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