]>
Commit | Line | Data |
---|---|---|
ee890fe2 | 1 | /* Target definitions for Darwin (Mac OS X) systems. |
0ea5865c | 2 | Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003, 2004 |
ee890fe2 SS |
3 | Free Software Foundation, Inc. |
4 | Contributed by Apple Computer Inc. | |
5 | ||
7ec022b2 | 6 | This file is part of GCC. |
ee890fe2 | 7 | |
7ec022b2 | 8 | GCC is free software; you can redistribute it and/or modify |
ee890fe2 SS |
9 | it under the terms of the GNU General Public License as published by |
10 | the Free Software Foundation; either version 2, or (at your option) | |
11 | any later version. | |
12 | ||
7ec022b2 | 13 | GCC is distributed in the hope that it will be useful, |
ee890fe2 SS |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
7ec022b2 | 19 | along with GCC; see the file COPYING. If not, write to |
ee890fe2 SS |
20 | the Free Software Foundation, 59 Temple Place - Suite 330, |
21 | Boston, MA 02111-1307, USA. */ | |
22 | ||
213c4a8a GK |
23 | #ifndef CONFIG_DARWIN_H |
24 | #define CONFIG_DARWIN_H | |
25 | ||
ee890fe2 SS |
26 | /* The definitions in this file are common to all processor types |
27 | running Darwin, which is the kernel for Mac OS X. Darwin is | |
28 | basically a BSD user layer laid over a Mach kernel, then evolved | |
29 | for many years (at NeXT) in parallel with other Unix systems. So | |
30 | while the runtime is a somewhat idiosyncratic Mach-based thing, | |
31 | other definitions look like they would for a BSD variant. */ | |
32 | ||
33 | /* Although NeXT ran on many different architectures, as of Jan 2001 | |
34 | the only supported Darwin targets are PowerPC and x86. */ | |
35 | ||
7606e68f SS |
36 | /* One of Darwin's NeXT legacies is the Mach-O format, which is partly |
37 | like a.out and partly like COFF, with additional features like | |
38 | multi-architecture binary support. */ | |
39 | ||
40 | #define OBJECT_FORMAT_MACHO | |
41 | ||
abe72dd8 SS |
42 | /* Suppress g++ attempt to link in the math library automatically. |
43 | (Some Darwin versions have a libm, but they seem to cause problems | |
9b2d02a0 AP |
44 | for C++ executables.) This needs to be -lmx for Darwin 7.0 and |
45 | above. */ | |
46 | #ifndef MATH_LIBRARY | |
abe72dd8 | 47 | #define MATH_LIBRARY "" |
9b2d02a0 | 48 | #endif |
ee890fe2 SS |
49 | |
50 | /* We have atexit. */ | |
51 | ||
52 | #define HAVE_ATEXIT | |
53 | ||
54 | /* Define an empty body for the function do_global_dtors() in libgcc2.c. */ | |
55 | ||
56 | #define DO_GLOBAL_DTORS_BODY | |
57 | ||
58 | /* The string value for __SIZE_TYPE__. */ | |
59 | ||
60 | #ifndef SIZE_TYPE | |
61 | #define SIZE_TYPE "long unsigned int" | |
62 | #endif | |
63 | ||
64 | /* Type used for ptrdiff_t, as a string used in a declaration. */ | |
65 | ||
66 | #undef PTRDIFF_TYPE | |
67 | #define PTRDIFF_TYPE "int" | |
68 | ||
69 | /* wchar_t is int. */ | |
70 | ||
71 | #undef WCHAR_TYPE | |
72 | #define WCHAR_TYPE "int" | |
73 | #undef WCHAR_TYPE_SIZE | |
74 | #define WCHAR_TYPE_SIZE 32 | |
75 | ||
f37f462a SS |
76 | /* Default to using the NeXT-style runtime, since that's what is |
77 | pre-installed on Darwin systems. */ | |
78 | ||
79 | #define NEXT_OBJC_RUNTIME | |
80 | ||
ee890fe2 SS |
81 | /* Don't default to pcc-struct-return, because gcc is the only compiler, and |
82 | we want to retain compatibility with older gcc versions. */ | |
83 | ||
84 | #undef DEFAULT_PCC_STRUCT_RETURN | |
85 | #define DEFAULT_PCC_STRUCT_RETURN 0 | |
86 | ||
48aec0bc DP |
87 | /* This table intercepts weirdo options whose names would interfere |
88 | with normal driver conventions, and either translates them into | |
89 | standardly-named options, or adds a 'Z' so that they can get to | |
90 | specs processing without interference. | |
91 | ||
92 | Do not expand a linker option to "-Xlinker -<option>", since that | |
93 | forfeits the ability to control via spec strings later. However, | |
94 | as a special exception, do this translation with -filelist, because | |
95 | otherwise the driver will think there are no input files and quit. | |
96 | (The alternative would be to hack the driver to recognize -filelist | |
97 | specially, but it's simpler to use the translation table.) | |
98 | ||
99 | Note that an option name with a prefix that matches another option | |
100 | name, that also takes an argument, needs to be modified so the | |
101 | prefix is different, otherwise a '*' after the shorter option will | |
8bb418a3 ZL |
102 | match with the longer one. |
103 | ||
104 | The SUBTARGET_OPTION_TRANSLATE_TABLE macro, which _must_ be defined | |
105 | in gcc/config/{i386,rs6000}/darwin.h, should contain any additional | |
106 | command-line option translations specific to the particular target | |
107 | architecture. */ | |
108 | ||
48aec0bc DP |
109 | #define TARGET_OPTION_TRANSLATE_TABLE \ |
110 | { "-all_load", "-Zall_load" }, \ | |
111 | { "-allowable_client", "-Zallowable_client" }, \ | |
112 | { "-arch_errors_fatal", "-Zarch_errors_fatal" }, \ | |
113 | { "-bind_at_load", "-Zbind_at_load" }, \ | |
114 | { "-bundle", "-Zbundle" }, \ | |
115 | { "-bundle_loader", "-Zbundle_loader" }, \ | |
116 | { "-weak_reference_mismatches", "-Zweak_reference_mismatches" }, \ | |
117 | { "-dependency-file", "-MF" }, \ | |
118 | { "-dylib_file", "-Zdylib_file" }, \ | |
3ab68120 | 119 | { "-dynamic", "-Zdynamic" }, \ |
48aec0bc DP |
120 | { "-dynamiclib", "-Zdynamiclib" }, \ |
121 | { "-exported_symbols_list", "-Zexported_symbols_list" }, \ | |
122 | { "-seg_addr_table_filename", "-Zseg_addr_table_filename" }, \ | |
123 | { "-filelist", "-Xlinker -filelist -Xlinker" }, \ | |
94d1613b | 124 | { "-framework", "-Xlinker -framework -Xlinker" }, \ |
48aec0bc DP |
125 | { "-flat_namespace", "-Zflat_namespace" }, \ |
126 | { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" }, \ | |
127 | { "-force_flat_namespace", "-Zforce_flat_namespace" }, \ | |
128 | { "-image_base", "-Zimage_base" }, \ | |
129 | { "-init", "-Zinit" }, \ | |
130 | { "-install_name", "-Zinstall_name" }, \ | |
131 | { "-multiply_defined_unused", "-Zmultiplydefinedunused" }, \ | |
132 | { "-multiply_defined", "-Zmultiply_defined" }, \ | |
133 | { "-multi_module", "-Zmulti_module" }, \ | |
134 | { "-static", "-static -Wa,-static" }, \ | |
135 | { "-single_module", "-Zsingle_module" }, \ | |
8bb418a3 ZL |
136 | { "-unexported_symbols_list", "-Zunexported_symbols_list" }, \ |
137 | SUBTARGET_OPTION_TRANSLATE_TABLE | |
138 | ||
48aec0bc DP |
139 | /* These compiler options take n arguments. */ |
140 | ||
141 | #undef WORD_SWITCH_TAKES_ARG | |
142 | #define WORD_SWITCH_TAKES_ARG(STR) \ | |
143 | (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \ | |
144 | !strcmp (STR, "Zallowable_client") ? 1 : \ | |
145 | !strcmp (STR, "arch") ? 1 : \ | |
146 | !strcmp (STR, "arch_only") ? 1 : \ | |
147 | !strcmp (STR, "Zbundle_loader") ? 1 : \ | |
148 | !strcmp (STR, "client_name") ? 1 : \ | |
149 | !strcmp (STR, "compatibility_version") ? 1 : \ | |
150 | !strcmp (STR, "current_version") ? 1 : \ | |
151 | !strcmp (STR, "Zdylib_file") ? 1 : \ | |
152 | !strcmp (STR, "Zexported_symbols_list") ? 1 : \ | |
153 | !strcmp (STR, "Zimage_base") ? 1 : \ | |
154 | !strcmp (STR, "Zinit") ? 1 : \ | |
155 | !strcmp (STR, "Zinstall_name") ? 1 : \ | |
156 | !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \ | |
157 | !strcmp (STR, "Zmultiply_defined") ? 1 : \ | |
158 | !strcmp (STR, "precomp-trustfile") ? 1 : \ | |
159 | !strcmp (STR, "read_only_relocs") ? 1 : \ | |
160 | !strcmp (STR, "sectcreate") ? 3 : \ | |
161 | !strcmp (STR, "sectorder") ? 3 : \ | |
162 | !strcmp (STR, "Zseg_addr_table_filename") ?1 :\ | |
163 | !strcmp (STR, "seg1addr") ? 1 : \ | |
164 | !strcmp (STR, "segprot") ? 3 : \ | |
165 | !strcmp (STR, "seg_addr_table") ? 1 : \ | |
166 | !strcmp (STR, "sub_library") ? 1 : \ | |
167 | !strcmp (STR, "sub_umbrella") ? 1 : \ | |
168 | !strcmp (STR, "umbrella") ? 1 : \ | |
169 | !strcmp (STR, "undefined") ? 1 : \ | |
170 | !strcmp (STR, "Zunexported_symbols_list") ? 1 : \ | |
171 | !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \ | |
172 | !strcmp (STR, "pagezero_size") ? 1 : \ | |
173 | !strcmp (STR, "segs_read_only_addr") ? 1 : \ | |
174 | !strcmp (STR, "segs_read_write_addr") ? 1 : \ | |
175 | !strcmp (STR, "sectalign") ? 3 : \ | |
176 | !strcmp (STR, "sectobjectsymbols") ? 2 : \ | |
177 | !strcmp (STR, "segcreate") ? 3 : \ | |
178 | !strcmp (STR, "dylinker_install_name") ? 1 : \ | |
179 | 0) | |
180 | ||
94d1613b MS |
181 | /* Machine dependent cpp options. __APPLE_CC__ is defined as the |
182 | Apple include files expect it to be defined and won't work if it | |
183 | isn't. */ | |
ee890fe2 | 184 | |
ee890fe2 | 185 | #undef CPP_SPEC |
94d1613b MS |
186 | #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}\ |
187 | -D__APPLE_CC__=1" | |
ee890fe2 | 188 | |
48aec0bc DP |
189 | /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus |
190 | precomp, libtool, and fat build additions. Also we | |
191 | don't specify a second %G after %L because libSystem is | |
192 | self-contained and doesn't need to link against libgcc.a. */ | |
193 | /* In general, random Darwin linker flags should go into LINK_SPEC | |
194 | instead of LINK_COMMAND_SPEC. The command spec is better for | |
195 | specifying the handling of options understood by generic Unix | |
196 | linkers, and for positional arguments like libraries. */ | |
197 | #define LINK_COMMAND_SPEC "\ | |
198 | %{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\ | |
199 | %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \ | |
3a7e8b87 GK |
200 | %{!Zdynamiclib:-arch %(darwin_arch)} \ |
201 | %{Zdynamiclib:-arch_only %(darwin_arch)} \ | |
48aec0bc DP |
202 | %l %X %{d} %{s} %{t} %{Z} \ |
203 | %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \ | |
204 | %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \ | |
205 | %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \ | |
06fc4e41 | 206 | %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate:-lgcov} \ |
1f61a15d | 207 | %{!nostdlib:%{!nodefaultlibs:%G %L}} \ |
48aec0bc | 208 | %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \ |
23bd1514 | 209 | %{!--help:%{!no-c++filt|c++filt:| c++filt }} }}}}}}}}" |
48aec0bc DP |
210 | |
211 | /* Please keep the random linker options in alphabetical order (modulo | |
212 | 'Z' and 'no' prefixes). Options that can only go to one of libtool | |
213 | or ld must be listed twice, under both !Zdynamiclib and | |
214 | Zdynamiclib, with one of the cases reporting an error. */ | |
215 | /* Note that options taking arguments may appear multiple times on a | |
216 | command line with different arguments each time, so put a * after | |
217 | their names so all of them get passed. */ | |
218 | #define LINK_SPEC \ | |
219 | "%{static}%{!static:-dynamic} \ | |
220 | %{!Zdynamiclib: \ | |
221 | %{Zbundle:-bundle} \ | |
222 | %{Zbundle_loader*:-bundle_loader %*} \ | |
223 | %{client_name*} \ | |
224 | %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\ | |
225 | } \ | |
226 | %{current_version*:%e-current_version only allowed with -dynamiclib} \ | |
227 | %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \ | |
228 | %{Zforce_flat_namespace:-force_flat_namespace} \ | |
229 | %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \ | |
230 | %{keep_private_externs} \ | |
231 | %{private_bundle} \ | |
232 | } \ | |
233 | %{Zdynamiclib: \ | |
234 | %{Zbundle:%e-bundle not allowed with -dynamiclib} \ | |
235 | %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \ | |
236 | %{client_name*:%e-client_name not allowed with -dynamiclib} \ | |
237 | %{compatibility_version*} \ | |
238 | %{current_version*} \ | |
239 | %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \ | |
240 | %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \ | |
241 | %{Zinstall_name*:-install_name %*} \ | |
242 | %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \ | |
243 | %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \ | |
244 | } \ | |
245 | %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \ | |
246 | %{Zallowable_client*:-allowable_client %*} \ | |
247 | %{Zbind_at_load:-bind_at_load} \ | |
248 | %{Zarch_errors_fatal:-arch_errors_fatal} \ | |
249 | %{Zdylib_file*:-dylib_file %*} \ | |
3ab68120 | 250 | %{Zdynamic:-dynamic}\ |
48aec0bc DP |
251 | %{Zexported_symbols_list*:-exported_symbols_list %*} \ |
252 | %{Zflat_namespace:-flat_namespace} \ | |
253 | %{headerpad_max_install_names*} \ | |
254 | %{Zimage_base*:-image_base %*} \ | |
255 | %{Zinit*:-init %*} \ | |
256 | %{nomultidefs} \ | |
257 | %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \ | |
258 | %{Zmultiply_defined*:-multiply_defined %*} \ | |
259 | %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \ | |
e62f462e | 260 | %{prebind} %{noprebind} %{nofixprebinding} %{prebind_all_twolevel_modules} \ |
48aec0bc DP |
261 | %{read_only_relocs} \ |
262 | %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \ | |
263 | %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \ | |
264 | %{sub_library*} %{sub_umbrella*} \ | |
265 | %{twolevel_namespace} %{twolevel_namespace_hints} \ | |
266 | %{umbrella*} \ | |
267 | %{undefined*} \ | |
268 | %{Zunexported_symbols_list*:-unexported_symbols_list %*} \ | |
269 | %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \ | |
270 | %{X} \ | |
271 | %{y*} \ | |
272 | %{w} \ | |
273 | %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \ | |
274 | %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \ | |
275 | %{whatsloaded} %{dylinker_install_name*} \ | |
276 | %{dylinker} %{Mach} " | |
277 | ||
278 | ||
ee890fe2 SS |
279 | /* Machine dependent libraries. */ |
280 | ||
281 | #undef LIB_SPEC | |
5fa5a27c | 282 | #define LIB_SPEC "%{!static:-lSystem}" |
ee890fe2 | 283 | |
991b6592 | 284 | /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */ |
ee890fe2 | 285 | |
48aec0bc | 286 | #undef STARTFILE_SPEC |
ee890fe2 | 287 | #define STARTFILE_SPEC \ |
48aec0bc DP |
288 | "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \ |
289 | %{!Zbundle:%{pg:%{static:-lgcrt0.o} \ | |
290 | %{!static:%{object:-lgcrt0.o} \ | |
291 | %{!object:%{preload:-lgcrt0.o} \ | |
2f70eed1 | 292 | %{!preload:-lgcrt1.o crt2.o%s}}}} \ |
48aec0bc DP |
293 | %{!pg:%{static:-lcrt0.o} \ |
294 | %{!static:%{object:-lcrt0.o} \ | |
295 | %{!object:%{preload:-lcrt0.o} \ | |
2f70eed1 | 296 | %{!preload:-lcrt1.o crt2.o%s}}}}}}" |
7606e68f | 297 | |
3cfe49da GK |
298 | /* The native Darwin linker doesn't necessarily place files in the order |
299 | that they're specified on the link line. Thus, it is pointless | |
300 | to put anything in ENDFILE_SPEC. */ | |
301 | /* #define ENDFILE_SPEC "" */ | |
ee890fe2 | 302 | |
ee890fe2 SS |
303 | /* We use Dbx symbol format. */ |
304 | ||
23532de9 | 305 | #define DBX_DEBUGGING_INFO 1 |
ee890fe2 | 306 | |
eeab4d81 MS |
307 | /* Also enable Dwarf 2 as an option. */ |
308 | #define DWARF2_DEBUGGING_INFO | |
309 | #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG | |
310 | ||
311 | #define DEBUG_FRAME_SECTION "__DWARFA,__debug_frame,coalesced,no_toc+strip_static_syms" | |
312 | #define DEBUG_INFO_SECTION "__DWARFA,__debug_info" | |
313 | #define DEBUG_ABBREV_SECTION "__DWARFA,__debug_abbrev" | |
314 | #define DEBUG_ARANGES_SECTION "__DWARFA,__debug_aranges" | |
315 | #define DEBUG_MACINFO_SECTION "__DWARFA,__debug_macinfo" | |
316 | #define DEBUG_LINE_SECTION "__DWARFA,__debug_line" | |
317 | #define DEBUG_LOC_SECTION "__DWARFA,__debug_loc" | |
318 | #define DEBUG_PUBNAMES_SECTION "__DWARFA,__debug_pubnames" | |
319 | #define DEBUG_STR_SECTION "__DWARFA,__debug_str" | |
320 | #define DEBUG_RANGES_SECTION "__DWARFA,__debug_ranges" | |
321 | ||
ee890fe2 SS |
322 | /* When generating stabs debugging, use N_BINCL entries. */ |
323 | ||
324 | #define DBX_USE_BINCL | |
325 | ||
326 | /* There is no limit to the length of stabs strings. */ | |
327 | ||
328 | #define DBX_CONTIN_LENGTH 0 | |
329 | ||
991b6592 | 330 | /* gdb needs a null N_SO at the end of each file for scattered loading. */ |
ee890fe2 SS |
331 | |
332 | #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END | |
333 | #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ | |
334 | do { text_section (); \ | |
335 | fprintf (FILE, \ | |
336 | "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO); \ | |
337 | } while (0) | |
338 | ||
4746cf84 MA |
339 | /* Making a symbols weak on Darwin requires more than just setting DECL_WEAK. */ |
340 | #define MAKE_DECL_ONE_ONLY(DECL) darwin_make_decl_one_only (DECL) | |
341 | ||
342 | /* Representation of linkonce symbols for the MACH-O assembler. Linkonce | |
343 | symbols must be given a special section *and* must be preceded by a | |
344 | special assembler directive. */ | |
345 | #define ASM_MAKE_LABEL_LINKONCE(FILE, NAME) \ | |
346 | do { const char* _x = (NAME); if (!!strncmp (_x, "_OBJC_", 6)) { \ | |
347 | fputs (".weak_definition ", FILE); assemble_name (FILE, _x); \ | |
348 | fputs ("\n", FILE); }} while (0) | |
349 | ||
350 | /* We support hidden visibility */ | |
351 | #undef TARGET_SUPPORTS_HIDDEN | |
352 | #define TARGET_SUPPORTS_HIDDEN 1 | |
353 | ||
354 | /* The Darwin linker imposes two limitations on common symbols: they | |
355 | can't have hidden visibility, and they can't appear in dylibs. As | |
356 | a consequence, we should never use common symbols to represent | |
357 | vague linkage. */ | |
358 | #undef USE_COMMON_FOR_ONE_ONLY | |
359 | #define USE_COMMON_FOR_ONE_ONLY 0 | |
360 | ||
666c27b9 | 361 | /* The Darwin linker doesn't like explicit template instantiations to be |
4746cf84 MA |
362 | coalesced, because it doesn't want coalesced symbols to appear in |
363 | a static archive's table of contents. */ | |
364 | #undef TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY | |
365 | #define TARGET_EXPLICIT_INSTANTIATIONS_ONE_ONLY 0 | |
366 | ||
367 | /* We make exception information linkonce. */ | |
368 | #undef TARGET_USES_WEAK_UNWIND_INFO | |
369 | #define TARGET_USES_WEAK_UNWIND_INFO 1 | |
370 | ||
371 | /* We need to use a nonlocal label for the start of an EH frame: the | |
372 | Darwin linker requires that a coalesced section start with a label. */ | |
373 | #undef FRAME_BEGIN_LABEL | |
374 | #define FRAME_BEGIN_LABEL "EH_frame" | |
375 | ||
376 | /* Emit a label for the FDE corresponding to DECL. EMPTY means | |
377 | emit a label for an empty FDE. */ | |
378 | #define TARGET_ASM_EMIT_UNWIND_LABEL darwin_emit_unwind_label | |
379 | ||
ee890fe2 SS |
380 | /* Our profiling scheme doesn't LP labels and counter words. */ |
381 | ||
9739c90c | 382 | #define NO_PROFILE_COUNTERS 1 |
ee890fe2 | 383 | |
ee890fe2 SS |
384 | #undef INIT_SECTION_ASM_OP |
385 | #define INIT_SECTION_ASM_OP | |
386 | ||
387 | #undef INVOKE__main | |
388 | ||
2cc07db4 RH |
389 | #define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor |
390 | #define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor | |
ee890fe2 | 391 | |
6ab9a3f4 SS |
392 | /* Always prefix with an underscore. */ |
393 | ||
394 | #define USER_LABEL_PREFIX "_" | |
395 | ||
ee890fe2 SS |
396 | /* Don't output a .file directive. That is only used by the assembler for |
397 | error reporting. */ | |
720b7001 ZW |
398 | #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE |
399 | #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false | |
ee890fe2 | 400 | |
a5fe455b ZW |
401 | #undef TARGET_ASM_FILE_END |
402 | #define TARGET_ASM_FILE_END darwin_file_end | |
ee890fe2 | 403 | |
2aa9948d | 404 | #define ASM_OUTPUT_SKIP(FILE,SIZE) \ |
58e15542 | 405 | fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE) |
2aa9948d | 406 | |
991b6592 | 407 | /* Give ObjC methods pretty symbol names. */ |
ee890fe2 SS |
408 | |
409 | #undef OBJC_GEN_METHOD_LABEL | |
410 | #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \ | |
411 | do { if (CAT_NAME) \ | |
412 | sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \ | |
413 | (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \ | |
414 | else \ | |
415 | sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \ | |
416 | (CLASS_NAME), (SEL_NAME)); \ | |
417 | } while (0) | |
418 | ||
419 | /* The RTTI data (e.g., __ti4name) is common and public (and static), | |
420 | but it does need to be referenced via indirect PIC data pointers. | |
421 | The machopic_define_name calls are telling the machopic subsystem | |
422 | that the name *is* defined in this module, so it doesn't need to | |
423 | make them indirect. */ | |
424 | ||
425 | #undef ASM_DECLARE_OBJECT_NAME | |
426 | #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ | |
427 | do { \ | |
18f3e349 GK |
428 | const char *xname = NAME; \ |
429 | if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \ | |
430 | xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \ | |
4746cf84 MA |
431 | if (! DECL_ONE_ONLY (DECL) && ! DECL_WEAK (DECL)) \ |
432 | if ((TREE_STATIC (DECL) \ | |
433 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
434 | || DECL_INITIAL (DECL)) \ | |
435 | machopic_define_name (xname); \ | |
18f3e349 GK |
436 | if ((TREE_STATIC (DECL) \ |
437 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
438 | || DECL_INITIAL (DECL)) \ | |
c6a2438a | 439 | (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \ |
18f3e349 | 440 | ASM_OUTPUT_LABEL (FILE, xname); \ |
9c808aad | 441 | /* Darwin doesn't support zero-size objects, so give them a \ |
18f3e349 GK |
442 | byte. */ \ |
443 | if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0) \ | |
444 | assemble_zeros (1); \ | |
93913281 SS |
445 | } while (0) |
446 | ||
447 | #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ | |
448 | do { \ | |
91dc3130 | 449 | const char *xname = NAME; \ |
93913281 SS |
450 | if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \ |
451 | xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \ | |
4746cf84 MA |
452 | if (! DECL_ONE_ONLY (DECL) && ! DECL_WEAK (DECL)) \ |
453 | if ((TREE_STATIC (DECL) \ | |
454 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
455 | || DECL_INITIAL (DECL)) \ | |
456 | machopic_define_name (xname); \ | |
93913281 SS |
457 | if ((TREE_STATIC (DECL) \ |
458 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
459 | || DECL_INITIAL (DECL)) \ | |
c6a2438a | 460 | (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \ |
93913281 | 461 | ASM_OUTPUT_LABEL (FILE, xname); \ |
ee890fe2 SS |
462 | } while (0) |
463 | ||
18f3e349 GK |
464 | #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE) \ |
465 | do { \ | |
466 | ASM_OUTPUT_LABEL (FILE, NAME); \ | |
467 | /* Darwin doesn't support zero-size objects, so give them a \ | |
468 | byte. */ \ | |
469 | if ((SIZE) == 0) \ | |
470 | assemble_zeros (1); \ | |
471 | } while (0) | |
472 | ||
ee890fe2 SS |
473 | /* Wrap new method names in quotes so the assembler doesn't gag. |
474 | Make Objective-C internal symbols local. */ | |
475 | ||
476 | #undef ASM_OUTPUT_LABELREF | |
772c5265 RH |
477 | #define ASM_OUTPUT_LABELREF(FILE,NAME) \ |
478 | do { \ | |
479 | const char *xname = darwin_strip_name_encoding (NAME); \ | |
1622229c AP |
480 | if (! strcmp (xname, "<pic base>")) \ |
481 | machopic_output_function_base_name(FILE); \ | |
482 | else if (xname[0] == '&' || xname[0] == '*') \ | |
772c5265 RH |
483 | { \ |
484 | int len = strlen (xname); \ | |
485 | if (len > 6 && !strcmp ("$stub", xname + len - 5)) \ | |
486 | machopic_validate_stub_or_non_lazy_ptr (xname, 1); \ | |
487 | else if (len > 7 && !strcmp ("$stub\"", xname + len - 6)) \ | |
488 | machopic_validate_stub_or_non_lazy_ptr (xname, 1); \ | |
489 | else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \ | |
490 | machopic_validate_stub_or_non_lazy_ptr (xname, 0); \ | |
491 | fputs (&xname[1], FILE); \ | |
492 | } \ | |
493 | else if (xname[0] == '+' || xname[0] == '-') \ | |
494 | fprintf (FILE, "\"%s\"", xname); \ | |
495 | else if (!strncmp (xname, "_OBJC_", 6)) \ | |
496 | fprintf (FILE, "L%s", xname); \ | |
497 | else if (!strncmp (xname, ".objc_class_name_", 17)) \ | |
498 | fprintf (FILE, "%s", xname); \ | |
499 | else \ | |
500 | fprintf (FILE, "_%s", xname); \ | |
ee890fe2 SS |
501 | } while (0) |
502 | ||
2aa9948d SS |
503 | /* Output before executable code. */ |
504 | #undef TEXT_SECTION_ASM_OP | |
505 | #define TEXT_SECTION_ASM_OP ".text" | |
506 | ||
507 | /* Output before writable data. */ | |
508 | ||
509 | #undef DATA_SECTION_ASM_OP | |
510 | #define DATA_SECTION_ASM_OP ".data" | |
511 | ||
ee890fe2 SS |
512 | #undef ALIGN_ASM_OP |
513 | #define ALIGN_ASM_OP ".align" | |
514 | ||
515 | #undef ASM_OUTPUT_ALIGN | |
516 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ | |
517 | if ((LOG) != 0) \ | |
518 | fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG)) | |
519 | ||
520 | /* Ensure correct alignment of bss data. */ | |
521 | ||
522 | #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL | |
b2003250 RH |
523 | #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ |
524 | do { \ | |
525 | fputs (".lcomm ", (FILE)); \ | |
526 | assemble_name ((FILE), (NAME)); \ | |
58e15542 | 527 | fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), \ |
b2003250 RH |
528 | floor_log2 ((ALIGN) / BITS_PER_UNIT)); \ |
529 | if ((DECL) && ((TREE_STATIC (DECL) \ | |
530 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
531 | || DECL_INITIAL (DECL))) \ | |
c6a2438a | 532 | (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \ |
b2003250 RH |
533 | if ((DECL) && ((TREE_STATIC (DECL) \ |
534 | && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ | |
535 | || DECL_INITIAL (DECL))) \ | |
536 | machopic_define_name (NAME); \ | |
ee890fe2 SS |
537 | } while (0) |
538 | ||
ee890fe2 SS |
539 | /* The maximum alignment which the object file format can support. |
540 | For Mach-O, this is 2^15. */ | |
541 | ||
542 | #undef MAX_OFILE_ALIGNMENT | |
543 | #define MAX_OFILE_ALIGNMENT 0x8000 | |
544 | ||
991b6592 | 545 | /* Create new Mach-O sections. */ |
ee890fe2 SS |
546 | |
547 | #undef SECTION_FUNCTION | |
70fb5453 | 548 | #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC) \ |
9c808aad | 549 | extern void FUNCTION (void); \ |
ee890fe2 | 550 | void \ |
9c808aad | 551 | FUNCTION (void) \ |
ee890fe2 | 552 | { \ |
70fb5453 | 553 | if (in_section != SECTION) \ |
ee890fe2 SS |
554 | { \ |
555 | if (OBJC) \ | |
556 | objc_section_init (); \ | |
557 | data_section (); \ | |
558 | if (asm_out_file) \ | |
559 | fprintf (asm_out_file, "%s\n", DIRECTIVE); \ | |
560 | in_section = SECTION; \ | |
561 | } \ | |
562 | } \ | |
563 | ||
ee890fe2 SS |
564 | /* Darwin uses many types of special sections. */ |
565 | ||
566 | #undef EXTRA_SECTIONS | |
567 | #define EXTRA_SECTIONS \ | |
568 | in_const, in_const_data, in_cstring, in_literal4, in_literal8, \ | |
569 | in_constructor, in_destructor, in_mod_init, in_mod_term, \ | |
570 | in_objc_class, in_objc_meta_class, in_objc_category, \ | |
571 | in_objc_class_vars, in_objc_instance_vars, \ | |
572 | in_objc_cls_meth, in_objc_inst_meth, \ | |
573 | in_objc_cat_cls_meth, in_objc_cat_inst_meth, \ | |
574 | in_objc_selector_refs, \ | |
575 | in_objc_selector_fixup, \ | |
576 | in_objc_symbols, in_objc_module_info, \ | |
577 | in_objc_protocol, in_objc_string_object, \ | |
578 | in_objc_constant_string_object, \ | |
264fa2db | 579 | in_objc_image_info, \ |
ee890fe2 | 580 | in_objc_class_names, in_objc_meth_var_names, \ |
9c808aad | 581 | in_objc_meth_var_types, in_objc_cls_refs, \ |
ee890fe2 SS |
582 | in_machopic_nl_symbol_ptr, \ |
583 | in_machopic_lazy_symbol_ptr, \ | |
584 | in_machopic_symbol_stub, \ | |
d3c300d2 | 585 | in_machopic_symbol_stub1, \ |
ee890fe2 | 586 | in_machopic_picsymbol_stub, \ |
d3c300d2 | 587 | in_machopic_picsymbol_stub1, \ |
07c9d2eb | 588 | in_darwin_exception, in_darwin_eh_frame, \ |
ee890fe2 SS |
589 | num_sections |
590 | ||
591 | #undef EXTRA_SECTION_FUNCTIONS | |
592 | #define EXTRA_SECTION_FUNCTIONS \ | |
9c808aad | 593 | static void objc_section_init (void); \ |
ee890fe2 SS |
594 | SECTION_FUNCTION (const_section, \ |
595 | in_const, \ | |
70fb5453 | 596 | ".const", 0) \ |
ee890fe2 SS |
597 | SECTION_FUNCTION (const_data_section, \ |
598 | in_const_data, \ | |
70fb5453 | 599 | ".const_data", 0) \ |
ee890fe2 SS |
600 | SECTION_FUNCTION (cstring_section, \ |
601 | in_cstring, \ | |
70fb5453 | 602 | ".cstring", 0) \ |
ee890fe2 SS |
603 | SECTION_FUNCTION (literal4_section, \ |
604 | in_literal4, \ | |
70fb5453 | 605 | ".literal4", 0) \ |
ee890fe2 SS |
606 | SECTION_FUNCTION (literal8_section, \ |
607 | in_literal8, \ | |
70fb5453 | 608 | ".literal8", 0) \ |
ee890fe2 SS |
609 | SECTION_FUNCTION (constructor_section, \ |
610 | in_constructor, \ | |
70fb5453 | 611 | ".constructor", 0) \ |
ee890fe2 SS |
612 | SECTION_FUNCTION (mod_init_section, \ |
613 | in_mod_init, \ | |
70fb5453 | 614 | ".mod_init_func", 0) \ |
ee890fe2 SS |
615 | SECTION_FUNCTION (mod_term_section, \ |
616 | in_mod_term, \ | |
70fb5453 | 617 | ".mod_term_func", 0) \ |
ee890fe2 SS |
618 | SECTION_FUNCTION (destructor_section, \ |
619 | in_destructor, \ | |
70fb5453 | 620 | ".destructor", 0) \ |
ee890fe2 SS |
621 | SECTION_FUNCTION (objc_class_section, \ |
622 | in_objc_class, \ | |
70fb5453 | 623 | ".objc_class", 1) \ |
ee890fe2 SS |
624 | SECTION_FUNCTION (objc_meta_class_section, \ |
625 | in_objc_meta_class, \ | |
70fb5453 | 626 | ".objc_meta_class", 1) \ |
ee890fe2 SS |
627 | SECTION_FUNCTION (objc_category_section, \ |
628 | in_objc_category, \ | |
70fb5453 | 629 | ".objc_category", 1) \ |
ee890fe2 SS |
630 | SECTION_FUNCTION (objc_class_vars_section, \ |
631 | in_objc_class_vars, \ | |
70fb5453 | 632 | ".objc_class_vars", 1) \ |
ee890fe2 SS |
633 | SECTION_FUNCTION (objc_instance_vars_section, \ |
634 | in_objc_instance_vars, \ | |
70fb5453 | 635 | ".objc_instance_vars", 1) \ |
ee890fe2 SS |
636 | SECTION_FUNCTION (objc_cls_meth_section, \ |
637 | in_objc_cls_meth, \ | |
70fb5453 | 638 | ".objc_cls_meth", 1) \ |
ee890fe2 SS |
639 | SECTION_FUNCTION (objc_inst_meth_section, \ |
640 | in_objc_inst_meth, \ | |
70fb5453 | 641 | ".objc_inst_meth", 1) \ |
ee890fe2 SS |
642 | SECTION_FUNCTION (objc_cat_cls_meth_section, \ |
643 | in_objc_cat_cls_meth, \ | |
70fb5453 | 644 | ".objc_cat_cls_meth", 1) \ |
ee890fe2 SS |
645 | SECTION_FUNCTION (objc_cat_inst_meth_section, \ |
646 | in_objc_cat_inst_meth, \ | |
70fb5453 | 647 | ".objc_cat_inst_meth", 1) \ |
ee890fe2 SS |
648 | SECTION_FUNCTION (objc_selector_refs_section, \ |
649 | in_objc_selector_refs, \ | |
70fb5453 | 650 | ".objc_message_refs", 1) \ |
ee890fe2 SS |
651 | SECTION_FUNCTION (objc_selector_fixup_section, \ |
652 | in_objc_selector_fixup, \ | |
70fb5453 | 653 | ".section __OBJC, __sel_fixup", 1) \ |
ee890fe2 SS |
654 | SECTION_FUNCTION (objc_symbols_section, \ |
655 | in_objc_symbols, \ | |
70fb5453 | 656 | ".objc_symbols", 1) \ |
ee890fe2 SS |
657 | SECTION_FUNCTION (objc_module_info_section, \ |
658 | in_objc_module_info, \ | |
70fb5453 | 659 | ".objc_module_info", 1) \ |
ee890fe2 SS |
660 | SECTION_FUNCTION (objc_protocol_section, \ |
661 | in_objc_protocol, \ | |
70fb5453 | 662 | ".objc_protocol", 1) \ |
ee890fe2 SS |
663 | SECTION_FUNCTION (objc_string_object_section, \ |
664 | in_objc_string_object, \ | |
70fb5453 | 665 | ".objc_string_object", 1) \ |
ee890fe2 SS |
666 | SECTION_FUNCTION (objc_constant_string_object_section, \ |
667 | in_objc_constant_string_object, \ | |
70fb5453 | 668 | ".section __OBJC, __cstring_object", 1) \ |
264fa2db ZL |
669 | /* Fix-and-Continue image marker. */ \ |
670 | SECTION_FUNCTION (objc_image_info_section, \ | |
671 | in_objc_image_info, \ | |
672 | ".section __OBJC, __image_info", 1) \ | |
ee890fe2 SS |
673 | SECTION_FUNCTION (objc_class_names_section, \ |
674 | in_objc_class_names, \ | |
70fb5453 | 675 | ".objc_class_names", 1) \ |
ee890fe2 SS |
676 | SECTION_FUNCTION (objc_meth_var_names_section, \ |
677 | in_objc_meth_var_names, \ | |
70fb5453 | 678 | ".objc_meth_var_names", 1) \ |
ee890fe2 SS |
679 | SECTION_FUNCTION (objc_meth_var_types_section, \ |
680 | in_objc_meth_var_types, \ | |
70fb5453 | 681 | ".objc_meth_var_types", 1) \ |
ee890fe2 SS |
682 | SECTION_FUNCTION (objc_cls_refs_section, \ |
683 | in_objc_cls_refs, \ | |
70fb5453 | 684 | ".objc_cls_refs", 1) \ |
ee890fe2 SS |
685 | \ |
686 | SECTION_FUNCTION (machopic_lazy_symbol_ptr_section, \ | |
687 | in_machopic_lazy_symbol_ptr, \ | |
9c808aad | 688 | ".lazy_symbol_pointer", 0) \ |
ee890fe2 SS |
689 | SECTION_FUNCTION (machopic_nl_symbol_ptr_section, \ |
690 | in_machopic_nl_symbol_ptr, \ | |
9c808aad | 691 | ".non_lazy_symbol_pointer", 0) \ |
ee890fe2 SS |
692 | SECTION_FUNCTION (machopic_symbol_stub_section, \ |
693 | in_machopic_symbol_stub, \ | |
9c808aad | 694 | ".symbol_stub", 0) \ |
d3c300d2 DJ |
695 | SECTION_FUNCTION (machopic_symbol_stub1_section, \ |
696 | in_machopic_symbol_stub1, \ | |
697 | ".section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16", 0)\ | |
ee890fe2 SS |
698 | SECTION_FUNCTION (machopic_picsymbol_stub_section, \ |
699 | in_machopic_picsymbol_stub, \ | |
9c808aad | 700 | ".picsymbol_stub", 0) \ |
d3c300d2 DJ |
701 | SECTION_FUNCTION (machopic_picsymbol_stub1_section, \ |
702 | in_machopic_picsymbol_stub1, \ | |
703 | ".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32", 0)\ | |
abe72dd8 SS |
704 | SECTION_FUNCTION (darwin_exception_section, \ |
705 | in_darwin_exception, \ | |
7606e68f | 706 | ".section __DATA,__gcc_except_tab", 0) \ |
07c9d2eb SS |
707 | SECTION_FUNCTION (darwin_eh_frame_section, \ |
708 | in_darwin_eh_frame, \ | |
4746cf84 | 709 | ".section " EH_FRAME_SECTION_NAME ",__eh_frame" EH_FRAME_SECTION_ATTR, 0) \ |
ee890fe2 | 710 | \ |
91dc3130 | 711 | static void \ |
9c808aad | 712 | objc_section_init (void) \ |
ee890fe2 SS |
713 | { \ |
714 | static int been_here = 0; \ | |
715 | \ | |
716 | if (been_here == 0) \ | |
717 | { \ | |
718 | been_here = 1; \ | |
719 | /* written, cold -> hot */ \ | |
720 | objc_cat_cls_meth_section (); \ | |
721 | objc_cat_inst_meth_section (); \ | |
722 | objc_string_object_section (); \ | |
723 | objc_constant_string_object_section (); \ | |
724 | objc_selector_refs_section (); \ | |
725 | objc_selector_fixup_section (); \ | |
726 | objc_cls_refs_section (); \ | |
727 | objc_class_section (); \ | |
728 | objc_meta_class_section (); \ | |
9c808aad | 729 | /* shared, hot -> cold */ \ |
ee890fe2 SS |
730 | objc_cls_meth_section (); \ |
731 | objc_inst_meth_section (); \ | |
732 | objc_protocol_section (); \ | |
733 | objc_class_names_section (); \ | |
734 | objc_meth_var_types_section (); \ | |
735 | objc_meth_var_names_section (); \ | |
736 | objc_category_section (); \ | |
737 | objc_class_vars_section (); \ | |
738 | objc_instance_vars_section (); \ | |
739 | objc_module_info_section (); \ | |
740 | objc_symbols_section (); \ | |
741 | } \ | |
ee890fe2 SS |
742 | } |
743 | ||
ee890fe2 SS |
744 | #define READONLY_DATA_SECTION const_section |
745 | ||
ae46c4e0 RH |
746 | #undef TARGET_ASM_SELECT_SECTION |
747 | #define TARGET_ASM_SELECT_SECTION machopic_select_section | |
b64a1b53 RH |
748 | #undef TARGET_ASM_SELECT_RTX_SECTION |
749 | #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section | |
4746cf84 MA |
750 | #undef TARGET_ASM_UNIQUE_SECTION |
751 | #define TARGET_ASM_UNIQUE_SECTION darwin_unique_section | |
752 | ||
753 | ||
ee890fe2 | 754 | |
28df0b5a | 755 | #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \ |
9c808aad | 756 | do { \ |
28df0b5a | 757 | if (FILE) { \ |
ab82a49f | 758 | if (MACHOPIC_INDIRECT) \ |
28df0b5a | 759 | fprintf (FILE, "\t.lazy_reference "); \ |
ee890fe2 | 760 | else \ |
28df0b5a SS |
761 | fprintf (FILE, "\t.reference "); \ |
762 | assemble_name (FILE, NAME); \ | |
763 | fprintf (FILE, "\n"); \ | |
ee890fe2 SS |
764 | } \ |
765 | } while (0) | |
766 | ||
f60b945b SS |
767 | #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \ |
768 | do { \ | |
769 | if (FILE) { \ | |
770 | fprintf (FILE, "\t"); \ | |
9c808aad | 771 | assemble_name (FILE, NAME); \ |
f60b945b | 772 | fprintf (FILE, "=0\n"); \ |
5eb99654 | 773 | (*targetm.asm_out.globalize_label) (FILE, NAME); \ |
ee890fe2 SS |
774 | } \ |
775 | } while (0) | |
776 | ||
5eb99654 KG |
777 | /* Globalizing directive for a label. */ |
778 | #define GLOBAL_ASM_OP ".globl " | |
779 | #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label | |
ee890fe2 | 780 | |
6ce4806b MA |
781 | /* Emit an assembler directive to set visibility for a symbol. Used |
782 | to support visibility attribute and Darwin's private extern | |
ff482c8d | 783 | feature. */ |
6ce4806b MA |
784 | #undef TARGET_ASM_ASSEMBLE_VISIBILITY |
785 | #define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility | |
786 | ||
787 | ||
ee890fe2 SS |
788 | #undef ASM_GENERATE_INTERNAL_LABEL |
789 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ | |
91dc3130 | 790 | sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM)) |
ee890fe2 | 791 | |
ee890fe2 SS |
792 | /* Since we have a separate readonly data section, define this so that |
793 | jump tables end up in text rather than data. */ | |
794 | ||
795 | #ifndef JUMP_TABLES_IN_TEXT_SECTION | |
796 | #define JUMP_TABLES_IN_TEXT_SECTION 1 | |
797 | #endif | |
798 | ||
799 | /* Symbolic names for various things we might know about a symbol. */ | |
800 | ||
801 | enum machopic_addr_class { | |
802 | MACHOPIC_UNDEFINED, | |
803 | MACHOPIC_DEFINED_DATA, | |
804 | MACHOPIC_UNDEFINED_DATA, | |
805 | MACHOPIC_DEFINED_FUNCTION, | |
806 | MACHOPIC_UNDEFINED_FUNCTION | |
807 | }; | |
808 | ||
809 | /* Macros defining the various PIC cases. */ | |
810 | ||
ab82a49f AP |
811 | #define MACHO_DYNAMIC_NO_PIC_P (TARGET_DYNAMIC_NO_PIC) |
812 | #define MACHOPIC_INDIRECT (flag_pic || MACHO_DYNAMIC_NO_PIC_P) | |
813 | #define MACHOPIC_JUST_INDIRECT (flag_pic == 1 || MACHO_DYNAMIC_NO_PIC_P) | |
814 | #define MACHOPIC_PURE (flag_pic == 2 && ! MACHO_DYNAMIC_NO_PIC_P) | |
ee890fe2 | 815 | |
b069de3b | 816 | #undef TARGET_ENCODE_SECTION_INFO |
fb49053f | 817 | #define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info |
b069de3b | 818 | #undef TARGET_STRIP_NAME_ENCODING |
772c5265 | 819 | #define TARGET_STRIP_NAME_ENCODING darwin_strip_name_encoding |
df56a27f | 820 | |
ee890fe2 SS |
821 | #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \ |
822 | do { \ | |
83182544 | 823 | const char *const stub_ = (STUB); \ |
ee890fe2 SS |
824 | char *buffer_ = (BUF); \ |
825 | strcpy (buffer_, stub_); \ | |
826 | if (stub_[0] == '"') \ | |
827 | { \ | |
828 | strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\""); \ | |
829 | } \ | |
830 | else \ | |
831 | { \ | |
832 | strcpy (buffer_ + (STUB_LENGTH), "_binder"); \ | |
833 | } \ | |
834 | } while (0) | |
835 | ||
836 | #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ | |
837 | do { \ | |
83182544 | 838 | const char *const symbol_ = (SYMBOL); \ |
ee890fe2 SS |
839 | char *buffer_ = (BUF); \ |
840 | if (name_needs_quotes (symbol_) && symbol_[0] != '"') \ | |
841 | { \ | |
842 | sprintf (buffer_, "\"%s\"", symbol_); \ | |
843 | } \ | |
844 | else \ | |
845 | { \ | |
846 | strcpy (buffer_, symbol_); \ | |
847 | } \ | |
848 | } while (0) | |
849 | ||
850 | /* Given a symbol name string, create the lazy pointer version | |
851 | of the symbol name. */ | |
852 | ||
853 | #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ | |
854 | do { \ | |
772c5265 | 855 | const char *symbol_ = darwin_strip_name_encoding (SYMBOL); \ |
ee890fe2 SS |
856 | char *buffer_ = (BUF); \ |
857 | if (symbol_[0] == '"') \ | |
858 | { \ | |
772c5265 | 859 | strcpy (buffer_, "\"L"); \ |
ee890fe2 SS |
860 | strcpy (buffer_ + 2, symbol_ + 1); \ |
861 | strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\""); \ | |
862 | } \ | |
863 | else if (name_needs_quotes (symbol_)) \ | |
864 | { \ | |
865 | strcpy (buffer_, "\"L"); \ | |
866 | strcpy (buffer_ + 2, symbol_); \ | |
867 | strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\""); \ | |
868 | } \ | |
869 | else \ | |
870 | { \ | |
871 | strcpy (buffer_, "L"); \ | |
872 | strcpy (buffer_ + 1, symbol_); \ | |
873 | strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr"); \ | |
874 | } \ | |
875 | } while (0) | |
876 | ||
07c9d2eb | 877 | #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section |
abe72dd8 | 878 | |
07c9d2eb | 879 | #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section |
9c808aad | 880 | |
4746cf84 MA |
881 | #define EH_FRAME_SECTION_NAME "__TEXT" |
882 | #define EH_FRAME_SECTION_ATTR ",coalesced,no_toc+strip_static_syms" | |
883 | ||
b069de3b | 884 | #undef ASM_PREFERRED_EH_DATA_FORMAT |
abe72dd8 | 885 | #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ |
7606e68f SS |
886 | (((CODE) == 2 && (GLOBAL) == 1) \ |
887 | ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \ | |
888 | ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr) | |
889 | ||
890 | #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \ | |
891 | darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2) | |
892 | ||
4746cf84 MA |
893 | #define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(ASM_OUT_FILE, ENCODING, SIZE, ADDR, DONE) \ |
894 | if (ENCODING == ASM_PREFERRED_EH_DATA_FORMAT (2, 1)) { \ | |
895 | darwin_non_lazy_pcrel (ASM_OUT_FILE, ADDR); \ | |
896 | goto DONE; \ | |
897 | } | |
898 | ||
899 | ||
7606e68f | 900 | #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false |
abe72dd8 | 901 | |
4746cf84 MA |
902 | #undef TARGET_ASM_NAMED_SECTION |
903 | #define TARGET_ASM_NAMED_SECTION darwin_asm_named_section | |
904 | #undef TARGET_SECTION_TYPE_FLAGS | |
905 | #define TARGET_SECTION_TYPE_FLAGS darwin_section_type_flags | |
906 | ||
c58b209a NB |
907 | #define DARWIN_REGISTER_TARGET_PRAGMAS() \ |
908 | do { \ | |
909 | c_register_pragma (0, "mark", darwin_pragma_ignore); \ | |
910 | c_register_pragma (0, "options", darwin_pragma_options); \ | |
911 | c_register_pragma (0, "segment", darwin_pragma_ignore); \ | |
912 | c_register_pragma (0, "unused", darwin_pragma_unused); \ | |
0168a849 | 913 | } while (0) |
2aa9948d SS |
914 | |
915 | #undef ASM_APP_ON | |
916 | #define ASM_APP_ON "" | |
917 | #undef ASM_APP_OFF | |
918 | #define ASM_APP_OFF "" | |
213c4a8a | 919 | |
94d1613b MS |
920 | void darwin_register_frameworks (int); |
921 | #define TARGET_EXTRA_INCLUDES darwin_register_frameworks | |
922 | ||
923 | void add_framework_path (char *); | |
924 | #define TARGET_OPTF add_framework_path | |
925 | ||
8db4d7a1 GK |
926 | #define TARGET_HAS_F_SETLKW |
927 | ||
9b2d02a0 AP |
928 | /* Darwin before 7.0 does not have C99 functions. */ |
929 | #ifndef TARGET_C99_FUNCTIONS | |
930 | #define TARGET_C99_FUNCTIONS 0 | |
931 | #endif | |
932 | ||
213c4a8a | 933 | #endif /* CONFIG_DARWIN_H */ |