netbsd64.h revision 1.1.1.1 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 mrg #undef PROCESSOR_DEFAULT
63 1.1 mrg #define PROCESSOR_DEFAULT PROCESSOR_POWER4
64 1.1 mrg #undef PROCESSOR_DEFAULT64
65 1.1 mrg #define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
66 1.1 mrg
67 1.1 mrg /* We don't need to generate entries in .fixup, except when
68 1.1 mrg -mrelocatable or -mrelocatable-lib is given. */
69 1.1 mrg #undef RELOCATABLE_NEEDS_FIXUP
70 1.1 mrg #define RELOCATABLE_NEEDS_FIXUP \
71 1.1 mrg (target_flags & target_flags_explicit & MASK_RELOCATABLE)
72 1.1 mrg
73 1.1 mrg #undef RS6000_ABI_NAME
74 1.1 mrg #define RS6000_ABI_NAME "netbsd"
75 1.1 mrg
76 1.1 mrg #define INVALID_64BIT "-m%s not supported in this configuration"
77 1.1 mrg #define INVALID_32BIT INVALID_64BIT
78 1.1 mrg
79 1.1 mrg #undef SUBSUBTARGET_OVERRIDE_OPTIONS
80 1.1 mrg #define SUBSUBTARGET_OVERRIDE_OPTIONS \
81 1.1 mrg do \
82 1.1 mrg { \
83 1.1 mrg if (!rs6000_explicit_options.alignment) \
84 1.1 mrg rs6000_alignment_flags = MASK_ALIGN_NATURAL; \
85 1.1 mrg if (TARGET_64BIT) \
86 1.1 mrg { \
87 1.1 mrg if (DEFAULT_ABI != ABI_AIX) \
88 1.1 mrg { \
89 1.1 mrg rs6000_current_abi = ABI_AIX; \
90 1.1 mrg error (INVALID_64BIT, "call"); \
91 1.1 mrg } \
92 1.1 mrg dot_symbols = !strcmp (rs6000_abi_name, "aixdesc"); \
93 1.1 mrg if (target_flags & MASK_RELOCATABLE) \
94 1.1 mrg { \
95 1.1 mrg target_flags &= ~MASK_RELOCATABLE; \
96 1.1 mrg error (INVALID_64BIT, "relocatable"); \
97 1.1 mrg } \
98 1.1 mrg if (target_flags & MASK_EABI) \
99 1.1 mrg { \
100 1.1 mrg target_flags &= ~MASK_EABI; \
101 1.1 mrg error (INVALID_64BIT, "eabi"); \
102 1.1 mrg } \
103 1.1 mrg if (TARGET_PROTOTYPE) \
104 1.1 mrg { \
105 1.1 mrg target_prototype = 0; \
106 1.1 mrg error (INVALID_64BIT, "prototype"); \
107 1.1 mrg } \
108 1.1 mrg if ((target_flags & MASK_POWERPC64) == 0) \
109 1.1 mrg { \
110 1.1 mrg target_flags |= MASK_POWERPC64; \
111 1.1 mrg error ("-m64 requires a PowerPC64 cpu"); \
112 1.1 mrg } \
113 1.1 mrg } \
114 1.1 mrg else \
115 1.1 mrg { \
116 1.1 mrg if (!RS6000_BI_ARCH_P) \
117 1.1 mrg error (INVALID_32BIT, "32"); \
118 1.1 mrg if (TARGET_PROFILE_KERNEL) \
119 1.1 mrg { \
120 1.1 mrg TARGET_PROFILE_KERNEL = 0; \
121 1.1 mrg error (INVALID_32BIT, "profile-kernel"); \
122 1.1 mrg } \
123 1.1 mrg } \
124 1.1 mrg } \
125 1.1 mrg while (0)
126 1.1 mrg
127 1.1 mrg #ifdef RS6000_BI_ARCH
128 1.1 mrg
129 1.1 mrg #undef OVERRIDE_OPTIONS
130 1.1 mrg #define OVERRIDE_OPTIONS \
131 1.1 mrg rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
132 1.1 mrg ? (char *) 0 : TARGET_CPU_DEFAULT)
133 1.1 mrg
134 1.1 mrg #endif
135 1.1 mrg
136 1.1 mrg #undef ASM_DEFAULT_SPEC
137 1.1 mrg #undef ASM_SPEC
138 1.1 mrg #undef LINK_OS_NETBSD_SPEC
139 1.1 mrg
140 1.1 mrg #ifndef RS6000_BI_ARCH
141 1.1 mrg #define ASM_DEFAULT_SPEC "-mppc64"
142 1.1 mrg #define ASM_SPEC "%(asm_spec64) %(asm_spec_common)"
143 1.1 mrg #define LINK_OS_NETBSD_SPEC "%(link_os_netbsd_spec64)"
144 1.1 mrg #else
145 1.1 mrg #if DEFAULT_ARCH64_P
146 1.1 mrg #define ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
147 1.1 mrg #define ASM_SPEC "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
148 1.1 mrg #define LINK_OS_NETBSD_SPEC "%{m32:%(link_os_netbsd_spec32)}%{!m32:%(link_os_netbsd_spec64)}"
149 1.1 mrg #else
150 1.1 mrg #define ASM_DEFAULT_SPEC "-mppc%{m64:64}"
151 1.1 mrg #define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
152 1.1 mrg #define LINK_OS_NETBSD_SPEC "%{!m64:%(link_os_netbsd_spec32)}%{m64:%(link_os_netbsd_spec64)}"
153 1.1 mrg #endif
154 1.1 mrg #endif
155 1.1 mrg
156 1.1 mrg #define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \
157 1.1 mrg %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
158 1.1 mrg %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
159 1.1 mrg %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
160 1.1 mrg %{mcall-freebsd: -mbig} \
161 1.1 mrg %{mcall-i960-old: -mlittle} \
162 1.1 mrg %{mcall-linux: -mbig} \
163 1.1 mrg %{mcall-gnu: -mbig} \
164 1.1 mrg %{mcall-netbsd: -mbig} \
165 1.1 mrg }}}}"
166 1.1 mrg
167 1.1 mrg #define ASM_SPEC64 "-a64"
168 1.1 mrg
169 1.1 mrg #define ASM_SPEC_COMMON "%(asm_cpu) \
170 1.1 mrg %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
171 1.1 mrg %{v:-V} %{Qy:} %{!Qn:-Qy} %{Wa,*:%*} \
172 1.1 mrg %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian}"
173 1.1 mrg
174 1.1 mrg #undef SUBSUBTARGET_EXTRA_SPECS
175 1.1 mrg #define SUBSUBTARGET_EXTRA_SPECS \
176 1.1 mrg { "asm_spec_common", ASM_SPEC_COMMON }, \
177 1.1 mrg { "asm_spec32", ASM_SPEC32 }, \
178 1.1 mrg { "asm_spec64", ASM_SPEC64 }, \
179 1.1 mrg { "link_os_netbsd_spec32", LINK_OS_NETBSD_SPEC32 }, \
180 1.1 mrg { "link_os_netbsd_spec64", LINK_OS_NETBSD_SPEC64 },
181 1.1 mrg
182 1.1 mrg #undef MULTILIB_DEFAULTS
183 1.1 mrg #if DEFAULT_ARCH64_P
184 1.1 mrg #define MULTILIB_DEFAULTS { "m64" }
185 1.1 mrg #else
186 1.1 mrg #define MULTILIB_DEFAULTS { "m32" }
187 1.1 mrg #endif
188 1.1 mrg
189 1.1 mrg #ifndef RS6000_BI_ARCH
190 1.1 mrg
191 1.1 mrg /* 64-bit PowerPC NetBSD is always big-endian. */
192 1.1 mrg #undef TARGET_LITTLE_ENDIAN
193 1.1 mrg #define TARGET_LITTLE_ENDIAN 0
194 1.1 mrg
195 1.1 mrg /* 64-bit PowerPC NetBSD always has a TOC. */
196 1.1 mrg #undef TARGET_TOC
197 1.1 mrg #define TARGET_TOC 1
198 1.1 mrg
199 1.1 mrg /* Some things from sysv4.h we don't do when 64 bit. */
200 1.1 mrg #undef TARGET_RELOCATABLE
201 1.1 mrg #define TARGET_RELOCATABLE 0
202 1.1 mrg #undef TARGET_EABI
203 1.1 mrg #define TARGET_EABI 0
204 1.1 mrg #undef TARGET_PROTOTYPE
205 1.1 mrg #define TARGET_PROTOTYPE 0
206 1.1 mrg #undef RELOCATABLE_NEEDS_FIXUP
207 1.1 mrg #define RELOCATABLE_NEEDS_FIXUP 0
208 1.1 mrg
209 1.1 mrg #endif
210 1.1 mrg
211 1.1 mrg /* PowerPC64 NetBSD word-aligns FP doubles when -malign-power is given. */
212 1.1 mrg #undef ADJUST_FIELD_ALIGN
213 1.1 mrg #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
214 1.1 mrg ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
215 1.1 mrg ? 128 \
216 1.1 mrg : (TARGET_64BIT \
217 1.1 mrg && TARGET_ALIGN_NATURAL == 0 \
218 1.1 mrg && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode) \
219 1.1 mrg ? MIN ((COMPUTED), 32) \
220 1.1 mrg : (COMPUTED))
221 1.1 mrg
222 1.1 mrg /* PowerPC64 NetBSD increases natural record alignment to doubleword if
223 1.1 mrg the first field is an FP double, only if in power alignment mode. */
224 1.1 mrg #undef ROUND_TYPE_ALIGN
225 1.1 mrg #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
226 1.1 mrg ((TARGET_64BIT \
227 1.1 mrg && (TREE_CODE (STRUCT) == RECORD_TYPE \
228 1.1 mrg || TREE_CODE (STRUCT) == UNION_TYPE \
229 1.1 mrg || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
230 1.1 mrg && TARGET_ALIGN_NATURAL == 0) \
231 1.1 mrg ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED) \
232 1.1 mrg : MAX ((COMPUTED), (SPECIFIED)))
233 1.1 mrg
234 1.1 mrg /* Use the default for compiling target libs. */
235 1.1 mrg #ifdef IN_TARGET_LIBS
236 1.1 mrg #undef TARGET_ALIGN_NATURAL
237 1.1 mrg #define TARGET_ALIGN_NATURAL 1
238 1.1 mrg #endif
239 1.1 mrg
240 1.1 mrg /* Indicate that jump tables go in the text section. */
241 1.1 mrg #undef JUMP_TABLES_IN_TEXT_SECTION
242 1.1 mrg #define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT
243 1.1 mrg
244 1.1 mrg /* The linux ppc64 ABI isn't explicit on whether aggregates smaller
245 1.1 mrg than a doubleword should be padded upward or downward. You could
246 1.1 mrg reasonably assume that they follow the normal rules for structure
247 1.1 mrg layout treating the parameter area as any other block of memory,
248 1.1 mrg then map the reg param area to registers. i.e. pad upward.
249 1.1 mrg Setting both of the following defines results in this behavior.
250 1.1 mrg Setting just the first one will result in aggregates that fit in a
251 1.1 mrg doubleword being padded downward, and others being padded upward.
252 1.1 mrg Not a bad idea as this results in struct { int x; } being passed
253 1.1 mrg the same way as an int. */
254 1.1 mrg #define AGGREGATE_PADDING_FIXED TARGET_64BIT
255 1.1 mrg #define AGGREGATES_PAD_UPWARD_ALWAYS 0
256 1.1 mrg
257 1.1 mrg /* Specify padding for the last element of a block move between
258 1.1 mrg registers and memory. FIRST is nonzero if this is the only
259 1.1 mrg element. */
260 1.1 mrg #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
261 1.1 mrg (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
262 1.1 mrg
263 1.1 mrg /* Override svr4.h */
264 1.1 mrg #undef MD_EXEC_PREFIX
265 1.1 mrg #undef MD_STARTFILE_PREFIX
266 1.1 mrg
267 1.1 mrg /* NetBSD doesn't support saving and restoring 64-bit regs in a 32-bit
268 1.1 mrg process. XXXMRG? */
269 1.1 mrg #define OS_MISSING_POWERPC64 !TARGET_64BIT
270 1.1 mrg
271 1.1 mrg /* NetBSD has float and long double forms of math functions. */
272 1.1 mrg #undef TARGET_C99_FUNCTIONS
273 1.1 mrg #define TARGET_C99_FUNCTIONS 1
274 1.1 mrg
275 1.1 mrg /* NetBSD doesn't have sincos that follows the GNU extension. */
276 1.1 mrg #undef TARGET_HAS_SINCOS
277 1.1 mrg
278 1.1 mrg #undef TARGET_OS_CPP_BUILTINS
279 1.1 mrg #define TARGET_OS_CPP_BUILTINS() \
280 1.1 mrg do \
281 1.1 mrg { \
282 1.1 mrg NETBSD_OS_CPP_BUILTINS_ELF(); \
283 1.1 mrg if (TARGET_64BIT) \
284 1.1 mrg { \
285 1.1 mrg builtin_define ("__PPC__"); \
286 1.1 mrg builtin_define ("__PPC64__"); \
287 1.1 mrg builtin_define ("__powerpc__"); \
288 1.1 mrg builtin_define ("__powerpc64__"); \
289 1.1 mrg builtin_define_with_int_value ("__PIC__", 2); \
290 1.1 mrg builtin_assert ("cpu=powerpc64"); \
291 1.1 mrg builtin_assert ("machine=powerpc64"); \
292 1.1 mrg } \
293 1.1 mrg else \
294 1.1 mrg { \
295 1.1 mrg builtin_define_std ("PPC"); \
296 1.1 mrg builtin_define_std ("powerpc"); \
297 1.1 mrg builtin_assert ("cpu=powerpc"); \
298 1.1 mrg builtin_assert ("machine=powerpc"); \
299 1.1 mrg TARGET_OS_SYSV_CPP_BUILTINS (); \
300 1.1 mrg } \
301 1.1 mrg } \
302 1.1 mrg while (0)
303 1.1 mrg
304 1.1 mrg /* Override the default from rs6000.h to avoid conflicts with macros
305 1.1 mrg defined in NetBSD header files. */
306 1.1 mrg
307 1.1 mrg #undef RS6000_CPU_CPP_ENDIAN_BUILTINS
308 1.1 mrg #define RS6000_CPU_CPP_ENDIAN_BUILTINS() \
309 1.1 mrg do \
310 1.1 mrg { \
311 1.1 mrg builtin_define ("__BIG_ENDIAN__"); \
312 1.1 mrg builtin_assert ("machine=bigendian"); \
313 1.1 mrg } \
314 1.1 mrg while (0)
315 1.1 mrg
316 1.1 mrg #undef CPP_OS_DEFAULT_SPEC
317 1.1 mrg #define CPP_OS_DEFAULT_SPEC "%(cpp_os_netbsd)"
318 1.1 mrg
319 1.1 mrg #undef LINK_SHLIB_SPEC
320 1.1 mrg #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
321 1.1 mrg
322 1.1 mrg #undef LIB_DEFAULT_SPEC
323 1.1 mrg #define LIB_DEFAULT_SPEC "%(lib_netbsd)"
324 1.1 mrg
325 1.1 mrg #undef STARTFILE_DEFAULT_SPEC
326 1.1 mrg #define STARTFILE_DEFAULT_SPEC "%(startfile_netbsd)"
327 1.1 mrg
328 1.1 mrg #undef ENDFILE_DEFAULT_SPEC
329 1.1 mrg #define ENDFILE_DEFAULT_SPEC "%(endfile_netbsd)"
330 1.1 mrg
331 1.1 mrg #undef CRTSAVRES_DEFAULT_SPEC
332 1.1 mrg #define CRTSAVRES_DEFAULT_SPEC ""
333 1.1 mrg
334 1.1 mrg #undef LINK_START_DEFAULT_SPEC
335 1.1 mrg #define LINK_START_DEFAULT_SPEC "%(link_start_netbsd)"
336 1.1 mrg
337 1.1 mrg #undef LINK_OS_DEFAULT_SPEC
338 1.1 mrg #define LINK_OS_DEFAULT_SPEC "%(link_os_netbsd)"
339 1.1 mrg
340 1.1 mrg #define LINK_OS_NETBSD_SPEC32 "-m elf32ppc %{!shared: %{!static: \
341 1.1 mrg %{rdynamic:-export-dynamic} \
342 1.1 mrg %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
343 1.1 mrg
344 1.1 mrg #define LINK_OS_NETBSD_SPEC64 "-m elf64ppc %{!shared: %{!static: \
345 1.1 mrg %{rdynamic:-export-dynamic} \
346 1.1 mrg %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
347 1.1 mrg
348 1.1 mrg #undef TOC_SECTION_ASM_OP
349 1.1 mrg #define TOC_SECTION_ASM_OP \
350 1.1 mrg (TARGET_64BIT \
351 1.1 mrg ? "\t.section\t\".toc\",\"aw\"" \
352 1.1 mrg : "\t.section\t\".got\",\"aw\"")
353 1.1 mrg
354 1.1 mrg #undef MINIMAL_TOC_SECTION_ASM_OP
355 1.1 mrg #define MINIMAL_TOC_SECTION_ASM_OP \
356 1.1 mrg (TARGET_64BIT \
357 1.1 mrg ? "\t.section\t\".toc1\",\"aw\"" \
358 1.1 mrg : ((TARGET_RELOCATABLE || flag_pic) \
359 1.1 mrg ? "\t.section\t\".got2\",\"aw\"" \
360 1.1 mrg : "\t.section\t\".got1\",\"aw\""))
361 1.1 mrg
362 1.1 mrg #undef TARGET_VERSION
363 1.1 mrg #define TARGET_VERSION fprintf (stderr, " (PowerPC64 NetBSD)");
364 1.1 mrg
365 1.1 mrg /* Make GCC agree with <machine/ansi.h>. */
366 1.1 mrg
367 1.1 mrg #undef SIZE_TYPE
368 1.1 mrg #define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int")
369 1.1 mrg
370 1.1 mrg #undef PTRDIFF_TYPE
371 1.1 mrg #define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
372 1.1 mrg
373 1.1 mrg #undef WCHAR_TYPE
374 1.1 mrg #define WCHAR_TYPE (TARGET_64BIT ? "int" : "long int")
375 1.1 mrg #undef WCHAR_TYPE_SIZE
376 1.1 mrg #define WCHAR_TYPE_SIZE 32
377 1.1 mrg
378 1.1 mrg /* Override rs6000.h definition. */
379 1.1 mrg #undef ASM_APP_ON
380 1.1 mrg #define ASM_APP_ON "#APP\n"
381 1.1 mrg
382 1.1 mrg /* Override rs6000.h definition. */
383 1.1 mrg #undef ASM_APP_OFF
384 1.1 mrg #define ASM_APP_OFF "#NO_APP\n"
385 1.1 mrg
386 1.1 mrg /* PowerPC no-op instruction. */
387 1.1 mrg #undef RS6000_CALL_GLUE
388 1.1 mrg #define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31")
389 1.1 mrg
390 1.1 mrg #undef RS6000_MCOUNT
391 1.1 mrg #define RS6000_MCOUNT "_mcount"
392 1.1 mrg
393 1.1 mrg #ifdef __powerpc64__
394 1.1 mrg /* _init and _fini functions are built from bits spread across many
395 1.1 mrg object files, each potentially with a different TOC pointer. For
396 1.1 mrg that reason, place a nop after the call so that the linker can
397 1.1 mrg restore the TOC pointer if a TOC adjusting call stub is needed. */
398 1.1 mrg #if DOT_SYMBOLS
399 1.1 mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
400 1.1 mrg asm (SECTION_OP "\n" \
401 1.1 mrg " bl ." #FUNC "\n" \
402 1.1 mrg " nop\n" \
403 1.1 mrg " .previous");
404 1.1 mrg #else
405 1.1 mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
406 1.1 mrg asm (SECTION_OP "\n" \
407 1.1 mrg " bl " #FUNC "\n" \
408 1.1 mrg " nop\n" \
409 1.1 mrg " .previous");
410 1.1 mrg #endif
411 1.1 mrg #endif
412 1.1 mrg
413 1.1 mrg /* FP save and restore routines. */
414 1.1 mrg #undef SAVE_FP_PREFIX
415 1.1 mrg #define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_")
416 1.1 mrg #undef SAVE_FP_SUFFIX
417 1.1 mrg #define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
418 1.1 mrg #undef RESTORE_FP_PREFIX
419 1.1 mrg #define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_")
420 1.1 mrg #undef RESTORE_FP_SUFFIX
421 1.1 mrg #define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
422 1.1 mrg
423 1.1 mrg /* Dwarf2 debugging. */
424 1.1 mrg #undef PREFERRED_DEBUGGING_TYPE
425 1.1 mrg #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
426 1.1 mrg
427 1.1 mrg /* This is how to declare the size of a function. */
428 1.1 mrg #undef ASM_DECLARE_FUNCTION_SIZE
429 1.1 mrg #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
430 1.1 mrg do \
431 1.1 mrg { \
432 1.1 mrg if (!flag_inhibit_size_directive) \
433 1.1 mrg { \
434 1.1 mrg fputs ("\t.size\t", (FILE)); \
435 1.1 mrg if (TARGET_64BIT && DOT_SYMBOLS) \
436 1.1 mrg putc ('.', (FILE)); \
437 1.1 mrg assemble_name ((FILE), (FNAME)); \
438 1.1 mrg fputs (",.-", (FILE)); \
439 1.1 mrg rs6000_output_function_entry (FILE, FNAME); \
440 1.1 mrg putc ('\n', (FILE)); \
441 1.1 mrg } \
442 1.1 mrg } \
443 1.1 mrg while (0)
444 1.1 mrg
445 1.1 mrg /* Return nonzero if this entry is to be written into the constant
446 1.1 mrg pool in a special way. We do so if this is a SYMBOL_REF, LABEL_REF
447 1.1 mrg or a CONST containing one of them. If -mfp-in-toc (the default),
448 1.1 mrg we also do this for floating-point constants. We actually can only
449 1.1 mrg do this if the FP formats of the target and host machines are the
450 1.1 mrg same, but we can't check that since not every file that uses
451 1.1 mrg the macros includes real.h. We also do this when we can write the
452 1.1 mrg entry into the TOC and the entry is not larger than a TOC entry. */
453 1.1 mrg
454 1.1 mrg #undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
455 1.1 mrg #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \
456 1.1 mrg (TARGET_TOC \
457 1.1 mrg && (GET_CODE (X) == SYMBOL_REF \
458 1.1 mrg || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \
459 1.1 mrg && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF) \
460 1.1 mrg || GET_CODE (X) == LABEL_REF \
461 1.1 mrg || (GET_CODE (X) == CONST_INT \
462 1.1 mrg && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \
463 1.1 mrg || (GET_CODE (X) == CONST_DOUBLE \
464 1.1 mrg && ((TARGET_64BIT \
465 1.1 mrg && (TARGET_MINIMAL_TOC \
466 1.1 mrg || (SCALAR_FLOAT_MODE_P (GET_MODE (X)) \
467 1.1 mrg && ! TARGET_NO_FP_IN_TOC))) \
468 1.1 mrg || (!TARGET_64BIT \
469 1.1 mrg && !TARGET_NO_FP_IN_TOC \
470 1.1 mrg && !TARGET_RELOCATABLE \
471 1.1 mrg && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \
472 1.1 mrg && BITS_PER_WORD == HOST_BITS_PER_INT)))))
473 1.1 mrg
474 1.1 mrg /* This ABI cannot use DBX_LINES_FUNCTION_RELATIVE, nor can it use
475 1.1 mrg dbxout_stab_value_internal_label_diff, because we must
476 1.1 mrg use the function code label, not the function descriptor label. */
477 1.1 mrg #define DBX_OUTPUT_SOURCE_LINE(FILE, LINE, COUNTER) \
478 1.1 mrg do \
479 1.1 mrg { \
480 1.1 mrg char temp[256]; \
481 1.1 mrg const char *s; \
482 1.1 mrg ASM_GENERATE_INTERNAL_LABEL (temp, "LM", COUNTER); \
483 1.1 mrg dbxout_begin_stabn_sline (LINE); \
484 1.1 mrg assemble_name (FILE, temp); \
485 1.1 mrg putc ('-', FILE); \
486 1.1 mrg s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \
487 1.1 mrg rs6000_output_function_entry (FILE, s); \
488 1.1 mrg putc ('\n', FILE); \
489 1.1 mrg targetm.asm_out.internal_label (FILE, "LM", COUNTER); \
490 1.1 mrg COUNTER += 1; \
491 1.1 mrg } \
492 1.1 mrg while (0)
493 1.1 mrg
494 1.1 mrg /* Similarly, we want the function code label here. Cannot use
495 1.1 mrg dbxout_stab_value_label_diff, as we have to use
496 1.1 mrg rs6000_output_function_entry. FIXME. */
497 1.1 mrg #define DBX_OUTPUT_BRAC(FILE, NAME, BRAC) \
498 1.1 mrg do \
499 1.1 mrg { \
500 1.1 mrg const char *s; \
501 1.1 mrg dbxout_begin_stabn (BRAC); \
502 1.1 mrg s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \
503 1.1 mrg /* dbxout_block passes this macro the function name as NAME, \
504 1.1 mrg assuming that it is the function code start label. In our \
505 1.1 mrg case, the function name is the OPD entry. dbxout_block is \
506 1.1 mrg broken, hack around it here. */ \
507 1.1 mrg if (NAME == s) \
508 1.1 mrg putc ('0', FILE); \
509 1.1 mrg else \
510 1.1 mrg { \
511 1.1 mrg assemble_name (FILE, NAME); \
512 1.1 mrg putc ('-', FILE); \
513 1.1 mrg rs6000_output_function_entry (FILE, s); \
514 1.1 mrg } \
515 1.1 mrg putc ('\n', FILE); \
516 1.1 mrg } \
517 1.1 mrg while (0)
518 1.1 mrg
519 1.1 mrg #define DBX_OUTPUT_LBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_LBRAC)
520 1.1 mrg #define DBX_OUTPUT_RBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_RBRAC)
521 1.1 mrg
522 1.1 mrg /* Another case where we want the dot name. */
523 1.1 mrg #define DBX_OUTPUT_NFUN(FILE, LSCOPE, DECL) \
524 1.1 mrg do \
525 1.1 mrg { \
526 1.1 mrg const char *s; \
527 1.1 mrg dbxout_begin_empty_stabs (N_FUN); \
528 1.1 mrg assemble_name (FILE, LSCOPE); \
529 1.1 mrg putc ('-', FILE); \
530 1.1 mrg s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \
531 1.1 mrg rs6000_output_function_entry (FILE, s); \
532 1.1 mrg putc ('\n', FILE); \
533 1.1 mrg } \
534 1.1 mrg while (0)
535 1.1 mrg
536 1.1 mrg /* Select a format to encode pointers in exception handling data. CODE
537 1.1 mrg is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
538 1.1 mrg true if the symbol may be affected by dynamic relocations. */
539 1.1 mrg #undef ASM_PREFERRED_EH_DATA_FORMAT
540 1.1 mrg #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
541 1.1 mrg ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \
542 1.1 mrg ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \
543 1.1 mrg | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \
544 1.1 mrg : DW_EH_PE_absptr)
545 1.1 mrg
546 1.1 mrg /* For backward compatibility, we must continue to use the AIX
547 1.1 mrg structure return convention. */
548 1.1 mrg #undef DRAFT_V4_STRUCT_RET
549 1.1 mrg #define DRAFT_V4_STRUCT_RET (!TARGET_64BIT)
550 1.1 mrg
551 1.1 mrg #define TARGET_ASM_FILE_END rs6000_elf_end_indicate_exec_stack
552 1.1 mrg
553 1.1 mrg #define TARGET_POSIX_IO
554 1.1 mrg
555 1.1 mrg #define LINK_GCC_C_SEQUENCE_SPEC \
556 1.1 mrg "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
557 1.1 mrg
558 1.1 mrg /* Use --as-needed -lgcc_s for eh support. */
559 1.1 mrg #ifdef HAVE_LD_AS_NEEDED
560 1.1 mrg #define USE_LD_AS_NEEDED 1
561 1.1 mrg #endif
562 1.1 mrg
563 1.1 mrg /* NetBSD ppc64 has 128-bit long double support. */
564 1.1 mrg #undef RS6000_DEFAULT_LONG_DOUBLE_SIZE
565 1.1 mrg #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
566 1.1 mrg #define POWERPC_NETBSD
567