OSDN Git Service

gcc
[pf3gnuchains/gcc-fork.git] / 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 GNU CC.
7
8 GNU CC 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 GNU CC 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 GNU CC; 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 #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" }, \
113   { "-dynamic", "-Zdynamic" },  \
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
173 /* Machine dependent cpp options.  */
174
175 #undef  CPP_SPEC
176 #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}"
177
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     %{!Zdynamiclib:-arch %(darwin_arch)} \
190     %{Zdynamiclib:-arch_only %(darwin_arch)} \
191     %l %X %{d} %{s} %{t} %{Z} \
192     %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \
193     %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \
194     %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \
195     %{L*} %(link_libgcc) %o %{fprofile-arcs:-lgcov} \
196     %{!nostdlib:%{!nodefaultlibs:%G %L}} \
197     %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \
198     %{!--help:%{!no-c++filt|c++filt:| c++filt3 }} }}}}}}}}"
199
200 /* Please keep the random linker options in alphabetical order (modulo
201    'Z' and 'no' prefixes).  Options that can only go to one of libtool
202    or ld must be listed twice, under both !Zdynamiclib and
203    Zdynamiclib, with one of the cases reporting an error.  */
204 /* Note that options taking arguments may appear multiple times on a
205    command line with different arguments each time, so put a * after
206    their names so all of them get passed.  */
207 #define LINK_SPEC  \
208   "%{static}%{!static:-dynamic} \
209    %{!Zdynamiclib: \
210      %{Zbundle:-bundle} \
211      %{Zbundle_loader*:-bundle_loader %*} \
212      %{client_name*} \
213      %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\
214 } \
215      %{current_version*:%e-current_version only allowed with -dynamiclib} \
216      %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \
217      %{Zforce_flat_namespace:-force_flat_namespace} \
218      %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \
219      %{keep_private_externs} \
220      %{private_bundle} \
221     } \
222    %{Zdynamiclib: \
223      %{Zbundle:%e-bundle not allowed with -dynamiclib} \
224      %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \
225      %{client_name*:%e-client_name not allowed with -dynamiclib} \
226      %{compatibility_version*} \
227      %{current_version*} \
228      %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \
229      %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \
230      %{Zinstall_name*:-install_name %*} \
231      %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \
232      %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \
233     } \
234    %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \
235    %{Zallowable_client*:-allowable_client %*} \
236    %{Zbind_at_load:-bind_at_load} \
237    %{Zarch_errors_fatal:-arch_errors_fatal} \
238    %{Zdylib_file*:-dylib_file %*} \
239    %{Zdynamic:-dynamic}\
240    %{Zexported_symbols_list*:-exported_symbols_list %*} \
241    %{Zflat_namespace:-flat_namespace} \
242    %{headerpad_max_install_names*} \
243    %{Zimage_base*:-image_base %*} \
244    %{Zinit*:-init %*} \
245    %{nomultidefs} \
246    %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \
247    %{Zmultiply_defined*:-multiply_defined %*} \
248    %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \
249    %{prebind} %{noprebind} %{nofixprebinding} %{prebind_all_twolevel_modules} \
250    %{read_only_relocs} \
251    %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \
252    %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \
253    %{sub_library*} %{sub_umbrella*} \
254    %{twolevel_namespace} %{twolevel_namespace_hints} \
255    %{umbrella*} \
256    %{undefined*} \
257    %{Zunexported_symbols_list*:-unexported_symbols_list %*} \
258    %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \
259    %{X} \
260    %{y*} \
261    %{w} \
262    %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit}  \
263    %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \
264    %{whatsloaded} %{dylinker_install_name*} \
265    %{dylinker} %{Mach} "
266
267
268 /* Machine dependent libraries.  */
269
270 #undef  LIB_SPEC
271 #define LIB_SPEC "%{!static:-lSystem}"
272
273 /* We specify crt0.o as -lcrt0.o so that ld will search the library path.  */
274
275 #undef  STARTFILE_SPEC
276 #define STARTFILE_SPEC  \
277   "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \
278      %{!Zbundle:%{pg:%{static:-lgcrt0.o} \
279                      %{!static:%{object:-lgcrt0.o} \
280                                %{!object:%{preload:-lgcrt0.o} \
281                                  %{!preload:-lgcrt1.o -lcrt2.o}}}} \
282                 %{!pg:%{static:-lcrt0.o} \
283                       %{!static:%{object:-lcrt0.o} \
284                                 %{!object:%{preload:-lcrt0.o} \
285                                   %{!preload:-lcrt1.o -lcrt2.o}}}}}}"
286
287 /* The native Darwin linker doesn't necessarily place files in the order
288    that they're specified on the link line.  Thus, it is pointless
289    to put anything in ENDFILE_SPEC.  */
290 /* #define ENDFILE_SPEC "" */
291
292 /* We use Dbx symbol format.  */
293
294 #define DBX_DEBUGGING_INFO 1
295
296 /* When generating stabs debugging, use N_BINCL entries.  */
297
298 #define DBX_USE_BINCL
299
300 /* There is no limit to the length of stabs strings.  */
301
302 #define DBX_CONTIN_LENGTH 0
303
304 /* gdb needs a null N_SO at the end of each file for scattered loading.  */
305
306 #undef  DBX_OUTPUT_MAIN_SOURCE_FILE_END
307 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)                 \
308 do { text_section ();                                                   \
309      fprintf (FILE,                                                     \
310               "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO);   \
311    } while (0)
312
313 /* Our profiling scheme doesn't LP labels and counter words.  */
314
315 #define NO_PROFILE_COUNTERS     1
316
317 #undef  INIT_SECTION_ASM_OP
318 #define INIT_SECTION_ASM_OP
319
320 #undef  INVOKE__main
321
322 #define TARGET_ASM_CONSTRUCTOR  machopic_asm_out_constructor
323 #define TARGET_ASM_DESTRUCTOR   machopic_asm_out_destructor
324
325 /* Always prefix with an underscore.  */
326
327 #define USER_LABEL_PREFIX "_"
328
329 /* Don't output a .file directive.  That is only used by the assembler for
330    error reporting.  */
331 #undef  TARGET_ASM_FILE_START_FILE_DIRECTIVE
332 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
333
334 #undef  TARGET_ASM_FILE_END
335 #define TARGET_ASM_FILE_END darwin_file_end
336
337 #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
338   fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE)
339
340 /* Give ObjC methods pretty symbol names.  */
341
342 #undef  OBJC_GEN_METHOD_LABEL
343 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
344   do { if (CAT_NAME)                                                    \
345          sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',          \
346                   (CLASS_NAME), (CAT_NAME), (SEL_NAME));                \
347        else                                                             \
348          sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',              \
349                   (CLASS_NAME), (SEL_NAME));                            \
350      } while (0)
351
352 /* The RTTI data (e.g., __ti4name) is common and public (and static),
353    but it does need to be referenced via indirect PIC data pointers.
354    The machopic_define_name calls are telling the machopic subsystem
355    that the name *is* defined in this module, so it doesn't need to
356    make them indirect.  */
357
358 #undef ASM_DECLARE_OBJECT_NAME
359 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
360   do {                                                                  \
361     const char *xname = NAME;                                           \
362     if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF)             \
363       xname = IDENTIFIER_POINTER (DECL_NAME (DECL));                    \
364     if ((TREE_STATIC (DECL)                                             \
365          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
366         || DECL_INITIAL (DECL))                                         \
367       machopic_define_name (xname);                                     \
368     if ((TREE_STATIC (DECL)                                             \
369          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
370         || DECL_INITIAL (DECL))                                         \
371       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);   \
372     ASM_OUTPUT_LABEL (FILE, xname);                                     \
373     /* Darwin doesn't support zero-size objects, so give them a \
374        byte.  */                                                        \
375     if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0)                   \
376       assemble_zeros (1);                                               \
377   } while (0)
378
379 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
380   do {                                                                  \
381     const char *xname = NAME;                                           \
382     if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF)             \
383       xname = IDENTIFIER_POINTER (DECL_NAME (DECL));                    \
384     if ((TREE_STATIC (DECL)                                             \
385          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
386         || DECL_INITIAL (DECL))                                         \
387       machopic_define_name (xname);                                     \
388     if ((TREE_STATIC (DECL)                                             \
389          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
390         || DECL_INITIAL (DECL))                                         \
391       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);   \
392     ASM_OUTPUT_LABEL (FILE, xname);                                     \
393     /* Avoid generating stubs for functions we've just defined by       \
394        outputting any required stub name label now.  */                 \
395     machopic_output_possible_stub_label (FILE, xname);                  \
396   } while (0)
397
398 #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE)        \
399   do {                                                          \
400     ASM_OUTPUT_LABEL (FILE, NAME);                              \
401     /* Darwin doesn't support zero-size objects, so give them a \
402        byte.  */                                                \
403     if ((SIZE) == 0)                                            \
404       assemble_zeros (1);                                       \
405   } while (0)
406
407 /* Wrap new method names in quotes so the assembler doesn't gag.
408    Make Objective-C internal symbols local.  */
409
410 #undef  ASM_OUTPUT_LABELREF
411 #define ASM_OUTPUT_LABELREF(FILE,NAME)                                       \
412   do {                                                                       \
413        const char *xname = darwin_strip_name_encoding (NAME);                \
414        if (! strcmp (xname, "<pic base>"))                                   \
415          machopic_output_function_base_name(FILE);                           \
416        else if (xname[0] == '&' || xname[0] == '*')                          \
417          {                                                                   \
418            int len = strlen (xname);                                         \
419            if (len > 6 && !strcmp ("$stub", xname + len - 5))                \
420              machopic_validate_stub_or_non_lazy_ptr (xname, 1);              \
421            else if (len > 7 && !strcmp ("$stub\"", xname + len - 6))         \
422              machopic_validate_stub_or_non_lazy_ptr (xname, 1);              \
423            else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
424              machopic_validate_stub_or_non_lazy_ptr (xname, 0);              \
425            fputs (&xname[1], FILE);                                          \
426          }                                                                   \
427        else if (xname[0] == '+' || xname[0] == '-')                          \
428          fprintf (FILE, "\"%s\"", xname);                                    \
429        else if (!strncmp (xname, "_OBJC_", 6))                               \
430          fprintf (FILE, "L%s", xname);                                       \
431        else if (!strncmp (xname, ".objc_class_name_", 17))                   \
432          fprintf (FILE, "%s", xname);                                        \
433        else                                                                  \
434          fprintf (FILE, "_%s", xname);                                       \
435   } while (0)
436
437 /* Output before executable code.  */
438 #undef TEXT_SECTION_ASM_OP
439 #define TEXT_SECTION_ASM_OP ".text"
440
441 /* Output before writable data.  */
442
443 #undef DATA_SECTION_ASM_OP
444 #define DATA_SECTION_ASM_OP ".data"
445
446 #undef  ALIGN_ASM_OP
447 #define ALIGN_ASM_OP            ".align"
448
449 #undef  ASM_OUTPUT_ALIGN
450 #define ASM_OUTPUT_ALIGN(FILE,LOG)      \
451   if ((LOG) != 0)                       \
452     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
453
454 /* Ensure correct alignment of bss data.  */
455
456 #undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
457 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)    \
458   do {                                                                  \
459     fputs (".lcomm ", (FILE));                                          \
460     assemble_name ((FILE), (NAME));                                     \
461     fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE),    \
462              floor_log2 ((ALIGN) / BITS_PER_UNIT));                     \
463     if ((DECL) && ((TREE_STATIC (DECL)                                  \
464          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
465         || DECL_INITIAL (DECL)))                                        \
466       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);   \
467     if ((DECL) && ((TREE_STATIC (DECL)                                  \
468          && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
469         || DECL_INITIAL (DECL)))                                        \
470       machopic_define_name (NAME);                                      \
471   } while (0)
472
473 /* The maximum alignment which the object file format can support.
474    For Mach-O, this is 2^15.  */
475
476 #undef  MAX_OFILE_ALIGNMENT
477 #define MAX_OFILE_ALIGNMENT 0x8000
478
479 /* Create new Mach-O sections.  */
480
481 #undef  SECTION_FUNCTION
482 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC)            \
483 extern void FUNCTION (void);                                            \
484 void                                                                    \
485 FUNCTION (void)                                                         \
486 {                                                                       \
487   if (in_section != SECTION)                                            \
488     {                                                                   \
489       if (OBJC)                                                         \
490         objc_section_init ();                                           \
491       data_section ();                                                  \
492       if (asm_out_file)                                                 \
493         fprintf (asm_out_file, "%s\n", DIRECTIVE);                      \
494       in_section = SECTION;                                             \
495     }                                                                   \
496 }                                                                       \
497
498 /* Darwin uses many types of special sections.  */
499
500 #undef  EXTRA_SECTIONS
501 #define EXTRA_SECTIONS                                  \
502   in_const, in_const_data, in_cstring, in_literal4, in_literal8,        \
503   in_constructor, in_destructor, in_mod_init, in_mod_term,              \
504   in_objc_class, in_objc_meta_class, in_objc_category,  \
505   in_objc_class_vars, in_objc_instance_vars,            \
506   in_objc_cls_meth, in_objc_inst_meth,                  \
507   in_objc_cat_cls_meth, in_objc_cat_inst_meth,          \
508   in_objc_selector_refs,                                \
509   in_objc_selector_fixup,                               \
510   in_objc_symbols, in_objc_module_info,                 \
511   in_objc_protocol, in_objc_string_object,              \
512   in_objc_constant_string_object,                       \
513   in_objc_class_names, in_objc_meth_var_names,          \
514   in_objc_meth_var_types, in_objc_cls_refs,             \
515   in_machopic_nl_symbol_ptr,                            \
516   in_machopic_lazy_symbol_ptr,                          \
517   in_machopic_symbol_stub,                              \
518   in_machopic_symbol_stub1,                             \
519   in_machopic_picsymbol_stub,                           \
520   in_machopic_picsymbol_stub1,                          \
521   in_darwin_exception, in_darwin_eh_frame,              \
522   num_sections
523
524 #undef  EXTRA_SECTION_FUNCTIONS
525 #define EXTRA_SECTION_FUNCTIONS                 \
526 static void objc_section_init (void);           \
527 SECTION_FUNCTION (const_section,                \
528                   in_const,                     \
529                   ".const", 0)                  \
530 SECTION_FUNCTION (const_data_section,           \
531                   in_const_data,                \
532                   ".const_data", 0)             \
533 SECTION_FUNCTION (cstring_section,              \
534                   in_cstring,                   \
535                   ".cstring", 0)                \
536 SECTION_FUNCTION (literal4_section,             \
537                   in_literal4,                  \
538                   ".literal4", 0)               \
539 SECTION_FUNCTION (literal8_section,             \
540                   in_literal8,                  \
541                   ".literal8", 0)               \
542 SECTION_FUNCTION (constructor_section,          \
543                   in_constructor,               \
544                   ".constructor", 0)            \
545 SECTION_FUNCTION (mod_init_section,             \
546                   in_mod_init,                  \
547                   ".mod_init_func", 0)  \
548 SECTION_FUNCTION (mod_term_section, \
549                   in_mod_term,                  \
550                   ".mod_term_func", 0)  \
551 SECTION_FUNCTION (destructor_section,           \
552                   in_destructor,                \
553                   ".destructor", 0)             \
554 SECTION_FUNCTION (objc_class_section,           \
555                   in_objc_class,                \
556                   ".objc_class", 1)             \
557 SECTION_FUNCTION (objc_meta_class_section,      \
558                   in_objc_meta_class,           \
559                   ".objc_meta_class", 1)        \
560 SECTION_FUNCTION (objc_category_section,        \
561                   in_objc_category,             \
562                 ".objc_category", 1)            \
563 SECTION_FUNCTION (objc_class_vars_section,      \
564                   in_objc_class_vars,           \
565                   ".objc_class_vars", 1)        \
566 SECTION_FUNCTION (objc_instance_vars_section,   \
567                   in_objc_instance_vars,        \
568                   ".objc_instance_vars", 1)     \
569 SECTION_FUNCTION (objc_cls_meth_section,        \
570                   in_objc_cls_meth,             \
571                   ".objc_cls_meth", 1)  \
572 SECTION_FUNCTION (objc_inst_meth_section,       \
573                   in_objc_inst_meth,            \
574                   ".objc_inst_meth", 1) \
575 SECTION_FUNCTION (objc_cat_cls_meth_section,    \
576                   in_objc_cat_cls_meth,         \
577                   ".objc_cat_cls_meth", 1)      \
578 SECTION_FUNCTION (objc_cat_inst_meth_section,   \
579                   in_objc_cat_inst_meth,        \
580                   ".objc_cat_inst_meth", 1)     \
581 SECTION_FUNCTION (objc_selector_refs_section,   \
582                   in_objc_selector_refs,        \
583                   ".objc_message_refs", 1)      \
584 SECTION_FUNCTION (objc_selector_fixup_section,  \
585                   in_objc_selector_fixup,       \
586                   ".section __OBJC, __sel_fixup", 1)    \
587 SECTION_FUNCTION (objc_symbols_section,         \
588                   in_objc_symbols,              \
589                   ".objc_symbols", 1)   \
590 SECTION_FUNCTION (objc_module_info_section,     \
591                   in_objc_module_info,          \
592                   ".objc_module_info", 1)       \
593 SECTION_FUNCTION (objc_protocol_section,        \
594                   in_objc_protocol,             \
595                   ".objc_protocol", 1)  \
596 SECTION_FUNCTION (objc_string_object_section,   \
597                   in_objc_string_object,        \
598                   ".objc_string_object", 1)     \
599 SECTION_FUNCTION (objc_constant_string_object_section,  \
600                   in_objc_constant_string_object,       \
601                   ".section __OBJC, __cstring_object", 1)       \
602 SECTION_FUNCTION (objc_class_names_section,     \
603                 in_objc_class_names,            \
604                 ".objc_class_names", 1) \
605 SECTION_FUNCTION (objc_meth_var_names_section,  \
606                 in_objc_meth_var_names,         \
607                 ".objc_meth_var_names", 1)      \
608 SECTION_FUNCTION (objc_meth_var_types_section,  \
609                 in_objc_meth_var_types,         \
610                 ".objc_meth_var_types", 1)      \
611 SECTION_FUNCTION (objc_cls_refs_section,        \
612                 in_objc_cls_refs,               \
613                 ".objc_cls_refs", 1)            \
614                                                 \
615 SECTION_FUNCTION (machopic_lazy_symbol_ptr_section,     \
616                 in_machopic_lazy_symbol_ptr,            \
617                 ".lazy_symbol_pointer", 0)      \
618 SECTION_FUNCTION (machopic_nl_symbol_ptr_section,       \
619                 in_machopic_nl_symbol_ptr,              \
620                 ".non_lazy_symbol_pointer", 0)  \
621 SECTION_FUNCTION (machopic_symbol_stub_section,         \
622                 in_machopic_symbol_stub,                \
623                 ".symbol_stub", 0)              \
624 SECTION_FUNCTION (machopic_symbol_stub1_section,        \
625                 in_machopic_symbol_stub1,               \
626                 ".section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16", 0)\
627 SECTION_FUNCTION (machopic_picsymbol_stub_section,      \
628                 in_machopic_picsymbol_stub,             \
629                 ".picsymbol_stub", 0)           \
630 SECTION_FUNCTION (machopic_picsymbol_stub1_section,     \
631                 in_machopic_picsymbol_stub1,            \
632                 ".section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32", 0)\
633 SECTION_FUNCTION (darwin_exception_section,             \
634                 in_darwin_exception,                    \
635                 ".section __DATA,__gcc_except_tab", 0)  \
636 SECTION_FUNCTION (darwin_eh_frame_section,              \
637                 in_darwin_eh_frame,                     \
638                 ".section __TEXT,__eh_frame", 0)        \
639                                                         \
640 static void                                     \
641 objc_section_init (void)                        \
642 {                                               \
643   static int been_here = 0;                     \
644                                                 \
645   if (been_here == 0)                           \
646     {                                           \
647       been_here = 1;                            \
648           /* written, cold -> hot */            \
649       objc_cat_cls_meth_section ();             \
650       objc_cat_inst_meth_section ();            \
651       objc_string_object_section ();            \
652       objc_constant_string_object_section ();   \
653       objc_selector_refs_section ();            \
654       objc_selector_fixup_section ();           \
655       objc_cls_refs_section ();                 \
656       objc_class_section ();                    \
657       objc_meta_class_section ();               \
658           /* shared, hot -> cold */             \
659       objc_cls_meth_section ();                 \
660       objc_inst_meth_section ();                \
661       objc_protocol_section ();                 \
662       objc_class_names_section ();              \
663       objc_meth_var_types_section ();           \
664       objc_meth_var_names_section ();           \
665       objc_category_section ();                 \
666       objc_class_vars_section ();               \
667       objc_instance_vars_section ();            \
668       objc_module_info_section ();              \
669       objc_symbols_section ();                  \
670     }                                           \
671 }
672
673 #define READONLY_DATA_SECTION const_section
674
675 #undef  TARGET_ASM_SELECT_SECTION
676 #define TARGET_ASM_SELECT_SECTION machopic_select_section
677 #undef  TARGET_ASM_SELECT_RTX_SECTION
678 #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
679
680 #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME)                     \
681     do {                                                                \
682          if (FILE) {                                                    \
683            if (MACHOPIC_INDIRECT)                                       \
684              fprintf (FILE, "\t.lazy_reference ");                      \
685            else                                                         \
686              fprintf (FILE, "\t.reference ");                           \
687            assemble_name (FILE, NAME);                                  \
688            fprintf (FILE, "\n");                                        \
689          }                                                              \
690        } while (0)
691
692 #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME)                          \
693     do {                                                                \
694          if (FILE) {                                                    \
695            fprintf (FILE, "\t");                                        \
696            assemble_name (FILE, NAME);                                  \
697            fprintf (FILE, "=0\n");                                      \
698            (*targetm.asm_out.globalize_label) (FILE, NAME);             \
699          }                                                              \
700        } while (0)
701
702 /* Globalizing directive for a label.  */
703 #define GLOBAL_ASM_OP ".globl "
704 #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
705
706 #undef ASM_GENERATE_INTERNAL_LABEL
707 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)   \
708   sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
709
710 /* Since we have a separate readonly data section, define this so that
711    jump tables end up in text rather than data.  */
712
713 #ifndef JUMP_TABLES_IN_TEXT_SECTION
714 #define JUMP_TABLES_IN_TEXT_SECTION 1
715 #endif
716
717 /* Symbolic names for various things we might know about a symbol.  */
718
719 enum machopic_addr_class {
720   MACHOPIC_UNDEFINED,
721   MACHOPIC_DEFINED_DATA,
722   MACHOPIC_UNDEFINED_DATA,
723   MACHOPIC_DEFINED_FUNCTION,
724   MACHOPIC_UNDEFINED_FUNCTION
725 };
726
727 /* Macros defining the various PIC cases.  */
728
729 #define MACHO_DYNAMIC_NO_PIC_P  (TARGET_DYNAMIC_NO_PIC)
730 #define MACHOPIC_INDIRECT       (flag_pic || MACHO_DYNAMIC_NO_PIC_P)
731 #define MACHOPIC_JUST_INDIRECT  (flag_pic == 1 || MACHO_DYNAMIC_NO_PIC_P)
732 #define MACHOPIC_PURE           (flag_pic == 2 && ! MACHO_DYNAMIC_NO_PIC_P)
733
734 #undef TARGET_ENCODE_SECTION_INFO
735 #define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info
736 #undef TARGET_STRIP_NAME_ENCODING
737 #define TARGET_STRIP_NAME_ENCODING  darwin_strip_name_encoding
738
739 #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH)          \
740   do {                                                          \
741     const char *const stub_ = (STUB);                           \
742     char *buffer_ = (BUF);                                      \
743     strcpy (buffer_, stub_);                                    \
744     if (stub_[0] == '"')                                        \
745       {                                                         \
746         strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\"");      \
747       }                                                         \
748     else                                                        \
749       {                                                         \
750         strcpy (buffer_ + (STUB_LENGTH), "_binder");            \
751       }                                                         \
752   } while (0)
753
754 #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)    \
755   do {                                                          \
756     const char *const symbol_ = (SYMBOL);                       \
757     char *buffer_ = (BUF);                                      \
758     if (name_needs_quotes (symbol_) && symbol_[0] != '"')       \
759       {                                                         \
760           sprintf (buffer_, "\"%s\"", symbol_);                 \
761       }                                                         \
762     else                                                        \
763       {                                                         \
764         strcpy (buffer_, symbol_);                              \
765       }                                                         \
766   } while (0)
767
768 /* Given a symbol name string, create the lazy pointer version
769    of the symbol name.  */
770
771 #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)  \
772   do {                                                          \
773     const char *symbol_ = darwin_strip_name_encoding (SYMBOL);  \
774     char *buffer_ = (BUF);                                      \
775     if (symbol_[0] == '"')                                      \
776       {                                                         \
777         strcpy (buffer_, "\"L");                                \
778         strcpy (buffer_ + 2, symbol_ + 1);                      \
779         strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\"");      \
780       }                                                         \
781     else if (name_needs_quotes (symbol_))                       \
782       {                                                         \
783         strcpy (buffer_, "\"L");                                \
784         strcpy (buffer_ + 2, symbol_);                          \
785         strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\"");  \
786       }                                                         \
787     else                                                        \
788       {                                                         \
789         strcpy (buffer_, "L");                                  \
790         strcpy (buffer_ + 1, symbol_);                          \
791         strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr");    \
792       }                                                         \
793   } while (0)
794
795 #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section
796
797 #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section
798
799 #undef ASM_PREFERRED_EH_DATA_FORMAT
800 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)  \
801   (((CODE) == 2 && (GLOBAL) == 1) \
802    ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \
803      ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
804
805 #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2)  \
806   darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
807
808 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
809
810 #define DARWIN_REGISTER_TARGET_PRAGMAS()                        \
811   do {                                                          \
812     c_register_pragma (0, "mark", darwin_pragma_ignore);        \
813     c_register_pragma (0, "options", darwin_pragma_options);    \
814     c_register_pragma (0, "segment", darwin_pragma_ignore);     \
815     c_register_pragma (0, "unused", darwin_pragma_unused);      \
816   } while (0)
817
818 #undef ASM_APP_ON
819 #define ASM_APP_ON ""
820 #undef ASM_APP_OFF
821 #define ASM_APP_OFF ""