netbsd64.h revision 1.1.1.7 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 /* 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