]>
Commit | Line | Data |
---|---|---|
ee890fe2 | 1 | /* Target definitions for Darwin (Mac OS X) systems. |
5b86a469 | 2 | Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003, 2004, |
d18d5478 | 3 | 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
ee890fe2 SS |
4 | Free Software Foundation, Inc. |
5 | Contributed by Apple Computer Inc. | |
6 | ||
7ec022b2 | 7 | This file is part of GCC. |
ee890fe2 | 8 | |
7ec022b2 | 9 | GCC is free software; you can redistribute it and/or modify |
ee890fe2 | 10 | it under the terms of the GNU General Public License as published by |
748086b7 | 11 | the Free Software Foundation; either version 3, or (at your option) |
ee890fe2 SS |
12 | any later version. |
13 | ||
7ec022b2 | 14 | GCC is distributed in the hope that it will be useful, |
ee890fe2 SS |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | GNU General Public License for more details. | |
18 | ||
748086b7 JJ |
19 | Under Section 7 of GPL version 3, you are granted additional |
20 | permissions described in the GCC Runtime Library Exception, version | |
21 | 3.1, as published by the Free Software Foundation. | |
22 | ||
23 | You should have received a copy of the GNU General Public License and | |
24 | a copy of the GCC Runtime Library Exception along with this program; | |
25 | see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
26 | <http://www.gnu.org/licenses/>. */ | |
ee890fe2 | 27 | |
213c4a8a GK |
28 | #ifndef CONFIG_DARWIN_H |
29 | #define CONFIG_DARWIN_H | |
30 | ||
ee890fe2 SS |
31 | /* The definitions in this file are common to all processor types |
32 | running Darwin, which is the kernel for Mac OS X. Darwin is | |
33 | basically a BSD user layer laid over a Mach kernel, then evolved | |
34 | for many years (at NeXT) in parallel with other Unix systems. So | |
35 | while the runtime is a somewhat idiosyncratic Mach-based thing, | |
36 | other definitions look like they would for a BSD variant. */ | |
37 | ||
38 | /* Although NeXT ran on many different architectures, as of Jan 2001 | |
39 | the only supported Darwin targets are PowerPC and x86. */ | |
40 | ||
7606e68f SS |
41 | /* One of Darwin's NeXT legacies is the Mach-O format, which is partly |
42 | like a.out and partly like COFF, with additional features like | |
43 | multi-architecture binary support. */ | |
44 | ||
fee3eacd IS |
45 | #define DARWIN_X86 0 |
46 | #define DARWIN_PPC 0 | |
7606e68f | 47 | |
7eb0a43c GK |
48 | /* Don't assume anything about the header files. */ |
49 | #define NO_IMPLICIT_EXTERN_C | |
50 | ||
d42093a1 | 51 | /* Suppress g++ attempt to link in the math library automatically. */ |
abe72dd8 | 52 | #define MATH_LIBRARY "" |
ee890fe2 SS |
53 | |
54 | /* We have atexit. */ | |
55 | ||
56 | #define HAVE_ATEXIT | |
57 | ||
58 | /* Define an empty body for the function do_global_dtors() in libgcc2.c. */ | |
59 | ||
60 | #define DO_GLOBAL_DTORS_BODY | |
61 | ||
62 | /* The string value for __SIZE_TYPE__. */ | |
63 | ||
64 | #ifndef SIZE_TYPE | |
65 | #define SIZE_TYPE "long unsigned int" | |
66 | #endif | |
67 | ||
68 | /* Type used for ptrdiff_t, as a string used in a declaration. */ | |
69 | ||
70 | #undef PTRDIFF_TYPE | |
71 | #define PTRDIFF_TYPE "int" | |
72 | ||
73 | /* wchar_t is int. */ | |
74 | ||
75 | #undef WCHAR_TYPE | |
76 | #define WCHAR_TYPE "int" | |
77 | #undef WCHAR_TYPE_SIZE | |
78 | #define WCHAR_TYPE_SIZE 32 | |
79 | ||
428ddbf0 FXC |
80 | #define INT8_TYPE "signed char" |
81 | #define INT16_TYPE "short int" | |
82 | #define INT32_TYPE "int" | |
83 | #define INT64_TYPE "long long int" | |
84 | #define UINT8_TYPE "unsigned char" | |
85 | #define UINT16_TYPE "short unsigned int" | |
86 | #define UINT32_TYPE "unsigned int" | |
87 | #define UINT64_TYPE "long long unsigned int" | |
88 | ||
89 | #define INT_LEAST8_TYPE "signed char" | |
90 | #define INT_LEAST16_TYPE "short int" | |
91 | #define INT_LEAST32_TYPE "int" | |
92 | #define INT_LEAST64_TYPE "long long int" | |
93 | #define UINT_LEAST8_TYPE "unsigned char" | |
94 | #define UINT_LEAST16_TYPE "short unsigned int" | |
95 | #define UINT_LEAST32_TYPE "unsigned int" | |
96 | #define UINT_LEAST64_TYPE "long long unsigned int" | |
97 | ||
98 | #define INT_FAST8_TYPE "signed char" | |
99 | #define INT_FAST16_TYPE "short int" | |
100 | #define INT_FAST32_TYPE "int" | |
101 | #define INT_FAST64_TYPE "long long int" | |
102 | #define UINT_FAST8_TYPE "unsigned char" | |
103 | #define UINT_FAST16_TYPE "short unsigned int" | |
104 | #define UINT_FAST32_TYPE "unsigned int" | |
105 | #define UINT_FAST64_TYPE "long long unsigned int" | |
106 | ||
107 | #define INTPTR_TYPE "long int" | |
108 | #define UINTPTR_TYPE "long unsigned int" | |
109 | ||
110 | #define SIG_ATOMIC_TYPE "int" | |
111 | ||
f37f462a SS |
112 | /* Default to using the NeXT-style runtime, since that's what is |
113 | pre-installed on Darwin systems. */ | |
114 | ||
fea3ca91 | 115 | #define NEXT_OBJC_RUNTIME 1 |
f37f462a | 116 | |
ee890fe2 SS |
117 | /* Don't default to pcc-struct-return, because gcc is the only compiler, and |
118 | we want to retain compatibility with older gcc versions. */ | |
119 | ||
120 | #undef DEFAULT_PCC_STRUCT_RETURN | |
121 | #define DEFAULT_PCC_STRUCT_RETURN 0 | |
122 | ||
4f8bdef9 EC |
123 | /* True if pragma ms_struct is in effect. */ |
124 | extern GTY(()) int darwin_ms_struct; | |
125 | ||
dd2e44f0 IS |
126 | #define DRIVER_SELF_SPECS \ |
127 | "%{gfull:-g -fno-eliminate-unused-debug-symbols} %<gfull", \ | |
128 | "%{gused:-g -feliminate-unused-debug-symbols} %<gused", \ | |
129 | "%{fapple-kext|mkernel:-static}", \ | |
130 | "%{shared:-Zdynamiclib} %<shared" | |
131 | ||
132 | #define DARWIN_CC1_SPEC \ | |
133 | "%{findirect-virtual-calls: -fapple-kext} %<findirect-virtual-calls " \ | |
134 | "%{fterminated-vtables: -fapple-kext} %<fterminated-vtables " \ | |
135 | "%<filelist* %<framework*" | |
136 | ||
137 | #define SUBSUBTARGET_OVERRIDE_OPTIONS \ | |
138 | do { \ | |
139 | darwin_override_options (); \ | |
140 | } while (0) | |
141 | ||
142 | #define SUBTARGET_C_COMMON_OVERRIDE_OPTIONS do { \ | |
dd2e44f0 IS |
143 | if (flag_mkernel || flag_apple_kext) \ |
144 | { \ | |
145 | if (flag_use_cxa_atexit == 2) \ | |
146 | flag_use_cxa_atexit = 0; \ | |
147 | /* kexts should always be built without the coalesced sections \ | |
148 | because the kernel loader doesn't grok such sections. */ \ | |
149 | flag_weak = 0; \ | |
150 | /* No RTTI in kexts. */ \ | |
151 | flag_rtti = 0; \ | |
152 | } \ | |
153 | } while (0) | |
f475fd3c | 154 | |
ed5b9f96 GK |
155 | /* Machine dependent cpp options. Don't add more options here, add |
156 | them to darwin_cpp_builtins in darwin-c.c. */ | |
ee890fe2 | 157 | |
ee890fe2 | 158 | #undef CPP_SPEC |
dd2e44f0 IS |
159 | #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}" \ |
160 | " %{pthread:-D_REENTRANT}" | |
ee890fe2 | 161 | |
48aec0bc | 162 | /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus |
7f814c0b IS |
163 | precomp, libtool, and fat build additions. |
164 | ||
165 | In general, random Darwin linker flags should go into LINK_SPEC | |
48aec0bc DP |
166 | instead of LINK_COMMAND_SPEC. The command spec is better for |
167 | specifying the handling of options understood by generic Unix | |
168 | linkers, and for positional arguments like libraries. */ | |
50eb566f | 169 | |
dd2e44f0 IS |
170 | #define LINK_COMMAND_SPEC_A \ |
171 | "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ | |
dd350eba RO |
172 | %(linker)" \ |
173 | LINK_PLUGIN_SPEC \ | |
174 | "%{flto*:%<fcompare-debug*} \ | |
dd2e44f0 IS |
175 | %{flto*} \ |
176 | %l %X %{s} %{t} %{Z} %{u*} \ | |
177 | %{e*} %{r} \ | |
178 | %{o*}%{!o:-o a.out} \ | |
179 | %{!nostdlib:%{!nostartfiles:%S}} \ | |
180 | %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate*|coverage:-lgcov} \ | |
181 | %{fopenmp|ftree-parallelize-loops=*: \ | |
182 | %{static|static-libgcc|static-libstdc++|static-libgfortran: libgomp.a%s; : -lgomp } } \ | |
3157880f | 183 | %{fsanitize=address: -framework CoreFoundation -lasan } \ |
255a9a1b EB |
184 | %{fgnu-tm: \ |
185 | %{static|static-libgcc|static-libstdc++|static-libgfortran: libitm.a%s; : -litm } } \ | |
dd2e44f0 IS |
186 | %{!nostdlib:%{!nodefaultlibs:\ |
187 | %(link_ssp) %(link_gcc_c_sequence)\ | |
188 | }}\ | |
189 | %{!nostdlib:%{!nostartfiles:%E}} %{T*} %{F*} }}}}}}}" | |
50eb566f | 190 | |
7f814c0b | 191 | #define DSYMUTIL "\ndsymutil" |
50eb566f | 192 | |
dd2e44f0 IS |
193 | #define DSYMUTIL_SPEC \ |
194 | "%{!fdump=*:%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:\ | |
195 | %{v} \ | |
196 | %{gdwarf-2:%{!gstabs*:%{!g0: -idsym}}}\ | |
197 | %{.c|.cc|.C|.cpp|.cp|.c++|.cxx|.CPP|.m|.mm: \ | |
198 | %{gdwarf-2:%{!gstabs*:%{!g0: -dsym}}}}}}}}}}}" | |
50eb566f IS |
199 | |
200 | #define LINK_COMMAND_SPEC LINK_COMMAND_SPEC_A DSYMUTIL_SPEC | |
48aec0bc | 201 | |
7e82085a | 202 | /* Tell collect2 to run dsymutil for us as necessary. */ |
11afe8e8 MS |
203 | #define COLLECT_RUN_DSYMUTIL 1 |
204 | ||
7f814c0b IS |
205 | /* We only want one instance of %G, since libSystem (Darwin's -lc) does not depend |
206 | on libgcc. */ | |
207 | #undef LINK_GCC_C_SEQUENCE_SPEC | |
208 | #define LINK_GCC_C_SEQUENCE_SPEC "%G %L" | |
209 | ||
9281e73d | 210 | #ifdef TARGET_SYSTEM_ROOT |
dd2e44f0 IS |
211 | #define LINK_SYSROOT_SPEC \ |
212 | "%{isysroot*:-syslibroot %*;:-syslibroot " TARGET_SYSTEM_ROOT "}" | |
9281e73d GK |
213 | #else |
214 | #define LINK_SYSROOT_SPEC "%{isysroot*:-syslibroot %*}" | |
215 | #endif | |
216 | ||
0e9197f5 IS |
217 | #define PIE_SPEC "%{fpie|pie|fPIE:}" |
218 | ||
48aec0bc | 219 | /* Please keep the random linker options in alphabetical order (modulo |
bd6a0889 EC |
220 | 'Z' and 'no' prefixes). Note that options taking arguments may appear |
221 | multiple times on a command line with different arguments each time, | |
222 | so put a * after their names so all of them get passed. */ | |
dd2e44f0 IS |
223 | #define LINK_SPEC \ |
224 | "%{static}%{!static:-dynamic} \ | |
225 | %:remove-outfile(-ldl) \ | |
226 | %:remove-outfile(-lm) \ | |
227 | %:remove-outfile(-lpthread) \ | |
228 | %{fgnu-runtime: %{static|static-libgcc: \ | |
229 | %:replace-outfile(-lobjc libobjc-gnu.a%s); \ | |
230 | :%:replace-outfile(-lobjc -lobjc-gnu ) } }\ | |
231 | %{static|static-libgcc|static-libgfortran:%:replace-outfile(-lgfortran libgfortran.a%s)}\ | |
232 | %{static|static-libgcc|static-libstdc++|static-libgfortran:%:replace-outfile(-lgomp libgomp.a%s)}\ | |
233 | %{static|static-libgcc|static-libstdc++:%:replace-outfile(-lstdc++ libstdc++.a%s)}\ | |
234 | %{!Zdynamiclib: \ | |
235 | %{Zforce_cpusubtype_ALL:-arch %(darwin_arch) -force_cpusubtype_ALL} \ | |
236 | %{!Zforce_cpusubtype_ALL:-arch %(darwin_subarch)} \ | |
237 | %{Zbundle:-bundle} \ | |
238 | %{Zbundle_loader*:-bundle_loader %*} \ | |
239 | %{client_name*} \ | |
240 | %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\ | |
241 | } \ | |
242 | %{current_version*:%e-current_version only allowed with -dynamiclib} \ | |
243 | %{Zforce_flat_namespace:-force_flat_namespace} \ | |
244 | %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \ | |
245 | %{keep_private_externs} \ | |
246 | %{private_bundle} \ | |
247 | } \ | |
248 | %{Zdynamiclib: -dylib \ | |
249 | %{Zbundle:%e-bundle not allowed with -dynamiclib} \ | |
250 | %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \ | |
251 | %{client_name*:%e-client_name not allowed with -dynamiclib} \ | |
252 | %{compatibility_version*:-dylib_compatibility_version %*} \ | |
253 | %{current_version*:-dylib_current_version %*} \ | |
254 | %{Zforce_cpusubtype_ALL:-arch %(darwin_arch)} \ | |
255 | %{!Zforce_cpusubtype_ALL: -arch %(darwin_subarch)} \ | |
256 | %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \ | |
257 | %{Zinstall_name*:-dylib_install_name %*} \ | |
258 | %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \ | |
259 | %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \ | |
260 | } \ | |
261 | %{Zall_load:-all_load} \ | |
262 | %{Zallowable_client*:-allowable_client %*} \ | |
263 | %{Zbind_at_load:-bind_at_load} \ | |
264 | %{Zarch_errors_fatal:-arch_errors_fatal} \ | |
265 | %{Zdead_strip:-dead_strip} \ | |
266 | %{Zno_dead_strip_inits_and_terms:-no_dead_strip_inits_and_terms} \ | |
267 | %{Zdylib_file*:-dylib_file %*} \ | |
268 | %{Zdynamic:-dynamic}\ | |
269 | %{Zexported_symbols_list*:-exported_symbols_list %*} \ | |
270 | %{Zflat_namespace:-flat_namespace} \ | |
271 | %{headerpad_max_install_names} \ | |
272 | %{Zimage_base*:-image_base %*} \ | |
273 | %{Zinit*:-init %*} \ | |
274 | %{!mmacosx-version-min=*:-macosx_version_min %(darwin_minversion)} \ | |
275 | %{mmacosx-version-min=*:-macosx_version_min %*} \ | |
276 | %{nomultidefs} \ | |
277 | %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \ | |
278 | %{Zmultiply_defined*:-multiply_defined %*} \ | |
279 | %{!Zmultiply_defined*:%{shared-libgcc: \ | |
280 | %:version-compare(< 10.5 mmacosx-version-min= -multiply_defined) \ | |
281 | %:version-compare(< 10.5 mmacosx-version-min= suppress)}} \ | |
282 | %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \ | |
0e9197f5 | 283 | " PIE_SPEC " \ |
dd2e44f0 IS |
284 | %{prebind} %{noprebind} %{nofixprebinding} %{prebind_all_twolevel_modules} \ |
285 | %{read_only_relocs} \ | |
286 | %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} \ | |
287 | %{Zsegaddr*:-segaddr %*} \ | |
288 | %{Zsegs_read_only_addr*:-segs_read_only_addr %*} \ | |
289 | %{Zsegs_read_write_addr*:-segs_read_write_addr %*} \ | |
290 | %{Zseg_addr_table*: -seg_addr_table %*} \ | |
291 | %{Zfn_seg_addr_table_filename*:-seg_addr_table_filename %*} \ | |
292 | %{sub_library*} %{sub_umbrella*} \ | |
293 | " LINK_SYSROOT_SPEC " \ | |
294 | %{twolevel_namespace} %{twolevel_namespace_hints} \ | |
295 | %{Zumbrella*: -umbrella %*} \ | |
296 | %{undefined*} \ | |
297 | %{Zunexported_symbols_list*:-unexported_symbols_list %*} \ | |
298 | %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \ | |
299 | %{!Zweak_reference_mismatches*:-weak_reference_mismatches non-weak} \ | |
300 | %{X} \ | |
301 | %{y*} \ | |
302 | %{w} \ | |
303 | %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \ | |
304 | %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \ | |
305 | %{whatsloaded} %{dylinker_install_name*} \ | |
306 | %{dylinker} %{Mach} " | |
48aec0bc DP |
307 | |
308 | ||
ed5b9f96 | 309 | /* Machine dependent libraries. */ |
ee890fe2 | 310 | |
5fa5a27c | 311 | #define LIB_SPEC "%{!static:-lSystem}" |
ee890fe2 | 312 | |
56309261 GK |
313 | /* Support -mmacosx-version-min by supplying different (stub) libgcc_s.dylib |
314 | libraries to link against, and by not linking against libgcc_s on | |
315 | earlier-than-10.3.9. | |
316 | ||
317 | Note that by default, -lgcc_eh is not linked against! This is | |
318 | because in a future version of Darwin the EH frame information may | |
319 | be in a new format, or the fallback routine might be changed; if | |
320 | you want to explicitly link against the static version of those | |
321 | routines, because you know you don't need to unwind through system | |
083cad55 EC |
322 | libraries, you need to explicitly say -static-libgcc. |
323 | ||
56309261 GK |
324 | If it is linked against, it has to be before -lgcc, because it may |
325 | need symbols from -lgcc. */ | |
040b1c5a | 326 | #undef REAL_LIBGCC_SPEC |
dd2e44f0 IS |
327 | #define REAL_LIBGCC_SPEC \ |
328 | "%{static-libgcc|static: -lgcc_eh -lgcc; \ | |
329 | shared-libgcc|fexceptions|fgnu-runtime: \ | |
330 | %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4) \ | |
331 | %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ | |
332 | %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ | |
333 | %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ | |
334 | -lgcc ; \ | |
335 | :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \ | |
336 | %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lgcc_s.10.5) \ | |
337 | %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_ext.10.4) \ | |
338 | %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_ext.10.5) \ | |
339 | -lgcc }" | |
083cad55 | 340 | |
747b9f55 GK |
341 | /* We specify crt0.o as -lcrt0.o so that ld will search the library path. |
342 | ||
343 | crt3.o provides __cxa_atexit on systems that don't have it. Since | |
344 | it's only used with C++, which requires passing -shared-libgcc, key | |
345 | off that to avoid unnecessarily adding a destructor to every | |
346 | powerpc program built. */ | |
ee890fe2 | 347 | |
48aec0bc | 348 | #undef STARTFILE_SPEC |
dd2e44f0 | 349 | #define STARTFILE_SPEC \ |
e2362f5d | 350 | "%{Zdynamiclib: %(darwin_dylib1) %{fgnu-tm: -lcrttms.o}} \ |
99b375d0 IS |
351 | %{!Zdynamiclib:%{Zbundle:%{!static: \ |
352 | %:version-compare(< 10.6 mmacosx-version-min= -lbundle1.o) \ | |
353 | %{fgnu-tm: -lcrttms.o}}} \ | |
dd2e44f0 IS |
354 | %{!Zbundle:%{pg:%{static:-lgcrt0.o} \ |
355 | %{!static:%{object:-lgcrt0.o} \ | |
356 | %{!object:%{preload:-lgcrt0.o} \ | |
3127f133 JH |
357 | %{!preload:-lgcrt1.o \ |
358 | %:version-compare(>= 10.8 mmacosx-version-min= -no_new_main) \ | |
359 | %(darwin_crt2)}}}} \ | |
dd2e44f0 IS |
360 | %{!pg:%{static:-lcrt0.o} \ |
361 | %{!static:%{object:-lcrt0.o} \ | |
362 | %{!object:%{preload:-lcrt0.o} \ | |
363 | %{!preload: %(darwin_crt1) \ | |
364 | %(darwin_crt2)}}}}}} \ | |
365 | %{shared-libgcc:%:version-compare(< 10.5 mmacosx-version-min= crt3.o%s)}" | |
7606e68f | 366 | |
e2362f5d IS |
367 | /* We want a destructor last in the list. */ |
368 | #define ENDFILE_SPEC "%{fgnu-tm: -lcrttme.o}" | |
ee890fe2 | 369 | |
dd2e44f0 IS |
370 | #define DARWIN_EXTRA_SPECS \ |
371 | { "darwin_crt1", DARWIN_CRT1_SPEC }, \ | |
372 | { "darwin_dylib1", DARWIN_DYLIB1_SPEC }, \ | |
373 | { "darwin_minversion", DARWIN_MINVERSION_SPEC }, | |
742163c0 | 374 | |
dd2e44f0 IS |
375 | #define DARWIN_DYLIB1_SPEC \ |
376 | "%:version-compare(!> 10.5 mmacosx-version-min= -ldylib1.o) \ | |
99b375d0 | 377 | %:version-compare(>< 10.5 10.6 mmacosx-version-min= -ldylib1.10.5.o)" |
742163c0 | 378 | |
dd2e44f0 IS |
379 | #define DARWIN_CRT1_SPEC \ |
380 | "%:version-compare(!> 10.5 mmacosx-version-min= -lcrt1.o) \ | |
99b375d0 | 381 | %:version-compare(>< 10.5 10.6 mmacosx-version-min= -lcrt1.10.5.o) \ |
3127f133 | 382 | %:version-compare(>< 10.6 10.8 mmacosx-version-min= -lcrt1.10.6.o) \ |
e2362f5d | 383 | %{fgnu-tm: -lcrttms.o}" |
742163c0 | 384 | |
c4e18b1c | 385 | /* Default Darwin ASM_SPEC, very simple. */ |
dd2e44f0 IS |
386 | #define ASM_SPEC "-arch %(darwin_arch) \ |
387 | %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \ | |
388 | %{static}" | |
c4e18b1c | 389 | |
40353fb3 IS |
390 | /* Default ASM_DEBUG_SPEC. Darwin's as cannot currently produce dwarf |
391 | debugging data. */ | |
392 | ||
393 | #define ASM_DEBUG_SPEC "%{g*:%{!g0:%{!gdwarf*:--gstabs}}}" | |
394 | ||
4d04fa05 | 395 | /* We still allow output of STABS. */ |
ee890fe2 | 396 | |
23532de9 | 397 | #define DBX_DEBUGGING_INFO 1 |
ee890fe2 | 398 | |
2d84a337 | 399 | #define DWARF2_DEBUGGING_INFO 1 |
80c85ca2 | 400 | #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG |
eeab4d81 | 401 | |
192d0f89 GK |
402 | #define DEBUG_FRAME_SECTION "__DWARF,__debug_frame,regular,debug" |
403 | #define DEBUG_INFO_SECTION "__DWARF,__debug_info,regular,debug" | |
404 | #define DEBUG_ABBREV_SECTION "__DWARF,__debug_abbrev,regular,debug" | |
405 | #define DEBUG_ARANGES_SECTION "__DWARF,__debug_aranges,regular,debug" | |
406 | #define DEBUG_MACINFO_SECTION "__DWARF,__debug_macinfo,regular,debug" | |
407 | #define DEBUG_LINE_SECTION "__DWARF,__debug_line,regular,debug" | |
408 | #define DEBUG_LOC_SECTION "__DWARF,__debug_loc,regular,debug" | |
409 | #define DEBUG_PUBNAMES_SECTION "__DWARF,__debug_pubnames,regular,debug" | |
89708594 | 410 | #define DEBUG_PUBTYPES_SECTION "__DWARF,__debug_pubtypes,regular,debug" |
192d0f89 GK |
411 | #define DEBUG_STR_SECTION "__DWARF,__debug_str,regular,debug" |
412 | #define DEBUG_RANGES_SECTION "__DWARF,__debug_ranges,regular,debug" | |
c0c19685 | 413 | #define DEBUG_MACRO_SECTION "__DWARF,__debug_macro,regular,debug" |
eeab4d81 | 414 | |
9730bc27 TT |
415 | #define TARGET_WANT_DEBUG_PUB_SECTIONS true |
416 | ||
638c962f JH |
417 | #define TARGET_FORCE_AT_COMP_DIR true |
418 | ||
ee890fe2 SS |
419 | /* When generating stabs debugging, use N_BINCL entries. */ |
420 | ||
421 | #define DBX_USE_BINCL | |
422 | ||
423 | /* There is no limit to the length of stabs strings. */ | |
424 | ||
425 | #define DBX_CONTIN_LENGTH 0 | |
426 | ||
991b6592 | 427 | /* gdb needs a null N_SO at the end of each file for scattered loading. */ |
ee890fe2 | 428 | |
3e487b21 | 429 | #define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END |
ee890fe2 | 430 | |
f1a66265 GK |
431 | /* GCC's definition of 'one_only' is the same as its definition of 'weak'. */ |
432 | #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) | |
4746cf84 | 433 | |
f1a66265 GK |
434 | /* Mach-O supports 'weak imports', and 'weak definitions' in coalesced |
435 | sections. machopic_select_section ensures that weak variables go in | |
436 | coalesced sections. Weak aliases (or any other kind of aliases) are | |
437 | not supported. Weak symbols that aren't visible outside the .s file | |
438 | are not supported. */ | |
dd2e44f0 IS |
439 | #define ASM_WEAKEN_DECL(FILE, DECL, NAME, ALIAS) \ |
440 | do { \ | |
441 | if (ALIAS) \ | |
442 | { \ | |
443 | warning (0, "alias definitions not supported in Mach-O; ignored"); \ | |
444 | break; \ | |
445 | } \ | |
446 | \ | |
447 | if (! DECL_EXTERNAL (DECL) && TREE_PUBLIC (DECL)) \ | |
448 | targetm.asm_out.globalize_label (FILE, NAME); \ | |
449 | if (DECL_EXTERNAL (DECL)) \ | |
450 | fputs ("\t.weak_reference ", FILE); \ | |
451 | else if (lookup_attribute ("weak_import", DECL_ATTRIBUTES (DECL))) \ | |
452 | break; \ | |
453 | else if (TREE_PUBLIC (DECL)) \ | |
454 | fputs ("\t.weak_definition ", FILE); \ | |
455 | else \ | |
456 | break; \ | |
457 | assemble_name (FILE, NAME); \ | |
458 | fputc ('\n', FILE); \ | |
459 | } while (0) | |
4746cf84 | 460 | |
72747d40 GK |
461 | /* Darwin has the pthread routines in libSystem, which every program |
462 | links to, so there's no need for weak-ness for that. */ | |
463 | #define GTHREAD_USE_WEAK 0 | |
464 | ||
0524c91d | 465 | /* The Darwin linker doesn't want coalesced symbols to appear in |
4746cf84 | 466 | a static archive's table of contents. */ |
0524c91d MA |
467 | #undef TARGET_WEAK_NOT_IN_ARCHIVE_TOC |
468 | #define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 1 | |
4746cf84 | 469 | |
9e170098 GK |
470 | /* On Darwin, we don't (at the time of writing) have linkonce sections |
471 | with names, so it's safe to make the class data not comdat. */ | |
472 | #define TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT hook_bool_void_false | |
473 | ||
157600d0 GK |
474 | /* For efficiency, on Darwin the RTTI information that is always |
475 | emitted in the standard C++ library should not be COMDAT. */ | |
476 | #define TARGET_CXX_LIBRARY_RTTI_COMDAT hook_bool_void_false | |
477 | ||
4746cf84 MA |
478 | /* We make exception information linkonce. */ |
479 | #undef TARGET_USES_WEAK_UNWIND_INFO | |
480 | #define TARGET_USES_WEAK_UNWIND_INFO 1 | |
481 | ||
482 | /* We need to use a nonlocal label for the start of an EH frame: the | |
16d6f994 | 483 | Darwin linker requires that a coalesced section start with a label. |
192d0f89 GK |
484 | Unfortunately, it also requires that 'debug' sections don't contain |
485 | labels. */ | |
4746cf84 | 486 | #undef FRAME_BEGIN_LABEL |
192d0f89 | 487 | #define FRAME_BEGIN_LABEL (for_eh ? "EH_frame" : "Lframe") |
4746cf84 | 488 | |
7904f95f | 489 | /* Emit a label for the FDE corresponding to DECL. EMPTY means |
4746cf84 MA |
490 | emit a label for an empty FDE. */ |
491 | #define TARGET_ASM_EMIT_UNWIND_LABEL darwin_emit_unwind_label | |
492 | ||
083cad55 EC |
493 | /* Emit a label to separate the exception table. */ |
494 | #define TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL darwin_emit_except_table_label | |
495 | ||
ee890fe2 SS |
496 | /* Our profiling scheme doesn't LP labels and counter words. */ |
497 | ||
9739c90c | 498 | #define NO_PROFILE_COUNTERS 1 |
ee890fe2 | 499 | |
ee890fe2 | 500 | #undef INIT_SECTION_ASM_OP |
d82f6b00 | 501 | #define INIT_SECTION_ASM_OP |
ee890fe2 SS |
502 | |
503 | #undef INVOKE__main | |
504 | ||
2cc07db4 RH |
505 | #define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor |
506 | #define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor | |
ee890fe2 | 507 | |
6ab9a3f4 SS |
508 | /* Always prefix with an underscore. */ |
509 | ||
510 | #define USER_LABEL_PREFIX "_" | |
511 | ||
08a6a74b RS |
512 | /* A dummy symbol that will be replaced with the function base name. */ |
513 | #define MACHOPIC_FUNCTION_BASE_NAME "<pic base>" | |
514 | ||
ee890fe2 SS |
515 | /* Don't output a .file directive. That is only used by the assembler for |
516 | error reporting. */ | |
720b7001 ZW |
517 | #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE |
518 | #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false | |
ee890fe2 | 519 | |
a5fe455b ZW |
520 | #undef TARGET_ASM_FILE_END |
521 | #define TARGET_ASM_FILE_END darwin_file_end | |
ee890fe2 | 522 | |
c082f9f3 SB |
523 | /* Because Mach-O relocations have a counter from 1 to 255 for the |
524 | section number they apply to, it is necessary to output all | |
525 | normal sections before the LTO sections, to make sure that the | |
526 | sections that may have relocations always have a section number | |
527 | smaller than 255. */ | |
528 | #undef TARGET_ASM_LTO_START | |
529 | #define TARGET_ASM_LTO_START darwin_asm_lto_start | |
530 | #undef TARGET_ASM_LTO_END | |
531 | #define TARGET_ASM_LTO_END darwin_asm_lto_end | |
532 | ||
dd2e44f0 IS |
533 | #define ASM_OUTPUT_SKIP(FILE,SIZE) \ |
534 | fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE) | |
2aa9948d | 535 | |
991b6592 | 536 | /* Give ObjC methods pretty symbol names. */ |
ee890fe2 SS |
537 | |
538 | #undef OBJC_GEN_METHOD_LABEL | |
dd2e44f0 IS |
539 | #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \ |
540 | do { if (CAT_NAME) \ | |
541 | sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \ | |
542 | (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \ | |
543 | else \ | |
544 | sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \ | |
545 | (CLASS_NAME), (SEL_NAME)); \ | |
546 | } while (0) | |
ee890fe2 | 547 | |
46a99b06 | 548 | #undef ASM_DECLARE_OBJECT_NAME |
dd2e44f0 IS |
549 | #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
550 | darwin_asm_declare_object_name ((FILE), (NAME), (DECL)) | |
46a99b06 | 551 | |
ee890fe2 SS |
552 | /* The RTTI data (e.g., __ti4name) is common and public (and static), |
553 | but it does need to be referenced via indirect PIC data pointers. | |
11abc112 | 554 | The machopic_define_symbol calls are telling the machopic subsystem |
ee890fe2 SS |
555 | that the name *is* defined in this module, so it doesn't need to |
556 | make them indirect. */ | |
557 | ||
dd2e44f0 IS |
558 | #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ |
559 | do { \ | |
560 | const char *xname = NAME; \ | |
561 | if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \ | |
562 | xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \ | |
563 | if (! DECL_WEAK (DECL) \ | |
564 | && ((TREE_STATIC (DECL) \ | |
565 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
566 | || DECL_INITIAL (DECL))) \ | |
567 | machopic_define_symbol (DECL_RTL (DECL)); \ | |
568 | if ((TREE_STATIC (DECL) \ | |
569 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
570 | || DECL_INITIAL (DECL)) \ | |
571 | (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \ | |
572 | ASM_OUTPUT_FUNCTION_LABEL (FILE, xname, DECL); \ | |
573 | } while (0) | |
ee890fe2 | 574 | |
e4f7c483 AS |
575 | #undef TARGET_ASM_DECLARE_CONSTANT_NAME |
576 | #define TARGET_ASM_DECLARE_CONSTANT_NAME darwin_asm_declare_constant_name | |
18f3e349 | 577 | |
ee890fe2 | 578 | /* Wrap new method names in quotes so the assembler doesn't gag. |
dd2e44f0 | 579 | Make Objective-C internal symbols local and in doing this, we need |
d8299715 DK |
580 | to accommodate the name mangling done by c++ on file scope locals. */ |
581 | ||
d8299715 | 582 | int darwin_label_is_anonymous_local_objc_name (const char *name); |
ee890fe2 SS |
583 | |
584 | #undef ASM_OUTPUT_LABELREF | |
dd2e44f0 IS |
585 | #define ASM_OUTPUT_LABELREF(FILE,NAME) \ |
586 | do { \ | |
587 | const char *xname = (NAME); \ | |
588 | if (! strcmp (xname, MACHOPIC_FUNCTION_BASE_NAME)) \ | |
589 | machopic_output_function_base_name(FILE); \ | |
590 | else if (xname[0] == '&' || xname[0] == '*') \ | |
591 | { \ | |
592 | int len = strlen (xname); \ | |
593 | if (len > 6 && !strcmp ("$stub", xname + len - 5)) \ | |
594 | machopic_validate_stub_or_non_lazy_ptr (xname); \ | |
595 | else if (len > 7 && !strcmp ("$stub\"", xname + len - 6)) \ | |
596 | machopic_validate_stub_or_non_lazy_ptr (xname); \ | |
597 | else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \ | |
598 | machopic_validate_stub_or_non_lazy_ptr (xname); \ | |
599 | else if (len > 15 && !strcmp ("$non_lazy_ptr\"", xname + len - 14)) \ | |
600 | machopic_validate_stub_or_non_lazy_ptr (xname); \ | |
601 | if (xname[1] != '"' && name_needs_quotes (&xname[1])) \ | |
602 | fprintf (FILE, "\"%s\"", &xname[1]); \ | |
603 | else \ | |
604 | fputs (&xname[1], FILE); \ | |
605 | } \ | |
606 | else if (xname[0] == '+' || xname[0] == '-') \ | |
607 | fprintf (FILE, "\"%s\"", xname); \ | |
d764a8e6 | 608 | else if (darwin_label_is_anonymous_local_objc_name (xname)) \ |
dd2e44f0 | 609 | fprintf (FILE, "L%s", xname); \ |
dd2e44f0 | 610 | else if (xname[0] != '"' && name_needs_quotes (xname)) \ |
cebb4698 | 611 | asm_fprintf (FILE, "\"%U%s\"", xname); \ |
dd2e44f0 IS |
612 | else \ |
613 | asm_fprintf (FILE, "%U%s", xname); \ | |
614 | } while (0) | |
ee890fe2 | 615 | |
2aa9948d SS |
616 | /* Output before executable code. */ |
617 | #undef TEXT_SECTION_ASM_OP | |
f1a66265 | 618 | #define TEXT_SECTION_ASM_OP "\t.text" |
2aa9948d SS |
619 | |
620 | /* Output before writable data. */ | |
621 | ||
622 | #undef DATA_SECTION_ASM_OP | |
f1a66265 | 623 | #define DATA_SECTION_ASM_OP "\t.data" |
2aa9948d | 624 | |
ee890fe2 SS |
625 | #undef ALIGN_ASM_OP |
626 | #define ALIGN_ASM_OP ".align" | |
627 | ||
628 | #undef ASM_OUTPUT_ALIGN | |
dd2e44f0 IS |
629 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ |
630 | if ((LOG) != 0) \ | |
631 | fprintf (FILE, "\t%s\t%d\n", ALIGN_ASM_OP, (LOG)) | |
ee890fe2 | 632 | |
4beb5c4b MS |
633 | /* The maximum alignment which the object file format can support in |
634 | bits. For Mach-O, this is 2^15 bytes. */ | |
ee890fe2 SS |
635 | |
636 | #undef MAX_OFILE_ALIGNMENT | |
4beb5c4b | 637 | #define MAX_OFILE_ALIGNMENT (0x8000 * 8) |
ee890fe2 | 638 | |
46a99b06 IS |
639 | #define L2_MAX_OFILE_ALIGNMENT 15 |
640 | ||
641 | /* These are the three variants that emit referenced blank space. */ | |
dd2e44f0 IS |
642 | #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ |
643 | darwin_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) | |
46a99b06 IS |
644 | |
645 | #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL | |
dd2e44f0 IS |
646 | #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ |
647 | darwin_asm_output_aligned_decl_local \ | |
648 | ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) | |
46a99b06 IS |
649 | |
650 | #undef ASM_OUTPUT_ALIGNED_DECL_COMMON | |
dd2e44f0 IS |
651 | #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ |
652 | darwin_asm_output_aligned_decl_common \ | |
653 | ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) | |
46a99b06 | 654 | |
fee3eacd IS |
655 | /* The generic version, archs should over-ride where required. */ |
656 | #define MACHOPIC_NL_SYMBOL_PTR_SECTION ".non_lazy_symbol_pointer" | |
657 | ||
d6b5193b | 658 | /* Declare the section variables. */ |
c3e23a08 | 659 | #ifndef USED_FOR_TARGET |
56c779bc GK |
660 | enum darwin_section_enum { |
661 | #define DEF_SECTION(NAME, FLAGS, DIRECTIVE, OBJC) NAME, | |
d6b5193b RS |
662 | #include "darwin-sections.def" |
663 | #undef DEF_SECTION | |
56c779bc GK |
664 | NUM_DARWIN_SECTIONS |
665 | }; | |
666 | extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS]; | |
0e230dfa | 667 | #endif |
ee890fe2 | 668 | |
ae46c4e0 RH |
669 | #undef TARGET_ASM_SELECT_SECTION |
670 | #define TARGET_ASM_SELECT_SECTION machopic_select_section | |
1f81953b | 671 | |
f16d3f39 JH |
672 | #undef TARGET_ASM_FUNCTION_SECTION |
673 | #define TARGET_ASM_FUNCTION_SECTION darwin_function_section | |
f1a66265 | 674 | |
14d11d40 | 675 | #undef TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS |
dd2e44f0 IS |
676 | #define TARGET_ASM_FUNCTION_SWITCHED_TEXT_SECTIONS \ |
677 | darwin_function_switched_text_sections | |
14d11d40 | 678 | |
b64a1b53 RH |
679 | #undef TARGET_ASM_SELECT_RTX_SECTION |
680 | #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section | |
4746cf84 MA |
681 | #undef TARGET_ASM_UNIQUE_SECTION |
682 | #define TARGET_ASM_UNIQUE_SECTION darwin_unique_section | |
ab5c8549 JJ |
683 | #undef TARGET_ASM_FUNCTION_RODATA_SECTION |
684 | #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section | |
50b0b78a IS |
685 | |
686 | #undef TARGET_ASM_TM_CLONE_TABLE_SECTION | |
687 | #define TARGET_ASM_TM_CLONE_TABLE_SECTION darwin_tm_clone_table_section | |
688 | ||
24c78b3a RH |
689 | #undef TARGET_ASM_RELOC_RW_MASK |
690 | #define TARGET_ASM_RELOC_RW_MASK machopic_reloc_rw_mask | |
4746cf84 | 691 | |
5eb99654 | 692 | /* Globalizing directive for a label. */ |
83bf7f5e | 693 | #define GLOBAL_ASM_OP "\t.globl " |
5eb99654 | 694 | #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label |
ee890fe2 | 695 | |
6ce4806b MA |
696 | /* Emit an assembler directive to set visibility for a symbol. Used |
697 | to support visibility attribute and Darwin's private extern | |
ff482c8d | 698 | feature. */ |
6ce4806b MA |
699 | #undef TARGET_ASM_ASSEMBLE_VISIBILITY |
700 | #define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility | |
701 | ||
005c1a13 | 702 | /* Extra attributes for Darwin. */ |
dd2e44f0 | 703 | #define SUBTARGET_ATTRIBUTE_TABLE \ |
62d784f7 KT |
704 | /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, \ |
705 | affects_type_identity } */ \ | |
dd2e44f0 | 706 | { "apple_kext_compatibility", 0, 0, false, true, false, \ |
62d784f7 | 707 | darwin_handle_kext_attribute, false }, \ |
dd2e44f0 | 708 | { "weak_import", 0, 0, true, false, false, \ |
62d784f7 | 709 | darwin_handle_weak_import_attribute, false } |
6ce4806b | 710 | |
ee890fe2 | 711 | #undef ASM_GENERATE_INTERNAL_LABEL |
dd2e44f0 IS |
712 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ |
713 | sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM)) | |
ee890fe2 | 714 | |
8e3e233b DP |
715 | #undef TARGET_ASM_MARK_DECL_PRESERVED |
716 | #define TARGET_ASM_MARK_DECL_PRESERVED darwin_mark_decl_preserved | |
717 | ||
11abc112 MM |
718 | /* Set on a symbol with SYMBOL_FLAG_FUNCTION or |
719 | MACHO_SYMBOL_FLAG_VARIABLE to indicate that the function or | |
2e71a7a3 EC |
720 | variable has been defined in this translation unit. |
721 | When porting Mach-O to new architectures you need to make | |
722 | sure these aren't clobbered by the backend. */ | |
699c914a | 723 | |
11abc112 MM |
724 | #define MACHO_SYMBOL_FLAG_VARIABLE (SYMBOL_FLAG_MACH_DEP) |
725 | #define MACHO_SYMBOL_FLAG_DEFINED ((SYMBOL_FLAG_MACH_DEP) << 1) | |
726 | ||
699c914a MS |
727 | /* Set on a symbol to indicate when fix-and-continue style code |
728 | generation is being used and the symbol refers to a static symbol | |
729 | that should be rebound from new instances of a translation unit to | |
730 | the original instance of the data. */ | |
731 | ||
732 | #define MACHO_SYMBOL_STATIC ((SYMBOL_FLAG_MACH_DEP) << 2) | |
733 | ||
ee890fe2 SS |
734 | /* Symbolic names for various things we might know about a symbol. */ |
735 | ||
736 | enum machopic_addr_class { | |
737 | MACHOPIC_UNDEFINED, | |
738 | MACHOPIC_DEFINED_DATA, | |
739 | MACHOPIC_UNDEFINED_DATA, | |
740 | MACHOPIC_DEFINED_FUNCTION, | |
741 | MACHOPIC_UNDEFINED_FUNCTION | |
742 | }; | |
743 | ||
744 | /* Macros defining the various PIC cases. */ | |
745 | ||
fee3eacd IS |
746 | #undef MACHO_DYNAMIC_NO_PIC_P |
747 | #define MACHO_DYNAMIC_NO_PIC_P (TARGET_MACHO_DYNAMIC_NO_PIC) | |
748 | #undef MACHOPIC_INDIRECT | |
ab82a49f | 749 | #define MACHOPIC_INDIRECT (flag_pic || MACHO_DYNAMIC_NO_PIC_P) |
c446d1a7 | 750 | #define MACHOPIC_JUST_INDIRECT (MACHO_DYNAMIC_NO_PIC_P) |
fee3eacd | 751 | #undef MACHOPIC_PURE |
c446d1a7 | 752 | #define MACHOPIC_PURE (flag_pic && ! MACHO_DYNAMIC_NO_PIC_P) |
ee890fe2 | 753 | |
b069de3b | 754 | #undef TARGET_ENCODE_SECTION_INFO |
fb49053f | 755 | #define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info |
b069de3b | 756 | #undef TARGET_STRIP_NAME_ENCODING |
11abc112 | 757 | #define TARGET_STRIP_NAME_ENCODING default_strip_name_encoding |
df56a27f | 758 | |
dd2e44f0 IS |
759 | #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \ |
760 | do { \ | |
761 | const char *const stub_ = (STUB); \ | |
762 | char *buffer_ = (BUF); \ | |
763 | strcpy (buffer_, stub_); \ | |
764 | if (stub_[0] == '"') \ | |
765 | { \ | |
766 | strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\""); \ | |
767 | } \ | |
768 | else \ | |
769 | { \ | |
770 | strcpy (buffer_ + (STUB_LENGTH), "_binder"); \ | |
771 | } \ | |
772 | } while (0) | |
773 | ||
774 | #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ | |
775 | do { \ | |
776 | const char *const symbol_ = (SYMBOL); \ | |
777 | char *buffer_ = (BUF); \ | |
778 | if (name_needs_quotes (symbol_) && symbol_[0] != '"') \ | |
779 | { \ | |
780 | sprintf (buffer_, "\"%s\"", symbol_); \ | |
781 | } \ | |
782 | else \ | |
783 | { \ | |
784 | strcpy (buffer_, symbol_); \ | |
785 | } \ | |
786 | } while (0) | |
ee890fe2 SS |
787 | |
788 | /* Given a symbol name string, create the lazy pointer version | |
789 | of the symbol name. */ | |
790 | ||
dd2e44f0 IS |
791 | #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ |
792 | do { \ | |
793 | const char *symbol_ = (SYMBOL); \ | |
794 | char *buffer_ = (BUF); \ | |
795 | if (symbol_[0] == '"') \ | |
796 | { \ | |
797 | strcpy (buffer_, "\"L"); \ | |
798 | strcpy (buffer_ + 2, symbol_ + 1); \ | |
799 | strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\""); \ | |
800 | } \ | |
801 | else if (name_needs_quotes (symbol_)) \ | |
802 | { \ | |
803 | strcpy (buffer_, "\"L"); \ | |
804 | strcpy (buffer_ + 2, symbol_); \ | |
805 | strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\""); \ | |
806 | } \ | |
807 | else \ | |
808 | { \ | |
809 | strcpy (buffer_, "L"); \ | |
810 | strcpy (buffer_ + 1, symbol_); \ | |
811 | strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr"); \ | |
812 | } \ | |
813 | } while (0) | |
ee890fe2 | 814 | |
4746cf84 | 815 | #define EH_FRAME_SECTION_NAME "__TEXT" |
92b9a671 | 816 | #define EH_FRAME_SECTION_ATTR ",coalesced,no_toc+strip_static_syms+live_support" |
4746cf84 | 817 | |
f1a66265 GK |
818 | /* Java runtime class list. */ |
819 | #define JCR_SECTION_NAME "__DATA,jcr,regular,no_dead_strip" | |
820 | ||
b069de3b | 821 | #undef ASM_PREFERRED_EH_DATA_FORMAT |
dd2e44f0 IS |
822 | #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ |
823 | (((CODE) == 2 && (GLOBAL) == 1) \ | |
824 | ? (DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4) : \ | |
825 | ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr) | |
7606e68f | 826 | |
dd2e44f0 IS |
827 | #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \ |
828 | darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2) | |
7606e68f | 829 | |
dd2e44f0 IS |
830 | #define ASM_OUTPUT_DWARF_OFFSET(FILE,SIZE,LABEL,BASE) \ |
831 | darwin_asm_output_dwarf_offset (FILE, SIZE, LABEL, BASE) | |
192d0f89 | 832 | |
dd2e44f0 IS |
833 | #define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(ASM_OUT_FILE, ENCODING, SIZE, ADDR, DONE) \ |
834 | if (ENCODING == ASM_PREFERRED_EH_DATA_FORMAT (2, 1)) { \ | |
835 | darwin_non_lazy_pcrel (ASM_OUT_FILE, ADDR); \ | |
836 | goto DONE; \ | |
837 | } | |
4746cf84 | 838 | |
5a25e0c5 DJ |
839 | /* Experimentally, putting jump tables in text is faster on SPEC. |
840 | Also this is needed for correctness for coalesced functions. */ | |
841 | ||
842 | #ifndef JUMP_TABLES_IN_TEXT_SECTION | |
31492595 | 843 | #define JUMP_TABLES_IN_TEXT_SECTION 1 |
5a25e0c5 | 844 | #endif |
4746cf84 | 845 | |
7606e68f | 846 | #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false |
abe72dd8 | 847 | |
d6b5193b | 848 | #define TARGET_ASM_INIT_SECTIONS darwin_init_sections |
4746cf84 MA |
849 | #undef TARGET_ASM_NAMED_SECTION |
850 | #define TARGET_ASM_NAMED_SECTION darwin_asm_named_section | |
4746cf84 | 851 | |
dd2e44f0 IS |
852 | #define DARWIN_REGISTER_TARGET_PRAGMAS() \ |
853 | do { \ | |
854 | if (!flag_preprocess_only) \ | |
855 | cpp_register_pragma (parse_in, NULL, "mark", \ | |
856 | darwin_pragma_ignore, false); \ | |
857 | c_register_pragma (0, "options", darwin_pragma_options); \ | |
858 | c_register_pragma (0, "segment", darwin_pragma_ignore); \ | |
859 | c_register_pragma (0, "unused", darwin_pragma_unused); \ | |
860 | c_register_pragma (0, "ms_struct", darwin_pragma_ms_struct); \ | |
861 | } while (0) | |
2aa9948d SS |
862 | |
863 | #undef ASM_APP_ON | |
864 | #define ASM_APP_ON "" | |
865 | #undef ASM_APP_OFF | |
866 | #define ASM_APP_OFF "" | |
213c4a8a | 867 | |
3dd53121 AP |
868 | void darwin_register_frameworks (const char *, const char *, int); |
869 | void darwin_register_objc_includes (const char *, const char *, int); | |
870 | #define TARGET_EXTRA_PRE_INCLUDES darwin_register_objc_includes | |
94d1613b MS |
871 | #define TARGET_EXTRA_INCLUDES darwin_register_frameworks |
872 | ||
873 | void add_framework_path (char *); | |
874 | #define TARGET_OPTF add_framework_path | |
875 | ||
4969c0d8 | 876 | #define TARGET_POSIX_IO |
8db4d7a1 | 877 | |
ed5b9f96 | 878 | /* All new versions of Darwin have C99 functions. */ |
23f99493 | 879 | |
68ece23d | 880 | #define TARGET_C99_FUNCTIONS 1 |
9b2d02a0 | 881 | |
2baeaa1b MS |
882 | #define WINT_TYPE "int" |
883 | ||
953ff289 DN |
884 | /* Every program on darwin links against libSystem which contains the pthread |
885 | routines, so there's no need to explicitly call out when doing threaded | |
886 | work. */ | |
23f99493 | 887 | |
953ff289 DN |
888 | #undef GOMP_SELF_SPECS |
889 | #define GOMP_SELF_SPECS "" | |
255a9a1b EB |
890 | #undef GTM_SELF_SPECS |
891 | #define GTM_SELF_SPECS "" | |
953ff289 | 892 | |
dd2e44f0 | 893 | /* Darwin disables section anchors by default. |
46a99b06 | 894 | They should be enabled per arch where support exists in that arch. */ |
23f99493 | 895 | #define TARGET_ASM_OUTPUT_ANCHOR NULL |
46a99b06 | 896 | #define DARWIN_SECTION_ANCHORS 0 |
23f99493 | 897 | |
10e48e39 | 898 | #define HAVE_ENABLE_EXECUTE_STACK |
c6c621d4 | 899 | |
f475fd3c MS |
900 | /* For Apple KEXTs, we make the constructors return this to match gcc |
901 | 2.95. */ | |
902 | #define TARGET_CXX_CDTOR_RETURNS_THIS (darwin_kextabi_p) | |
f475fd3c MS |
903 | #define TARGET_KEXTABI flag_apple_kext |
904 | ||
26705988 | 905 | /* We have target-specific builtins. */ |
1cd130b0 | 906 | #define SUBTARGET_FOLD_BUILTIN darwin_fold_builtin |
26705988 | 907 | |
91ebb981 IS |
908 | #define TARGET_N_FORMAT_TYPES 1 |
909 | #define TARGET_FORMAT_TYPES darwin_additional_format_types | |
910 | ||
927b679c IS |
911 | #ifndef USED_FOR_TARGET |
912 | extern void darwin_driver_init (unsigned int *,struct cl_decoded_option **); | |
dd2e44f0 IS |
913 | #define GCC_DRIVER_HOST_INITIALIZATION \ |
914 | darwin_driver_init (&decoded_options_count, &decoded_options) | |
927b679c | 915 | #endif |
e46b55d0 | 916 | |
8cd01fe6 JDA |
917 | /* The Apple assembler and linker do not support constructor priorities. */ |
918 | #undef SUPPORTS_INIT_PRIORITY | |
919 | #define SUPPORTS_INIT_PRIORITY 0 | |
920 | ||
558c362a IS |
921 | /* When building cross-compilers (and native crosses) we shall default to |
922 | providing an osx-version-min of this unless overridden by the User. */ | |
923 | #define DEF_MIN_OSX_VERSION "10.4" | |
924 | ||
213c4a8a | 925 | #endif /* CONFIG_DARWIN_H */ |