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