]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/gcc/config/darwin.h
This commit was generated by cvs2svn to compensate for changes in r165254,
[FreeBSD/FreeBSD.git] / contrib / gcc / config / darwin.h
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.
5
6 This file is part of GCC.
7
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)
11 any later version.
12
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.
17
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.  */
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
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.  */
37
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
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.)  */
47
48 #define MATH_LIBRARY ""
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
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
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
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.
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
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
137
138 /* These compiler options take n arguments.  */
139
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 : \
178    0)
179
180 /* Machine dependent cpp options.  */
181
182 #undef  CPP_SPEC
183 #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}"
184
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 }} }}}}}}}}"
206
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.  */
214 #define LINK_SPEC  \
215   "%{static}%{!static:-dynamic} \
216    %{!Zdynamiclib: \
217      %{Zbundle:-bundle} \
218      %{Zbundle_loader*:-bundle_loader %*} \
219      %{client_name*} \
220      %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\
221 } \
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} \
227      %{private_bundle} \
228     } \
229    %{Zdynamiclib: \
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} \
240     } \
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 %*} \
251    %{Zinit*:-init %*} \
252    %{nomultidefs} \
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} \
262    %{umbrella*} \
263    %{undefined*} \
264    %{Zunexported_symbols_list*:-unexported_symbols_list %*} \
265    %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \
266    %{X} \
267    %{y*} \
268    %{w} \
269    %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit}  \
270    %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \
271    %{whatsloaded} %{dylinker_install_name*} \
272    %{dylinker} %{Mach} "
273
274
275 /* Machine dependent libraries.  */
276
277 #undef  LIB_SPEC
278 #define LIB_SPEC "%{!static:-lSystem}"
279
280 /* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
281
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}}}}}}"
293
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 "" */
298
299 /* We use Dbx symbol format.  */
300
301 #define DBX_DEBUGGING_INFO 1
302
303 /* When generating stabs debugging, use N_BINCL entries.  */
304
305 #define DBX_USE_BINCL
306
307 /* There is no limit to the length of stabs strings.  */
308
309 #define DBX_CONTIN_LENGTH 0
310
311 /* gdb needs a null N_SO at the end of each file for scattered loading.  */
312
313 #undef  DBX_OUTPUT_MAIN_SOURCE_FILE_END
314 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)                 \
315 do { text_section ();                                                   \
316      fprintf (FILE,                                                     \
317               "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO);   \
318    } while (0)
319
320 /* Our profiling scheme doesn't LP labels and counter words.  */
321
322 #define NO_PROFILE_COUNTERS     1
323
324 #undef  INIT_SECTION_ASM_OP
325 #define INIT_SECTION_ASM_OP
326
327 #undef  INVOKE__main
328
329 #define TARGET_ASM_CONSTRUCTOR  machopic_asm_out_constructor
330 #define TARGET_ASM_DESTRUCTOR   machopic_asm_out_destructor
331
332 /* Always prefix with an underscore.  */
333
334 #define USER_LABEL_PREFIX "_"
335
336 /* Don't output a .file directive.  That is only used by the assembler for
337    error reporting.  */
338 #undef  TARGET_ASM_FILE_START_FILE_DIRECTIVE
339 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
340
341 #undef  TARGET_ASM_FILE_END
342 #define TARGET_ASM_FILE_END darwin_file_end
343
344 #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
345   fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE)
346
347 /* Give ObjC methods pretty symbol names.  */
348
349 #undef  OBJC_GEN_METHOD_LABEL
350 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
351   do { if (CAT_NAME)                                                    \
352          sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',          \
353                   (CLASS_NAME), (CAT_NAME), (SEL_NAME));                \
354        else                                                             \
355          sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',              \
356                   (CLASS_NAME), (SEL_NAME));                            \
357      } while (0)
358
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.  */
364
365 #undef ASM_DECLARE_OBJECT_NAME
366 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
367   do {                                                                  \
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 \
381        byte.  */                                                        \
382     if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0)                   \
383       assemble_zeros (1);                                               \
384   } while (0)
385
386 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
387   do {                                                                  \
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);                                     \
400   } while (0)
401
402 #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE)        \
403   do {                                                          \
404     ASM_OUTPUT_LABEL (FILE, NAME);                              \
405     /* Darwin doesn't support zero-size objects, so give them a \
406        byte.  */                                                \
407     if ((SIZE) == 0)                                            \
408       assemble_zeros (1);                                       \
409   } while (0)
410
411 /* Wrap new method names in quotes so the assembler doesn't gag.
412    Make Objective-C internal symbols local.  */
413
414 #undef  ASM_OUTPUT_LABELREF
415 #define ASM_OUTPUT_LABELREF(FILE,NAME)                                       \
416   do {                                                                       \
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] == '*')                          \
421          {                                                                   \
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);                                          \
430          }                                                                   \
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);                                        \
437        else                                                                  \
438          fprintf (FILE, "_%s", xname);                                       \
439   } while (0)
440
441 /* Output before executable code.  */
442 #undef TEXT_SECTION_ASM_OP
443 #define TEXT_SECTION_ASM_OP ".text"
444
445 /* Output before writable data.  */
446
447 #undef DATA_SECTION_ASM_OP
448 #define DATA_SECTION_ASM_OP ".data"
449
450 #undef  ALIGN_ASM_OP
451 #define ALIGN_ASM_OP            ".align"
452
453 #undef  ASM_OUTPUT_ALIGN
454 #define ASM_OUTPUT_ALIGN(FILE,LOG)      \
455   if ((LOG) != 0)                       \
456     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
457
458 /* Ensure correct alignment of bss data.  */
459
460 #undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
461 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)    \
462   do {                                                                  \
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);                                      \
475   } while (0)
476
477 /* The maximum alignment which the object file format can support.
478    For Mach-O, this is 2^15.  */
479
480 #undef  MAX_OFILE_ALIGNMENT
481 #define MAX_OFILE_ALIGNMENT 0x8000
482
483 /* Create new Mach-O sections.  */
484
485 #undef  SECTION_FUNCTION
486 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC)            \
487 extern void FUNCTION (void);                                            \
488 void                                                                    \
489 FUNCTION (void)                                                         \
490 {                                                                       \
491   if (in_section != SECTION)                                            \
492     {                                                                   \
493       if (OBJC)                                                         \
494         objc_section_init ();                                           \
495       data_section ();                                                  \
496       if (asm_out_file)                                                 \
497         fprintf (asm_out_file, "%s\n", DIRECTIVE);                      \
498       in_section = SECTION;                                             \
499     }                                                                   \
500 }                                                                       \
501
502 /* Darwin uses many types of special sections.  */
503
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,              \
527   num_sections
528
529 #undef  EXTRA_SECTION_FUNCTIONS
530 #define EXTRA_SECTION_FUNCTIONS                 \
531 static void objc_section_init (void);           \
532 SECTION_FUNCTION (const_section,                \
533                   in_const,                     \
534                   ".const", 0)                  \
535 SECTION_FUNCTION (const_data_section,           \
536                   in_const_data,                \
537                   ".const_data", 0)             \
538 SECTION_FUNCTION (cstring_section,              \
539                   in_cstring,                   \
540                   ".cstring", 0)                \
541 SECTION_FUNCTION (literal4_section,             \
542                   in_literal4,                  \
543                   ".literal4", 0)               \
544 SECTION_FUNCTION (literal8_section,             \
545                   in_literal8,                  \
546                   ".literal8", 0)               \
547 SECTION_FUNCTION (constructor_section,          \
548                   in_constructor,               \
549                   ".constructor", 0)            \
550 SECTION_FUNCTION (mod_init_section,             \
551                   in_mod_init,                  \
552                   ".mod_init_func", 0)  \
553 SECTION_FUNCTION (mod_term_section, \
554                   in_mod_term,                  \
555                   ".mod_term_func", 0)  \
556 SECTION_FUNCTION (destructor_section,           \
557                   in_destructor,                \
558                   ".destructor", 0)             \
559 SECTION_FUNCTION (objc_class_section,           \
560                   in_objc_class,                \
561                   ".objc_class", 1)             \
562 SECTION_FUNCTION (objc_meta_class_section,      \
563                   in_objc_meta_class,           \
564                   ".objc_meta_class", 1)        \
565 SECTION_FUNCTION (objc_category_section,        \
566                   in_objc_category,             \
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,        \
575                   in_objc_cls_meth,             \
576                   ".objc_cls_meth", 1)  \
577 SECTION_FUNCTION (objc_inst_meth_section,       \
578                   in_objc_inst_meth,            \
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,         \
593                   in_objc_symbols,              \
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,        \
599                   in_objc_protocol,             \
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,        \
621                 in_objc_cls_refs,               \
622                 ".objc_cls_refs", 1)            \
623                                                 \
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,                \
632                 ".symbol_stub", 0)              \
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)        \
648                                                         \
649 static void                                     \
650 objc_section_init (void)                        \
651 {                                               \
652   static int been_here = 0;                     \
653                                                 \
654   if (been_here == 0)                           \
655     {                                           \
656       been_here = 1;                            \
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 ();                  \
679     }                                           \
680 }
681
682 #define READONLY_DATA_SECTION const_section
683
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
688
689 #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME)                     \
690     do {                                                                \
691          if (FILE) {                                                    \
692            if (MACHOPIC_INDIRECT)                                       \
693              fprintf (FILE, "\t.lazy_reference ");                      \
694            else                                                         \
695              fprintf (FILE, "\t.reference ");                           \
696            assemble_name (FILE, NAME);                                  \
697            fprintf (FILE, "\n");                                        \
698          }                                                              \
699        } while (0)
700
701 #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME)                          \
702     do {                                                                \
703          if (FILE) {                                                    \
704            fprintf (FILE, "\t");                                        \
705            assemble_name (FILE, NAME);                                  \
706            fprintf (FILE, "=0\n");                                      \
707            (*targetm.asm_out.globalize_label) (FILE, NAME);             \
708          }                                                              \
709        } while (0)
710
711 /* Globalizing directive for a label.  */
712 #define GLOBAL_ASM_OP ".globl "
713 #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
714
715 /* Emit an assembler directive to set visibility for a symbol.  Used
716    to support visibility attribute and Darwin's private extern
717    feature. */
718 #undef TARGET_ASM_ASSEMBLE_VISIBILITY
719 #define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility
720
721
722 #undef ASM_GENERATE_INTERNAL_LABEL
723 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)   \
724   sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
725
726 /* Since we have a separate readonly data section, define this so that
727    jump tables end up in text rather than data.  */
728
729 #ifndef JUMP_TABLES_IN_TEXT_SECTION
730 #define JUMP_TABLES_IN_TEXT_SECTION 1
731 #endif
732
733 /* Symbolic names for various things we might know about a symbol.  */
734
735 enum machopic_addr_class {
736   MACHOPIC_UNDEFINED,
737   MACHOPIC_DEFINED_DATA,
738   MACHOPIC_UNDEFINED_DATA,
739   MACHOPIC_DEFINED_FUNCTION,
740   MACHOPIC_UNDEFINED_FUNCTION
741 };
742
743 /* Macros defining the various PIC cases.  */
744
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)
749
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
754
755 #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH)          \
756   do {                                                          \
757     const char *const stub_ = (STUB);                           \
758     char *buffer_ = (BUF);                                      \
759     strcpy (buffer_, stub_);                                    \
760     if (stub_[0] == '"')                                        \
761       {                                                         \
762         strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\"");      \
763       }                                                         \
764     else                                                        \
765       {                                                         \
766         strcpy (buffer_ + (STUB_LENGTH), "_binder");            \
767       }                                                         \
768   } while (0)
769
770 #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)    \
771   do {                                                          \
772     const char *const symbol_ = (SYMBOL);                       \
773     char *buffer_ = (BUF);                                      \
774     if (name_needs_quotes (symbol_) && symbol_[0] != '"')       \
775       {                                                         \
776           sprintf (buffer_, "\"%s\"", symbol_);                 \
777       }                                                         \
778     else                                                        \
779       {                                                         \
780         strcpy (buffer_, symbol_);                              \
781       }                                                         \
782   } while (0)
783
784 /* Given a symbol name string, create the lazy pointer version
785    of the symbol name.  */
786
787 #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)  \
788   do {                                                          \
789     const char *symbol_ = darwin_strip_name_encoding (SYMBOL);  \
790     char *buffer_ = (BUF);                                      \
791     if (symbol_[0] == '"')                                      \
792       {                                                         \
793         strcpy (buffer_, "\"L");                                \
794         strcpy (buffer_ + 2, symbol_ + 1);                      \
795         strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\"");      \
796       }                                                         \
797     else if (name_needs_quotes (symbol_))                       \
798       {                                                         \
799         strcpy (buffer_, "\"L");                                \
800         strcpy (buffer_ + 2, symbol_);                          \
801         strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\"");  \
802       }                                                         \
803     else                                                        \
804       {                                                         \
805         strcpy (buffer_, "L");                                  \
806         strcpy (buffer_ + 1, symbol_);                          \
807         strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr");    \
808       }                                                         \
809   } while (0)
810
811 #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section
812
813 #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section
814
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)
820
821 #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2)  \
822   darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
823
824 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
825
826 #define DARWIN_REGISTER_TARGET_PRAGMAS()                        \
827   do {                                                          \
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);      \
832   } while (0)
833
834 #undef ASM_APP_ON
835 #define ASM_APP_ON ""
836 #undef ASM_APP_OFF
837 #define ASM_APP_OFF ""