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