Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/rs6000/darwin.h @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children | f6334be47118 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 /* Target definitions for PowerPC running Darwin (Mac OS X). | |
2 Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008 | |
3 Free Software Foundation, Inc. | |
4 Contributed by Apple Computer Inc. | |
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 3, 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 COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 #undef TARGET_VERSION | |
23 #define TARGET_VERSION fprintf (stderr, " (Darwin/PowerPC)"); | |
24 | |
25 /* The "Darwin ABI" is mostly like AIX, but with some key differences. */ | |
26 | |
27 #define DEFAULT_ABI ABI_DARWIN | |
28 | |
29 #ifdef IN_LIBGCC2 | |
30 #undef TARGET_64BIT | |
31 #ifdef __powerpc64__ | |
32 #define TARGET_64BIT 1 | |
33 #else | |
34 #define TARGET_64BIT 0 | |
35 #endif | |
36 #endif | |
37 | |
38 /* The object file format is Mach-O. */ | |
39 | |
40 #define TARGET_OBJECT_FORMAT OBJECT_MACHO | |
41 | |
42 /* Size of the Obj-C jump buffer. */ | |
43 #define OBJC_JBLEN ((TARGET_64BIT) ? (26*2 + 18*2 + 129 + 1) : (26 + 18*2 + 129 + 1)) | |
44 | |
45 /* We're not ever going to do TOCs. */ | |
46 | |
47 #define TARGET_TOC 0 | |
48 #define TARGET_NO_TOC 1 | |
49 | |
50 /* Override the default rs6000 definition. */ | |
51 #undef PTRDIFF_TYPE | |
52 #define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") | |
53 | |
54 /* Translate config/rs6000/darwin.opt to config/darwin.h. */ | |
55 #define TARGET_DYNAMIC_NO_PIC (TARGET_MACHO_DYNAMIC_NO_PIC) | |
56 | |
57 #define TARGET_OS_CPP_BUILTINS() \ | |
58 do \ | |
59 { \ | |
60 if (!TARGET_64BIT) builtin_define ("__ppc__"); \ | |
61 if (TARGET_64BIT) builtin_define ("__ppc64__"); \ | |
62 builtin_define ("__POWERPC__"); \ | |
63 builtin_define ("__NATURAL_ALIGNMENT__"); \ | |
64 darwin_cpp_builtins (pfile); \ | |
65 } \ | |
66 while (0) | |
67 | |
68 #define SUBTARGET_OVERRIDE_OPTIONS darwin_rs6000_override_options () | |
69 | |
70 #define C_COMMON_OVERRIDE_OPTIONS do { \ | |
71 /* On powerpc, __cxa_get_exception_ptr is available starting in the \ | |
72 10.4.6 libstdc++.dylib. */ \ | |
73 if (strverscmp (darwin_macosx_version_min, "10.4.6") < 0 \ | |
74 && flag_use_cxa_get_exception_ptr == 2) \ | |
75 flag_use_cxa_get_exception_ptr = 0; \ | |
76 if (flag_mkernel) \ | |
77 flag_no_builtin = 1; \ | |
78 SUBTARGET_C_COMMON_OVERRIDE_OPTIONS; \ | |
79 } while (0) | |
80 | |
81 /* Darwin has 128-bit long double support in libc in 10.4 and later. | |
82 Default to 128-bit long doubles even on earlier platforms for ABI | |
83 consistency; arithmetic will work even if libc and libm support is | |
84 not available. */ | |
85 | |
86 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128 | |
87 | |
88 | |
89 /* We want -fPIC by default, unless we're using -static to compile for | |
90 the kernel or some such. */ | |
91 | |
92 #define CC1_SPEC "\ | |
93 %(cc1_cpu) \ | |
94 %{g: %{!fno-eliminate-unused-debug-symbols: -feliminate-unused-debug-symbols }} \ | |
95 %{static: %{Zdynamic: %e conflicting code gen style switches are used}}\ | |
96 %{!mmacosx-version-min=*:-mmacosx-version-min=%(darwin_minversion)} \ | |
97 %{!mkernel:%{!static:%{!mdynamic-no-pic:-fPIC}}}" | |
98 | |
99 #define DARWIN_ARCH_SPEC "%{m64:ppc64;:ppc}" | |
100 | |
101 #define DARWIN_SUBARCH_SPEC " \ | |
102 %{m64: ppc64} \ | |
103 %{!m64: \ | |
104 %{mcpu=601:ppc601; \ | |
105 mcpu=603:ppc603; \ | |
106 mcpu=603e:ppc603; \ | |
107 mcpu=604:ppc604; \ | |
108 mcpu=604e:ppc604e; \ | |
109 mcpu=740:ppc750; \ | |
110 mcpu=750:ppc750; \ | |
111 mcpu=G3:ppc750; \ | |
112 mcpu=7400:ppc7400; \ | |
113 mcpu=G4:ppc7400; \ | |
114 mcpu=7450:ppc7450; \ | |
115 mcpu=970:ppc970; \ | |
116 mcpu=power4:ppc970; \ | |
117 mcpu=G5:ppc970; \ | |
118 :ppc}}" | |
119 | |
120 /* crt2.o is at least partially required for 10.3.x and earlier. */ | |
121 #define DARWIN_CRT2_SPEC \ | |
122 "%{!m64:%:version-compare(!> 10.4 mmacosx-version-min= crt2.o%s)}" | |
123 | |
124 /* Determine a minimum version based on compiler options. */ | |
125 #define DARWIN_MINVERSION_SPEC \ | |
126 "%{m64:%{fgnu-runtime:10.4; \ | |
127 ,objective-c|,objc-cpp-output:10.5; \ | |
128 ,objective-c-header:10.5; \ | |
129 ,objective-c++|,objective-c++-cpp-output:10.5; \ | |
130 ,objective-c++-header|,objc++-cpp-output:10.5; \ | |
131 :10.4}; \ | |
132 shared-libgcc:10.3; \ | |
133 :10.1}" | |
134 | |
135 #undef SUBTARGET_EXTRA_SPECS | |
136 #define SUBTARGET_EXTRA_SPECS \ | |
137 DARWIN_EXTRA_SPECS \ | |
138 { "darwin_arch", DARWIN_ARCH_SPEC }, \ | |
139 { "darwin_crt2", DARWIN_CRT2_SPEC }, \ | |
140 { "darwin_subarch", DARWIN_SUBARCH_SPEC }, | |
141 | |
142 /* Output a .machine directive. */ | |
143 #undef TARGET_ASM_FILE_START | |
144 #define TARGET_ASM_FILE_START rs6000_darwin_file_start | |
145 | |
146 /* The "-faltivec" option should have been called "-maltivec" all | |
147 along. -ffix-and-continue and -findirect-data is for compatibility | |
148 for old compilers. */ | |
149 | |
150 #define SUBTARGET_OPTION_TRANSLATE_TABLE \ | |
151 { "-ffix-and-continue", "-mfix-and-continue" }, \ | |
152 { "-findirect-data", "-mfix-and-continue" }, \ | |
153 { "-faltivec", "-maltivec -include altivec.h" }, \ | |
154 { "-fno-altivec", "-mno-altivec" }, \ | |
155 { "-Waltivec-long-deprecated", "-mwarn-altivec-long" }, \ | |
156 { "-Wno-altivec-long-deprecated", "-mno-warn-altivec-long" } | |
157 | |
158 /* Make both r2 and r13 available for allocation. */ | |
159 #define FIXED_R2 0 | |
160 #define FIXED_R13 0 | |
161 | |
162 /* Base register for access to local variables of the function. */ | |
163 | |
164 #undef HARD_FRAME_POINTER_REGNUM | |
165 #define HARD_FRAME_POINTER_REGNUM 30 | |
166 | |
167 #undef RS6000_PIC_OFFSET_TABLE_REGNUM | |
168 #define RS6000_PIC_OFFSET_TABLE_REGNUM 31 | |
169 | |
170 /* Pad the outgoing args area to 16 bytes instead of the usual 8. */ | |
171 | |
172 #undef STARTING_FRAME_OFFSET | |
173 #define STARTING_FRAME_OFFSET \ | |
174 (FRAME_GROWS_DOWNWARD \ | |
175 ? 0 \ | |
176 : (RS6000_ALIGN (crtl->outgoing_args_size, 16) \ | |
177 + RS6000_SAVE_AREA)) | |
178 | |
179 #undef STACK_DYNAMIC_OFFSET | |
180 #define STACK_DYNAMIC_OFFSET(FUNDECL) \ | |
181 (RS6000_ALIGN (crtl->outgoing_args_size, 16) \ | |
182 + (STACK_POINTER_OFFSET)) | |
183 | |
184 /* These are used by -fbranch-probabilities */ | |
185 #define HOT_TEXT_SECTION_NAME "__TEXT,__text,regular,pure_instructions" | |
186 #define UNLIKELY_EXECUTED_TEXT_SECTION_NAME \ | |
187 "__TEXT,__unlikely,regular,pure_instructions" | |
188 | |
189 /* Define cutoff for using external functions to save floating point. | |
190 Currently on Darwin, always use inline stores. */ | |
191 | |
192 #undef FP_SAVE_INLINE | |
193 #define FP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 64) | |
194 #undef GP_SAVE_INLINE | |
195 #define GP_SAVE_INLINE(FIRST_REG) ((FIRST_REG) < 32) | |
196 | |
197 /* Darwin uses a function call if everything needs to be saved/restored. */ | |
198 #undef WORLD_SAVE_P | |
199 #define WORLD_SAVE_P(INFO) ((INFO)->world_save_p) | |
200 | |
201 /* The assembler wants the alternate register names, but without | |
202 leading percent sign. */ | |
203 #undef REGISTER_NAMES | |
204 #define REGISTER_NAMES \ | |
205 { \ | |
206 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ | |
207 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \ | |
208 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", \ | |
209 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", \ | |
210 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ | |
211 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ | |
212 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ | |
213 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ | |
214 "mq", "lr", "ctr", "ap", \ | |
215 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", \ | |
216 "xer", \ | |
217 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", \ | |
218 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", \ | |
219 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", \ | |
220 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", \ | |
221 "vrsave", "vscr", \ | |
222 "spe_acc", "spefscr", \ | |
223 "sfp" \ | |
224 } | |
225 | |
226 /* This outputs NAME to FILE. */ | |
227 | |
228 #undef RS6000_OUTPUT_BASENAME | |
229 #define RS6000_OUTPUT_BASENAME(FILE, NAME) \ | |
230 assemble_name (FILE, NAME) | |
231 | |
232 /* Globalizing directive for a label. */ | |
233 #undef GLOBAL_ASM_OP | |
234 #define GLOBAL_ASM_OP "\t.globl " | |
235 #undef TARGET_ASM_GLOBALIZE_LABEL | |
236 | |
237 /* This is how to output an internal label prefix. rs6000.c uses this | |
238 when generating traceback tables. */ | |
239 /* Not really used for Darwin? */ | |
240 | |
241 #undef ASM_OUTPUT_INTERNAL_LABEL_PREFIX | |
242 #define ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX) \ | |
243 fprintf (FILE, "%s", PREFIX) | |
244 | |
245 /* This says how to output an assembler line to define a global common | |
246 symbol. */ | |
247 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ | |
248 do { \ | |
249 unsigned HOST_WIDE_INT _new_size = SIZE; \ | |
250 fputs (".comm ", (FILE)); \ | |
251 RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \ | |
252 if (_new_size == 0) _new_size = 1; \ | |
253 fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", _new_size); \ | |
254 } while (0) | |
255 | |
256 /* Override the standard rs6000 definition. */ | |
257 | |
258 #undef ASM_COMMENT_START | |
259 #define ASM_COMMENT_START ";" | |
260 | |
261 /* FP save and restore routines. */ | |
262 #define SAVE_FP_PREFIX "._savef" | |
263 #define SAVE_FP_SUFFIX "" | |
264 #define RESTORE_FP_PREFIX "._restf" | |
265 #define RESTORE_FP_SUFFIX "" | |
266 | |
267 /* This is how to output an assembler line that says to advance | |
268 the location counter to a multiple of 2**LOG bytes using the | |
269 "nop" instruction as padding. */ | |
270 | |
271 #define ASM_OUTPUT_ALIGN_WITH_NOP(FILE,LOG) \ | |
272 do \ | |
273 { \ | |
274 if ((LOG) < 3) \ | |
275 { \ | |
276 ASM_OUTPUT_ALIGN (FILE,LOG); \ | |
277 } \ | |
278 else /* nop == ori r0,r0,0 */ \ | |
279 fprintf (FILE, "\t.align32 %d,0x60000000\n", (LOG)); \ | |
280 } while (0) | |
281 | |
282 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN | |
283 /* This is supported in cctools 465 and later. The macro test | |
284 above prevents using it in earlier build environments. */ | |
285 #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ | |
286 if ((LOG) != 0) \ | |
287 { \ | |
288 if ((MAX_SKIP) == 0) \ | |
289 fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ | |
290 else \ | |
291 fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \ | |
292 } | |
293 #endif | |
294 | |
295 /* Generate insns to call the profiler. */ | |
296 | |
297 #define PROFILE_HOOK(LABEL) output_profile_hook (LABEL) | |
298 | |
299 /* Function name to call to do profiling. */ | |
300 | |
301 #define RS6000_MCOUNT "*mcount" | |
302 | |
303 /* Default processor: G4, and G5 for 64-bit. */ | |
304 | |
305 #undef PROCESSOR_DEFAULT | |
306 #define PROCESSOR_DEFAULT PROCESSOR_PPC7400 | |
307 #undef PROCESSOR_DEFAULT64 | |
308 #define PROCESSOR_DEFAULT64 PROCESSOR_POWER4 | |
309 | |
310 /* Default target flag settings. Despite the fact that STMW/LMW | |
311 serializes, it's still a big code size win to use them. Use FSEL by | |
312 default as well. */ | |
313 | |
314 #undef TARGET_DEFAULT | |
315 #define TARGET_DEFAULT (MASK_POWERPC | MASK_MULTIPLE | MASK_NEW_MNEMONICS \ | |
316 | MASK_PPC_GFXOPT) | |
317 | |
318 /* Darwin only runs on PowerPC, so short-circuit POWER patterns. */ | |
319 #undef TARGET_POWER | |
320 #define TARGET_POWER 0 | |
321 #undef TARGET_IEEEQUAD | |
322 #define TARGET_IEEEQUAD 0 | |
323 | |
324 /* Since Darwin doesn't do TOCs, stub this out. */ | |
325 | |
326 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) ((void)X, (void)MODE, 0) | |
327 | |
328 /* Unlike most other PowerPC targets, chars are signed, for | |
329 consistency with other Darwin architectures. */ | |
330 | |
331 #undef DEFAULT_SIGNED_CHAR | |
332 #define DEFAULT_SIGNED_CHAR (1) | |
333 | |
334 /* Given an rtx X being reloaded into a reg required to be | |
335 in class CLASS, return the class of reg to actually use. | |
336 In general this is just CLASS; but on some machines | |
337 in some cases it is preferable to use a more restrictive class. | |
338 | |
339 On the RS/6000, we have to return NO_REGS when we want to reload a | |
340 floating-point CONST_DOUBLE to force it to be copied to memory. | |
341 | |
342 Don't allow R0 when loading the address of, or otherwise furtling with, | |
343 a SYMBOL_REF. */ | |
344 | |
345 #undef PREFERRED_RELOAD_CLASS | |
346 #define PREFERRED_RELOAD_CLASS(X,CLASS) \ | |
347 ((CONSTANT_P (X) \ | |
348 && reg_classes_intersect_p ((CLASS), FLOAT_REGS)) \ | |
349 ? NO_REGS \ | |
350 : ((GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == HIGH) \ | |
351 && reg_class_subset_p (BASE_REGS, (CLASS))) \ | |
352 ? BASE_REGS \ | |
353 : (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \ | |
354 && (CLASS) == NON_SPECIAL_REGS) \ | |
355 ? GENERAL_REGS \ | |
356 : (CLASS)) | |
357 | |
358 /* Compute field alignment. This is similar to the version of the | |
359 macro in the Apple version of GCC, except that version supports | |
360 'mac68k' alignment, and that version uses the computed alignment | |
361 always for the first field of a structure. The first-field | |
362 behavior is dealt with by | |
363 darwin_rs6000_special_round_type_align. */ | |
364 #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ | |
365 (TARGET_ALIGN_NATURAL ? (COMPUTED) \ | |
366 : (COMPUTED) == 128 ? 128 \ | |
367 : MIN ((COMPUTED), 32)) | |
368 | |
369 /* Darwin increases natural record alignment to doubleword if the first | |
370 field is an FP double while the FP fields remain word aligned. */ | |
371 #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \ | |
372 ((TREE_CODE (STRUCT) == RECORD_TYPE \ | |
373 || TREE_CODE (STRUCT) == UNION_TYPE \ | |
374 || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \ | |
375 && TARGET_ALIGN_NATURAL == 0 \ | |
376 ? darwin_rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED) \ | |
377 : (TREE_CODE (STRUCT) == VECTOR_TYPE \ | |
378 && ALTIVEC_VECTOR_MODE (TYPE_MODE (STRUCT))) \ | |
379 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \ | |
380 : MAX ((COMPUTED), (SPECIFIED))) | |
381 | |
382 /* Specify padding for the last element of a block move between | |
383 registers and memory. FIRST is nonzero if this is the only | |
384 element. */ | |
385 #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ | |
386 (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE)) | |
387 | |
388 /* XXX: Darwin supports neither .quad, or .llong, but it also doesn't | |
389 support 64 bit PowerPC either, so this just keeps things happy. */ | |
390 #define DOUBLE_INT_ASM_OP "\t.quad\t" | |
391 | |
392 /* For binary compatibility with 2.95; Darwin C APIs use bool from | |
393 stdbool.h, which was an int-sized enum in 2.95. Users can explicitly | |
394 choose to have sizeof(bool)==1 with the -mone-byte-bool switch. */ | |
395 #define BOOL_TYPE_SIZE (darwin_one_byte_bool ? CHAR_TYPE_SIZE : INT_TYPE_SIZE) | |
396 | |
397 #undef REGISTER_TARGET_PRAGMAS | |
398 #define REGISTER_TARGET_PRAGMAS() \ | |
399 do \ | |
400 { \ | |
401 DARWIN_REGISTER_TARGET_PRAGMAS(); \ | |
402 targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin; \ | |
403 } \ | |
404 while (0) | |
405 | |
406 #ifdef IN_LIBGCC2 | |
407 #include <stdbool.h> | |
408 #endif | |
409 | |
410 #if !defined(__LP64__) && !defined(DARWIN_LIBSYSTEM_HAS_UNWIND) | |
411 #define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h" | |
412 #endif | |
413 | |
414 /* True, iff we're generating fast turn around debugging code. When | |
415 true, we arrange for function prologues to start with 5 nops so | |
416 that gdb may insert code to redirect them, and for data to be | |
417 accessed indirectly. The runtime uses this indirection to forward | |
418 references for data to the original instance of that data. */ | |
419 | |
420 #define TARGET_FIX_AND_CONTINUE (darwin_fix_and_continue) | |
421 | |
422 /* This is the reserved direct dispatch address for Objective-C. */ | |
423 #define OFFS_MSGSEND_FAST 0xFFFEFF00 | |
424 | |
425 /* This is the reserved ivar address Objective-C. */ | |
426 #define OFFS_ASSIGNIVAR_FAST 0xFFFEFEC0 | |
427 | |
428 /* Old versions of Mac OS/Darwin don't have C99 functions available. */ | |
429 #undef TARGET_C99_FUNCTIONS | |
430 #define TARGET_C99_FUNCTIONS \ | |
431 (TARGET_64BIT \ | |
432 || strverscmp (darwin_macosx_version_min, "10.3") >= 0) | |
433 | |
434 /* When generating kernel code or kexts, we don't use Altivec by | |
435 default, as kernel code doesn't save/restore those registers. */ | |
436 #define OS_MISSING_ALTIVEC (flag_mkernel || flag_apple_kext) | |
437 | |
438 /* Darwin has to rename some of the long double builtins. */ | |
439 #define SUBTARGET_INIT_BUILTINS darwin_patch_builtins () |