]> gcc.gnu.org Git - gcc.git/blame - gcc/config/darwin.h
* config/darwin.h, config/elfos.h, config/i960/i960-coff.h
[gcc.git] / gcc / config / darwin.h
CommitLineData
ee890fe2 1/* Target definitions for Darwin (Mac OS X) systems.
c58b209a 2 Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003
ee890fe2
SS
3 Free Software Foundation, Inc.
4 Contributed by Apple Computer Inc.
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING. If not, write to
20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
22
23/* The definitions in this file are common to all processor types
24 running Darwin, which is the kernel for Mac OS X. Darwin is
25 basically a BSD user layer laid over a Mach kernel, then evolved
26 for many years (at NeXT) in parallel with other Unix systems. So
27 while the runtime is a somewhat idiosyncratic Mach-based thing,
28 other definitions look like they would for a BSD variant. */
29
30/* Although NeXT ran on many different architectures, as of Jan 2001
31 the only supported Darwin targets are PowerPC and x86. */
32
f37f462a
SS
33/* Technically, STANDARD_EXEC_PREFIX should be /usr/libexec/, but in
34 practice this makes it hard to install new compilers elsewhere, so
35 leave it undefined and expect system builders to set configure args
36 correctly. */
ee890fe2 37
7606e68f
SS
38/* One of Darwin's NeXT legacies is the Mach-O format, which is partly
39 like a.out and partly like COFF, with additional features like
40 multi-architecture binary support. */
41
42#define OBJECT_FORMAT_MACHO
43
abe72dd8
SS
44/* Suppress g++ attempt to link in the math library automatically.
45 (Some Darwin versions have a libm, but they seem to cause problems
46 for C++ executables.) */
ee890fe2 47
abe72dd8 48#define MATH_LIBRARY ""
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
102 match with the longer one. */
48aec0bc
DP
103#define TARGET_OPTION_TRANSLATE_TABLE \
104 { "-all_load", "-Zall_load" }, \
105 { "-allowable_client", "-Zallowable_client" }, \
106 { "-arch_errors_fatal", "-Zarch_errors_fatal" }, \
107 { "-bind_at_load", "-Zbind_at_load" }, \
108 { "-bundle", "-Zbundle" }, \
109 { "-bundle_loader", "-Zbundle_loader" }, \
110 { "-weak_reference_mismatches", "-Zweak_reference_mismatches" }, \
111 { "-dependency-file", "-MF" }, \
112 { "-dylib_file", "-Zdylib_file" }, \
3ab68120 113 { "-dynamic", "-Zdynamic" }, \
48aec0bc
DP
114 { "-dynamiclib", "-Zdynamiclib" }, \
115 { "-exported_symbols_list", "-Zexported_symbols_list" }, \
116 { "-seg_addr_table_filename", "-Zseg_addr_table_filename" }, \
117 { "-filelist", "-Xlinker -filelist -Xlinker" }, \
118 { "-flat_namespace", "-Zflat_namespace" }, \
119 { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" }, \
120 { "-force_flat_namespace", "-Zforce_flat_namespace" }, \
121 { "-image_base", "-Zimage_base" }, \
122 { "-init", "-Zinit" }, \
123 { "-install_name", "-Zinstall_name" }, \
124 { "-multiply_defined_unused", "-Zmultiplydefinedunused" }, \
125 { "-multiply_defined", "-Zmultiply_defined" }, \
126 { "-multi_module", "-Zmulti_module" }, \
127 { "-static", "-static -Wa,-static" }, \
128 { "-single_module", "-Zsingle_module" }, \
129 { "-unexported_symbols_list", "-Zunexported_symbols_list" }
130
131/* These compiler options take n arguments. */
132
133#undef WORD_SWITCH_TAKES_ARG
134#define WORD_SWITCH_TAKES_ARG(STR) \
135 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \
136 !strcmp (STR, "Zallowable_client") ? 1 : \
137 !strcmp (STR, "arch") ? 1 : \
138 !strcmp (STR, "arch_only") ? 1 : \
139 !strcmp (STR, "Zbundle_loader") ? 1 : \
140 !strcmp (STR, "client_name") ? 1 : \
141 !strcmp (STR, "compatibility_version") ? 1 : \
142 !strcmp (STR, "current_version") ? 1 : \
143 !strcmp (STR, "Zdylib_file") ? 1 : \
144 !strcmp (STR, "Zexported_symbols_list") ? 1 : \
145 !strcmp (STR, "Zimage_base") ? 1 : \
146 !strcmp (STR, "Zinit") ? 1 : \
147 !strcmp (STR, "Zinstall_name") ? 1 : \
148 !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \
149 !strcmp (STR, "Zmultiply_defined") ? 1 : \
150 !strcmp (STR, "precomp-trustfile") ? 1 : \
151 !strcmp (STR, "read_only_relocs") ? 1 : \
152 !strcmp (STR, "sectcreate") ? 3 : \
153 !strcmp (STR, "sectorder") ? 3 : \
154 !strcmp (STR, "Zseg_addr_table_filename") ?1 :\
155 !strcmp (STR, "seg1addr") ? 1 : \
156 !strcmp (STR, "segprot") ? 3 : \
157 !strcmp (STR, "seg_addr_table") ? 1 : \
158 !strcmp (STR, "sub_library") ? 1 : \
159 !strcmp (STR, "sub_umbrella") ? 1 : \
160 !strcmp (STR, "umbrella") ? 1 : \
161 !strcmp (STR, "undefined") ? 1 : \
162 !strcmp (STR, "Zunexported_symbols_list") ? 1 : \
163 !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \
164 !strcmp (STR, "pagezero_size") ? 1 : \
165 !strcmp (STR, "segs_read_only_addr") ? 1 : \
166 !strcmp (STR, "segs_read_write_addr") ? 1 : \
167 !strcmp (STR, "sectalign") ? 3 : \
168 !strcmp (STR, "sectobjectsymbols") ? 2 : \
169 !strcmp (STR, "segcreate") ? 3 : \
170 !strcmp (STR, "dylinker_install_name") ? 1 : \
171 0)
172
ee890fe2
SS
173/* Machine dependent cpp options. */
174
ee890fe2 175#undef CPP_SPEC
3ab68120 176#define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}"
ee890fe2 177
48aec0bc
DP
178/* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus
179 precomp, libtool, and fat build additions. Also we
180 don't specify a second %G after %L because libSystem is
181 self-contained and doesn't need to link against libgcc.a. */
182/* In general, random Darwin linker flags should go into LINK_SPEC
183 instead of LINK_COMMAND_SPEC. The command spec is better for
184 specifying the handling of options understood by generic Unix
185 linkers, and for positional arguments like libraries. */
186#define LINK_COMMAND_SPEC "\
187%{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\
188 %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \
189 %l %X %{d} %{s} %{t} %{Z} \
190 %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \
191 %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \
192 %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \
1f61a15d
GK
193 %{L*} %(link_libgcc) %o %{fprofile-arcs:-lgcov} \
194 %{!nostdlib:%{!nodefaultlibs:%G %L}} \
48aec0bc
DP
195 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \
196 %{!--help:%{!no-c++filt|c++filt:| c++filt3 }} }}}}}}}}"
197
198/* Please keep the random linker options in alphabetical order (modulo
199 'Z' and 'no' prefixes). Options that can only go to one of libtool
200 or ld must be listed twice, under both !Zdynamiclib and
201 Zdynamiclib, with one of the cases reporting an error. */
202/* Note that options taking arguments may appear multiple times on a
203 command line with different arguments each time, so put a * after
204 their names so all of them get passed. */
205#define LINK_SPEC \
206 "%{static}%{!static:-dynamic} \
207 %{!Zdynamiclib: \
208 %{Zbundle:-bundle} \
209 %{Zbundle_loader*:-bundle_loader %*} \
210 %{client_name*} \
211 %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\
212} \
213 %{current_version*:%e-current_version only allowed with -dynamiclib} \
214 %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
215 %{Zforce_flat_namespace:-force_flat_namespace} \
216 %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \
217 %{keep_private_externs} \
218 %{private_bundle} \
219 } \
220 %{Zdynamiclib: \
221 %{Zbundle:%e-bundle not allowed with -dynamiclib} \
222 %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \
223 %{client_name*:%e-client_name not allowed with -dynamiclib} \
224 %{compatibility_version*} \
225 %{current_version*} \
226 %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \
227 %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \
228 %{Zinstall_name*:-install_name %*} \
229 %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \
230 %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \
231 } \
232 %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \
233 %{Zallowable_client*:-allowable_client %*} \
234 %{Zbind_at_load:-bind_at_load} \
235 %{Zarch_errors_fatal:-arch_errors_fatal} \
236 %{Zdylib_file*:-dylib_file %*} \
3ab68120 237 %{Zdynamic:-dynamic}\
48aec0bc
DP
238 %{Zexported_symbols_list*:-exported_symbols_list %*} \
239 %{Zflat_namespace:-flat_namespace} \
240 %{headerpad_max_install_names*} \
241 %{Zimage_base*:-image_base %*} \
242 %{Zinit*:-init %*} \
243 %{nomultidefs} \
244 %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \
245 %{Zmultiply_defined*:-multiply_defined %*} \
246 %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \
247 %{prebind} %{noprebind} %{prebind_all_twolevel_modules} \
248 %{read_only_relocs} \
249 %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \
250 %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \
251 %{sub_library*} %{sub_umbrella*} \
252 %{twolevel_namespace} %{twolevel_namespace_hints} \
253 %{umbrella*} \
254 %{undefined*} \
255 %{Zunexported_symbols_list*:-unexported_symbols_list %*} \
256 %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \
257 %{X} \
258 %{y*} \
259 %{w} \
260 %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \
261 %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \
262 %{whatsloaded} %{dylinker_install_name*} \
263 %{dylinker} %{Mach} "
264
265
ee890fe2
SS
266/* Machine dependent libraries. */
267
268#undef LIB_SPEC
5fa5a27c 269#define LIB_SPEC "%{!static:-lSystem}"
ee890fe2 270
991b6592 271/* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
ee890fe2 272
48aec0bc 273#undef STARTFILE_SPEC
ee890fe2 274#define STARTFILE_SPEC \
48aec0bc
DP
275 "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \
276 %{!Zbundle:%{pg:%{static:-lgcrt0.o} \
277 %{!static:%{object:-lgcrt0.o} \
278 %{!object:%{preload:-lgcrt0.o} \
279 %{!preload:-lgcrt1.o -lcrt2.o}}}} \
280 %{!pg:%{static:-lcrt0.o} \
281 %{!static:%{object:-lcrt0.o} \
282 %{!object:%{preload:-lcrt0.o} \
283 %{!preload:-lcrt1.o -lcrt2.o}}}}}}"
7606e68f 284
3cfe49da
GK
285/* The native Darwin linker doesn't necessarily place files in the order
286 that they're specified on the link line. Thus, it is pointless
287 to put anything in ENDFILE_SPEC. */
288/* #define ENDFILE_SPEC "" */
ee890fe2 289
ee890fe2
SS
290/* We use Dbx symbol format. */
291
23532de9 292#define DBX_DEBUGGING_INFO 1
ee890fe2
SS
293
294/* When generating stabs debugging, use N_BINCL entries. */
295
296#define DBX_USE_BINCL
297
298/* There is no limit to the length of stabs strings. */
299
300#define DBX_CONTIN_LENGTH 0
301
991b6592 302/* gdb needs a null N_SO at the end of each file for scattered loading. */
ee890fe2
SS
303
304#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
305#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
306do { text_section (); \
307 fprintf (FILE, \
308 "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO); \
309 } while (0)
310
311/* Our profiling scheme doesn't LP labels and counter words. */
312
9739c90c 313#define NO_PROFILE_COUNTERS 1
ee890fe2 314
ee890fe2
SS
315#undef INIT_SECTION_ASM_OP
316#define INIT_SECTION_ASM_OP
317
318#undef INVOKE__main
319
2cc07db4
RH
320#define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor
321#define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor
ee890fe2 322
6ab9a3f4
SS
323/* Always prefix with an underscore. */
324
325#define USER_LABEL_PREFIX "_"
326
ee890fe2
SS
327/* Don't output a .file directive. That is only used by the assembler for
328 error reporting. */
720b7001
ZW
329#undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
330#define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
ee890fe2 331
a5fe455b
ZW
332#undef TARGET_ASM_FILE_END
333#define TARGET_ASM_FILE_END darwin_file_end
ee890fe2 334
2aa9948d 335#define ASM_OUTPUT_SKIP(FILE,SIZE) \
58e15542 336 fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE)
2aa9948d 337
991b6592 338/* Give ObjC methods pretty symbol names. */
ee890fe2
SS
339
340#undef OBJC_GEN_METHOD_LABEL
341#define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
342 do { if (CAT_NAME) \
343 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
344 (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
345 else \
346 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
347 (CLASS_NAME), (SEL_NAME)); \
348 } while (0)
349
350/* The RTTI data (e.g., __ti4name) is common and public (and static),
351 but it does need to be referenced via indirect PIC data pointers.
352 The machopic_define_name calls are telling the machopic subsystem
353 that the name *is* defined in this module, so it doesn't need to
354 make them indirect. */
355
356#undef ASM_DECLARE_OBJECT_NAME
357#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
358 do { \
91dc3130 359 const char *xname = NAME; \
ee890fe2
SS
360 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \
361 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \
362 if ((TREE_STATIC (DECL) \
363 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
364 || DECL_INITIAL (DECL)) \
365 machopic_define_name (xname); \
df56a27f
SS
366 if ((TREE_STATIC (DECL) \
367 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
368 || DECL_INITIAL (DECL)) \
c6a2438a 369 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
ee890fe2 370 ASM_OUTPUT_LABEL (FILE, xname); \
93913281
SS
371 } while (0)
372
373#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
374 do { \
91dc3130 375 const char *xname = NAME; \
93913281
SS
376 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \
377 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \
378 if ((TREE_STATIC (DECL) \
379 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
380 || DECL_INITIAL (DECL)) \
381 machopic_define_name (xname); \
382 if ((TREE_STATIC (DECL) \
383 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
384 || DECL_INITIAL (DECL)) \
c6a2438a 385 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
93913281 386 ASM_OUTPUT_LABEL (FILE, xname); \
b7fb9feb
TC
387 /* Avoid generating stubs for functions we've just defined by \
388 outputting any required stub name label now. */ \
389 machopic_output_possible_stub_label (FILE, xname); \
ee890fe2
SS
390 } while (0)
391
392/* Wrap new method names in quotes so the assembler doesn't gag.
393 Make Objective-C internal symbols local. */
394
395#undef ASM_OUTPUT_LABELREF
772c5265
RH
396#define ASM_OUTPUT_LABELREF(FILE,NAME) \
397 do { \
398 const char *xname = darwin_strip_name_encoding (NAME); \
399 if (xname[0] == '&' || xname[0] == '*') \
400 { \
401 int len = strlen (xname); \
402 if (len > 6 && !strcmp ("$stub", xname + len - 5)) \
403 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \
404 else if (len > 7 && !strcmp ("$stub\"", xname + len - 6)) \
405 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \
406 else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
407 machopic_validate_stub_or_non_lazy_ptr (xname, 0); \
408 fputs (&xname[1], FILE); \
409 } \
410 else if (xname[0] == '+' || xname[0] == '-') \
411 fprintf (FILE, "\"%s\"", xname); \
412 else if (!strncmp (xname, "_OBJC_", 6)) \
413 fprintf (FILE, "L%s", xname); \
414 else if (!strncmp (xname, ".objc_class_name_", 17)) \
415 fprintf (FILE, "%s", xname); \
416 else \
417 fprintf (FILE, "_%s", xname); \
ee890fe2
SS
418 } while (0)
419
2aa9948d
SS
420/* Output before executable code. */
421#undef TEXT_SECTION_ASM_OP
422#define TEXT_SECTION_ASM_OP ".text"
423
424/* Output before writable data. */
425
426#undef DATA_SECTION_ASM_OP
427#define DATA_SECTION_ASM_OP ".data"
428
ee890fe2
SS
429#undef ALIGN_ASM_OP
430#define ALIGN_ASM_OP ".align"
431
432#undef ASM_OUTPUT_ALIGN
433#define ASM_OUTPUT_ALIGN(FILE,LOG) \
434 if ((LOG) != 0) \
435 fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
436
437/* Ensure correct alignment of bss data. */
438
439#undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
b2003250
RH
440#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \
441 do { \
442 fputs (".lcomm ", (FILE)); \
443 assemble_name ((FILE), (NAME)); \
58e15542 444 fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), \
b2003250
RH
445 floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
446 if ((DECL) && ((TREE_STATIC (DECL) \
447 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
448 || DECL_INITIAL (DECL))) \
c6a2438a 449 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
b2003250
RH
450 if ((DECL) && ((TREE_STATIC (DECL) \
451 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
452 || DECL_INITIAL (DECL))) \
453 machopic_define_name (NAME); \
ee890fe2
SS
454 } while (0)
455
ee890fe2
SS
456/* The maximum alignment which the object file format can support.
457 For Mach-O, this is 2^15. */
458
459#undef MAX_OFILE_ALIGNMENT
460#define MAX_OFILE_ALIGNMENT 0x8000
461
991b6592 462/* Create new Mach-O sections. */
ee890fe2
SS
463
464#undef SECTION_FUNCTION
70fb5453 465#define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC) \
91dc3130 466extern void FUNCTION PARAMS ((void)); \
ee890fe2
SS
467void \
468FUNCTION () \
469{ \
70fb5453 470 if (in_section != SECTION) \
ee890fe2
SS
471 { \
472 if (OBJC) \
473 objc_section_init (); \
474 data_section (); \
475 if (asm_out_file) \
476 fprintf (asm_out_file, "%s\n", DIRECTIVE); \
477 in_section = SECTION; \
478 } \
479} \
480
ee890fe2
SS
481/* Darwin uses many types of special sections. */
482
483#undef EXTRA_SECTIONS
484#define EXTRA_SECTIONS \
485 in_const, in_const_data, in_cstring, in_literal4, in_literal8, \
486 in_constructor, in_destructor, in_mod_init, in_mod_term, \
487 in_objc_class, in_objc_meta_class, in_objc_category, \
488 in_objc_class_vars, in_objc_instance_vars, \
489 in_objc_cls_meth, in_objc_inst_meth, \
490 in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
491 in_objc_selector_refs, \
492 in_objc_selector_fixup, \
493 in_objc_symbols, in_objc_module_info, \
494 in_objc_protocol, in_objc_string_object, \
495 in_objc_constant_string_object, \
496 in_objc_class_names, in_objc_meth_var_names, \
497 in_objc_meth_var_types, in_objc_cls_refs, \
498 in_machopic_nl_symbol_ptr, \
499 in_machopic_lazy_symbol_ptr, \
500 in_machopic_symbol_stub, \
d3c300d2 501 in_machopic_symbol_stub1, \
ee890fe2 502 in_machopic_picsymbol_stub, \
d3c300d2 503 in_machopic_picsymbol_stub1, \
07c9d2eb 504 in_darwin_exception, in_darwin_eh_frame, \
ee890fe2
SS
505 num_sections
506
507#undef EXTRA_SECTION_FUNCTIONS
508#define EXTRA_SECTION_FUNCTIONS \
91dc3130 509static void objc_section_init PARAMS ((void)); \
ee890fe2
SS
510SECTION_FUNCTION (const_section, \
511 in_const, \
70fb5453 512 ".const", 0) \
ee890fe2
SS
513SECTION_FUNCTION (const_data_section, \
514 in_const_data, \
70fb5453 515 ".const_data", 0) \
ee890fe2
SS
516SECTION_FUNCTION (cstring_section, \
517 in_cstring, \
70fb5453 518 ".cstring", 0) \
ee890fe2
SS
519SECTION_FUNCTION (literal4_section, \
520 in_literal4, \
70fb5453 521 ".literal4", 0) \
ee890fe2
SS
522SECTION_FUNCTION (literal8_section, \
523 in_literal8, \
70fb5453 524 ".literal8", 0) \
ee890fe2
SS
525SECTION_FUNCTION (constructor_section, \
526 in_constructor, \
70fb5453 527 ".constructor", 0) \
ee890fe2
SS
528SECTION_FUNCTION (mod_init_section, \
529 in_mod_init, \
70fb5453 530 ".mod_init_func", 0) \
ee890fe2
SS
531SECTION_FUNCTION (mod_term_section, \
532 in_mod_term, \
70fb5453 533 ".mod_term_func", 0) \
ee890fe2
SS
534SECTION_FUNCTION (destructor_section, \
535 in_destructor, \
70fb5453 536 ".destructor", 0) \
ee890fe2
SS
537SECTION_FUNCTION (objc_class_section, \
538 in_objc_class, \
70fb5453 539 ".objc_class", 1) \
ee890fe2
SS
540SECTION_FUNCTION (objc_meta_class_section, \
541 in_objc_meta_class, \
70fb5453 542 ".objc_meta_class", 1) \
ee890fe2
SS
543SECTION_FUNCTION (objc_category_section, \
544 in_objc_category, \
70fb5453 545 ".objc_category", 1) \
ee890fe2
SS
546SECTION_FUNCTION (objc_class_vars_section, \
547 in_objc_class_vars, \
70fb5453 548 ".objc_class_vars", 1) \
ee890fe2
SS
549SECTION_FUNCTION (objc_instance_vars_section, \
550 in_objc_instance_vars, \
70fb5453 551 ".objc_instance_vars", 1) \
ee890fe2
SS
552SECTION_FUNCTION (objc_cls_meth_section, \
553 in_objc_cls_meth, \
70fb5453 554 ".objc_cls_meth", 1) \
ee890fe2
SS
555SECTION_FUNCTION (objc_inst_meth_section, \
556 in_objc_inst_meth, \
70fb5453 557 ".objc_inst_meth", 1) \
ee890fe2
SS
558SECTION_FUNCTION (objc_cat_cls_meth_section, \
559 in_objc_cat_cls_meth, \
70fb5453 560 ".objc_cat_cls_meth", 1) \
ee890fe2
SS
561SECTION_FUNCTION (objc_cat_inst_meth_section, \
562 in_objc_cat_inst_meth, \
70fb5453 563 ".objc_cat_inst_meth", 1) \
ee890fe2
SS
564SECTION_FUNCTION (objc_selector_refs_section, \
565 in_objc_selector_refs, \
70fb5453 566 ".objc_message_refs", 1) \
ee890fe2
SS
567SECTION_FUNCTION (objc_selector_fixup_section, \
568 in_objc_selector_fixup, \
70fb5453 569 ".section __OBJC, __sel_fixup", 1) \
ee890fe2
SS
570SECTION_FUNCTION (objc_symbols_section, \
571 in_objc_symbols, \
70fb5453 572 ".objc_symbols", 1) \
ee890fe2
SS
573SECTION_FUNCTION (objc_module_info_section, \
574 in_objc_module_info, \
70fb5453 575 ".objc_module_info", 1) \
ee890fe2
SS
576SECTION_FUNCTION (objc_protocol_section, \
577 in_objc_protocol, \
70fb5453 578 ".objc_protocol", 1) \
ee890fe2
SS
579SECTION_FUNCTION (objc_string_object_section, \
580 in_objc_string_object, \
70fb5453 581 ".objc_string_object", 1) \
ee890fe2
SS
582SECTION_FUNCTION (objc_constant_string_object_section, \
583 in_objc_constant_string_object, \
70fb5453 584 ".section __OBJC, __cstring_object", 1) \
ee890fe2
SS
585SECTION_FUNCTION (objc_class_names_section, \
586 in_objc_class_names, \
70fb5453 587 ".objc_class_names", 1) \
ee890fe2
SS
588SECTION_FUNCTION (objc_meth_var_names_section, \
589 in_objc_meth_var_names, \
70fb5453 590 ".objc_meth_var_names", 1) \
ee890fe2
SS
591SECTION_FUNCTION (objc_meth_var_types_section, \
592 in_objc_meth_var_types, \
70fb5453 593 ".objc_meth_var_types", 1) \
ee890fe2
SS
594SECTION_FUNCTION (objc_cls_refs_section, \
595 in_objc_cls_refs, \
70fb5453 596 ".objc_cls_refs", 1) \
ee890fe2
SS
597 \
598SECTION_FUNCTION (machopic_lazy_symbol_ptr_section, \
599 in_machopic_lazy_symbol_ptr, \
70fb5453 600 ".lazy_symbol_pointer", 0) \
ee890fe2
SS
601SECTION_FUNCTION (machopic_nl_symbol_ptr_section, \
602 in_machopic_nl_symbol_ptr, \
70fb5453 603 ".non_lazy_symbol_pointer", 0) \
ee890fe2
SS
604SECTION_FUNCTION (machopic_symbol_stub_section, \
605 in_machopic_symbol_stub, \
70fb5453 606 ".symbol_stub", 0) \
d3c300d2
DJ
607SECTION_FUNCTION (machopic_symbol_stub1_section, \
608 in_machopic_symbol_stub1, \
609 ".section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16", 0)\
ee890fe2
SS
610SECTION_FUNCTION (machopic_picsymbol_stub_section, \
611 in_machopic_picsymbol_stub, \
70fb5453 612 ".picsymbol_stub", 0) \
d3c300d2
DJ
613SECTION_FUNCTION (machopic_picsymbol_stub1_section, \
614 in_machopic_picsymbol_stub1, \
615 ".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32", 0)\
abe72dd8
SS
616SECTION_FUNCTION (darwin_exception_section, \
617 in_darwin_exception, \
7606e68f 618 ".section __DATA,__gcc_except_tab", 0) \
07c9d2eb
SS
619SECTION_FUNCTION (darwin_eh_frame_section, \
620 in_darwin_eh_frame, \
621 ".section __TEXT,__eh_frame", 0) \
ee890fe2 622 \
91dc3130 623static void \
ee890fe2
SS
624objc_section_init () \
625{ \
626 static int been_here = 0; \
627 \
628 if (been_here == 0) \
629 { \
630 been_here = 1; \
631 /* written, cold -> hot */ \
632 objc_cat_cls_meth_section (); \
633 objc_cat_inst_meth_section (); \
634 objc_string_object_section (); \
635 objc_constant_string_object_section (); \
636 objc_selector_refs_section (); \
637 objc_selector_fixup_section (); \
638 objc_cls_refs_section (); \
639 objc_class_section (); \
640 objc_meta_class_section (); \
641 /* shared, hot -> cold */ \
642 objc_cls_meth_section (); \
643 objc_inst_meth_section (); \
644 objc_protocol_section (); \
645 objc_class_names_section (); \
646 objc_meth_var_types_section (); \
647 objc_meth_var_names_section (); \
648 objc_category_section (); \
649 objc_class_vars_section (); \
650 objc_instance_vars_section (); \
651 objc_module_info_section (); \
652 objc_symbols_section (); \
653 } \
ee890fe2
SS
654}
655
ee890fe2
SS
656#define READONLY_DATA_SECTION const_section
657
ae46c4e0
RH
658#undef TARGET_ASM_SELECT_SECTION
659#define TARGET_ASM_SELECT_SECTION machopic_select_section
b64a1b53
RH
660#undef TARGET_ASM_SELECT_RTX_SECTION
661#define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
ee890fe2 662
28df0b5a
SS
663#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
664 do { \
665 if (FILE) { \
ab82a49f 666 if (MACHOPIC_INDIRECT) \
28df0b5a 667 fprintf (FILE, "\t.lazy_reference "); \
ee890fe2 668 else \
28df0b5a
SS
669 fprintf (FILE, "\t.reference "); \
670 assemble_name (FILE, NAME); \
671 fprintf (FILE, "\n"); \
ee890fe2
SS
672 } \
673 } while (0)
674
f60b945b
SS
675#define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \
676 do { \
677 if (FILE) { \
678 fprintf (FILE, "\t"); \
679 assemble_name (FILE, NAME); \
680 fprintf (FILE, "=0\n"); \
5eb99654 681 (*targetm.asm_out.globalize_label) (FILE, NAME); \
ee890fe2
SS
682 } \
683 } while (0)
684
5eb99654
KG
685/* Globalizing directive for a label. */
686#define GLOBAL_ASM_OP ".globl "
687#define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
ee890fe2
SS
688
689#undef ASM_GENERATE_INTERNAL_LABEL
690#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
91dc3130 691 sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
ee890fe2 692
ee890fe2
SS
693/* Since we have a separate readonly data section, define this so that
694 jump tables end up in text rather than data. */
695
696#ifndef JUMP_TABLES_IN_TEXT_SECTION
697#define JUMP_TABLES_IN_TEXT_SECTION 1
698#endif
699
700/* Symbolic names for various things we might know about a symbol. */
701
702enum machopic_addr_class {
703 MACHOPIC_UNDEFINED,
704 MACHOPIC_DEFINED_DATA,
705 MACHOPIC_UNDEFINED_DATA,
706 MACHOPIC_DEFINED_FUNCTION,
707 MACHOPIC_UNDEFINED_FUNCTION
708};
709
710/* Macros defining the various PIC cases. */
711
ab82a49f
AP
712#define MACHO_DYNAMIC_NO_PIC_P (TARGET_DYNAMIC_NO_PIC)
713#define MACHOPIC_INDIRECT (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
714#define MACHOPIC_JUST_INDIRECT (flag_pic == 1 || MACHO_DYNAMIC_NO_PIC_P)
715#define MACHOPIC_PURE (flag_pic == 2 && ! MACHO_DYNAMIC_NO_PIC_P)
ee890fe2 716
b069de3b 717#undef TARGET_ENCODE_SECTION_INFO
fb49053f 718#define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info
b069de3b 719#undef TARGET_STRIP_NAME_ENCODING
772c5265 720#define TARGET_STRIP_NAME_ENCODING darwin_strip_name_encoding
df56a27f 721
ee890fe2
SS
722#define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \
723 do { \
83182544 724 const char *const stub_ = (STUB); \
ee890fe2
SS
725 char *buffer_ = (BUF); \
726 strcpy (buffer_, stub_); \
727 if (stub_[0] == '"') \
728 { \
729 strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\""); \
730 } \
731 else \
732 { \
733 strcpy (buffer_ + (STUB_LENGTH), "_binder"); \
734 } \
735 } while (0)
736
737#define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \
738 do { \
83182544 739 const char *const symbol_ = (SYMBOL); \
ee890fe2
SS
740 char *buffer_ = (BUF); \
741 if (name_needs_quotes (symbol_) && symbol_[0] != '"') \
742 { \
743 sprintf (buffer_, "\"%s\"", symbol_); \
744 } \
745 else \
746 { \
747 strcpy (buffer_, symbol_); \
748 } \
749 } while (0)
750
751/* Given a symbol name string, create the lazy pointer version
752 of the symbol name. */
753
754#define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \
755 do { \
772c5265 756 const char *symbol_ = darwin_strip_name_encoding (SYMBOL); \
ee890fe2
SS
757 char *buffer_ = (BUF); \
758 if (symbol_[0] == '"') \
759 { \
772c5265 760 strcpy (buffer_, "\"L"); \
ee890fe2
SS
761 strcpy (buffer_ + 2, symbol_ + 1); \
762 strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\""); \
763 } \
764 else if (name_needs_quotes (symbol_)) \
765 { \
766 strcpy (buffer_, "\"L"); \
767 strcpy (buffer_ + 2, symbol_); \
768 strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\""); \
769 } \
770 else \
771 { \
772 strcpy (buffer_, "L"); \
773 strcpy (buffer_ + 1, symbol_); \
774 strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr"); \
775 } \
776 } while (0)
777
07c9d2eb 778#define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section
abe72dd8 779
07c9d2eb
SS
780#define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section
781
b069de3b 782#undef ASM_PREFERRED_EH_DATA_FORMAT
abe72dd8 783#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
7606e68f
SS
784 (((CODE) == 2 && (GLOBAL) == 1) \
785 ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \
786 ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
787
788#define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \
789 darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
790
791#define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
abe72dd8 792
c58b209a
NB
793#define DARWIN_REGISTER_TARGET_PRAGMAS() \
794 do { \
795 c_register_pragma (0, "mark", darwin_pragma_ignore); \
796 c_register_pragma (0, "options", darwin_pragma_options); \
797 c_register_pragma (0, "segment", darwin_pragma_ignore); \
798 c_register_pragma (0, "unused", darwin_pragma_unused); \
0168a849 799 } while (0)
2aa9948d
SS
800
801#undef ASM_APP_ON
802#define ASM_APP_ON ""
803#undef ASM_APP_OFF
804#define ASM_APP_OFF ""
This page took 0.580522 seconds and 5 git commands to generate.