Home | History | Annotate | Line # | Download | only in rs6000
netbsd64.h revision 1.1.1.2
      1      1.1  mrg /* Definitions of target machine for GNU compiler,
      2      1.1  mrg    for 64 bit PowerPC NetBSD.
      3      1.1  mrg    Copyright (C) 2006 Free Software Foundation, Inc.
      4      1.1  mrg    Contributed by Matthew Green (mrg (at) eterna.com.au).
      5      1.1  mrg 
      6      1.1  mrg    This file is part of GCC.
      7      1.1  mrg 
      8      1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      9      1.1  mrg    under the terms of the GNU General Public License as published
     10      1.1  mrg    by the Free Software Foundation; either version 2, or (at your
     11      1.1  mrg    option) any later version.
     12      1.1  mrg 
     13      1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     14      1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     16      1.1  mrg    License for more details.
     17      1.1  mrg 
     18      1.1  mrg    You should have received a copy of the GNU General Public License
     19      1.1  mrg    along with GCC; see the file COPYING.  If not, write to the
     20      1.1  mrg    Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
     21      1.1  mrg    MA 02110-1301, USA.  */
     22      1.1  mrg 
     23      1.1  mrg #ifndef RS6000_BI_ARCH
     24      1.1  mrg 
     25      1.1  mrg #undef	DEFAULT_ABI
     26      1.1  mrg #define	DEFAULT_ABI ABI_AIX
     27      1.1  mrg 
     28      1.1  mrg #undef	TARGET_64BIT
     29      1.1  mrg #define	TARGET_64BIT 1
     30      1.1  mrg 
     31      1.1  mrg #define	DEFAULT_ARCH64_P 1
     32      1.1  mrg #define	RS6000_BI_ARCH_P 0
     33      1.1  mrg 
     34      1.1  mrg #else
     35      1.1  mrg 
     36      1.1  mrg #define	DEFAULT_ARCH64_P (TARGET_DEFAULT & MASK_64BIT)
     37      1.1  mrg #define	RS6000_BI_ARCH_P 1
     38      1.1  mrg 
     39      1.1  mrg #endif
     40      1.1  mrg 
     41      1.1  mrg #ifdef IN_LIBGCC2
     42      1.1  mrg #undef TARGET_64BIT
     43      1.1  mrg #ifdef __powerpc64__
     44      1.1  mrg #define TARGET_64BIT 1
     45      1.1  mrg #else
     46      1.1  mrg #define TARGET_64BIT 0
     47      1.1  mrg #endif
     48      1.1  mrg #endif
     49      1.1  mrg 
     50      1.1  mrg #undef	TARGET_AIX
     51      1.1  mrg #define	TARGET_AIX TARGET_64BIT
     52      1.1  mrg 
     53      1.1  mrg #ifdef HAVE_LD_NO_DOT_SYMS
     54      1.1  mrg /* New ABI uses a local sym for the function entry point.  */
     55      1.1  mrg extern int dot_symbols;
     56      1.1  mrg #undef DOT_SYMBOLS
     57      1.1  mrg #define DOT_SYMBOLS dot_symbols
     58      1.1  mrg #endif
     59      1.1  mrg 
     60      1.1  mrg #define TARGET_PROFILE_KERNEL profile_kernel
     61      1.1  mrg 
     62  1.1.1.2  mrg #define TARGET_USES_LINUX64_OPT 1
     63  1.1.1.2  mrg #ifdef HAVE_LD_LARGE_TOC
     64  1.1.1.2  mrg #undef TARGET_CMODEL
     65  1.1.1.2  mrg #define TARGET_CMODEL rs6000_current_cmodel
     66  1.1.1.2  mrg #define SET_CMODEL(opt) rs6000_current_cmodel = opt
     67  1.1.1.2  mrg #else
     68  1.1.1.2  mrg #define SET_CMODEL(opt) do {} while (0)
     69  1.1.1.2  mrg #endif
     70  1.1.1.2  mrg 
     71      1.1  mrg #undef  PROCESSOR_DEFAULT
     72      1.1  mrg #define PROCESSOR_DEFAULT PROCESSOR_POWER4
     73      1.1  mrg #undef  PROCESSOR_DEFAULT64
     74      1.1  mrg #define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
     75      1.1  mrg 
     76      1.1  mrg /* We don't need to generate entries in .fixup, except when
     77      1.1  mrg    -mrelocatable or -mrelocatable-lib is given.  */
     78      1.1  mrg #undef RELOCATABLE_NEEDS_FIXUP
     79      1.1  mrg #define RELOCATABLE_NEEDS_FIXUP \
     80  1.1.1.2  mrg   (rs6000_isa_flags & rs6000_isa_flags_explicit & OPTION_MASK_RELOCATABLE)
     81      1.1  mrg 
     82      1.1  mrg #undef	RS6000_ABI_NAME
     83      1.1  mrg #define	RS6000_ABI_NAME "netbsd"
     84      1.1  mrg 
     85      1.1  mrg #define INVALID_64BIT "-m%s not supported in this configuration"
     86      1.1  mrg #define INVALID_32BIT INVALID_64BIT
     87      1.1  mrg 
     88  1.1.1.2  mrg #define ELFv2_ABI_CHECK (rs6000_elf_abi == 2)
     89  1.1.1.2  mrg 
     90  1.1.1.2  mrg #undef CC1_OS_NETBSD_SPEC
     91  1.1.1.2  mrg #define CC1_OS_NETBSD_SPEC \
     92  1.1.1.2  mrg   NETBSD_CC1_AND_CC1PLUS_SPEC \
     93  1.1.1.2  mrg   "%{!m32: %{!mrelocatable: %{!fno-pie: %{!fno-pic: \
     94  1.1.1.2  mrg      %{!fpie: %{!fpic: \
     95  1.1.1.2  mrg        %{!fPIE: %{!fPIC:-fPIC}}}}}}}}"
     96  1.1.1.2  mrg /* %{!m32: %{!mcmodel*: -mcmodel=medium}}" */
     97  1.1.1.2  mrg 
     98  1.1.1.2  mrg #undef CC1PLUS_SPEC
     99  1.1.1.2  mrg #define CC1PLUS_SPEC CC1_OS_NETBSD_SPEC
    100  1.1.1.2  mrg 
    101      1.1  mrg #undef	SUBSUBTARGET_OVERRIDE_OPTIONS
    102      1.1  mrg #define	SUBSUBTARGET_OVERRIDE_OPTIONS				\
    103      1.1  mrg   do								\
    104      1.1  mrg     {								\
    105  1.1.1.2  mrg       if (!global_options_set.x_rs6000_alignment_flags)		\
    106      1.1  mrg 	rs6000_alignment_flags = MASK_ALIGN_NATURAL;		\
    107      1.1  mrg       if (TARGET_64BIT)						\
    108      1.1  mrg 	{							\
    109      1.1  mrg 	  if (DEFAULT_ABI != ABI_AIX)				\
    110      1.1  mrg 	    {							\
    111      1.1  mrg 	      rs6000_current_abi = ABI_AIX;			\
    112      1.1  mrg 	      error (INVALID_64BIT, "call");			\
    113      1.1  mrg 	    }							\
    114      1.1  mrg 	  dot_symbols = !strcmp (rs6000_abi_name, "aixdesc");	\
    115  1.1.1.2  mrg 	  if (ELFv2_ABI_CHECK)					\
    116  1.1.1.2  mrg 	    {							\
    117  1.1.1.2  mrg 	      rs6000_current_abi = ABI_ELFv2;			\
    118  1.1.1.2  mrg 	      if (dot_symbols)					\
    119  1.1.1.2  mrg 		error ("-mcall-aixdesc incompatible with -mabi=elfv2"); \
    120  1.1.1.2  mrg 	    }							\
    121  1.1.1.2  mrg 	  if (rs6000_isa_flags & OPTION_MASK_RELOCATABLE)	\
    122      1.1  mrg 	    {							\
    123  1.1.1.2  mrg 	      rs6000_isa_flags &= ~OPTION_MASK_RELOCATABLE;	\
    124      1.1  mrg 	      error (INVALID_64BIT, "relocatable");		\
    125      1.1  mrg 	    }							\
    126  1.1.1.2  mrg 	  if (rs6000_isa_flags & OPTION_MASK_EABI)		\
    127      1.1  mrg 	    {							\
    128  1.1.1.2  mrg 	      rs6000_isa_flags &= ~OPTION_MASK_EABI;		\
    129      1.1  mrg 	      error (INVALID_64BIT, "eabi");			\
    130      1.1  mrg 	    }							\
    131      1.1  mrg 	  if (TARGET_PROTOTYPE)					\
    132      1.1  mrg 	    {							\
    133      1.1  mrg 	      target_prototype = 0;				\
    134      1.1  mrg 	      error (INVALID_64BIT, "prototype");		\
    135      1.1  mrg 	    }							\
    136  1.1.1.2  mrg 	  if ((rs6000_isa_flags & OPTION_MASK_POWERPC64) == 0)	\
    137      1.1  mrg 	    {							\
    138  1.1.1.2  mrg 	      rs6000_isa_flags |= OPTION_MASK_POWERPC64;	\
    139      1.1  mrg 	      error ("-m64 requires a PowerPC64 cpu");		\
    140      1.1  mrg 	    }							\
    141  1.1.1.2  mrg 	  if ((rs6000_isa_flags_explicit			\
    142  1.1.1.2  mrg 	       & OPTION_MASK_MINIMAL_TOC) != 0)			\
    143  1.1.1.2  mrg 	    {							\
    144  1.1.1.2  mrg 	      if (global_options_set.x_rs6000_current_cmodel	\
    145  1.1.1.2  mrg 		  && rs6000_current_cmodel != CMODEL_SMALL)	\
    146  1.1.1.2  mrg 		error ("-mcmodel incompatible with other toc options"); \
    147  1.1.1.2  mrg 	      SET_CMODEL (CMODEL_SMALL);			\
    148  1.1.1.2  mrg 	    }							\
    149  1.1.1.2  mrg 	    {							\
    150  1.1.1.2  mrg 	      if (!global_options_set.x_rs6000_current_cmodel)	\
    151  1.1.1.2  mrg 		SET_CMODEL (CMODEL_MEDIUM);			\
    152  1.1.1.2  mrg 	      if (rs6000_current_cmodel != CMODEL_SMALL)	\
    153  1.1.1.2  mrg 		{						\
    154  1.1.1.2  mrg 		  TARGET_NO_FP_IN_TOC = 0;			\
    155  1.1.1.2  mrg 		  TARGET_NO_SUM_IN_TOC = 0;			\
    156  1.1.1.2  mrg 		}						\
    157  1.1.1.2  mrg 	    }							\
    158      1.1  mrg 	}							\
    159      1.1  mrg       else							\
    160      1.1  mrg 	{							\
    161      1.1  mrg 	  if (!RS6000_BI_ARCH_P)				\
    162      1.1  mrg 	    error (INVALID_32BIT, "32");			\
    163      1.1  mrg 	  if (TARGET_PROFILE_KERNEL)				\
    164      1.1  mrg 	    {							\
    165      1.1  mrg 	      TARGET_PROFILE_KERNEL = 0;			\
    166      1.1  mrg 	      error (INVALID_32BIT, "profile-kernel");		\
    167      1.1  mrg 	    }							\
    168  1.1.1.2  mrg 	  if (global_options_set.x_rs6000_current_cmodel)	\
    169  1.1.1.2  mrg 	    {							\
    170  1.1.1.2  mrg 	      SET_CMODEL (CMODEL_SMALL);			\
    171  1.1.1.2  mrg 	      error (INVALID_32BIT, "cmodel");			\
    172  1.1.1.2  mrg 	    }							\
    173      1.1  mrg 	}							\
    174      1.1  mrg     }								\
    175      1.1  mrg   while (0)
    176      1.1  mrg 
    177      1.1  mrg #ifdef	RS6000_BI_ARCH
    178      1.1  mrg 
    179  1.1.1.2  mrg #if 0
    180      1.1  mrg #undef	OVERRIDE_OPTIONS
    181      1.1  mrg #define	OVERRIDE_OPTIONS \
    182      1.1  mrg   rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
    183      1.1  mrg 			   ? (char *) 0 : TARGET_CPU_DEFAULT)
    184  1.1.1.2  mrg #endif
    185      1.1  mrg 
    186      1.1  mrg #endif
    187      1.1  mrg 
    188      1.1  mrg #undef	ASM_DEFAULT_SPEC
    189      1.1  mrg #undef	ASM_SPEC
    190      1.1  mrg #undef	LINK_OS_NETBSD_SPEC
    191      1.1  mrg 
    192      1.1  mrg #ifndef	RS6000_BI_ARCH
    193      1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc64"
    194      1.1  mrg #define	ASM_SPEC	 "%(asm_spec64) %(asm_spec_common)"
    195      1.1  mrg #define	LINK_OS_NETBSD_SPEC "%(link_os_netbsd_spec64)"
    196      1.1  mrg #else
    197      1.1  mrg #if DEFAULT_ARCH64_P
    198      1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
    199      1.1  mrg #define	ASM_SPEC	 "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
    200      1.1  mrg #define	LINK_OS_NETBSD_SPEC "%{m32:%(link_os_netbsd_spec32)}%{!m32:%(link_os_netbsd_spec64)}"
    201      1.1  mrg #else
    202      1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc%{m64:64}"
    203      1.1  mrg #define	ASM_SPEC	 "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
    204      1.1  mrg #define	LINK_OS_NETBSD_SPEC "%{!m64:%(link_os_netbsd_spec32)}%{m64:%(link_os_netbsd_spec64)}"
    205      1.1  mrg #endif
    206      1.1  mrg #endif
    207      1.1  mrg 
    208  1.1.1.2  mrg #define ASM_SPEC32 "-a32 \
    209  1.1.1.2  mrg %{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} \
    210  1.1.1.2  mrg %{memb|msdata=eabi: -memb}"
    211      1.1  mrg 
    212      1.1  mrg #define ASM_SPEC64 "-a64"
    213      1.1  mrg 
    214      1.1  mrg #define ASM_SPEC_COMMON "%(asm_cpu) \
    215  1.1.1.2  mrg %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}}" \
    216  1.1.1.2  mrg   ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
    217      1.1  mrg 
    218      1.1  mrg #undef	SUBSUBTARGET_EXTRA_SPECS
    219      1.1  mrg #define SUBSUBTARGET_EXTRA_SPECS \
    220      1.1  mrg   { "asm_spec_common",		ASM_SPEC_COMMON },			\
    221      1.1  mrg   { "asm_spec32",		ASM_SPEC32 },				\
    222      1.1  mrg   { "asm_spec64",		ASM_SPEC64 },				\
    223  1.1.1.2  mrg   { "link_os_netbsd_spec32",	LINK_OS_NETBSD_SPEC32 },		\
    224      1.1  mrg   { "link_os_netbsd_spec64",	LINK_OS_NETBSD_SPEC64 },
    225      1.1  mrg 
    226      1.1  mrg #undef	MULTILIB_DEFAULTS
    227      1.1  mrg #if DEFAULT_ARCH64_P
    228      1.1  mrg #define MULTILIB_DEFAULTS { "m64" }
    229      1.1  mrg #else
    230      1.1  mrg #define MULTILIB_DEFAULTS { "m32" }
    231      1.1  mrg #endif
    232      1.1  mrg 
    233      1.1  mrg #ifndef RS6000_BI_ARCH
    234      1.1  mrg 
    235      1.1  mrg /* 64-bit PowerPC NetBSD is always big-endian.  */
    236      1.1  mrg #undef	TARGET_LITTLE_ENDIAN
    237      1.1  mrg #define TARGET_LITTLE_ENDIAN	0
    238      1.1  mrg 
    239      1.1  mrg /* 64-bit PowerPC NetBSD always has a TOC.  */
    240      1.1  mrg #undef  TARGET_TOC
    241      1.1  mrg #define	TARGET_TOC		1
    242      1.1  mrg 
    243      1.1  mrg /* Some things from sysv4.h we don't do when 64 bit.  */
    244      1.1  mrg #undef	TARGET_RELOCATABLE
    245      1.1  mrg #define	TARGET_RELOCATABLE	0
    246      1.1  mrg #undef	TARGET_EABI
    247      1.1  mrg #define	TARGET_EABI		0
    248      1.1  mrg #undef	TARGET_PROTOTYPE
    249      1.1  mrg #define	TARGET_PROTOTYPE	0
    250      1.1  mrg #undef RELOCATABLE_NEEDS_FIXUP
    251      1.1  mrg #define RELOCATABLE_NEEDS_FIXUP 0
    252      1.1  mrg 
    253      1.1  mrg #endif
    254      1.1  mrg 
    255      1.1  mrg /* PowerPC64 NetBSD word-aligns FP doubles when -malign-power is given.  */
    256      1.1  mrg #undef  ADJUST_FIELD_ALIGN
    257      1.1  mrg #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
    258      1.1  mrg   ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)	\
    259      1.1  mrg    ? 128								\
    260      1.1  mrg    : (TARGET_64BIT							\
    261      1.1  mrg       && TARGET_ALIGN_NATURAL == 0					\
    262      1.1  mrg       && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode)	\
    263      1.1  mrg    ? MIN ((COMPUTED), 32)						\
    264      1.1  mrg    : (COMPUTED))
    265      1.1  mrg 
    266      1.1  mrg /* PowerPC64 NetBSD increases natural record alignment to doubleword if
    267      1.1  mrg    the first field is an FP double, only if in power alignment mode.  */
    268      1.1  mrg #undef  ROUND_TYPE_ALIGN
    269      1.1  mrg #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)			\
    270      1.1  mrg   ((TARGET_64BIT							\
    271      1.1  mrg     && (TREE_CODE (STRUCT) == RECORD_TYPE				\
    272      1.1  mrg 	|| TREE_CODE (STRUCT) == UNION_TYPE				\
    273      1.1  mrg 	|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE)			\
    274      1.1  mrg     && TARGET_ALIGN_NATURAL == 0)					\
    275      1.1  mrg    ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)	\
    276      1.1  mrg    : MAX ((COMPUTED), (SPECIFIED)))
    277      1.1  mrg 
    278      1.1  mrg /* Use the default for compiling target libs.  */
    279      1.1  mrg #ifdef IN_TARGET_LIBS
    280      1.1  mrg #undef TARGET_ALIGN_NATURAL
    281      1.1  mrg #define TARGET_ALIGN_NATURAL 1
    282      1.1  mrg #endif
    283      1.1  mrg 
    284      1.1  mrg /* Indicate that jump tables go in the text section.  */
    285      1.1  mrg #undef  JUMP_TABLES_IN_TEXT_SECTION
    286      1.1  mrg #define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT
    287      1.1  mrg 
    288      1.1  mrg /* The linux ppc64 ABI isn't explicit on whether aggregates smaller
    289      1.1  mrg    than a doubleword should be padded upward or downward.  You could
    290      1.1  mrg    reasonably assume that they follow the normal rules for structure
    291      1.1  mrg    layout treating the parameter area as any other block of memory,
    292      1.1  mrg    then map the reg param area to registers.  i.e. pad upward.
    293      1.1  mrg    Setting both of the following defines results in this behavior.
    294      1.1  mrg    Setting just the first one will result in aggregates that fit in a
    295      1.1  mrg    doubleword being padded downward, and others being padded upward.
    296      1.1  mrg    Not a bad idea as this results in struct { int x; } being passed
    297      1.1  mrg    the same way as an int.  */
    298      1.1  mrg #define AGGREGATE_PADDING_FIXED TARGET_64BIT
    299      1.1  mrg #define AGGREGATES_PAD_UPWARD_ALWAYS 0
    300      1.1  mrg 
    301      1.1  mrg /* Specify padding for the last element of a block move between
    302      1.1  mrg    registers and memory.  FIRST is nonzero if this is the only
    303      1.1  mrg    element.  */
    304      1.1  mrg #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
    305      1.1  mrg   (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
    306      1.1  mrg 
    307      1.1  mrg /* NetBSD doesn't support saving and restoring 64-bit regs in a 32-bit
    308      1.1  mrg    process.  XXXMRG?  */
    309      1.1  mrg #define OS_MISSING_POWERPC64 !TARGET_64BIT
    310      1.1  mrg 
    311      1.1  mrg /* NetBSD has float and long double forms of math functions.  */
    312      1.1  mrg #undef  TARGET_C99_FUNCTIONS
    313      1.1  mrg #define TARGET_C99_FUNCTIONS 1
    314      1.1  mrg 
    315      1.1  mrg /* NetBSD doesn't have sincos that follows the GNU extension.  */
    316      1.1  mrg #undef  TARGET_HAS_SINCOS
    317      1.1  mrg 
    318      1.1  mrg #undef  TARGET_OS_CPP_BUILTINS
    319      1.1  mrg #define TARGET_OS_CPP_BUILTINS()			\
    320      1.1  mrg   do							\
    321      1.1  mrg     {							\
    322      1.1  mrg       NETBSD_OS_CPP_BUILTINS_ELF();			\
    323  1.1.1.2  mrg       if (TARGET_ISEL)					\
    324  1.1.1.2  mrg 	builtin_define ("__PPC_ISEL__");		\
    325      1.1  mrg       if (TARGET_64BIT)					\
    326      1.1  mrg 	{						\
    327      1.1  mrg 	  builtin_define ("__PPC__");			\
    328      1.1  mrg 	  builtin_define ("__PPC64__");			\
    329      1.1  mrg 	  builtin_define ("__powerpc__");		\
    330      1.1  mrg 	  builtin_define ("__powerpc64__");		\
    331      1.1  mrg 	  builtin_define_with_int_value ("__PIC__", 2);	\
    332      1.1  mrg 	  builtin_assert ("cpu=powerpc64");		\
    333      1.1  mrg 	  builtin_assert ("machine=powerpc64");		\
    334      1.1  mrg 	}						\
    335      1.1  mrg       else						\
    336      1.1  mrg 	{						\
    337      1.1  mrg 	  builtin_define_std ("PPC");			\
    338      1.1  mrg 	  builtin_define_std ("powerpc");		\
    339      1.1  mrg 	  builtin_assert ("cpu=powerpc");		\
    340      1.1  mrg 	  builtin_assert ("machine=powerpc");		\
    341      1.1  mrg 	  TARGET_OS_SYSV_CPP_BUILTINS ();		\
    342      1.1  mrg 	}						\
    343      1.1  mrg     }							\
    344      1.1  mrg   while (0)
    345      1.1  mrg 
    346      1.1  mrg /* Override the default from rs6000.h to avoid conflicts with macros
    347      1.1  mrg    defined in NetBSD header files.  */
    348      1.1  mrg 
    349      1.1  mrg #undef  RS6000_CPU_CPP_ENDIAN_BUILTINS
    350      1.1  mrg #define RS6000_CPU_CPP_ENDIAN_BUILTINS()	\
    351      1.1  mrg   do						\
    352      1.1  mrg     {						\
    353      1.1  mrg       builtin_define ("__BIG_ENDIAN__");	\
    354      1.1  mrg       builtin_assert ("machine=bigendian");	\
    355      1.1  mrg     }						\
    356      1.1  mrg   while (0)
    357      1.1  mrg 
    358      1.1  mrg #undef  CPP_OS_DEFAULT_SPEC
    359      1.1  mrg #define CPP_OS_DEFAULT_SPEC "%(cpp_os_netbsd)"
    360      1.1  mrg 
    361      1.1  mrg #undef  LINK_SHLIB_SPEC
    362      1.1  mrg #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
    363      1.1  mrg 
    364      1.1  mrg #undef  LIB_DEFAULT_SPEC
    365      1.1  mrg #define LIB_DEFAULT_SPEC "%(lib_netbsd)"
    366      1.1  mrg 
    367      1.1  mrg #undef  STARTFILE_DEFAULT_SPEC
    368      1.1  mrg #define STARTFILE_DEFAULT_SPEC "%(startfile_netbsd)"
    369      1.1  mrg 
    370      1.1  mrg #undef	ENDFILE_DEFAULT_SPEC
    371      1.1  mrg #define ENDFILE_DEFAULT_SPEC "%(endfile_netbsd)"
    372      1.1  mrg 
    373      1.1  mrg #undef	LINK_START_DEFAULT_SPEC
    374      1.1  mrg #define LINK_START_DEFAULT_SPEC "%(link_start_netbsd)"
    375      1.1  mrg 
    376      1.1  mrg #undef	LINK_OS_DEFAULT_SPEC
    377      1.1  mrg #define LINK_OS_DEFAULT_SPEC "%(link_os_netbsd)"
    378      1.1  mrg 
    379      1.1  mrg #define LINK_OS_NETBSD_SPEC32 "-m elf32ppc %{!shared: %{!static: \
    380      1.1  mrg   %{rdynamic:-export-dynamic} \
    381      1.1  mrg   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
    382      1.1  mrg 
    383      1.1  mrg #define LINK_OS_NETBSD_SPEC64 "-m elf64ppc %{!shared: %{!static: \
    384      1.1  mrg   %{rdynamic:-export-dynamic} \
    385      1.1  mrg   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
    386      1.1  mrg 
    387      1.1  mrg #undef  TOC_SECTION_ASM_OP
    388      1.1  mrg #define TOC_SECTION_ASM_OP \
    389      1.1  mrg   (TARGET_64BIT						\
    390      1.1  mrg    ? "\t.section\t\".toc\",\"aw\""			\
    391      1.1  mrg    : "\t.section\t\".got\",\"aw\"")
    392      1.1  mrg 
    393      1.1  mrg #undef  MINIMAL_TOC_SECTION_ASM_OP
    394      1.1  mrg #define MINIMAL_TOC_SECTION_ASM_OP \
    395      1.1  mrg   (TARGET_64BIT						\
    396      1.1  mrg    ? "\t.section\t\".toc1\",\"aw\""			\
    397      1.1  mrg    : ((TARGET_RELOCATABLE || flag_pic)			\
    398      1.1  mrg       ? "\t.section\t\".got2\",\"aw\""			\
    399      1.1  mrg       : "\t.section\t\".got1\",\"aw\""))
    400      1.1  mrg 
    401      1.1  mrg /* Make GCC agree with <machine/ansi.h>.  */
    402      1.1  mrg 
    403      1.1  mrg #undef	SIZE_TYPE
    404  1.1.1.2  mrg #define	SIZE_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int")
    405      1.1  mrg 
    406      1.1  mrg #undef	PTRDIFF_TYPE
    407  1.1.1.2  mrg #define	PTRDIFF_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int")
    408  1.1.1.2  mrg 
    409  1.1.1.2  mrg #undef INTPTR_TYPE
    410  1.1.1.2  mrg #define INTPTR_TYPE PTRDIFF_TYPE
    411  1.1.1.2  mrg 
    412  1.1.1.2  mrg #undef UINTPTR_TYPE
    413  1.1.1.2  mrg #define UINTPTR_TYPE SIZE_TYPE
    414      1.1  mrg 
    415      1.1  mrg #undef	WCHAR_TYPE
    416  1.1.1.2  mrg #define	WCHAR_TYPE "int"
    417  1.1.1.2  mrg 
    418  1.1.1.2  mrg #undef INT8_TYPE
    419  1.1.1.2  mrg #define INT8_TYPE "signed char"
    420  1.1.1.2  mrg 
    421  1.1.1.2  mrg #undef INT16_TYPE
    422  1.1.1.2  mrg #define INT16_TYPE "short int"
    423  1.1.1.2  mrg 
    424  1.1.1.2  mrg #undef INT32_TYPE
    425  1.1.1.2  mrg #define INT32_TYPE "int"
    426  1.1.1.2  mrg 
    427  1.1.1.2  mrg #undef INT64_TYPE
    428  1.1.1.2  mrg #define INT64_TYPE "long long int"
    429  1.1.1.2  mrg 
    430  1.1.1.2  mrg #undef UINT8_TYPE
    431  1.1.1.2  mrg #define UINT8_TYPE "unsigned char"
    432  1.1.1.2  mrg 
    433  1.1.1.2  mrg #undef UINT16_TYPE
    434  1.1.1.2  mrg #define UINT16_TYPE "short unsigned int"
    435  1.1.1.2  mrg 
    436  1.1.1.2  mrg #undef UINT32_TYPE
    437  1.1.1.2  mrg #define UINT32_TYPE "unsigned int"
    438  1.1.1.2  mrg 
    439  1.1.1.2  mrg #undef UINT64_TYPE
    440  1.1.1.2  mrg #define UINT64_TYPE "long long unsigned int"
    441  1.1.1.2  mrg 
    442  1.1.1.2  mrg #undef INT_FAST8_TYPE
    443  1.1.1.2  mrg #define INT_FAST8_TYPE "int"
    444  1.1.1.2  mrg 
    445  1.1.1.2  mrg #undef INT_FAST16_TYPE
    446  1.1.1.2  mrg #define INT_FAST16_TYPE "int"
    447  1.1.1.2  mrg 
    448  1.1.1.2  mrg #undef INT_FAST32_TYPE
    449  1.1.1.2  mrg #define INT_FAST32_TYPE "int"
    450  1.1.1.2  mrg 
    451  1.1.1.2  mrg #undef INT_FAST64_TYPE
    452  1.1.1.2  mrg #define INT_FAST64_TYPE INT64_TYPE
    453  1.1.1.2  mrg 
    454  1.1.1.2  mrg #undef UINT_FAST8_TYPE
    455  1.1.1.2  mrg #define UINT_FAST8_TYPE "unsigned int"
    456  1.1.1.2  mrg 
    457  1.1.1.2  mrg #undef UINT_FAST16_TYPE
    458  1.1.1.2  mrg #define UINT_FAST16_TYPE "unsigned int"
    459  1.1.1.2  mrg 
    460  1.1.1.2  mrg #undef UINT_FAST32_TYPE
    461  1.1.1.2  mrg #define UINT_FAST32_TYPE "unsigned int"
    462  1.1.1.2  mrg 
    463  1.1.1.2  mrg #undef UINT_FAST8_TYPE
    464  1.1.1.2  mrg #define UINT_FAST8_TYPE "unsigned int"
    465  1.1.1.2  mrg 
    466  1.1.1.2  mrg #undef UINT_FAST16_TYPE
    467  1.1.1.2  mrg #define UINT_FAST16_TYPE "unsigned int"
    468  1.1.1.2  mrg 
    469  1.1.1.2  mrg #undef UINT_FAST32_TYPE
    470  1.1.1.2  mrg #define UINT_FAST32_TYPE "unsigned int"
    471  1.1.1.2  mrg 
    472  1.1.1.2  mrg #undef UINT_FAST64_TYPE
    473  1.1.1.2  mrg #define UINT_FAST64_TYPE UINT64_TYPE
    474  1.1.1.2  mrg 
    475  1.1.1.2  mrg #undef INT_LEAST8_TYPE
    476  1.1.1.2  mrg #define INT_LEAST8_TYPE INT8_TYPE
    477  1.1.1.2  mrg 
    478  1.1.1.2  mrg #undef INT_LEAST16_TYPE
    479  1.1.1.2  mrg #define INT_LEAST16_TYPE INT16_TYPE
    480  1.1.1.2  mrg 
    481  1.1.1.2  mrg #undef INT_LEAST32_TYPE
    482  1.1.1.2  mrg #define INT_LEAST32_TYPE "int"
    483  1.1.1.2  mrg 
    484  1.1.1.2  mrg #undef INT_LEAST64_TYPE
    485  1.1.1.2  mrg #define INT_LEAST64_TYPE INT64_TYPE
    486  1.1.1.2  mrg 
    487  1.1.1.2  mrg #undef UINT_LEAST8_TYPE
    488  1.1.1.2  mrg #define UINT_LEAST8_TYPE UINT8_TYPE
    489  1.1.1.2  mrg 
    490  1.1.1.2  mrg #undef UINT_LEAST16_TYPE
    491  1.1.1.2  mrg #define UINT_LEAST16_TYPE UINT16_TYPE
    492  1.1.1.2  mrg 
    493  1.1.1.2  mrg #undef UINT_LEAST32_TYPE
    494  1.1.1.2  mrg #define UINT_LEAST32_TYPE "unsigned int"
    495  1.1.1.2  mrg 
    496  1.1.1.2  mrg #undef UINT_LEAST64_TYPE
    497  1.1.1.2  mrg #define UINT_LEAST64_TYPE UINT64_TYPE
    498  1.1.1.2  mrg 
    499  1.1.1.2  mrg #undef INTMAX_TYPE
    500  1.1.1.2  mrg #define INTMAX_TYPE INT64_TYPE
    501  1.1.1.2  mrg 
    502  1.1.1.2  mrg #undef UINTMAX_TYPE
    503  1.1.1.2  mrg #define UINTMAX_TYPE UINT64_TYPE
    504      1.1  mrg 
    505      1.1  mrg /* Override rs6000.h definition.  */
    506      1.1  mrg #undef  ASM_APP_ON
    507      1.1  mrg #define ASM_APP_ON "#APP\n"
    508      1.1  mrg 
    509      1.1  mrg /* Override rs6000.h definition.  */
    510      1.1  mrg #undef  ASM_APP_OFF
    511      1.1  mrg #define ASM_APP_OFF "#NO_APP\n"
    512      1.1  mrg 
    513      1.1  mrg /* PowerPC no-op instruction.  */
    514      1.1  mrg #undef  RS6000_CALL_GLUE
    515      1.1  mrg #define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31")
    516      1.1  mrg 
    517      1.1  mrg #undef  RS6000_MCOUNT
    518      1.1  mrg #define RS6000_MCOUNT "_mcount"
    519      1.1  mrg 
    520      1.1  mrg #ifdef __powerpc64__
    521      1.1  mrg /* _init and _fini functions are built from bits spread across many
    522      1.1  mrg    object files, each potentially with a different TOC pointer.  For
    523      1.1  mrg    that reason, place a nop after the call so that the linker can
    524      1.1  mrg    restore the TOC pointer if a TOC adjusting call stub is needed.  */
    525      1.1  mrg #if DOT_SYMBOLS
    526      1.1  mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
    527      1.1  mrg   asm (SECTION_OP "\n"					\
    528      1.1  mrg "	bl ." #FUNC "\n"				\
    529      1.1  mrg "	nop\n"						\
    530      1.1  mrg "	.previous");
    531      1.1  mrg #else
    532      1.1  mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
    533      1.1  mrg   asm (SECTION_OP "\n"					\
    534      1.1  mrg "	bl " #FUNC "\n"					\
    535      1.1  mrg "	nop\n"						\
    536      1.1  mrg "	.previous");
    537      1.1  mrg #endif
    538      1.1  mrg #endif
    539      1.1  mrg 
    540      1.1  mrg /* FP save and restore routines.  */
    541      1.1  mrg #undef  SAVE_FP_PREFIX
    542      1.1  mrg #define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_")
    543      1.1  mrg #undef  SAVE_FP_SUFFIX
    544      1.1  mrg #define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
    545      1.1  mrg #undef  RESTORE_FP_PREFIX
    546      1.1  mrg #define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_")
    547      1.1  mrg #undef  RESTORE_FP_SUFFIX
    548      1.1  mrg #define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
    549      1.1  mrg 
    550      1.1  mrg /* Dwarf2 debugging.  */
    551      1.1  mrg #undef  PREFERRED_DEBUGGING_TYPE
    552      1.1  mrg #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
    553      1.1  mrg 
    554      1.1  mrg /* This is how to declare the size of a function.  */
    555      1.1  mrg #undef	ASM_DECLARE_FUNCTION_SIZE
    556      1.1  mrg #define	ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
    557      1.1  mrg   do									\
    558      1.1  mrg     {									\
    559      1.1  mrg       if (!flag_inhibit_size_directive)					\
    560      1.1  mrg 	{								\
    561      1.1  mrg 	  fputs ("\t.size\t", (FILE));					\
    562      1.1  mrg 	  if (TARGET_64BIT && DOT_SYMBOLS)				\
    563      1.1  mrg 	    putc ('.', (FILE));						\
    564      1.1  mrg 	  assemble_name ((FILE), (FNAME));				\
    565      1.1  mrg 	  fputs (",.-", (FILE));					\
    566      1.1  mrg 	  rs6000_output_function_entry (FILE, FNAME);			\
    567      1.1  mrg 	  putc ('\n', (FILE));						\
    568      1.1  mrg 	}								\
    569      1.1  mrg     }									\
    570      1.1  mrg   while (0)
    571      1.1  mrg 
    572      1.1  mrg /* Return nonzero if this entry is to be written into the constant
    573      1.1  mrg    pool in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF
    574      1.1  mrg    or a CONST containing one of them.  If -mfp-in-toc (the default),
    575      1.1  mrg    we also do this for floating-point constants.  We actually can only
    576      1.1  mrg    do this if the FP formats of the target and host machines are the
    577      1.1  mrg    same, but we can't check that since not every file that uses
    578      1.1  mrg    the macros includes real.h.  We also do this when we can write the
    579      1.1  mrg    entry into the TOC and the entry is not larger than a TOC entry.  */
    580      1.1  mrg 
    581      1.1  mrg #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
    582      1.1  mrg #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)			\
    583      1.1  mrg   (TARGET_TOC								\
    584      1.1  mrg    && (GET_CODE (X) == SYMBOL_REF					\
    585      1.1  mrg        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS	\
    586      1.1  mrg 	   && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)		\
    587      1.1  mrg        || GET_CODE (X) == LABEL_REF					\
    588      1.1  mrg        || (GET_CODE (X) == CONST_INT 					\
    589      1.1  mrg 	   && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))	\
    590      1.1  mrg        || (GET_CODE (X) == CONST_DOUBLE					\
    591      1.1  mrg 	   && ((TARGET_64BIT						\
    592      1.1  mrg 		&& (TARGET_MINIMAL_TOC					\
    593      1.1  mrg 		    || (SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
    594      1.1  mrg 			&& ! TARGET_NO_FP_IN_TOC)))			\
    595      1.1  mrg 	       || (!TARGET_64BIT					\
    596      1.1  mrg 		   && !TARGET_NO_FP_IN_TOC				\
    597      1.1  mrg 		   && !TARGET_RELOCATABLE				\
    598      1.1  mrg 		   && SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
    599      1.1  mrg 		   && BITS_PER_WORD == HOST_BITS_PER_INT)))))
    600      1.1  mrg 
    601      1.1  mrg /* Select a format to encode pointers in exception handling data.  CODE
    602      1.1  mrg    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
    603      1.1  mrg    true if the symbol may be affected by dynamic relocations.  */
    604      1.1  mrg #undef	ASM_PREFERRED_EH_DATA_FORMAT
    605      1.1  mrg #define	ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
    606      1.1  mrg   ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE)			\
    607      1.1  mrg    ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel		\
    608      1.1  mrg       | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4))		\
    609      1.1  mrg    : DW_EH_PE_absptr)
    610      1.1  mrg 
    611      1.1  mrg /* For backward compatibility, we must continue to use the AIX
    612      1.1  mrg    structure return convention.  */
    613      1.1  mrg #undef DRAFT_V4_STRUCT_RET
    614      1.1  mrg #define DRAFT_V4_STRUCT_RET (!TARGET_64BIT)
    615      1.1  mrg 
    616      1.1  mrg #define TARGET_POSIX_IO
    617      1.1  mrg 
    618      1.1  mrg #define LINK_GCC_C_SEQUENCE_SPEC \
    619      1.1  mrg   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
    620      1.1  mrg 
    621      1.1  mrg /* Use --as-needed -lgcc_s for eh support.  */
    622      1.1  mrg #ifdef HAVE_LD_AS_NEEDED
    623      1.1  mrg #define USE_LD_AS_NEEDED 1
    624      1.1  mrg #endif
    625      1.1  mrg 
    626      1.1  mrg /* NetBSD ppc64 has 128-bit long double support.  */
    627      1.1  mrg #undef	RS6000_DEFAULT_LONG_DOUBLE_SIZE
    628      1.1  mrg #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
    629      1.1  mrg #define POWERPC_NETBSD
    630