OSDN Git Service

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