OSDN Git Service

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