OSDN Git Service

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