xref: /openbsd/gnu/usr.bin/gcc/gcc/config/darwin.h (revision 4e43c760)
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++filt }} }}}}}}}}"
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     /* Darwin doesn't support zero-size objects, so give them a 	\
384        byte.  */							\
385     if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0)			\
386       assemble_zeros (1);						\
387   } while (0)
388 
389 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)                     \
390   do {									\
391     const char *xname = NAME;                                           \
392     if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF)             \
393       xname = IDENTIFIER_POINTER (DECL_NAME (DECL));                    \
394     if ((TREE_STATIC (DECL)                                             \
395 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
396         || DECL_INITIAL (DECL))                                         \
397       machopic_define_name (xname);                                     \
398     if ((TREE_STATIC (DECL)                                             \
399 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))               \
400         || DECL_INITIAL (DECL))                                         \
401       (* targetm.encode_section_info) (DECL, false);			\
402     ASM_OUTPUT_LABEL (FILE, xname);                                     \
403     /* Avoid generating stubs for functions we've just defined by	\
404        outputting any required stub name label now.  */			\
405     machopic_output_possible_stub_label (FILE, xname);			\
406   } while (0)
407 
408 #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE)	\
409   do {								\
410     ASM_OUTPUT_LABEL (FILE, NAME);				\
411     /* Darwin doesn't support zero-size objects, so give them a	\
412        byte.  */						\
413     if ((SIZE) == 0)						\
414       assemble_zeros (1);					\
415   } while (0)
416 
417 /* Wrap new method names in quotes so the assembler doesn't gag.
418    Make Objective-C internal symbols local.  */
419 
420 #undef	ASM_OUTPUT_LABELREF
421 #define ASM_OUTPUT_LABELREF(FILE,NAME)					     \
422   do {									     \
423        const char *xname = darwin_strip_name_encoding (NAME);		     \
424        if (xname[0] == '&' || xname[0] == '*')				     \
425          {								     \
426            int len = strlen (xname);					     \
427 	   if (len > 6 && !strcmp ("$stub", xname + len - 5))		     \
428 	     machopic_validate_stub_or_non_lazy_ptr (xname, 1);		     \
429 	   else if (len > 7 && !strcmp ("$stub\"", xname + len - 6))	     \
430 	     machopic_validate_stub_or_non_lazy_ptr (xname, 1);		     \
431 	   else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
432 	     machopic_validate_stub_or_non_lazy_ptr (xname, 0);		     \
433 	   fputs (&xname[1], FILE);					     \
434 	 }								     \
435        else if (xname[0] == '+' || xname[0] == '-')			     \
436          fprintf (FILE, "\"%s\"", xname);				     \
437        else if (!strncmp (xname, "_OBJC_", 6))				     \
438          fprintf (FILE, "L%s", xname);					     \
439        else if (!strncmp (xname, ".objc_class_name_", 17))		     \
440 	 fprintf (FILE, "%s", xname);					     \
441        else								     \
442          fprintf (FILE, "_%s", xname);					     \
443   } while (0)
444 
445 /* Output before executable code.  */
446 #undef TEXT_SECTION_ASM_OP
447 #define TEXT_SECTION_ASM_OP ".text"
448 
449 /* Output before writable data.  */
450 
451 #undef DATA_SECTION_ASM_OP
452 #define DATA_SECTION_ASM_OP ".data"
453 
454 #undef	ALIGN_ASM_OP
455 #define ALIGN_ASM_OP		".align"
456 
457 #undef	ASM_OUTPUT_ALIGN
458 #define ASM_OUTPUT_ALIGN(FILE,LOG)	\
459   if ((LOG) != 0)			\
460     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
461 
462 /* Ensure correct alignment of bss data.  */
463 
464 #undef	ASM_OUTPUT_ALIGNED_DECL_LOCAL
465 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	\
466   do {									\
467     fputs (".lcomm ", (FILE));						\
468     assemble_name ((FILE), (NAME));					\
469     fprintf ((FILE), ",%u,%u\n", (SIZE),				\
470 	     floor_log2 ((ALIGN) / BITS_PER_UNIT));			\
471     if ((DECL) && ((TREE_STATIC (DECL)					\
472 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
473         || DECL_INITIAL (DECL)))					\
474       (* targetm.encode_section_info) (DECL, false);			\
475     if ((DECL) && ((TREE_STATIC (DECL)					\
476 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
477         || DECL_INITIAL (DECL)))					\
478       machopic_define_name (NAME);					\
479   } while (0)
480 
481 /* The maximum alignment which the object file format can support.
482    For Mach-O, this is 2^15.  */
483 
484 #undef	MAX_OFILE_ALIGNMENT
485 #define MAX_OFILE_ALIGNMENT 0x8000
486 
487 /* Create new Mach-O sections.  */
488 
489 #undef	SECTION_FUNCTION
490 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC)		\
491 extern void FUNCTION PARAMS ((void));					\
492 void									\
493 FUNCTION ()								\
494 {									\
495   if (in_section != SECTION)						\
496     {									\
497       if (OBJC)								\
498 	objc_section_init ();						\
499       data_section ();							\
500       if (asm_out_file)							\
501 	fprintf (asm_out_file, "%s\n", DIRECTIVE);			\
502       in_section = SECTION;						\
503     }									\
504 }									\
505 
506 /* Darwin uses many types of special sections.  */
507 
508 #undef	EXTRA_SECTIONS
509 #define EXTRA_SECTIONS					\
510   in_const, in_const_data, in_cstring, in_literal4, in_literal8,	\
511   in_constructor, in_destructor, in_mod_init, in_mod_term,		\
512   in_objc_class, in_objc_meta_class, in_objc_category,	\
513   in_objc_class_vars, in_objc_instance_vars,		\
514   in_objc_cls_meth, in_objc_inst_meth,			\
515   in_objc_cat_cls_meth, in_objc_cat_inst_meth,		\
516   in_objc_selector_refs,				\
517   in_objc_selector_fixup,				\
518   in_objc_symbols, in_objc_module_info,			\
519   in_objc_protocol, in_objc_string_object,		\
520   in_objc_constant_string_object,			\
521   in_objc_class_names, in_objc_meth_var_names,		\
522   in_objc_meth_var_types, in_objc_cls_refs, 		\
523   in_machopic_nl_symbol_ptr,				\
524   in_machopic_lazy_symbol_ptr,				\
525   in_machopic_symbol_stub,				\
526   in_machopic_picsymbol_stub,				\
527   in_darwin_exception, in_darwin_eh_frame,		\
528   num_sections
529 
530 #undef	EXTRA_SECTION_FUNCTIONS
531 #define EXTRA_SECTION_FUNCTIONS			\
532 static void objc_section_init PARAMS ((void));	\
533 SECTION_FUNCTION (const_section,		\
534                   in_const,			\
535                   ".const", 0)			\
536 SECTION_FUNCTION (const_data_section,		\
537                   in_const_data,		\
538                   ".const_data", 0)		\
539 SECTION_FUNCTION (cstring_section,		\
540 		  in_cstring,			\
541 		  ".cstring", 0)		\
542 SECTION_FUNCTION (literal4_section,		\
543 		  in_literal4,			\
544 		  ".literal4", 0)		\
545 SECTION_FUNCTION (literal8_section,		\
546 		  in_literal8,			\
547 		  ".literal8", 0)		\
548 SECTION_FUNCTION (constructor_section,		\
549 		  in_constructor,		\
550 		  ".constructor", 0)		\
551 SECTION_FUNCTION (mod_init_section,		\
552 		  in_mod_init,			\
553 		  ".mod_init_func", 0)	\
554 SECTION_FUNCTION (mod_term_section, \
555 		  in_mod_term,			\
556 		  ".mod_term_func", 0)	\
557 SECTION_FUNCTION (destructor_section,		\
558 		  in_destructor,		\
559 		  ".destructor", 0)		\
560 SECTION_FUNCTION (objc_class_section,		\
561 		  in_objc_class,		\
562 		  ".objc_class", 1)		\
563 SECTION_FUNCTION (objc_meta_class_section,	\
564 		  in_objc_meta_class,		\
565 		  ".objc_meta_class", 1)	\
566 SECTION_FUNCTION (objc_category_section,	\
567 		  in_objc_category,		\
568 		".objc_category", 1)		\
569 SECTION_FUNCTION (objc_class_vars_section,	\
570 		  in_objc_class_vars,		\
571 		  ".objc_class_vars", 1)	\
572 SECTION_FUNCTION (objc_instance_vars_section,	\
573 		  in_objc_instance_vars,	\
574 		  ".objc_instance_vars", 1)	\
575 SECTION_FUNCTION (objc_cls_meth_section,	\
576 		  in_objc_cls_meth,		\
577 		  ".objc_cls_meth", 1)	\
578 SECTION_FUNCTION (objc_inst_meth_section,	\
579 		  in_objc_inst_meth,		\
580 		  ".objc_inst_meth", 1)	\
581 SECTION_FUNCTION (objc_cat_cls_meth_section,	\
582 		  in_objc_cat_cls_meth,		\
583 		  ".objc_cat_cls_meth", 1)	\
584 SECTION_FUNCTION (objc_cat_inst_meth_section,	\
585 		  in_objc_cat_inst_meth,	\
586 		  ".objc_cat_inst_meth", 1)	\
587 SECTION_FUNCTION (objc_selector_refs_section,	\
588 		  in_objc_selector_refs,	\
589 		  ".objc_message_refs", 1)	\
590 SECTION_FUNCTION (objc_selector_fixup_section,	\
591 		  in_objc_selector_fixup,	\
592 		  ".section __OBJC, __sel_fixup", 1)	\
593 SECTION_FUNCTION (objc_symbols_section,		\
594 		  in_objc_symbols,		\
595 		  ".objc_symbols", 1)	\
596 SECTION_FUNCTION (objc_module_info_section,	\
597 		  in_objc_module_info,		\
598 		  ".objc_module_info", 1)	\
599 SECTION_FUNCTION (objc_protocol_section,	\
600 		  in_objc_protocol,		\
601 		  ".objc_protocol", 1)	\
602 SECTION_FUNCTION (objc_string_object_section,	\
603 		  in_objc_string_object,	\
604 		  ".objc_string_object", 1)	\
605 SECTION_FUNCTION (objc_constant_string_object_section,	\
606 		  in_objc_constant_string_object,	\
607 		  ".section __OBJC, __cstring_object", 1)	\
608 SECTION_FUNCTION (objc_class_names_section,	\
609 		in_objc_class_names,		\
610 		".objc_class_names", 1)	\
611 SECTION_FUNCTION (objc_meth_var_names_section,	\
612 		in_objc_meth_var_names,		\
613 		".objc_meth_var_names", 1)	\
614 SECTION_FUNCTION (objc_meth_var_types_section,	\
615 		in_objc_meth_var_types,		\
616 		".objc_meth_var_types", 1)	\
617 SECTION_FUNCTION (objc_cls_refs_section,	\
618 		in_objc_cls_refs,		\
619 		".objc_cls_refs", 1)		\
620 						\
621 SECTION_FUNCTION (machopic_lazy_symbol_ptr_section,	\
622 		in_machopic_lazy_symbol_ptr,		\
623 		".lazy_symbol_pointer", 0)      	\
624 SECTION_FUNCTION (machopic_nl_symbol_ptr_section,	\
625 		in_machopic_nl_symbol_ptr,		\
626 		".non_lazy_symbol_pointer", 0)      	\
627 SECTION_FUNCTION (machopic_symbol_stub_section,		\
628 		in_machopic_symbol_stub,		\
629 		".symbol_stub", 0)      		\
630 SECTION_FUNCTION (machopic_picsymbol_stub_section,	\
631 		in_machopic_picsymbol_stub,		\
632 		".picsymbol_stub", 0)      		\
633 SECTION_FUNCTION (darwin_exception_section,		\
634 		in_darwin_exception,			\
635 		".section __DATA,__gcc_except_tab", 0)	\
636 SECTION_FUNCTION (darwin_eh_frame_section,		\
637 		in_darwin_eh_frame,			\
638 		".section __TEXT,__eh_frame", 0)	\
639 							\
640 static void					\
641 objc_section_init ()				\
642 {						\
643   static int been_here = 0;			\
644 						\
645   if (been_here == 0)				\
646     {						\
647       been_here = 1;				\
648           /* written, cold -> hot */		\
649       objc_cat_cls_meth_section ();		\
650       objc_cat_inst_meth_section ();		\
651       objc_string_object_section ();		\
652       objc_constant_string_object_section ();	\
653       objc_selector_refs_section ();		\
654       objc_selector_fixup_section ();		\
655       objc_cls_refs_section ();			\
656       objc_class_section ();			\
657       objc_meta_class_section ();		\
658           /* shared, hot -> cold */    		\
659       objc_cls_meth_section ();			\
660       objc_inst_meth_section ();		\
661       objc_protocol_section ();			\
662       objc_class_names_section ();		\
663       objc_meth_var_types_section ();		\
664       objc_meth_var_names_section ();		\
665       objc_category_section ();			\
666       objc_class_vars_section ();		\
667       objc_instance_vars_section ();		\
668       objc_module_info_section ();		\
669       objc_symbols_section ();			\
670     }						\
671 }
672 
673 #define READONLY_DATA_SECTION const_section
674 
675 #undef	TARGET_ASM_SELECT_SECTION
676 #define TARGET_ASM_SELECT_SECTION machopic_select_section
677 #undef	TARGET_ASM_SELECT_RTX_SECTION
678 #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
679 
680 #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME)			\
681     do { 								\
682 	 if (FILE) {							\
683 	   if (flag_pic)						\
684 	     fprintf (FILE, "\t.lazy_reference ");			\
685 	   else								\
686 	     fprintf (FILE, "\t.reference ");				\
687 	   assemble_name (FILE, NAME);					\
688 	   fprintf (FILE, "\n");					\
689 	 }                                                              \
690        } while (0)
691 
692 #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME)				\
693     do {								\
694 	 if (FILE) {							\
695 	   fprintf (FILE, "\t");					\
696 	   assemble_name (FILE, NAME); 					\
697 	   fprintf (FILE, "=0\n");					\
698 	   (*targetm.asm_out.globalize_label) (FILE, NAME);		\
699 	 }								\
700        } while (0)
701 
702 /* Globalizing directive for a label.  */
703 #define GLOBAL_ASM_OP ".globl "
704 #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
705 
706 #undef ASM_GENERATE_INTERNAL_LABEL
707 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)	\
708   sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
709 
710 /* This is how to output an internal numbered label where PREFIX is
711    the class of label and NUM is the number within the class.  */
712 
713 #undef ASM_OUTPUT_INTERNAL_LABEL
714 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)	\
715   fprintf (FILE, "%s%d:\n", PREFIX, NUM)
716 
717 /* Since we have a separate readonly data section, define this so that
718    jump tables end up in text rather than data.  */
719 
720 #ifndef JUMP_TABLES_IN_TEXT_SECTION
721 #define JUMP_TABLES_IN_TEXT_SECTION 1
722 #endif
723 
724 /* Symbolic names for various things we might know about a symbol.  */
725 
726 enum machopic_addr_class {
727   MACHOPIC_UNDEFINED,
728   MACHOPIC_DEFINED_DATA,
729   MACHOPIC_UNDEFINED_DATA,
730   MACHOPIC_DEFINED_FUNCTION,
731   MACHOPIC_UNDEFINED_FUNCTION
732 };
733 
734 /* Macros defining the various PIC cases.  */
735 
736 #define MACHOPIC_INDIRECT      (flag_pic)
737 #define MACHOPIC_JUST_INDIRECT (flag_pic == 1)
738 #define MACHOPIC_PURE          (flag_pic == 2)
739 
740 #undef TARGET_ENCODE_SECTION_INFO
741 #define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info
742 #undef TARGET_STRIP_NAME_ENCODING
743 #define TARGET_STRIP_NAME_ENCODING  darwin_strip_name_encoding
744 
745 #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH)		\
746   do {								\
747     const char *const stub_ = (STUB);				\
748     char *buffer_ = (BUF);					\
749     strcpy (buffer_, stub_);					\
750     if (stub_[0] == '"')					\
751       {								\
752 	strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\"");	\
753       }								\
754     else							\
755       {								\
756 	strcpy (buffer_ + (STUB_LENGTH), "_binder");		\
757       }								\
758   } while (0)
759 
760 #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)	\
761   do {								\
762     const char *const symbol_ = (SYMBOL);			\
763     char *buffer_ = (BUF);					\
764     if (name_needs_quotes (symbol_) && symbol_[0] != '"')	\
765       {								\
766 	  sprintf (buffer_, "\"%s\"", symbol_);			\
767       }								\
768     else							\
769       {								\
770 	strcpy (buffer_, symbol_);				\
771       }								\
772   } while (0)
773 
774 /* Given a symbol name string, create the lazy pointer version
775    of the symbol name.  */
776 
777 #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)	\
778   do {								\
779     const char *symbol_ = darwin_strip_name_encoding (SYMBOL);	\
780     char *buffer_ = (BUF);					\
781     if (symbol_[0] == '"')					\
782       {								\
783         strcpy (buffer_, "\"L");				\
784         strcpy (buffer_ + 2, symbol_ + 1);			\
785 	strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\"");	\
786       }								\
787     else if (name_needs_quotes (symbol_))			\
788       {								\
789         strcpy (buffer_, "\"L");				\
790         strcpy (buffer_ + 2, symbol_);				\
791 	strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\"");	\
792       }								\
793     else							\
794       {								\
795         strcpy (buffer_, "L");					\
796         strcpy (buffer_ + 1, symbol_);				\
797 	strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr");	\
798       }								\
799   } while (0)
800 
801 #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section
802 
803 #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section
804 
805 #undef ASM_PREFERRED_EH_DATA_FORMAT
806 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)  \
807   (((CODE) == 2 && (GLOBAL) == 1) \
808    ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \
809      ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
810 
811 #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2)  \
812   darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
813 
814 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
815 
816 #define DARWIN_REGISTER_TARGET_PRAGMAS(PFILE)				\
817   do {									\
818     cpp_register_pragma (PFILE, 0, "mark", darwin_pragma_ignore);	\
819     cpp_register_pragma (PFILE, 0, "options", darwin_pragma_options);	\
820     cpp_register_pragma (PFILE, 0, "segment", darwin_pragma_ignore);	\
821     cpp_register_pragma (PFILE, 0, "unused", darwin_pragma_unused);	\
822   } while (0)
823 
824 #undef ASM_APP_ON
825 #define ASM_APP_ON ""
826 #undef ASM_APP_OFF
827 #define ASM_APP_OFF ""
828