m68k/ELF target configuration.
This commit is contained in:
parent
61e5d73035
commit
2a213ac8a5
|
@ -0,0 +1,561 @@
|
|||
/* Definitions of target machine for GNU compiler, for m68k NetBSD platforms
|
||||
using the ELF object format.
|
||||
Largely derived from alpha/netbsd.h, i386/netbsd-elf.h and m68k/linux.h.
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 1, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define MOTOROLA /* Use Motorola syntax */
|
||||
#define USE_GAS /* But GAS wants jbsr instead of jsr */
|
||||
|
||||
/* Get generic m68k definitions. */
|
||||
|
||||
#include <m68k/m68k.h>
|
||||
|
||||
/* Get generic NetBSD ELF definitions. We will override if necessary. */
|
||||
|
||||
#define NETBSD_ELF
|
||||
#include <netbsd.h>
|
||||
|
||||
/* 68020 with 68881 */
|
||||
#define TARGET_DEFAULT (MASK_BITFIELD|MASK_68881|MASK_68020)
|
||||
|
||||
#define bsd4_4
|
||||
#undef HAS_INIT_SECTION
|
||||
|
||||
#undef CPP_SPEC
|
||||
#define CPP_SPEC "%{!msoft-float:-D__HAVE_68881__ -D__HAVE_FPU__} %{posix:-D_POSIX_SOURCE}"
|
||||
|
||||
#undef ASM_SPEC
|
||||
#define ASM_SPEC " %| %{m68030} %{m68040} %{m68060} %{fpic:-k} %{fPIC:-k -K}"
|
||||
|
||||
/* Provide a set of pre-definitions and pre-assertions appropriate for
|
||||
the m68k running svr4. */
|
||||
|
||||
/* NetBSD extension to GNU C: __KPRINTF_ATTRIBUTE__ */
|
||||
|
||||
#define CPP_PREDEFINES "\
|
||||
-Dm68k -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ -D__SVR4_ABI__ \
|
||||
-D__motorola__ -Asystem(unix) -Asystem(NetBSD) -Acpu(m68k) -Amachine(m68k)"
|
||||
|
||||
/* XXX This may need further investigation. */
|
||||
|
||||
#undef DBX_DEBUGGING_INFO
|
||||
#define DBX_DEBUGGING_INFO
|
||||
#undef PREFERRED_DEBUGGING_TYPE DBX_DEBUG
|
||||
|
||||
/* Make GCC agree with <machine/ansi.h>. */
|
||||
|
||||
#undef SIZE_TYPE
|
||||
#define SIZE_TYPE "unsigned int"
|
||||
|
||||
#undef PTRDIFF_TYPE
|
||||
#define PTRDIFF_TYPE "int"
|
||||
|
||||
#undef WCHAR_TYPE
|
||||
#define WCHAR_TYPE "int"
|
||||
|
||||
#undef WCHAR_UNSIGNED
|
||||
#define WCHAR_UNSIGNED 0
|
||||
|
||||
#undef WCHAR_TYPE_SIZE
|
||||
#define WCHAR_TYPE_SIZE 32
|
||||
|
||||
#undef ASM_APP_ON
|
||||
#define ASM_APP_ON "#APP\n"
|
||||
|
||||
#undef ASM_APP_OFF
|
||||
#define ASM_APP_OFF "#NO_APP\n"
|
||||
|
||||
/* Here are four prefixes that are used by asm_fprintf to
|
||||
facilitate customization for alternate assembler syntaxes.
|
||||
Machines with no likelihood of an alternate syntax need not
|
||||
define these and need not use asm_fprintf. */
|
||||
|
||||
/* The prefix for register names. Note that REGISTER_NAMES
|
||||
is supposed to include this prefix. Also note that this is NOT an
|
||||
fprintf format string, it is a literal string */
|
||||
|
||||
#undef REGISTER_PREFIX
|
||||
#define REGISTER_PREFIX "%"
|
||||
|
||||
/* The prefix for local (compiler generated) labels.
|
||||
These labels will not appear in the symbol table. */
|
||||
|
||||
#undef LOCAL_LABEL_PREFIX
|
||||
#define LOCAL_LABEL_PREFIX "."
|
||||
|
||||
/* The prefix to add to user-visible assembler symbols. */
|
||||
|
||||
#undef USER_LABEL_PREFIX
|
||||
#define USER_LABEL_PREFIX ""
|
||||
|
||||
#define ASM_COMMENT_START "|"
|
||||
|
||||
/* How to refer to registers in assembler output.
|
||||
This sequence is indexed by compiler's hard-register-number.
|
||||
Motorola format uses different register names than defined in m68k.h.
|
||||
We also take this chance to convert 'a6' to 'fp' */
|
||||
|
||||
#undef REGISTER_NAMES
|
||||
|
||||
#ifndef SUPPORT_SUN_FPA
|
||||
|
||||
#define REGISTER_NAMES \
|
||||
{"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
|
||||
"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
|
||||
"%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7" }
|
||||
|
||||
#else /* SUPPORTED_SUN_FPA */
|
||||
|
||||
#define REGISTER_NAMES \
|
||||
{"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7", \
|
||||
"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp", \
|
||||
"%fp0", "%fp1", "%fp2", "%fp3", "%fp4", "%fp5", "%fp6", "%fp7", \
|
||||
"%fpa0", "%fpa1", "%fpa2", "%fpa3", "%fpa4", "%fpa5", "%fpa6","%fpa7", \
|
||||
"%fpa8", "%fpa9", "%fpa10","%fpa11","%fpa12","%fpa13","%fpa14","%fpa15", \
|
||||
"%fpa16","%fpa17","%fpa18","%fpa19","%fpa20","%fpa21","%fpa22","%fpa23", \
|
||||
"%fpa24","%fpa25","%fpa26","%fpa27","%fpa28","%fpa29","%fpa30","%fpa31" }
|
||||
|
||||
#endif /* defined SUPPORT_SUN_FPA */
|
||||
|
||||
/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
|
||||
keep switch tables in the text section. */
|
||||
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION 1
|
||||
|
||||
/* Use the default action for outputting the case label. */
|
||||
#undef ASM_OUTPUT_CASE_LABEL
|
||||
#define ASM_RETURN_CASE_JUMP \
|
||||
do { \
|
||||
if (TARGET_5200) \
|
||||
return "ext%.l %0\n\tjmp %%pc@(2,%0:l)"; \
|
||||
else \
|
||||
return "jmp %%pc@(2,%0:w)"; \
|
||||
} while (0)
|
||||
|
||||
/* This is how to output an assembler line that says to advance the
|
||||
location counter to a multiple of 2**LOG bytes. */
|
||||
|
||||
#undef ALIGN_ASM_OP
|
||||
#define ALIGN_ASM_OP ".align"
|
||||
|
||||
#undef ASM_OUTPUT_ALIGN
|
||||
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
|
||||
do { \
|
||||
if ((LOG) > 0) \
|
||||
fprintf ((FILE), "\t%s %u\n", ALIGN_ASM_OP, 1 << (LOG)); \
|
||||
} while (0)
|
||||
|
||||
/* If defined, a C expression whose value is a string containing the
|
||||
assembler operation to identify the following data as uninitialized global
|
||||
data. */
|
||||
|
||||
#define BSS_SECTION_ASM_OP ".section\t.bss"
|
||||
|
||||
/* A C statement (sans semicolon) to output to the stdio stream
|
||||
FILE the assembler definition of uninitialized global DECL named
|
||||
NAME whose size is SIZE bytes and alignment is ALIGN bytes.
|
||||
Try to use asm_output_aligned_bss to implement this macro. */
|
||||
|
||||
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
|
||||
asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
|
||||
|
||||
/* Section output setup. */
|
||||
|
||||
#define USE_CONST_SECTION 1
|
||||
|
||||
#define BSS_SECTION_ASM_OP ".section\t.bss"
|
||||
#define CONST_SECTION_ASM_OP ".section\t.rodata"
|
||||
#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
|
||||
#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\""
|
||||
#define INIT_SECTION_ASM_OP ".section\t.init"
|
||||
#define FINI_SECTION_ASM_OP ".section\t.fini"
|
||||
|
||||
#undef EXTRA_SECTIONS
|
||||
#define EXTRA_SECTIONS in_const, in_ctors, in_dtors
|
||||
|
||||
#undef EXTRA_SECTION_FUNCTIONS
|
||||
#define EXTRA_SECTION_FUNCTIONS \
|
||||
CONST_SECTION_FUNCTION \
|
||||
CTORS_SECTION_FUNCTION \
|
||||
DTORS_SECTION_FUNCTION
|
||||
|
||||
#undef READONLY_DATA_SECTION
|
||||
#define READONLY_DATA_SECTION() const_section ()
|
||||
|
||||
extern void text_section ();
|
||||
|
||||
#define CONST_SECTION_FUNCTION \
|
||||
void \
|
||||
const_section () \
|
||||
{ \
|
||||
if (!USE_CONST_SECTION) \
|
||||
text_section(); \
|
||||
else if (in_section != in_const) \
|
||||
{ \
|
||||
fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \
|
||||
in_section = in_const; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CTORS_SECTION_FUNCTION \
|
||||
void \
|
||||
ctors_section () \
|
||||
{ \
|
||||
if (in_section != in_ctors) \
|
||||
{ \
|
||||
fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \
|
||||
in_section = in_ctors; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define DTORS_SECTION_FUNCTION \
|
||||
void \
|
||||
dtors_section () \
|
||||
{ \
|
||||
if (in_section != in_dtors) \
|
||||
{ \
|
||||
fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \
|
||||
in_section = in_dtors; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Switch into a generic section.
|
||||
This is currently only used to support section attributes.
|
||||
|
||||
We make the section read-only and executable for a function decl,
|
||||
read-only for a const data decl, and writable for a non-const data decl. */
|
||||
#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \
|
||||
fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, \
|
||||
(DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \
|
||||
(DECL) && DECL_READONLY_SECTION (DECL, RELOC) ? "a" : "aw")
|
||||
|
||||
/* These macros generate the special .type and .size directives which
|
||||
are used to set the corresponding fields of the linker symbol table
|
||||
entries in an ELF object file under SVR4. These macros also output
|
||||
the starting labels for the relevant functions/objects. */
|
||||
|
||||
/* Write the extra assembler code needed to declare a function properly.
|
||||
Some svr4 assemblers need to also have something extra said about the
|
||||
function's return value. We allow for that here. */
|
||||
|
||||
#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
|
||||
do { \
|
||||
fprintf (FILE, "\t%s\t", TYPE_ASM_OP); \
|
||||
assemble_name (FILE, NAME); \
|
||||
putc (',', FILE); \
|
||||
fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
|
||||
putc ('\n', FILE); \
|
||||
ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
|
||||
ASM_OUTPUT_LABEL(FILE, NAME); \
|
||||
} while (0)
|
||||
|
||||
/* Write the extra assembler code needed to declare an object properly. */
|
||||
|
||||
#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
|
||||
do { \
|
||||
fprintf (FILE, "\t%s\t", TYPE_ASM_OP); \
|
||||
assemble_name (FILE, NAME); \
|
||||
putc (',', FILE); \
|
||||
fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
|
||||
putc ('\n', FILE); \
|
||||
size_directive_output = 0; \
|
||||
if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
|
||||
{ \
|
||||
size_directive_output = 1; \
|
||||
fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
|
||||
assemble_name (FILE, NAME); \
|
||||
putc (',', FILE); \
|
||||
fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
|
||||
int_size_in_bytes (TREE_TYPE (DECL))); \
|
||||
fputc ('\n', FILE); \
|
||||
} \
|
||||
ASM_OUTPUT_LABEL(FILE, NAME); \
|
||||
} while (0)
|
||||
|
||||
/* Output the size directive for a decl in rest_of_decl_compilation
|
||||
in the case where we did not do so before the initializer.
|
||||
Once we find the error_mark_node, we know that the value of
|
||||
size_directive_output was set
|
||||
by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
|
||||
|
||||
#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
|
||||
do { \
|
||||
char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
|
||||
if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
|
||||
&& ! AT_END && TOP_LEVEL \
|
||||
&& DECL_INITIAL (DECL) == error_mark_node \
|
||||
&& !size_directive_output) \
|
||||
{ \
|
||||
size_directive_output = 1; \
|
||||
fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
|
||||
assemble_name (FILE, name); \
|
||||
putc (',', FILE); \
|
||||
fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \
|
||||
int_size_in_bytes (TREE_TYPE (DECL))); \
|
||||
fputc ('\n', FILE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* This is how to declare the size of a function. */
|
||||
|
||||
#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
|
||||
do { \
|
||||
if (!flag_inhibit_size_directive) \
|
||||
{ \
|
||||
char label[256]; \
|
||||
static int labelno; \
|
||||
labelno++; \
|
||||
ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
|
||||
ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
|
||||
fprintf (FILE, "\t%s\t", SIZE_ASM_OP); \
|
||||
assemble_name (FILE, (FNAME)); \
|
||||
fprintf (FILE, ","); \
|
||||
assemble_name (FILE, label); \
|
||||
fprintf (FILE, "-"); \
|
||||
assemble_name (FILE, (FNAME)); \
|
||||
putc ('\n', FILE); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* This is how we tell the assembler that two symbols have the same value. */
|
||||
|
||||
#define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \
|
||||
do { assemble_name(FILE, NAME1); \
|
||||
fputs(" = ", FILE); \
|
||||
assemble_name(FILE, NAME2); \
|
||||
fputc('\n', FILE); } while (0)
|
||||
/* Currently, JUMP_TABLES_IN_TEXT_SECTION must be defined in order to
|
||||
keep switch tables in the text section. */
|
||||
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION 1
|
||||
|
||||
/* Output assembler code to FILE to increment profiler label # LABELNO
|
||||
for profiling a function entry. XXX should have _mcount. */
|
||||
|
||||
#undef FUNCTION_PROFILER
|
||||
#define FUNCTION_PROFILER(FILE, LABELNO) \
|
||||
do { \
|
||||
asm_fprintf (FILE, "\tlea (%LLP%d,%Rpc),%Ra1\n", (LABELNO)); \
|
||||
if (flag_pic) \
|
||||
fprintf (FILE, "\tbsr.l mcount@PLTPC\n"); \
|
||||
else \
|
||||
fprintf (FILE, "\tjbsr mcount\n"); \
|
||||
} while (0)
|
||||
|
||||
/* Register in which address to store a structure value is passed to a
|
||||
function. The default in m68k.h is a1. For m68k/SVR4 it is a0. */
|
||||
|
||||
#undef STRUCT_VALUE_REGNUM
|
||||
#define STRUCT_VALUE_REGNUM 8
|
||||
|
||||
/* Register in which static-chain is passed to a function. The
|
||||
default in m68k.h is a0, but that is already the struct value
|
||||
regnum. Make it a1 instead. */
|
||||
|
||||
#undef STATIC_CHAIN_REGNUM
|
||||
#define STATIC_CHAIN_REGNUM 9
|
||||
|
||||
/* How to renumber registers for dbx and gdb.
|
||||
On the Sun-3, the floating point registers have numbers
|
||||
18 to 25, not 16 to 23 as they do in the compiler. */
|
||||
|
||||
#define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 16 ? (REGNO) : (REGNO) + 2)
|
||||
|
||||
/* Do not break .stabs pseudos into continuations. */
|
||||
|
||||
#define DBX_CONTIN_LENGTH 0
|
||||
|
||||
/* 1 if N is a possible register number for a function value. For
|
||||
m68k/SVR4 allow d0, a0, or fp0 as return registers, for integral,
|
||||
pointer, or floating types, respectively. Reject fp0 if not using
|
||||
a 68881 coprocessor. */
|
||||
|
||||
#undef FUNCTION_VALUE_REGNO_P
|
||||
#define FUNCTION_VALUE_REGNO_P(N) \
|
||||
((N) == 0 || (N) == 8 || (TARGET_68881 && (N) == 16))
|
||||
|
||||
/* Define this to be true when FUNCTION_VALUE_REGNO_P is true for
|
||||
more than one register. */
|
||||
|
||||
#undef NEEDS_UNTYPED_CALL
|
||||
#define NEEDS_UNTYPED_CALL 1
|
||||
|
||||
/* Define how to generate (in the callee) the output value of a
|
||||
function and how to find (in the caller) the value returned by a
|
||||
function. VALTYPE is the data type of the value (as a tree). If
|
||||
the precise function being called is known, FUNC is its
|
||||
FUNCTION_DECL; otherwise, FUNC is 0. For m68k/SVR4 generate the
|
||||
result in d0, a0, or fp0 as appropriate. */
|
||||
|
||||
#undef FUNCTION_VALUE
|
||||
#define FUNCTION_VALUE(VALTYPE, FUNC) \
|
||||
(TREE_CODE (VALTYPE) == REAL_TYPE && TARGET_68881 \
|
||||
? gen_rtx_REG (TYPE_MODE (VALTYPE), 16) \
|
||||
: (POINTER_TYPE_P (VALTYPE) \
|
||||
? gen_rtx_REG (TYPE_MODE (VALTYPE), 8) \
|
||||
: gen_rtx_REG (TYPE_MODE (VALTYPE), 0)))
|
||||
|
||||
/* For compatibility with the large body of existing code which does
|
||||
not always properly declare external functions returning pointer
|
||||
types, the m68k/SVR4 convention is to copy the value returned for
|
||||
pointer functions from a0 to d0 in the function epilogue, so that
|
||||
callers that have neglected to properly declare the callee can
|
||||
still find the correct return value. */
|
||||
|
||||
extern int current_function_returns_pointer;
|
||||
#define FUNCTION_EXTRA_EPILOGUE(FILE, SIZE) \
|
||||
do { \
|
||||
if ((current_function_returns_pointer) && \
|
||||
! find_equiv_reg (0, get_last_insn (), 0, 0, 0, 8, Pmode)) \
|
||||
asm_fprintf (FILE, "\tmove.l %Ra0,%Rd0\n"); \
|
||||
} while (0);
|
||||
|
||||
/* Define how to find the value returned by a library function
|
||||
assuming the value has mode MODE.
|
||||
For m68k/SVR4 look for integer values in d0, pointer values in d0
|
||||
(returned in both d0 and a0), and floating values in fp0. */
|
||||
|
||||
#undef LIBCALL_VALUE
|
||||
#define LIBCALL_VALUE(MODE) \
|
||||
((((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode) \
|
||||
&& TARGET_68881) \
|
||||
? gen_rtx_REG (MODE, 16) \
|
||||
: gen_rtx_REG (MODE, 0))
|
||||
|
||||
/* Boundary (in *bits*) on which stack pointer should be aligned.
|
||||
The m68k/SVR4 convention is to keep the stack pointer longword aligned. */
|
||||
|
||||
#undef STACK_BOUNDARY
|
||||
#define STACK_BOUNDARY 32
|
||||
|
||||
/* Alignment of field after `int : 0' in a structure.
|
||||
For m68k/SVR4, this is the next longword boundary. */
|
||||
|
||||
#undef EMPTY_FIELD_BOUNDARY
|
||||
#define EMPTY_FIELD_BOUNDARY 32
|
||||
|
||||
/* No data type wants to be aligned rounder than this.
|
||||
For m68k/SVR4, some types (doubles for example) are aligned on 8 byte
|
||||
boundaries */
|
||||
|
||||
#undef BIGGEST_ALIGNMENT
|
||||
#define BIGGEST_ALIGNMENT 64
|
||||
|
||||
/* In m68k svr4, a symbol_ref rtx can be a valid PIC operand if it is
|
||||
an operand of a function call. */
|
||||
#undef LEGITIMATE_PIC_OPERAND_P
|
||||
#define LEGITIMATE_PIC_OPERAND_P(X) \
|
||||
((! symbolic_operand (X, VOIDmode) \
|
||||
&& ! (GET_CODE (X) == CONST_DOUBLE && CONST_DOUBLE_MEM (X) \
|
||||
&& GET_CODE (CONST_DOUBLE_MEM (X)) == MEM \
|
||||
&& symbolic_operand (XEXP (CONST_DOUBLE_MEM (X), 0), VOIDmode))) \
|
||||
|| (GET_CODE (X) == SYMBOL_REF && SYMBOL_REF_FLAG (X)))
|
||||
|
||||
/* Turn off function cse if we are doing PIC. We always want function
|
||||
call to be done as `bsr foo@PLTPC', so it will force the assembler
|
||||
to create the PLT entry for `foo'. Doing function cse will cause
|
||||
the address of `foo' to be loaded into a register, which is exactly
|
||||
what we want to avoid when we are doing PIC on svr4 m68k. */
|
||||
#undef SUBTARGET_OVERRIDE_OPTIONS
|
||||
#define SUBTARGET_OVERRIDE_OPTIONS \
|
||||
if (flag_pic) flag_no_function_cse = 1;
|
||||
|
||||
/* For m68k SVR4, structures are returned using the reentrant
|
||||
technique. */
|
||||
|
||||
#undef PCC_STATIC_STRUCT_RETURN
|
||||
|
||||
/* The svr4 ABI for the m68k says that records and unions are returned
|
||||
in memory. */
|
||||
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 1
|
||||
|
||||
/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
|
||||
Used for C++ multiple inheritance. */
|
||||
#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
|
||||
do { \
|
||||
if (DELTA > 0 && DELTA <= 8) \
|
||||
asm_fprintf (FILE, "\taddq.l %I%d,4(%Rsp)\n", DELTA); \
|
||||
else if (DELTA < 0 && DELTA >= -8) \
|
||||
asm_fprintf (FILE, "\tsubq.l %I%d,4(%Rsp)\n", -DELTA); \
|
||||
else \
|
||||
asm_fprintf (FILE, "\tadd.l %I%d,4(%Rsp)\n", DELTA); \
|
||||
\
|
||||
if (flag_pic) \
|
||||
{ \
|
||||
fprintf (FILE, "\tbra.l "); \
|
||||
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
|
||||
fprintf (FILE, "@PLTPC\n"); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
fprintf (FILE, "\tjmp "); \
|
||||
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
|
||||
fprintf (FILE, "\n"); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Output assembler code for a block containing the constant parts
|
||||
of a trampoline, leaving space for the variable parts. */
|
||||
|
||||
/* On m68k svr4, the trampoline is different from the generic version
|
||||
in that we use a1 as the static call chain. */
|
||||
|
||||
#undef TRAMPOLINE_TEMPLATE
|
||||
#define TRAMPOLINE_TEMPLATE(FILE) \
|
||||
{ \
|
||||
ASM_OUTPUT_SHORT (FILE, GEN_INT (0x227a)); \
|
||||
ASM_OUTPUT_SHORT (FILE, GEN_INT (8)); \
|
||||
ASM_OUTPUT_SHORT (FILE, GEN_INT (0x2f3a)); \
|
||||
ASM_OUTPUT_SHORT (FILE, GEN_INT (8)); \
|
||||
ASM_OUTPUT_SHORT (FILE, GEN_INT (0x4e75)); \
|
||||
ASM_OUTPUT_INT (FILE, const0_rtx); \
|
||||
ASM_OUTPUT_INT (FILE, const0_rtx); \
|
||||
}
|
||||
|
||||
/* Redefine since we are using a different trampoline */
|
||||
#undef TRAMPOLINE_SIZE
|
||||
#define TRAMPOLINE_SIZE 18
|
||||
|
||||
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
||||
FNADDR is an RTX for the address of the function's pure code.
|
||||
CXT is an RTX for the static chain value for the function. */
|
||||
|
||||
#undef INITIALIZE_TRAMPOLINE
|
||||
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
|
||||
{ \
|
||||
emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 10)), CXT); \
|
||||
emit_move_insn (gen_rtx (MEM, SImode, plus_constant (TRAMP, 14)), FNADDR); \
|
||||
}
|
||||
|
||||
/* Provide a LINK_SPEC appropriate for a NetBSD ELF target.
|
||||
Differs only in explicit emulation selection. */
|
||||
#undef LINK_SPEC
|
||||
#define LINK_SPEC \
|
||||
"-m m68kelf \
|
||||
%{assert*} \
|
||||
%{shared:-shared} \
|
||||
%{!shared: \
|
||||
-dc -dp \
|
||||
%{!nostdlib:%{!r*:%{!e*:-e __start}}} \
|
||||
%{!static: \
|
||||
%{rdynamic:-export-dynamic} \
|
||||
%{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \
|
||||
%{static:-static}}"
|
|
@ -3649,6 +3649,14 @@ for machine in $build $host $target; do
|
|||
extra_headers=math-68881.h
|
||||
float_format=m68k
|
||||
;;
|
||||
m68k*-*-netbsdelf*)
|
||||
tm_file=m68k/netbsd-elf.h
|
||||
xm_file=m68k/xm-netbsd.h
|
||||
# On NetBSD, the headers are already okay, except for math.h.
|
||||
fixincludes=fixinc.wrap
|
||||
tmake_file=t-netbsd
|
||||
float_format=m68k
|
||||
;;
|
||||
m68k*-*-netbsd*)
|
||||
tm_file=m68k/netbsd.h
|
||||
xm_file=m68k/xm-netbsd.h
|
||||
|
|
|
@ -1670,6 +1670,14 @@ for machine in $build $host $target; do
|
|||
extra_headers=math-68881.h
|
||||
float_format=m68k
|
||||
;;
|
||||
m68k*-*-netbsdelf*)
|
||||
tm_file=m68k/netbsd-elf.h
|
||||
xm_file=m68k/xm-netbsd.h
|
||||
# On NetBSD, the headers are already okay, except for math.h.
|
||||
fixincludes=fixinc.wrap
|
||||
tmake_file=t-netbsd
|
||||
float_format=m68k
|
||||
;;
|
||||
m68k*-*-netbsd*)
|
||||
tm_file=m68k/netbsd.h
|
||||
xm_file=m68k/xm-netbsd.h
|
||||
|
|
Loading…
Reference in New Issue