1 /* Target definitions for Darwin (Mac OS X) systems.
2 Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4 Contributed by Apple Computer Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
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)
13 GCC is distributed in the hope that it will be useful,
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.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
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. */
30 /* Although NeXT ran on many different architectures, as of Jan 2001
31 the only supported Darwin targets are PowerPC and x86. */
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
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. */
42 #define OBJECT_FORMAT_MACHO
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.) */
48 #define MATH_LIBRARY ""
54 /* Define an empty body for the function do_global_dtors() in libgcc2.c. */
56 #define DO_GLOBAL_DTORS_BODY
58 /* The string value for __SIZE_TYPE__. */
61 #define SIZE_TYPE "long unsigned int"
64 /* Type used for ptrdiff_t, as a string used in a declaration. */
67 #define PTRDIFF_TYPE "int"
72 #define WCHAR_TYPE "int"
73 #undef WCHAR_TYPE_SIZE
74 #define WCHAR_TYPE_SIZE 32
76 /* Default to using the NeXT-style runtime, since that's what is
77 pre-installed on Darwin systems. */
79 #define NEXT_OBJC_RUNTIME
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. */
84 #undef DEFAULT_PCC_STRUCT_RETURN
85 #define DEFAULT_PCC_STRUCT_RETURN 0
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.
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.)
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.
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
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" }, \
119 { "-dynamic", "-Zdynamic" }, \
120 { "-dynamiclib", "-Zdynamiclib" }, \
121 { "-exported_symbols_list", "-Zexported_symbols_list" }, \
122 { "-seg_addr_table_filename", "-Zseg_addr_table_filename" }, \
123 { "-filelist", "-Xlinker -filelist -Xlinker" }, \
124 { "-flat_namespace", "-Zflat_namespace" }, \
125 { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" }, \
126 { "-force_flat_namespace", "-Zforce_flat_namespace" }, \
127 { "-image_base", "-Zimage_base" }, \
128 { "-init", "-Zinit" }, \
129 { "-install_name", "-Zinstall_name" }, \
130 { "-multiply_defined_unused", "-Zmultiplydefinedunused" }, \
131 { "-multiply_defined", "-Zmultiply_defined" }, \
132 { "-multi_module", "-Zmulti_module" }, \
133 { "-static", "-static -Wa,-static" }, \
134 { "-single_module", "-Zsingle_module" }, \
135 { "-unexported_symbols_list", "-Zunexported_symbols_list" }, \
136 SUBTARGET_OPTION_TRANSLATE_TABLE
138 /* These compiler options take n arguments. */
140 #undef WORD_SWITCH_TAKES_ARG
141 #define WORD_SWITCH_TAKES_ARG(STR) \
142 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \
143 !strcmp (STR, "Zallowable_client") ? 1 : \
144 !strcmp (STR, "arch") ? 1 : \
145 !strcmp (STR, "arch_only") ? 1 : \
146 !strcmp (STR, "Zbundle_loader") ? 1 : \
147 !strcmp (STR, "client_name") ? 1 : \
148 !strcmp (STR, "compatibility_version") ? 1 : \
149 !strcmp (STR, "current_version") ? 1 : \
150 !strcmp (STR, "Zdylib_file") ? 1 : \
151 !strcmp (STR, "Zexported_symbols_list") ? 1 : \
152 !strcmp (STR, "Zimage_base") ? 1 : \
153 !strcmp (STR, "Zinit") ? 1 : \
154 !strcmp (STR, "Zinstall_name") ? 1 : \
155 !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \
156 !strcmp (STR, "Zmultiply_defined") ? 1 : \
157 !strcmp (STR, "precomp-trustfile") ? 1 : \
158 !strcmp (STR, "read_only_relocs") ? 1 : \
159 !strcmp (STR, "sectcreate") ? 3 : \
160 !strcmp (STR, "sectorder") ? 3 : \
161 !strcmp (STR, "Zseg_addr_table_filename") ?1 :\
162 !strcmp (STR, "seg1addr") ? 1 : \
163 !strcmp (STR, "segprot") ? 3 : \
164 !strcmp (STR, "seg_addr_table") ? 1 : \
165 !strcmp (STR, "sub_library") ? 1 : \
166 !strcmp (STR, "sub_umbrella") ? 1 : \
167 !strcmp (STR, "umbrella") ? 1 : \
168 !strcmp (STR, "undefined") ? 1 : \
169 !strcmp (STR, "Zunexported_symbols_list") ? 1 : \
170 !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \
171 !strcmp (STR, "pagezero_size") ? 1 : \
172 !strcmp (STR, "segs_read_only_addr") ? 1 : \
173 !strcmp (STR, "segs_read_write_addr") ? 1 : \
174 !strcmp (STR, "sectalign") ? 3 : \
175 !strcmp (STR, "sectobjectsymbols") ? 2 : \
176 !strcmp (STR, "segcreate") ? 3 : \
177 !strcmp (STR, "dylinker_install_name") ? 1 : \
180 /* Machine dependent cpp options. */
183 #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}"
185 /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus
186 precomp, libtool, and fat build additions. Also we
187 don't specify a second %G after %L because libSystem is
188 self-contained and doesn't need to link against libgcc.a. */
189 /* In general, random Darwin linker flags should go into LINK_SPEC
190 instead of LINK_COMMAND_SPEC. The command spec is better for
191 specifying the handling of options understood by generic Unix
192 linkers, and for positional arguments like libraries. */
193 #define LINK_COMMAND_SPEC "\
194 %{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\
195 %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \
196 %{!Zdynamiclib:-arch %(darwin_arch)} \
197 %{Zdynamiclib:-arch_only %(darwin_arch)} \
198 %l %X %{d} %{s} %{t} %{Z} \
199 %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \
200 %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \
201 %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \
202 %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate:-lgcov} \
203 %{!nostdlib:%{!nodefaultlibs:%G %L}} \
204 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \
205 %{!--help:%{!no-c++filt|c++filt:| c++filt }} }}}}}}}}"
207 /* Please keep the random linker options in alphabetical order (modulo
208 'Z' and 'no' prefixes). Options that can only go to one of libtool
209 or ld must be listed twice, under both !Zdynamiclib and
210 Zdynamiclib, with one of the cases reporting an error. */
211 /* Note that options taking arguments may appear multiple times on a
212 command line with different arguments each time, so put a * after
213 their names so all of them get passed. */
215 "%{static}%{!static:-dynamic} \
218 %{Zbundle_loader*:-bundle_loader %*} \
220 %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\
222 %{current_version*:%e-current_version only allowed with -dynamiclib} \
223 %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
224 %{Zforce_flat_namespace:-force_flat_namespace} \
225 %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \
226 %{keep_private_externs} \
230 %{Zbundle:%e-bundle not allowed with -dynamiclib} \
231 %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \
232 %{client_name*:%e-client_name not allowed with -dynamiclib} \
233 %{compatibility_version*} \
234 %{current_version*} \
235 %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \
236 %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \
237 %{Zinstall_name*:-install_name %*} \
238 %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \
239 %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \
241 %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \
242 %{Zallowable_client*:-allowable_client %*} \
243 %{Zbind_at_load:-bind_at_load} \
244 %{Zarch_errors_fatal:-arch_errors_fatal} \
245 %{Zdylib_file*:-dylib_file %*} \
246 %{Zdynamic:-dynamic}\
247 %{Zexported_symbols_list*:-exported_symbols_list %*} \
248 %{Zflat_namespace:-flat_namespace} \
249 %{headerpad_max_install_names*} \
250 %{Zimage_base*:-image_base %*} \
253 %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \
254 %{Zmultiply_defined*:-multiply_defined %*} \
255 %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \
256 %{prebind} %{noprebind} %{nofixprebinding} %{prebind_all_twolevel_modules} \
257 %{read_only_relocs} \
258 %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \
259 %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \
260 %{sub_library*} %{sub_umbrella*} \
261 %{twolevel_namespace} %{twolevel_namespace_hints} \
264 %{Zunexported_symbols_list*:-unexported_symbols_list %*} \
265 %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \
269 %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \
270 %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \
271 %{whatsloaded} %{dylinker_install_name*} \
272 %{dylinker} %{Mach} "
275 /* Machine dependent libraries. */
278 #define LIB_SPEC "%{!static:-lSystem}"
280 /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
282 #undef STARTFILE_SPEC
283 #define STARTFILE_SPEC \
284 "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \
285 %{!Zbundle:%{pg:%{static:-lgcrt0.o} \
286 %{!static:%{object:-lgcrt0.o} \
287 %{!object:%{preload:-lgcrt0.o} \
288 %{!preload:-lgcrt1.o -lcrt2.o}}}} \
289 %{!pg:%{static:-lcrt0.o} \
290 %{!static:%{object:-lcrt0.o} \
291 %{!object:%{preload:-lcrt0.o} \
292 %{!preload:-lcrt1.o -lcrt2.o}}}}}}"
294 /* The native Darwin linker doesn't necessarily place files in the order
295 that they're specified on the link line. Thus, it is pointless
296 to put anything in ENDFILE_SPEC. */
297 /* #define ENDFILE_SPEC "" */
299 /* We use Dbx symbol format. */
301 #define DBX_DEBUGGING_INFO 1
303 /* When generating stabs debugging, use N_BINCL entries. */
305 #define DBX_USE_BINCL
307 /* There is no limit to the length of stabs strings. */
309 #define DBX_CONTIN_LENGTH 0
311 /* gdb needs a null N_SO at the end of each file for scattered loading. */
313 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
314 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
315 do { text_section (); \
317 "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO); \
320 /* Our profiling scheme doesn't LP labels and counter words. */
322 #define NO_PROFILE_COUNTERS 1
324 #undef INIT_SECTION_ASM_OP
325 #define INIT_SECTION_ASM_OP
329 #define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor
330 #define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor
332 /* Always prefix with an underscore. */
334 #define USER_LABEL_PREFIX "_"
336 /* Don't output a .file directive. That is only used by the assembler for
338 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
339 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
341 #undef TARGET_ASM_FILE_END
342 #define TARGET_ASM_FILE_END darwin_file_end
344 #define ASM_OUTPUT_SKIP(FILE,SIZE) \
345 fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE)
347 /* Give ObjC methods pretty symbol names. */
349 #undef OBJC_GEN_METHOD_LABEL
350 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
352 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
353 (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
355 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
356 (CLASS_NAME), (SEL_NAME)); \
359 /* The RTTI data (e.g., __ti4name) is common and public (and static),
360 but it does need to be referenced via indirect PIC data pointers.
361 The machopic_define_name calls are telling the machopic subsystem
362 that the name *is* defined in this module, so it doesn't need to
363 make them indirect. */
365 #undef ASM_DECLARE_OBJECT_NAME
366 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
368 const char *xname = NAME; \
369 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \
370 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \
371 if ((TREE_STATIC (DECL) \
372 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
373 || DECL_INITIAL (DECL)) \
374 machopic_define_name (xname); \
375 if ((TREE_STATIC (DECL) \
376 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
377 || DECL_INITIAL (DECL)) \
378 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
379 ASM_OUTPUT_LABEL (FILE, xname); \
380 /* Darwin doesn't support zero-size objects, so give them a \
382 if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0) \
383 assemble_zeros (1); \
386 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
388 const char *xname = NAME; \
389 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \
390 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \
391 if ((TREE_STATIC (DECL) \
392 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
393 || DECL_INITIAL (DECL)) \
394 machopic_define_name (xname); \
395 if ((TREE_STATIC (DECL) \
396 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
397 || DECL_INITIAL (DECL)) \
398 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
399 ASM_OUTPUT_LABEL (FILE, xname); \
402 #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE) \
404 ASM_OUTPUT_LABEL (FILE, NAME); \
405 /* Darwin doesn't support zero-size objects, so give them a \
408 assemble_zeros (1); \
411 /* Wrap new method names in quotes so the assembler doesn't gag.
412 Make Objective-C internal symbols local. */
414 #undef ASM_OUTPUT_LABELREF
415 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
417 const char *xname = darwin_strip_name_encoding (NAME); \
418 if (! strcmp (xname, "<pic base>")) \
419 machopic_output_function_base_name(FILE); \
420 else if (xname[0] == '&' || xname[0] == '*') \
422 int len = strlen (xname); \
423 if (len > 6 && !strcmp ("$stub", xname + len - 5)) \
424 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \
425 else if (len > 7 && !strcmp ("$stub\"", xname + len - 6)) \
426 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \
427 else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
428 machopic_validate_stub_or_non_lazy_ptr (xname, 0); \
429 fputs (&xname[1], FILE); \
431 else if (xname[0] == '+' || xname[0] == '-') \
432 fprintf (FILE, "\"%s\"", xname); \
433 else if (!strncmp (xname, "_OBJC_", 6)) \
434 fprintf (FILE, "L%s", xname); \
435 else if (!strncmp (xname, ".objc_class_name_", 17)) \
436 fprintf (FILE, "%s", xname); \
438 fprintf (FILE, "_%s", xname); \
441 /* Output before executable code. */
442 #undef TEXT_SECTION_ASM_OP
443 #define TEXT_SECTION_ASM_OP ".text"
445 /* Output before writable data. */
447 #undef DATA_SECTION_ASM_OP
448 #define DATA_SECTION_ASM_OP ".data"
451 #define ALIGN_ASM_OP ".align"
453 #undef ASM_OUTPUT_ALIGN
454 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
456 fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
458 /* Ensure correct alignment of bss data. */
460 #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL
461 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \
463 fputs (".lcomm ", (FILE)); \
464 assemble_name ((FILE), (NAME)); \
465 fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), \
466 floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
467 if ((DECL) && ((TREE_STATIC (DECL) \
468 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
469 || DECL_INITIAL (DECL))) \
470 (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false); \
471 if ((DECL) && ((TREE_STATIC (DECL) \
472 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \
473 || DECL_INITIAL (DECL))) \
474 machopic_define_name (NAME); \
477 /* The maximum alignment which the object file format can support.
478 For Mach-O, this is 2^15. */
480 #undef MAX_OFILE_ALIGNMENT
481 #define MAX_OFILE_ALIGNMENT 0x8000
483 /* Create new Mach-O sections. */
485 #undef SECTION_FUNCTION
486 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC) \
487 extern void FUNCTION (void); \
491 if (in_section != SECTION) \
494 objc_section_init (); \
497 fprintf (asm_out_file, "%s\n", DIRECTIVE); \
498 in_section = SECTION; \
502 /* Darwin uses many types of special sections. */
504 #undef EXTRA_SECTIONS
505 #define EXTRA_SECTIONS \
506 in_const, in_const_data, in_cstring, in_literal4, in_literal8, \
507 in_constructor, in_destructor, in_mod_init, in_mod_term, \
508 in_objc_class, in_objc_meta_class, in_objc_category, \
509 in_objc_class_vars, in_objc_instance_vars, \
510 in_objc_cls_meth, in_objc_inst_meth, \
511 in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
512 in_objc_selector_refs, \
513 in_objc_selector_fixup, \
514 in_objc_symbols, in_objc_module_info, \
515 in_objc_protocol, in_objc_string_object, \
516 in_objc_constant_string_object, \
517 in_objc_image_info, \
518 in_objc_class_names, in_objc_meth_var_names, \
519 in_objc_meth_var_types, in_objc_cls_refs, \
520 in_machopic_nl_symbol_ptr, \
521 in_machopic_lazy_symbol_ptr, \
522 in_machopic_symbol_stub, \
523 in_machopic_symbol_stub1, \
524 in_machopic_picsymbol_stub, \
525 in_machopic_picsymbol_stub1, \
526 in_darwin_exception, in_darwin_eh_frame, \
529 #undef EXTRA_SECTION_FUNCTIONS
530 #define EXTRA_SECTION_FUNCTIONS \
531 static void objc_section_init (void); \
532 SECTION_FUNCTION (const_section, \
535 SECTION_FUNCTION (const_data_section, \
538 SECTION_FUNCTION (cstring_section, \
541 SECTION_FUNCTION (literal4_section, \
544 SECTION_FUNCTION (literal8_section, \
547 SECTION_FUNCTION (constructor_section, \
550 SECTION_FUNCTION (mod_init_section, \
552 ".mod_init_func", 0) \
553 SECTION_FUNCTION (mod_term_section, \
555 ".mod_term_func", 0) \
556 SECTION_FUNCTION (destructor_section, \
559 SECTION_FUNCTION (objc_class_section, \
562 SECTION_FUNCTION (objc_meta_class_section, \
563 in_objc_meta_class, \
564 ".objc_meta_class", 1) \
565 SECTION_FUNCTION (objc_category_section, \
567 ".objc_category", 1) \
568 SECTION_FUNCTION (objc_class_vars_section, \
569 in_objc_class_vars, \
570 ".objc_class_vars", 1) \
571 SECTION_FUNCTION (objc_instance_vars_section, \
572 in_objc_instance_vars, \
573 ".objc_instance_vars", 1) \
574 SECTION_FUNCTION (objc_cls_meth_section, \
576 ".objc_cls_meth", 1) \
577 SECTION_FUNCTION (objc_inst_meth_section, \
579 ".objc_inst_meth", 1) \
580 SECTION_FUNCTION (objc_cat_cls_meth_section, \
581 in_objc_cat_cls_meth, \
582 ".objc_cat_cls_meth", 1) \
583 SECTION_FUNCTION (objc_cat_inst_meth_section, \
584 in_objc_cat_inst_meth, \
585 ".objc_cat_inst_meth", 1) \
586 SECTION_FUNCTION (objc_selector_refs_section, \
587 in_objc_selector_refs, \
588 ".objc_message_refs", 1) \
589 SECTION_FUNCTION (objc_selector_fixup_section, \
590 in_objc_selector_fixup, \
591 ".section __OBJC, __sel_fixup", 1) \
592 SECTION_FUNCTION (objc_symbols_section, \
594 ".objc_symbols", 1) \
595 SECTION_FUNCTION (objc_module_info_section, \
596 in_objc_module_info, \
597 ".objc_module_info", 1) \
598 SECTION_FUNCTION (objc_protocol_section, \
600 ".objc_protocol", 1) \
601 SECTION_FUNCTION (objc_string_object_section, \
602 in_objc_string_object, \
603 ".objc_string_object", 1) \
604 SECTION_FUNCTION (objc_constant_string_object_section, \
605 in_objc_constant_string_object, \
606 ".section __OBJC, __cstring_object", 1) \
607 /* Fix-and-Continue image marker. */ \
608 SECTION_FUNCTION (objc_image_info_section, \
609 in_objc_image_info, \
610 ".section __OBJC, __image_info", 1) \
611 SECTION_FUNCTION (objc_class_names_section, \
612 in_objc_class_names, \
613 ".objc_class_names", 1) \
614 SECTION_FUNCTION (objc_meth_var_names_section, \
615 in_objc_meth_var_names, \
616 ".objc_meth_var_names", 1) \
617 SECTION_FUNCTION (objc_meth_var_types_section, \
618 in_objc_meth_var_types, \
619 ".objc_meth_var_types", 1) \
620 SECTION_FUNCTION (objc_cls_refs_section, \
622 ".objc_cls_refs", 1) \
624 SECTION_FUNCTION (machopic_lazy_symbol_ptr_section, \
625 in_machopic_lazy_symbol_ptr, \
626 ".lazy_symbol_pointer", 0) \
627 SECTION_FUNCTION (machopic_nl_symbol_ptr_section, \
628 in_machopic_nl_symbol_ptr, \
629 ".non_lazy_symbol_pointer", 0) \
630 SECTION_FUNCTION (machopic_symbol_stub_section, \
631 in_machopic_symbol_stub, \
633 SECTION_FUNCTION (machopic_symbol_stub1_section, \
634 in_machopic_symbol_stub1, \
635 ".section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16", 0)\
636 SECTION_FUNCTION (machopic_picsymbol_stub_section, \
637 in_machopic_picsymbol_stub, \
638 ".picsymbol_stub", 0) \
639 SECTION_FUNCTION (machopic_picsymbol_stub1_section, \
640 in_machopic_picsymbol_stub1, \
641 ".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32", 0)\
642 SECTION_FUNCTION (darwin_exception_section, \
643 in_darwin_exception, \
644 ".section __DATA,__gcc_except_tab", 0) \
645 SECTION_FUNCTION (darwin_eh_frame_section, \
646 in_darwin_eh_frame, \
647 ".section __TEXT,__eh_frame", 0) \
650 objc_section_init (void) \
652 static int been_here = 0; \
654 if (been_here == 0) \
657 /* written, cold -> hot */ \
658 objc_cat_cls_meth_section (); \
659 objc_cat_inst_meth_section (); \
660 objc_string_object_section (); \
661 objc_constant_string_object_section (); \
662 objc_selector_refs_section (); \
663 objc_selector_fixup_section (); \
664 objc_cls_refs_section (); \
665 objc_class_section (); \
666 objc_meta_class_section (); \
667 /* shared, hot -> cold */ \
668 objc_cls_meth_section (); \
669 objc_inst_meth_section (); \
670 objc_protocol_section (); \
671 objc_class_names_section (); \
672 objc_meth_var_types_section (); \
673 objc_meth_var_names_section (); \
674 objc_category_section (); \
675 objc_class_vars_section (); \
676 objc_instance_vars_section (); \
677 objc_module_info_section (); \
678 objc_symbols_section (); \
682 #define READONLY_DATA_SECTION const_section
684 #undef TARGET_ASM_SELECT_SECTION
685 #define TARGET_ASM_SELECT_SECTION machopic_select_section
686 #undef TARGET_ASM_SELECT_RTX_SECTION
687 #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
689 #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
692 if (MACHOPIC_INDIRECT) \
693 fprintf (FILE, "\t.lazy_reference "); \
695 fprintf (FILE, "\t.reference "); \
696 assemble_name (FILE, NAME); \
697 fprintf (FILE, "\n"); \
701 #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \
704 fprintf (FILE, "\t"); \
705 assemble_name (FILE, NAME); \
706 fprintf (FILE, "=0\n"); \
707 (*targetm.asm_out.globalize_label) (FILE, NAME); \
711 /* Globalizing directive for a label. */
712 #define GLOBAL_ASM_OP ".globl "
713 #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
715 /* Emit an assembler directive to set visibility for a symbol. Used
716 to support visibility attribute and Darwin's private extern
718 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
719 #define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility
722 #undef ASM_GENERATE_INTERNAL_LABEL
723 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
724 sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
726 /* Since we have a separate readonly data section, define this so that
727 jump tables end up in text rather than data. */
729 #ifndef JUMP_TABLES_IN_TEXT_SECTION
730 #define JUMP_TABLES_IN_TEXT_SECTION 1
733 /* Symbolic names for various things we might know about a symbol. */
735 enum machopic_addr_class {
737 MACHOPIC_DEFINED_DATA,
738 MACHOPIC_UNDEFINED_DATA,
739 MACHOPIC_DEFINED_FUNCTION,
740 MACHOPIC_UNDEFINED_FUNCTION
743 /* Macros defining the various PIC cases. */
745 #define MACHO_DYNAMIC_NO_PIC_P (TARGET_DYNAMIC_NO_PIC)
746 #define MACHOPIC_INDIRECT (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
747 #define MACHOPIC_JUST_INDIRECT (flag_pic == 1 || MACHO_DYNAMIC_NO_PIC_P)
748 #define MACHOPIC_PURE (flag_pic == 2 && ! MACHO_DYNAMIC_NO_PIC_P)
750 #undef TARGET_ENCODE_SECTION_INFO
751 #define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info
752 #undef TARGET_STRIP_NAME_ENCODING
753 #define TARGET_STRIP_NAME_ENCODING darwin_strip_name_encoding
755 #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \
757 const char *const stub_ = (STUB); \
758 char *buffer_ = (BUF); \
759 strcpy (buffer_, stub_); \
760 if (stub_[0] == '"') \
762 strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\""); \
766 strcpy (buffer_ + (STUB_LENGTH), "_binder"); \
770 #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \
772 const char *const symbol_ = (SYMBOL); \
773 char *buffer_ = (BUF); \
774 if (name_needs_quotes (symbol_) && symbol_[0] != '"') \
776 sprintf (buffer_, "\"%s\"", symbol_); \
780 strcpy (buffer_, symbol_); \
784 /* Given a symbol name string, create the lazy pointer version
785 of the symbol name. */
787 #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \
789 const char *symbol_ = darwin_strip_name_encoding (SYMBOL); \
790 char *buffer_ = (BUF); \
791 if (symbol_[0] == '"') \
793 strcpy (buffer_, "\"L"); \
794 strcpy (buffer_ + 2, symbol_ + 1); \
795 strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\""); \
797 else if (name_needs_quotes (symbol_)) \
799 strcpy (buffer_, "\"L"); \
800 strcpy (buffer_ + 2, symbol_); \
801 strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\""); \
805 strcpy (buffer_, "L"); \
806 strcpy (buffer_ + 1, symbol_); \
807 strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr"); \
811 #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section
813 #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section
815 #undef ASM_PREFERRED_EH_DATA_FORMAT
816 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \
817 (((CODE) == 2 && (GLOBAL) == 1) \
818 ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \
819 ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
821 #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \
822 darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
824 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
826 #define DARWIN_REGISTER_TARGET_PRAGMAS() \
828 c_register_pragma (0, "mark", darwin_pragma_ignore); \
829 c_register_pragma (0, "options", darwin_pragma_options); \
830 c_register_pragma (0, "segment", darwin_pragma_ignore); \
831 c_register_pragma (0, "unused", darwin_pragma_unused); \
835 #define ASM_APP_ON ""
837 #define ASM_APP_OFF ""