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