xref: /openbsd/gnu/gcc/gcc/config/darwin.h (revision 404b540a)
1*404b540aSrobert /* Target definitions for Darwin (Mac OS X) systems.
2*404b540aSrobert    Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003, 2004,
3*404b540aSrobert    2005
4*404b540aSrobert    Free Software Foundation, Inc.
5*404b540aSrobert    Contributed by Apple Computer Inc.
6*404b540aSrobert 
7*404b540aSrobert This file is part of GCC.
8*404b540aSrobert 
9*404b540aSrobert GCC is free software; you can redistribute it and/or modify
10*404b540aSrobert it under the terms of the GNU General Public License as published by
11*404b540aSrobert the Free Software Foundation; either version 2, or (at your option)
12*404b540aSrobert any later version.
13*404b540aSrobert 
14*404b540aSrobert GCC is distributed in the hope that it will be useful,
15*404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of
16*404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*404b540aSrobert GNU General Public License for more details.
18*404b540aSrobert 
19*404b540aSrobert You should have received a copy of the GNU General Public License
20*404b540aSrobert along with GCC; see the file COPYING.  If not, write to
21*404b540aSrobert the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22*404b540aSrobert Boston, MA 02110-1301, USA.  */
23*404b540aSrobert 
24*404b540aSrobert #ifndef CONFIG_DARWIN_H
25*404b540aSrobert #define CONFIG_DARWIN_H
26*404b540aSrobert 
27*404b540aSrobert /* The definitions in this file are common to all processor types
28*404b540aSrobert    running Darwin, which is the kernel for Mac OS X.  Darwin is
29*404b540aSrobert    basically a BSD user layer laid over a Mach kernel, then evolved
30*404b540aSrobert    for many years (at NeXT) in parallel with other Unix systems.  So
31*404b540aSrobert    while the runtime is a somewhat idiosyncratic Mach-based thing,
32*404b540aSrobert    other definitions look like they would for a BSD variant.  */
33*404b540aSrobert 
34*404b540aSrobert /* Although NeXT ran on many different architectures, as of Jan 2001
35*404b540aSrobert    the only supported Darwin targets are PowerPC and x86.  */
36*404b540aSrobert 
37*404b540aSrobert /* One of Darwin's NeXT legacies is the Mach-O format, which is partly
38*404b540aSrobert    like a.out and partly like COFF, with additional features like
39*404b540aSrobert    multi-architecture binary support.  */
40*404b540aSrobert 
41*404b540aSrobert #define OBJECT_FORMAT_MACHO
42*404b540aSrobert 
43*404b540aSrobert /* Suppress g++ attempt to link in the math library automatically. */
44*404b540aSrobert #define MATH_LIBRARY ""
45*404b540aSrobert 
46*404b540aSrobert /* We have atexit.  */
47*404b540aSrobert 
48*404b540aSrobert #define HAVE_ATEXIT
49*404b540aSrobert 
50*404b540aSrobert /* Define an empty body for the function do_global_dtors() in libgcc2.c.  */
51*404b540aSrobert 
52*404b540aSrobert #define DO_GLOBAL_DTORS_BODY
53*404b540aSrobert 
54*404b540aSrobert /* The string value for __SIZE_TYPE__.  */
55*404b540aSrobert 
56*404b540aSrobert #ifndef SIZE_TYPE
57*404b540aSrobert #define SIZE_TYPE "long unsigned int"
58*404b540aSrobert #endif
59*404b540aSrobert 
60*404b540aSrobert /* Type used for ptrdiff_t, as a string used in a declaration.  */
61*404b540aSrobert 
62*404b540aSrobert #undef  PTRDIFF_TYPE
63*404b540aSrobert #define PTRDIFF_TYPE "int"
64*404b540aSrobert 
65*404b540aSrobert /* wchar_t is int.  */
66*404b540aSrobert 
67*404b540aSrobert #undef	WCHAR_TYPE
68*404b540aSrobert #define WCHAR_TYPE "int"
69*404b540aSrobert #undef	WCHAR_TYPE_SIZE
70*404b540aSrobert #define WCHAR_TYPE_SIZE 32
71*404b540aSrobert 
72*404b540aSrobert /* Default to using the NeXT-style runtime, since that's what is
73*404b540aSrobert    pre-installed on Darwin systems.  */
74*404b540aSrobert 
75*404b540aSrobert #define NEXT_OBJC_RUNTIME
76*404b540aSrobert 
77*404b540aSrobert /* Don't default to pcc-struct-return, because gcc is the only compiler, and
78*404b540aSrobert    we want to retain compatibility with older gcc versions.  */
79*404b540aSrobert 
80*404b540aSrobert #undef	DEFAULT_PCC_STRUCT_RETURN
81*404b540aSrobert #define DEFAULT_PCC_STRUCT_RETURN 0
82*404b540aSrobert 
83*404b540aSrobert /* True if pragma ms_struct is in effect.  */
84*404b540aSrobert extern GTY(()) int darwin_ms_struct;
85*404b540aSrobert 
86*404b540aSrobert /* This table intercepts weirdo options whose names would interfere
87*404b540aSrobert    with normal driver conventions, and either translates them into
88*404b540aSrobert    standardly-named options, or adds a 'Z' so that they can get to
89*404b540aSrobert    specs processing without interference.
90*404b540aSrobert 
91*404b540aSrobert    Do not expand a linker option to "-Xlinker -<option>", since that
92*404b540aSrobert    forfeits the ability to control via spec strings later.  However,
93*404b540aSrobert    as a special exception, do this translation with -filelist, because
94*404b540aSrobert    otherwise the driver will think there are no input files and quit.
95*404b540aSrobert    (The alternative would be to hack the driver to recognize -filelist
96*404b540aSrobert    specially, but it's simpler to use the translation table.)
97*404b540aSrobert 
98*404b540aSrobert    Note that an option name with a prefix that matches another option
99*404b540aSrobert    name, that also takes an argument, needs to be modified so the
100*404b540aSrobert    prefix is different, otherwise a '*' after the shorter option will
101*404b540aSrobert    match with the longer one.
102*404b540aSrobert 
103*404b540aSrobert    The SUBTARGET_OPTION_TRANSLATE_TABLE macro, which _must_ be defined
104*404b540aSrobert    in gcc/config/{i386,rs6000}/darwin.h, should contain any additional
105*404b540aSrobert    command-line option translations specific to the particular target
106*404b540aSrobert    architecture.  */
107*404b540aSrobert 
108*404b540aSrobert #define TARGET_OPTION_TRANSLATE_TABLE \
109*404b540aSrobert   { "-all_load", "-Zall_load" },  \
110*404b540aSrobert   { "-allowable_client", "-Zallowable_client" },  \
111*404b540aSrobert   { "-arch_errors_fatal", "-Zarch_errors_fatal" },  \
112*404b540aSrobert   { "-bind_at_load", "-Zbind_at_load" },  \
113*404b540aSrobert   { "-bundle", "-Zbundle" },  \
114*404b540aSrobert   { "-bundle_loader", "-Zbundle_loader" },  \
115*404b540aSrobert   { "-weak_reference_mismatches", "-Zweak_reference_mismatches" },  \
116*404b540aSrobert   { "-dead_strip", "-Zdead_strip" }, \
117*404b540aSrobert   { "-no_dead_strip_inits_and_terms", "-Zno_dead_strip_inits_and_terms" }, \
118*404b540aSrobert   { "-dependency-file", "-MF" }, \
119*404b540aSrobert   { "-dylib_file", "-Zdylib_file" }, \
120*404b540aSrobert   { "-dynamic", "-Zdynamic" },  \
121*404b540aSrobert   { "-dynamiclib", "-Zdynamiclib" },  \
122*404b540aSrobert   { "-exported_symbols_list", "-Zexported_symbols_list" },  \
123*404b540aSrobert   { "-gfull", "-g -fno-eliminate-unused-debug-symbols" }, \
124*404b540aSrobert   { "-gused", "-g -feliminate-unused-debug-symbols" }, \
125*404b540aSrobert   { "-segaddr", "-Zsegaddr" }, \
126*404b540aSrobert   { "-segs_read_only_addr", "-Zsegs_read_only_addr" }, \
127*404b540aSrobert   { "-segs_read_write_addr", "-Zsegs_read_write_addr" }, \
128*404b540aSrobert   { "-seg_addr_table", "-Zseg_addr_table" }, \
129*404b540aSrobert   { "-seg_addr_table_filename", "-Zfn_seg_addr_table_filename" }, \
130*404b540aSrobert   { "-fapple-kext", "-fapple-kext -static -Wa,-static" }, \
131*404b540aSrobert   { "-filelist", "-Xlinker -filelist -Xlinker" },  \
132*404b540aSrobert   { "-findirect-virtual-calls", "-fapple-kext" }, \
133*404b540aSrobert   { "-flat_namespace", "-Zflat_namespace" },  \
134*404b540aSrobert   { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" },  \
135*404b540aSrobert   { "-force_flat_namespace", "-Zforce_flat_namespace" },  \
136*404b540aSrobert   { "-framework", "-Xlinker -framework -Xlinker" },  \
137*404b540aSrobert   { "-fterminated-vtables", "-fapple-kext" }, \
138*404b540aSrobert   { "-image_base", "-Zimage_base" },  \
139*404b540aSrobert   { "-init", "-Zinit" },  \
140*404b540aSrobert   { "-install_name", "-Zinstall_name" },  \
141*404b540aSrobert   { "-mkernel", "-mkernel -static -Wa,-static" }, \
142*404b540aSrobert   { "-multiply_defined_unused", "-Zmultiplydefinedunused" },  \
143*404b540aSrobert   { "-multiply_defined", "-Zmultiply_defined" },  \
144*404b540aSrobert   { "-multi_module", "-Zmulti_module" },  \
145*404b540aSrobert   { "-static", "-static -Wa,-static" },  \
146*404b540aSrobert   { "-single_module", "-Zsingle_module" },  \
147*404b540aSrobert   { "-unexported_symbols_list", "-Zunexported_symbols_list" }, \
148*404b540aSrobert   SUBTARGET_OPTION_TRANSLATE_TABLE
149*404b540aSrobert 
150*404b540aSrobert #define SUBSUBTARGET_OVERRIDE_OPTIONS					\
151*404b540aSrobert   do {									\
152*404b540aSrobert     darwin_override_options ();						\
153*404b540aSrobert   } while (0)
154*404b540aSrobert 
155*404b540aSrobert /* These compiler options take n arguments.  */
156*404b540aSrobert 
157*404b540aSrobert #undef  WORD_SWITCH_TAKES_ARG
158*404b540aSrobert #define WORD_SWITCH_TAKES_ARG(STR)              \
159*404b540aSrobert   (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 :    \
160*404b540aSrobert    !strcmp (STR, "Zallowable_client") ? 1 :     \
161*404b540aSrobert    !strcmp (STR, "arch") ? 1 :                  \
162*404b540aSrobert    !strcmp (STR, "arch_only") ? 1 :             \
163*404b540aSrobert    !strcmp (STR, "Zbundle_loader") ? 1 :        \
164*404b540aSrobert    !strcmp (STR, "client_name") ? 1 :           \
165*404b540aSrobert    !strcmp (STR, "compatibility_version") ? 1 : \
166*404b540aSrobert    !strcmp (STR, "current_version") ? 1 :       \
167*404b540aSrobert    !strcmp (STR, "Zdylib_file") ? 1 :           \
168*404b540aSrobert    !strcmp (STR, "Zexported_symbols_list") ? 1 : \
169*404b540aSrobert    !strcmp (STR, "Zimage_base") ? 1 :           \
170*404b540aSrobert    !strcmp (STR, "Zinit") ? 1 :                 \
171*404b540aSrobert    !strcmp (STR, "Zinstall_name") ? 1 :         \
172*404b540aSrobert    !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \
173*404b540aSrobert    !strcmp (STR, "Zmultiply_defined") ? 1 :     \
174*404b540aSrobert    !strcmp (STR, "precomp-trustfile") ? 1 :     \
175*404b540aSrobert    !strcmp (STR, "read_only_relocs") ? 1 :      \
176*404b540aSrobert    !strcmp (STR, "sectcreate") ? 3 :            \
177*404b540aSrobert    !strcmp (STR, "sectorder") ? 3 :             \
178*404b540aSrobert    !strcmp (STR, "Zsegaddr") ? 2 :              \
179*404b540aSrobert    !strcmp (STR, "Zsegs_read_only_addr") ? 1 :  \
180*404b540aSrobert    !strcmp (STR, "Zsegs_read_write_addr") ? 1 : \
181*404b540aSrobert    !strcmp (STR, "Zseg_addr_table") ? 1 :       \
182*404b540aSrobert    !strcmp (STR, "Zfn_seg_addr_table_filename") ? 1 :\
183*404b540aSrobert    !strcmp (STR, "seg1addr") ? 1 :              \
184*404b540aSrobert    !strcmp (STR, "segprot") ? 3 :               \
185*404b540aSrobert    !strcmp (STR, "sub_library") ? 1 :           \
186*404b540aSrobert    !strcmp (STR, "sub_umbrella") ? 1 :          \
187*404b540aSrobert    !strcmp (STR, "umbrella") ? 1 :              \
188*404b540aSrobert    !strcmp (STR, "undefined") ? 1 :             \
189*404b540aSrobert    !strcmp (STR, "Zunexported_symbols_list") ? 1 : \
190*404b540aSrobert    !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \
191*404b540aSrobert    !strcmp (STR, "pagezero_size") ? 1 :         \
192*404b540aSrobert    !strcmp (STR, "segs_read_only_addr") ? 1 :   \
193*404b540aSrobert    !strcmp (STR, "segs_read_write_addr") ? 1 :  \
194*404b540aSrobert    !strcmp (STR, "sectalign") ? 3 :             \
195*404b540aSrobert    !strcmp (STR, "sectobjectsymbols") ? 2 :     \
196*404b540aSrobert    !strcmp (STR, "segcreate") ? 3 :             \
197*404b540aSrobert    !strcmp (STR, "dylinker_install_name") ? 1 : \
198*404b540aSrobert    0)
199*404b540aSrobert 
200*404b540aSrobert #define SUBTARGET_C_COMMON_OVERRIDE_OPTIONS do {                        \
201*404b540aSrobert     if (flag_mkernel || flag_apple_kext)				\
202*404b540aSrobert       {									\
203*404b540aSrobert 	if (flag_use_cxa_atexit == 2)					\
204*404b540aSrobert 	  flag_use_cxa_atexit = 0;					\
205*404b540aSrobert 	/* kexts should always be built without the coalesced sections	\
206*404b540aSrobert 	   because the kernel loader doesn't grok such sections.  */	\
207*404b540aSrobert 	flag_weak = 0;							\
208*404b540aSrobert 	/* No RTTI in kexts.  */					\
209*404b540aSrobert 	flag_rtti = 0;							\
210*404b540aSrobert       }									\
211*404b540aSrobert   } while (0)
212*404b540aSrobert 
213*404b540aSrobert /* Machine dependent cpp options.  Don't add more options here, add
214*404b540aSrobert    them to darwin_cpp_builtins in darwin-c.c.  */
215*404b540aSrobert 
216*404b540aSrobert #undef	CPP_SPEC
217*404b540aSrobert #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}" \
218*404b540aSrobert 	" %{pthread:-D_REENTRANT}"
219*404b540aSrobert 
220*404b540aSrobert /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus
221*404b540aSrobert    precomp, libtool, and fat build additions.  Also we
222*404b540aSrobert    don't specify a second %G after %L because libSystem is
223*404b540aSrobert    self-contained and doesn't need to link against libgcc.a.  */
224*404b540aSrobert /* In general, random Darwin linker flags should go into LINK_SPEC
225*404b540aSrobert    instead of LINK_COMMAND_SPEC.  The command spec is better for
226*404b540aSrobert    specifying the handling of options understood by generic Unix
227*404b540aSrobert    linkers, and for positional arguments like libraries.  */
228*404b540aSrobert #define LINK_COMMAND_SPEC "\
229*404b540aSrobert %{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\
230*404b540aSrobert     %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \
231*404b540aSrobert     %l %X %{d} %{s} %{t} %{Z} \
232*404b540aSrobert     %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \
233*404b540aSrobert     %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \
234*404b540aSrobert     %{!A:%{!nostdlib:%{!nostartfiles:%S}}} \
235*404b540aSrobert     %{L*} %{fopenmp:%:include(libgomp.spec)%(link_gomp)}   \
236*404b540aSrobert     %(link_libgcc) %o %{fprofile-arcs|fprofile-generate|coverage:-lgcov} \
237*404b540aSrobert     %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %G %L}} \
238*404b540aSrobert     %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} }}}}}}}}"
239*404b540aSrobert 
240*404b540aSrobert #ifdef TARGET_SYSTEM_ROOT
241*404b540aSrobert #define LINK_SYSROOT_SPEC \
242*404b540aSrobert   "%{isysroot*:-syslibroot %*;:-syslibroot " TARGET_SYSTEM_ROOT "}"
243*404b540aSrobert #else
244*404b540aSrobert #define LINK_SYSROOT_SPEC "%{isysroot*:-syslibroot %*}"
245*404b540aSrobert #endif
246*404b540aSrobert 
247*404b540aSrobert /* Please keep the random linker options in alphabetical order (modulo
248*404b540aSrobert    'Z' and 'no' prefixes).  Options that can only go to one of libtool
249*404b540aSrobert    or ld must be listed twice, under both !Zdynamiclib and
250*404b540aSrobert    Zdynamiclib, with one of the cases reporting an error.  */
251*404b540aSrobert /* Note that options taking arguments may appear multiple times on a
252*404b540aSrobert    command line with different arguments each time, so put a * after
253*404b540aSrobert    their names so all of them get passed.  */
254*404b540aSrobert #define LINK_SPEC  \
255*404b540aSrobert   "%{static}%{!static:-dynamic} \
256*404b540aSrobert    %{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)}\
257*404b540aSrobert    %{!Zdynamiclib: \
258*404b540aSrobert      %{Zforce_cpusubtype_ALL:-arch %(darwin_arch) -force_cpusubtype_ALL} \
259*404b540aSrobert      %{!Zforce_cpusubtype_ALL:-arch %(darwin_subarch)} \
260*404b540aSrobert      %{Zbundle:-bundle} \
261*404b540aSrobert      %{Zbundle_loader*:-bundle_loader %*} \
262*404b540aSrobert      %{client_name*} \
263*404b540aSrobert      %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\
264*404b540aSrobert } \
265*404b540aSrobert      %{current_version*:%e-current_version only allowed with -dynamiclib} \
266*404b540aSrobert      %{Zforce_flat_namespace:-force_flat_namespace} \
267*404b540aSrobert      %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \
268*404b540aSrobert      %{keep_private_externs} \
269*404b540aSrobert      %{private_bundle} \
270*404b540aSrobert     } \
271*404b540aSrobert    %{Zdynamiclib: \
272*404b540aSrobert      %{Zbundle:%e-bundle not allowed with -dynamiclib} \
273*404b540aSrobert      %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \
274*404b540aSrobert      %{client_name*:%e-client_name not allowed with -dynamiclib} \
275*404b540aSrobert      %{compatibility_version*} \
276*404b540aSrobert      %{current_version*} \
277*404b540aSrobert      %{Zforce_cpusubtype_ALL:-arch_only %(darwin_arch)} \
278*404b540aSrobert      %{!Zforce_cpusubtype_ALL: -arch_only %(darwin_subarch)} \
279*404b540aSrobert      %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \
280*404b540aSrobert      %{Zinstall_name*:-install_name %*} \
281*404b540aSrobert      %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \
282*404b540aSrobert      %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \
283*404b540aSrobert     } \
284*404b540aSrobert    %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \
285*404b540aSrobert    %{Zallowable_client*:-allowable_client %*} \
286*404b540aSrobert    %{Zbind_at_load:-bind_at_load} \
287*404b540aSrobert    %{Zarch_errors_fatal:-arch_errors_fatal} \
288*404b540aSrobert    %{Zdead_strip:-dead_strip} \
289*404b540aSrobert    %{Zno_dead_strip_inits_and_terms:-no_dead_strip_inits_and_terms} \
290*404b540aSrobert    %{Zdylib_file*:-dylib_file %*} \
291*404b540aSrobert    %{Zdynamic:-dynamic}\
292*404b540aSrobert    %{Zexported_symbols_list*:-exported_symbols_list %*} \
293*404b540aSrobert    %{Zflat_namespace:-flat_namespace} \
294*404b540aSrobert    %{headerpad_max_install_names*} \
295*404b540aSrobert    %{Zimage_base*:-image_base %*} \
296*404b540aSrobert    %{Zinit*:-init %*} \
297*404b540aSrobert    %{mmacosx-version-min=*:-macosx_version_min %*} \
298*404b540aSrobert    %{!mmacosx-version-min=*:%{shared-libgcc:-macosx_version_min 10.3}} \
299*404b540aSrobert    %{nomultidefs} \
300*404b540aSrobert    %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \
301*404b540aSrobert    %{Zmultiply_defined*:-multiply_defined %*} \
302*404b540aSrobert    %{!Zmultiply_defined*:%{shared-libgcc: \
303*404b540aSrobert      %:version-compare(< 10.5 mmacosx-version-min= -multiply_defined) \
304*404b540aSrobert      %:version-compare(< 10.5 mmacosx-version-min= suppress)}} \
305*404b540aSrobert    %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \
306*404b540aSrobert    %{prebind} %{noprebind} %{nofixprebinding} %{prebind_all_twolevel_modules} \
307*404b540aSrobert    %{read_only_relocs} \
308*404b540aSrobert    %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} \
309*404b540aSrobert    %{Zsegaddr*:-segaddr %*} \
310*404b540aSrobert    %{Zsegs_read_only_addr*:-segs_read_only_addr %*} \
311*404b540aSrobert    %{Zsegs_read_write_addr*:-segs_read_write_addr %*} \
312*404b540aSrobert    %{Zseg_addr_table*: -seg_addr_table %*} \
313*404b540aSrobert    %{Zfn_seg_addr_table_filename*:-seg_addr_table_filename %*} \
314*404b540aSrobert    %{sub_library*} %{sub_umbrella*} \
315*404b540aSrobert    " LINK_SYSROOT_SPEC " \
316*404b540aSrobert    %{twolevel_namespace} %{twolevel_namespace_hints} \
317*404b540aSrobert    %{umbrella*} \
318*404b540aSrobert    %{undefined*} \
319*404b540aSrobert    %{Zunexported_symbols_list*:-unexported_symbols_list %*} \
320*404b540aSrobert    %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \
321*404b540aSrobert    %{!Zweak_reference_mismatches*:-weak_reference_mismatches non-weak} \
322*404b540aSrobert    %{X} \
323*404b540aSrobert    %{y*} \
324*404b540aSrobert    %{w} \
325*404b540aSrobert    %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit}  \
326*404b540aSrobert    %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \
327*404b540aSrobert    %{whatsloaded} %{dylinker_install_name*} \
328*404b540aSrobert    %{dylinker} %{Mach} "
329*404b540aSrobert 
330*404b540aSrobert 
331*404b540aSrobert /* Machine dependent libraries.  */
332*404b540aSrobert 
333*404b540aSrobert #define LIB_SPEC "%{!static:-lSystem}"
334*404b540aSrobert 
335*404b540aSrobert /* Support -mmacosx-version-min by supplying different (stub) libgcc_s.dylib
336*404b540aSrobert    libraries to link against, and by not linking against libgcc_s on
337*404b540aSrobert    earlier-than-10.3.9.
338*404b540aSrobert 
339*404b540aSrobert    Note that by default, -lgcc_eh is not linked against!  This is
340*404b540aSrobert    because in a future version of Darwin the EH frame information may
341*404b540aSrobert    be in a new format, or the fallback routine might be changed; if
342*404b540aSrobert    you want to explicitly link against the static version of those
343*404b540aSrobert    routines, because you know you don't need to unwind through system
344*404b540aSrobert    libraries, you need to explicitly say -static-libgcc.
345*404b540aSrobert 
346*404b540aSrobert    If it is linked against, it has to be before -lgcc, because it may
347*404b540aSrobert    need symbols from -lgcc.  */
348*404b540aSrobert #undef REAL_LIBGCC_SPEC
349*404b540aSrobert #define REAL_LIBGCC_SPEC						   \
350*404b540aSrobert    "%{static-libgcc|static: -lgcc_eh -lgcc;				   \
351*404b540aSrobert       shared-libgcc|fexceptions|fgnu-runtime:				   \
352*404b540aSrobert        %:version-compare(!> 10.5 mmacosx-version-min= -lgcc_s.10.4)	   \
353*404b540aSrobert        %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_s.10.5)	   \
354*404b540aSrobert        -lgcc;								   \
355*404b540aSrobert       :%:version-compare(>< 10.3.9 10.5 mmacosx-version-min= -lgcc_s.10.4) \
356*404b540aSrobert        %:version-compare(>= 10.5 mmacosx-version-min= -lgcc_s.10.5)	   \
357*404b540aSrobert        -lgcc}"
358*404b540aSrobert 
359*404b540aSrobert /* We specify crt0.o as -lcrt0.o so that ld will search the library path.
360*404b540aSrobert 
361*404b540aSrobert    crt3.o provides __cxa_atexit on systems that don't have it.  Since
362*404b540aSrobert    it's only used with C++, which requires passing -shared-libgcc, key
363*404b540aSrobert    off that to avoid unnecessarily adding a destructor to every
364*404b540aSrobert    powerpc program built.  */
365*404b540aSrobert 
366*404b540aSrobert #undef  STARTFILE_SPEC
367*404b540aSrobert #define STARTFILE_SPEC							    \
368*404b540aSrobert   "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}}			    \
369*404b540aSrobert      %{!Zbundle:%{pg:%{static:-lgcrt0.o}				    \
370*404b540aSrobert                      %{!static:%{object:-lgcrt0.o}			    \
371*404b540aSrobert                                %{!object:%{preload:-lgcrt0.o}		    \
372*404b540aSrobert                                  %{!preload:-lgcrt1.o %(darwin_crt2)}}}}    \
373*404b540aSrobert                 %{!pg:%{static:-lcrt0.o}				    \
374*404b540aSrobert                       %{!static:%{object:-lcrt0.o}			    \
375*404b540aSrobert                                 %{!object:%{preload:-lcrt0.o}		    \
376*404b540aSrobert                                   %{!preload:-lcrt1.o %(darwin_crt2)}}}}}}  \
377*404b540aSrobert   %{shared-libgcc:%:version-compare(< 10.5 mmacosx-version-min= crt3.o%s)}"
378*404b540aSrobert 
379*404b540aSrobert /* The native Darwin linker doesn't necessarily place files in the order
380*404b540aSrobert    that they're specified on the link line.  Thus, it is pointless
381*404b540aSrobert    to put anything in ENDFILE_SPEC.  */
382*404b540aSrobert /* #define ENDFILE_SPEC "" */
383*404b540aSrobert 
384*404b540aSrobert /* Default Darwin ASM_SPEC, very simple.  */
385*404b540aSrobert #define ASM_SPEC "-arch %(darwin_arch) \
386*404b540aSrobert   %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL}"
387*404b540aSrobert 
388*404b540aSrobert /* We use Dbx symbol format.  */
389*404b540aSrobert 
390*404b540aSrobert #define DBX_DEBUGGING_INFO 1
391*404b540aSrobert 
392*404b540aSrobert /* Also enable Dwarf 2 as an option.  */
393*404b540aSrobert #define DWARF2_DEBUGGING_INFO
394*404b540aSrobert #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
395*404b540aSrobert 
396*404b540aSrobert #define DEBUG_FRAME_SECTION	"__DWARF,__debug_frame,regular,debug"
397*404b540aSrobert #define DEBUG_INFO_SECTION	"__DWARF,__debug_info,regular,debug"
398*404b540aSrobert #define DEBUG_ABBREV_SECTION	"__DWARF,__debug_abbrev,regular,debug"
399*404b540aSrobert #define DEBUG_ARANGES_SECTION	"__DWARF,__debug_aranges,regular,debug"
400*404b540aSrobert #define DEBUG_MACINFO_SECTION	"__DWARF,__debug_macinfo,regular,debug"
401*404b540aSrobert #define DEBUG_LINE_SECTION	"__DWARF,__debug_line,regular,debug"
402*404b540aSrobert #define DEBUG_LOC_SECTION	"__DWARF,__debug_loc,regular,debug"
403*404b540aSrobert #define DEBUG_PUBNAMES_SECTION	"__DWARF,__debug_pubnames,regular,debug"
404*404b540aSrobert #define DEBUG_STR_SECTION	"__DWARF,__debug_str,regular,debug"
405*404b540aSrobert #define DEBUG_RANGES_SECTION	"__DWARF,__debug_ranges,regular,debug"
406*404b540aSrobert 
407*404b540aSrobert /* When generating stabs debugging, use N_BINCL entries.  */
408*404b540aSrobert 
409*404b540aSrobert #define DBX_USE_BINCL
410*404b540aSrobert 
411*404b540aSrobert /* There is no limit to the length of stabs strings.  */
412*404b540aSrobert 
413*404b540aSrobert #define DBX_CONTIN_LENGTH 0
414*404b540aSrobert 
415*404b540aSrobert /* gdb needs a null N_SO at the end of each file for scattered loading.  */
416*404b540aSrobert 
417*404b540aSrobert #define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
418*404b540aSrobert 
419*404b540aSrobert /* GCC's definition of 'one_only' is the same as its definition of 'weak'.  */
420*404b540aSrobert #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
421*404b540aSrobert 
422*404b540aSrobert /* Mach-O supports 'weak imports', and 'weak definitions' in coalesced
423*404b540aSrobert    sections.  machopic_select_section ensures that weak variables go in
424*404b540aSrobert    coalesced sections.  Weak aliases (or any other kind of aliases) are
425*404b540aSrobert    not supported.  Weak symbols that aren't visible outside the .s file
426*404b540aSrobert    are not supported.  */
427*404b540aSrobert #define ASM_WEAKEN_DECL(FILE, DECL, NAME, ALIAS)			\
428*404b540aSrobert   do {									\
429*404b540aSrobert     if (ALIAS)								\
430*404b540aSrobert       {									\
431*404b540aSrobert 	warning (0, "alias definitions not supported in Mach-O; ignored");	\
432*404b540aSrobert 	break;								\
433*404b540aSrobert       }									\
434*404b540aSrobert  									\
435*404b540aSrobert     if (! DECL_EXTERNAL (DECL) && TREE_PUBLIC (DECL))			\
436*404b540aSrobert       targetm.asm_out.globalize_label (FILE, NAME);			\
437*404b540aSrobert     if (DECL_EXTERNAL (DECL))						\
438*404b540aSrobert       fputs ("\t.weak_reference ", FILE);				\
439*404b540aSrobert     else if (! lookup_attribute ("weak", DECL_ATTRIBUTES (DECL))	\
440*404b540aSrobert 	&& lookup_attribute ("weak_import", DECL_ATTRIBUTES (DECL)))	\
441*404b540aSrobert       break;								\
442*404b540aSrobert     else if (TREE_PUBLIC (DECL))					\
443*404b540aSrobert       fputs ("\t.weak_definition ", FILE);				\
444*404b540aSrobert     else								\
445*404b540aSrobert       break;								\
446*404b540aSrobert     assemble_name (FILE, NAME);						\
447*404b540aSrobert     fputc ('\n', FILE);							\
448*404b540aSrobert   } while (0)
449*404b540aSrobert 
450*404b540aSrobert /* Darwin has the pthread routines in libSystem, which every program
451*404b540aSrobert    links to, so there's no need for weak-ness for that.  */
452*404b540aSrobert #define GTHREAD_USE_WEAK 0
453*404b540aSrobert 
454*404b540aSrobert /* The Darwin linker imposes two limitations on common symbols: they
455*404b540aSrobert    can't have hidden visibility, and they can't appear in dylibs.  As
456*404b540aSrobert    a consequence, we should never use common symbols to represent
457*404b540aSrobert    vague linkage. */
458*404b540aSrobert #undef USE_COMMON_FOR_ONE_ONLY
459*404b540aSrobert #define USE_COMMON_FOR_ONE_ONLY 0
460*404b540aSrobert 
461*404b540aSrobert /* The Darwin linker doesn't want coalesced symbols to appear in
462*404b540aSrobert    a static archive's table of contents. */
463*404b540aSrobert #undef TARGET_WEAK_NOT_IN_ARCHIVE_TOC
464*404b540aSrobert #define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 1
465*404b540aSrobert 
466*404b540aSrobert /* On Darwin, we don't (at the time of writing) have linkonce sections
467*404b540aSrobert    with names, so it's safe to make the class data not comdat.  */
468*404b540aSrobert #define TARGET_CXX_CLASS_DATA_ALWAYS_COMDAT hook_bool_void_false
469*404b540aSrobert 
470*404b540aSrobert /* We make exception information linkonce. */
471*404b540aSrobert #undef TARGET_USES_WEAK_UNWIND_INFO
472*404b540aSrobert #define TARGET_USES_WEAK_UNWIND_INFO 1
473*404b540aSrobert 
474*404b540aSrobert /* We need to use a nonlocal label for the start of an EH frame: the
475*404b540aSrobert    Darwin linker requires that a coalesced section start with a label.
476*404b540aSrobert    Unfortunately, it also requires that 'debug' sections don't contain
477*404b540aSrobert    labels.  */
478*404b540aSrobert #undef FRAME_BEGIN_LABEL
479*404b540aSrobert #define FRAME_BEGIN_LABEL (for_eh ? "EH_frame" : "Lframe")
480*404b540aSrobert 
481*404b540aSrobert /* Emit a label for the FDE corresponding to DECL.  EMPTY means
482*404b540aSrobert    emit a label for an empty FDE. */
483*404b540aSrobert #define TARGET_ASM_EMIT_UNWIND_LABEL darwin_emit_unwind_label
484*404b540aSrobert 
485*404b540aSrobert /* Emit a label to separate the exception table.  */
486*404b540aSrobert #define TARGET_ASM_EMIT_EXCEPT_TABLE_LABEL darwin_emit_except_table_label
487*404b540aSrobert 
488*404b540aSrobert /* Our profiling scheme doesn't LP labels and counter words.  */
489*404b540aSrobert 
490*404b540aSrobert #define NO_PROFILE_COUNTERS	1
491*404b540aSrobert 
492*404b540aSrobert #undef	INIT_SECTION_ASM_OP
493*404b540aSrobert #define INIT_SECTION_ASM_OP
494*404b540aSrobert 
495*404b540aSrobert #undef	INVOKE__main
496*404b540aSrobert 
497*404b540aSrobert #define TARGET_ASM_CONSTRUCTOR  machopic_asm_out_constructor
498*404b540aSrobert #define TARGET_ASM_DESTRUCTOR   machopic_asm_out_destructor
499*404b540aSrobert 
500*404b540aSrobert /* Always prefix with an underscore.  */
501*404b540aSrobert 
502*404b540aSrobert #define USER_LABEL_PREFIX "_"
503*404b540aSrobert 
504*404b540aSrobert /* Don't output a .file directive.  That is only used by the assembler for
505*404b540aSrobert    error reporting.  */
506*404b540aSrobert #undef	TARGET_ASM_FILE_START_FILE_DIRECTIVE
507*404b540aSrobert #define TARGET_ASM_FILE_START_FILE_DIRECTIVE false
508*404b540aSrobert 
509*404b540aSrobert #undef  TARGET_ASM_FILE_END
510*404b540aSrobert #define TARGET_ASM_FILE_END darwin_file_end
511*404b540aSrobert 
512*404b540aSrobert #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
513*404b540aSrobert   fprintf (FILE, "\t.space "HOST_WIDE_INT_PRINT_UNSIGNED"\n", SIZE)
514*404b540aSrobert 
515*404b540aSrobert /* Give ObjC methods pretty symbol names.  */
516*404b540aSrobert 
517*404b540aSrobert #undef	OBJC_GEN_METHOD_LABEL
518*404b540aSrobert #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
519*404b540aSrobert   do { if (CAT_NAME)							\
520*404b540aSrobert 	 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',		\
521*404b540aSrobert 		  (CLASS_NAME), (CAT_NAME), (SEL_NAME));		\
522*404b540aSrobert        else								\
523*404b540aSrobert 	 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',		\
524*404b540aSrobert 		  (CLASS_NAME), (SEL_NAME));				\
525*404b540aSrobert      } while (0)
526*404b540aSrobert 
527*404b540aSrobert /* The RTTI data (e.g., __ti4name) is common and public (and static),
528*404b540aSrobert    but it does need to be referenced via indirect PIC data pointers.
529*404b540aSrobert    The machopic_define_symbol calls are telling the machopic subsystem
530*404b540aSrobert    that the name *is* defined in this module, so it doesn't need to
531*404b540aSrobert    make them indirect.  */
532*404b540aSrobert 
533*404b540aSrobert #undef ASM_DECLARE_OBJECT_NAME
534*404b540aSrobert #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
535*404b540aSrobert   do {									\
536*404b540aSrobert     const char *xname = NAME;						\
537*404b540aSrobert     if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF)		\
538*404b540aSrobert       xname = IDENTIFIER_POINTER (DECL_NAME (DECL));			\
539*404b540aSrobert     if (! DECL_WEAK (DECL)						\
540*404b540aSrobert         && ((TREE_STATIC (DECL)						\
541*404b540aSrobert 	     && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
542*404b540aSrobert             || DECL_INITIAL (DECL)))					\
543*404b540aSrobert         machopic_define_symbol (DECL_RTL (DECL));			\
544*404b540aSrobert     if ((TREE_STATIC (DECL)						\
545*404b540aSrobert 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
546*404b540aSrobert         || DECL_INITIAL (DECL))						\
547*404b540aSrobert       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);	\
548*404b540aSrobert     ASM_OUTPUT_LABEL (FILE, xname);					\
549*404b540aSrobert     /* Darwin doesn't support zero-size objects, so give them a		\
550*404b540aSrobert        byte.  */							\
551*404b540aSrobert     if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0)			\
552*404b540aSrobert       assemble_zeros (1);						\
553*404b540aSrobert   } while (0)
554*404b540aSrobert 
555*404b540aSrobert #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
556*404b540aSrobert   do {									\
557*404b540aSrobert     const char *xname = NAME;						\
558*404b540aSrobert     if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF)		\
559*404b540aSrobert       xname = IDENTIFIER_POINTER (DECL_NAME (DECL));			\
560*404b540aSrobert     if (! DECL_WEAK (DECL)						\
561*404b540aSrobert         && ((TREE_STATIC (DECL)						\
562*404b540aSrobert 	     && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
563*404b540aSrobert             || DECL_INITIAL (DECL)))					\
564*404b540aSrobert         machopic_define_symbol (DECL_RTL (DECL));			\
565*404b540aSrobert     if ((TREE_STATIC (DECL)						\
566*404b540aSrobert 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
567*404b540aSrobert         || DECL_INITIAL (DECL))						\
568*404b540aSrobert       (* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);	\
569*404b540aSrobert     ASM_OUTPUT_LABEL (FILE, xname);					\
570*404b540aSrobert   } while (0)
571*404b540aSrobert 
572*404b540aSrobert #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE)	\
573*404b540aSrobert   do {								\
574*404b540aSrobert     ASM_OUTPUT_LABEL (FILE, NAME);				\
575*404b540aSrobert     /* Darwin doesn't support zero-size objects, so give them a	\
576*404b540aSrobert        byte.  */						\
577*404b540aSrobert     if ((SIZE) == 0)						\
578*404b540aSrobert       assemble_zeros (1);					\
579*404b540aSrobert   } while (0)
580*404b540aSrobert 
581*404b540aSrobert /* Wrap new method names in quotes so the assembler doesn't gag.
582*404b540aSrobert    Make Objective-C internal symbols local.  */
583*404b540aSrobert 
584*404b540aSrobert #undef	ASM_OUTPUT_LABELREF
585*404b540aSrobert #define ASM_OUTPUT_LABELREF(FILE,NAME)					     \
586*404b540aSrobert   do {									     \
587*404b540aSrobert        const char *xname = (NAME);					     \
588*404b540aSrobert        if (! strcmp (xname, "<pic base>"))				     \
589*404b540aSrobert          machopic_output_function_base_name(FILE);                           \
590*404b540aSrobert        else if (xname[0] == '&' || xname[0] == '*')			     \
591*404b540aSrobert          {								     \
592*404b540aSrobert            int len = strlen (xname);					     \
593*404b540aSrobert 	   if (len > 6 && !strcmp ("$stub", xname + len - 5))		     \
594*404b540aSrobert 	     machopic_validate_stub_or_non_lazy_ptr (xname);		     \
595*404b540aSrobert 	   else if (len > 7 && !strcmp ("$stub\"", xname + len - 6))	     \
596*404b540aSrobert 	     machopic_validate_stub_or_non_lazy_ptr (xname);		     \
597*404b540aSrobert 	   else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
598*404b540aSrobert 	     machopic_validate_stub_or_non_lazy_ptr (xname);		     \
599*404b540aSrobert 	   else if (len > 15 && !strcmp ("$non_lazy_ptr\"", xname + len - 14)) \
600*404b540aSrobert 	     machopic_validate_stub_or_non_lazy_ptr (xname);		     \
601*404b540aSrobert 	   if (xname[1] != '"' && name_needs_quotes (&xname[1]))	     \
602*404b540aSrobert 	     fprintf (FILE, "\"%s\"", &xname[1]);			     \
603*404b540aSrobert 	   else								     \
604*404b540aSrobert 	     fputs (&xname[1], FILE); 					     \
605*404b540aSrobert 	 }								     \
606*404b540aSrobert        else if (xname[0] == '+' || xname[0] == '-')			     \
607*404b540aSrobert          fprintf (FILE, "\"%s\"", xname);				     \
608*404b540aSrobert        else if (!strncmp (xname, "_OBJC_", 6))				     \
609*404b540aSrobert          fprintf (FILE, "L%s", xname);					     \
610*404b540aSrobert        else if (!strncmp (xname, ".objc_class_name_", 17))		     \
611*404b540aSrobert 	 fprintf (FILE, "%s", xname);					     \
612*404b540aSrobert        else if (xname[0] != '"' && name_needs_quotes (xname))		     \
613*404b540aSrobert 	 fprintf (FILE, "\"%s\"", xname);				     \
614*404b540aSrobert        else								     \
615*404b540aSrobert          asm_fprintf (FILE, "%U%s", xname);				     \
616*404b540aSrobert   } while (0)
617*404b540aSrobert 
618*404b540aSrobert /* Output before executable code.  */
619*404b540aSrobert #undef TEXT_SECTION_ASM_OP
620*404b540aSrobert #define TEXT_SECTION_ASM_OP "\t.text"
621*404b540aSrobert 
622*404b540aSrobert /* Output before writable data.  */
623*404b540aSrobert 
624*404b540aSrobert #undef DATA_SECTION_ASM_OP
625*404b540aSrobert #define DATA_SECTION_ASM_OP "\t.data"
626*404b540aSrobert 
627*404b540aSrobert #undef	ALIGN_ASM_OP
628*404b540aSrobert #define ALIGN_ASM_OP		".align"
629*404b540aSrobert 
630*404b540aSrobert #undef	ASM_OUTPUT_ALIGN
631*404b540aSrobert #define ASM_OUTPUT_ALIGN(FILE,LOG)	\
632*404b540aSrobert   if ((LOG) != 0)			\
633*404b540aSrobert     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
634*404b540aSrobert 
635*404b540aSrobert /* Ensure correct alignment of bss data.  */
636*404b540aSrobert 
637*404b540aSrobert #undef	ASM_OUTPUT_ALIGNED_DECL_LOCAL
638*404b540aSrobert #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	\
639*404b540aSrobert   do {									\
640*404b540aSrobert     unsigned HOST_WIDE_INT _new_size = SIZE;				\
641*404b540aSrobert     fputs (".lcomm ", (FILE));						\
642*404b540aSrobert     assemble_name ((FILE), (NAME));					\
643*404b540aSrobert     if (_new_size == 0) _new_size = 1;					\
644*404b540aSrobert     fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", _new_size,	\
645*404b540aSrobert 	     floor_log2 ((ALIGN) / BITS_PER_UNIT));			\
646*404b540aSrobert     if ((DECL) && ((TREE_STATIC (DECL)					\
647*404b540aSrobert 	 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL)))		\
648*404b540aSrobert         || DECL_INITIAL (DECL)))					\
649*404b540aSrobert       {									\
650*404b540aSrobert 	(* targetm.encode_section_info) (DECL, DECL_RTL (DECL), false);	\
651*404b540aSrobert 	machopic_define_symbol (DECL_RTL (DECL));			\
652*404b540aSrobert       }									\
653*404b540aSrobert   } while (0)
654*404b540aSrobert 
655*404b540aSrobert /* The maximum alignment which the object file format can support in
656*404b540aSrobert    bits.  For Mach-O, this is 2^15 bytes.  */
657*404b540aSrobert 
658*404b540aSrobert #undef	MAX_OFILE_ALIGNMENT
659*404b540aSrobert #define MAX_OFILE_ALIGNMENT (0x8000 * 8)
660*404b540aSrobert 
661*404b540aSrobert /* Declare the section variables.  */
662*404b540aSrobert #ifndef USED_FOR_TARGET
663*404b540aSrobert enum darwin_section_enum {
664*404b540aSrobert #define DEF_SECTION(NAME, FLAGS, DIRECTIVE, OBJC) NAME,
665*404b540aSrobert #include "darwin-sections.def"
666*404b540aSrobert #undef DEF_SECTION
667*404b540aSrobert   NUM_DARWIN_SECTIONS
668*404b540aSrobert };
669*404b540aSrobert extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS];
670*404b540aSrobert #endif
671*404b540aSrobert 
672*404b540aSrobert #undef	TARGET_ASM_SELECT_SECTION
673*404b540aSrobert #define TARGET_ASM_SELECT_SECTION machopic_select_section
674*404b540aSrobert #define USE_SELECT_SECTION_FOR_FUNCTIONS
675*404b540aSrobert 
676*404b540aSrobert #undef	TARGET_ASM_SELECT_RTX_SECTION
677*404b540aSrobert #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
678*404b540aSrobert #undef  TARGET_ASM_UNIQUE_SECTION
679*404b540aSrobert #define TARGET_ASM_UNIQUE_SECTION darwin_unique_section
680*404b540aSrobert #undef  TARGET_ASM_FUNCTION_RODATA_SECTION
681*404b540aSrobert #define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
682*404b540aSrobert #undef  TARGET_ASM_RELOC_RW_MASK
683*404b540aSrobert #define TARGET_ASM_RELOC_RW_MASK machopic_reloc_rw_mask
684*404b540aSrobert 
685*404b540aSrobert 
686*404b540aSrobert #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME)			\
687*404b540aSrobert     do {								\
688*404b540aSrobert 	 if (FILE) {							\
689*404b540aSrobert 	   if (MACHOPIC_INDIRECT)					\
690*404b540aSrobert 	     fprintf (FILE, "\t.lazy_reference ");			\
691*404b540aSrobert 	   else								\
692*404b540aSrobert 	     fprintf (FILE, "\t.reference ");				\
693*404b540aSrobert 	   assemble_name (FILE, NAME);					\
694*404b540aSrobert 	   fprintf (FILE, "\n");					\
695*404b540aSrobert 	 }                                                              \
696*404b540aSrobert        } while (0)
697*404b540aSrobert 
698*404b540aSrobert #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME)				\
699*404b540aSrobert     do {								\
700*404b540aSrobert 	 if (FILE) {							\
701*404b540aSrobert 	   fprintf (FILE, "\t");					\
702*404b540aSrobert 	   assemble_name (FILE, NAME);					\
703*404b540aSrobert 	   fprintf (FILE, "=0\n");					\
704*404b540aSrobert 	   (*targetm.asm_out.globalize_label) (FILE, NAME);		\
705*404b540aSrobert 	 }								\
706*404b540aSrobert        } while (0)
707*404b540aSrobert 
708*404b540aSrobert /* Globalizing directive for a label.  */
709*404b540aSrobert #define GLOBAL_ASM_OP ".globl "
710*404b540aSrobert #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label
711*404b540aSrobert 
712*404b540aSrobert /* Emit an assembler directive to set visibility for a symbol.  Used
713*404b540aSrobert    to support visibility attribute and Darwin's private extern
714*404b540aSrobert    feature.  */
715*404b540aSrobert #undef TARGET_ASM_ASSEMBLE_VISIBILITY
716*404b540aSrobert #define TARGET_ASM_ASSEMBLE_VISIBILITY darwin_assemble_visibility
717*404b540aSrobert 
718*404b540aSrobert /* Extra attributes for Darwin.  */
719*404b540aSrobert #define SUBTARGET_ATTRIBUTE_TABLE					     \
720*404b540aSrobert   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \
721*404b540aSrobert   { "apple_kext_compatibility", 0, 0, false, true, false,		     \
722*404b540aSrobert     darwin_handle_kext_attribute },					     \
723*404b540aSrobert   { "weak_import", 0, 0, true, false, false,				     \
724*404b540aSrobert     darwin_handle_weak_import_attribute }
725*404b540aSrobert 
726*404b540aSrobert #undef ASM_GENERATE_INTERNAL_LABEL
727*404b540aSrobert #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)	\
728*404b540aSrobert   sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
729*404b540aSrobert 
730*404b540aSrobert #undef TARGET_ASM_MARK_DECL_PRESERVED
731*404b540aSrobert #define TARGET_ASM_MARK_DECL_PRESERVED darwin_mark_decl_preserved
732*404b540aSrobert 
733*404b540aSrobert /* Set on a symbol with SYMBOL_FLAG_FUNCTION or
734*404b540aSrobert    MACHO_SYMBOL_FLAG_VARIABLE to indicate that the function or
735*404b540aSrobert    variable has been defined in this translation unit.
736*404b540aSrobert    When porting Mach-O to new architectures you need to make
737*404b540aSrobert    sure these aren't clobbered by the backend.  */
738*404b540aSrobert 
739*404b540aSrobert #define MACHO_SYMBOL_FLAG_VARIABLE (SYMBOL_FLAG_MACH_DEP)
740*404b540aSrobert #define MACHO_SYMBOL_FLAG_DEFINED ((SYMBOL_FLAG_MACH_DEP) << 1)
741*404b540aSrobert 
742*404b540aSrobert /* Set on a symbol to indicate when fix-and-continue style code
743*404b540aSrobert    generation is being used and the symbol refers to a static symbol
744*404b540aSrobert    that should be rebound from new instances of a translation unit to
745*404b540aSrobert    the original instance of the data.  */
746*404b540aSrobert 
747*404b540aSrobert #define MACHO_SYMBOL_STATIC ((SYMBOL_FLAG_MACH_DEP) << 2)
748*404b540aSrobert 
749*404b540aSrobert /* Symbolic names for various things we might know about a symbol.  */
750*404b540aSrobert 
751*404b540aSrobert enum machopic_addr_class {
752*404b540aSrobert   MACHOPIC_UNDEFINED,
753*404b540aSrobert   MACHOPIC_DEFINED_DATA,
754*404b540aSrobert   MACHOPIC_UNDEFINED_DATA,
755*404b540aSrobert   MACHOPIC_DEFINED_FUNCTION,
756*404b540aSrobert   MACHOPIC_UNDEFINED_FUNCTION
757*404b540aSrobert };
758*404b540aSrobert 
759*404b540aSrobert /* Macros defining the various PIC cases.  */
760*404b540aSrobert 
761*404b540aSrobert #define MACHO_DYNAMIC_NO_PIC_P	(TARGET_DYNAMIC_NO_PIC)
762*404b540aSrobert #define MACHOPIC_INDIRECT	(flag_pic || MACHO_DYNAMIC_NO_PIC_P)
763*404b540aSrobert #define MACHOPIC_JUST_INDIRECT	(MACHO_DYNAMIC_NO_PIC_P)
764*404b540aSrobert #define MACHOPIC_PURE		(flag_pic && ! MACHO_DYNAMIC_NO_PIC_P)
765*404b540aSrobert 
766*404b540aSrobert #undef TARGET_ENCODE_SECTION_INFO
767*404b540aSrobert #define TARGET_ENCODE_SECTION_INFO  darwin_encode_section_info
768*404b540aSrobert #undef TARGET_STRIP_NAME_ENCODING
769*404b540aSrobert #define TARGET_STRIP_NAME_ENCODING  default_strip_name_encoding
770*404b540aSrobert 
771*404b540aSrobert #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH)		\
772*404b540aSrobert   do {								\
773*404b540aSrobert     const char *const stub_ = (STUB);				\
774*404b540aSrobert     char *buffer_ = (BUF);					\
775*404b540aSrobert     strcpy (buffer_, stub_);					\
776*404b540aSrobert     if (stub_[0] == '"')					\
777*404b540aSrobert       {								\
778*404b540aSrobert 	strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\"");	\
779*404b540aSrobert       }								\
780*404b540aSrobert     else							\
781*404b540aSrobert       {								\
782*404b540aSrobert 	strcpy (buffer_ + (STUB_LENGTH), "_binder");		\
783*404b540aSrobert       }								\
784*404b540aSrobert   } while (0)
785*404b540aSrobert 
786*404b540aSrobert #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)	\
787*404b540aSrobert   do {								\
788*404b540aSrobert     const char *const symbol_ = (SYMBOL);			\
789*404b540aSrobert     char *buffer_ = (BUF);					\
790*404b540aSrobert     if (name_needs_quotes (symbol_) && symbol_[0] != '"')	\
791*404b540aSrobert       {								\
792*404b540aSrobert 	  sprintf (buffer_, "\"%s\"", symbol_);			\
793*404b540aSrobert       }								\
794*404b540aSrobert     else							\
795*404b540aSrobert       {								\
796*404b540aSrobert 	strcpy (buffer_, symbol_);				\
797*404b540aSrobert       }								\
798*404b540aSrobert   } while (0)
799*404b540aSrobert 
800*404b540aSrobert /* Given a symbol name string, create the lazy pointer version
801*404b540aSrobert    of the symbol name.  */
802*404b540aSrobert 
803*404b540aSrobert #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH)	\
804*404b540aSrobert   do {								\
805*404b540aSrobert     const char *symbol_ = (SYMBOL);                             \
806*404b540aSrobert     char *buffer_ = (BUF);					\
807*404b540aSrobert     if (symbol_[0] == '"')					\
808*404b540aSrobert       {								\
809*404b540aSrobert         strcpy (buffer_, "\"L");				\
810*404b540aSrobert         strcpy (buffer_ + 2, symbol_ + 1);			\
811*404b540aSrobert 	strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\"");	\
812*404b540aSrobert       }								\
813*404b540aSrobert     else if (name_needs_quotes (symbol_))			\
814*404b540aSrobert       {								\
815*404b540aSrobert         strcpy (buffer_, "\"L");				\
816*404b540aSrobert         strcpy (buffer_ + 2, symbol_);				\
817*404b540aSrobert 	strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\"");	\
818*404b540aSrobert       }								\
819*404b540aSrobert     else							\
820*404b540aSrobert       {								\
821*404b540aSrobert         strcpy (buffer_, "L");					\
822*404b540aSrobert         strcpy (buffer_ + 1, symbol_);				\
823*404b540aSrobert 	strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr");	\
824*404b540aSrobert       }								\
825*404b540aSrobert   } while (0)
826*404b540aSrobert 
827*404b540aSrobert #define EH_FRAME_SECTION_NAME   "__TEXT"
828*404b540aSrobert #define EH_FRAME_SECTION_ATTR ",coalesced,no_toc+strip_static_syms+live_support"
829*404b540aSrobert 
830*404b540aSrobert /* Java runtime class list.  */
831*404b540aSrobert #define JCR_SECTION_NAME "__DATA,jcr,regular,no_dead_strip"
832*404b540aSrobert 
833*404b540aSrobert #undef ASM_PREFERRED_EH_DATA_FORMAT
834*404b540aSrobert #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)  \
835*404b540aSrobert   (((CODE) == 2 && (GLOBAL) == 1) \
836*404b540aSrobert    ? (DW_EH_PE_pcrel | DW_EH_PE_indirect | DW_EH_PE_sdata4) : \
837*404b540aSrobert      ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr)
838*404b540aSrobert 
839*404b540aSrobert #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2)  \
840*404b540aSrobert   darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2)
841*404b540aSrobert 
842*404b540aSrobert #define ASM_OUTPUT_DWARF_OFFSET(FILE,SIZE,LABEL,BASE)  \
843*404b540aSrobert   darwin_asm_output_dwarf_offset (FILE, SIZE, LABEL, BASE)
844*404b540aSrobert 
845*404b540aSrobert #define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(ASM_OUT_FILE, ENCODING, SIZE, ADDR, DONE)	\
846*404b540aSrobert       if (ENCODING == ASM_PREFERRED_EH_DATA_FORMAT (2, 1)) {				\
847*404b540aSrobert 	darwin_non_lazy_pcrel (ASM_OUT_FILE, ADDR);					\
848*404b540aSrobert 	goto DONE;									\
849*404b540aSrobert       }
850*404b540aSrobert 
851*404b540aSrobert /* Experimentally, putting jump tables in text is faster on SPEC.
852*404b540aSrobert    Also this is needed for correctness for coalesced functions.  */
853*404b540aSrobert 
854*404b540aSrobert #ifndef JUMP_TABLES_IN_TEXT_SECTION
855*404b540aSrobert #define JUMP_TABLES_IN_TEXT_SECTION 1
856*404b540aSrobert #endif
857*404b540aSrobert 
858*404b540aSrobert #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false
859*404b540aSrobert 
860*404b540aSrobert #define TARGET_ASM_INIT_SECTIONS darwin_init_sections
861*404b540aSrobert #undef TARGET_ASM_NAMED_SECTION
862*404b540aSrobert #define TARGET_ASM_NAMED_SECTION darwin_asm_named_section
863*404b540aSrobert 
864*404b540aSrobert /* Handle pragma weak and pragma pack.  */
865*404b540aSrobert #define HANDLE_SYSV_PRAGMA 1
866*404b540aSrobert 
867*404b540aSrobert #define HANDLE_PRAGMA_PACK_PUSH_POP 1
868*404b540aSrobert 
869*404b540aSrobert #define DARWIN_REGISTER_TARGET_PRAGMAS()			\
870*404b540aSrobert   do {								\
871*404b540aSrobert     c_register_pragma (0, "mark", darwin_pragma_ignore);	\
872*404b540aSrobert     c_register_pragma (0, "options", darwin_pragma_options);	\
873*404b540aSrobert     c_register_pragma (0, "segment", darwin_pragma_ignore);	\
874*404b540aSrobert     c_register_pragma (0, "unused", darwin_pragma_unused);	\
875*404b540aSrobert     c_register_pragma (0, "ms_struct", darwin_pragma_ms_struct); \
876*404b540aSrobert   } while (0)
877*404b540aSrobert 
878*404b540aSrobert #undef ASM_APP_ON
879*404b540aSrobert #define ASM_APP_ON ""
880*404b540aSrobert #undef ASM_APP_OFF
881*404b540aSrobert #define ASM_APP_OFF ""
882*404b540aSrobert 
883*404b540aSrobert void darwin_register_frameworks (const char *, const char *, int);
884*404b540aSrobert void darwin_register_objc_includes (const char *, const char *, int);
885*404b540aSrobert #define TARGET_EXTRA_PRE_INCLUDES darwin_register_objc_includes
886*404b540aSrobert #define TARGET_EXTRA_INCLUDES darwin_register_frameworks
887*404b540aSrobert 
888*404b540aSrobert void add_framework_path (char *);
889*404b540aSrobert #define TARGET_OPTF add_framework_path
890*404b540aSrobert 
891*404b540aSrobert #define TARGET_POSIX_IO
892*404b540aSrobert 
893*404b540aSrobert /* All new versions of Darwin have C99 functions.  */
894*404b540aSrobert 
895*404b540aSrobert #define TARGET_C99_FUNCTIONS 1
896*404b540aSrobert 
897*404b540aSrobert #define WINT_TYPE "int"
898*404b540aSrobert 
899*404b540aSrobert /* Every program on darwin links against libSystem which contains the pthread
900*404b540aSrobert    routines, so there's no need to explicitly call out when doing threaded
901*404b540aSrobert    work.  */
902*404b540aSrobert 
903*404b540aSrobert #undef GOMP_SELF_SPECS
904*404b540aSrobert #define GOMP_SELF_SPECS ""
905*404b540aSrobert 
906*404b540aSrobert /* Darwin can't support anchors until we can cope with the adjustments
907*404b540aSrobert    to size that ASM_DECLARE_OBJECT_NAME and ASM_DECLARE_CONSTANT_NAME
908*404b540aSrobert    when outputting members of an anchor block and the linker can be
909*404b540aSrobert    taught to keep them together or we find some other suitable
910*404b540aSrobert    code-gen technique.  */
911*404b540aSrobert 
912*404b540aSrobert #if 0
913*404b540aSrobert #define TARGET_ASM_OUTPUT_ANCHOR darwin_asm_output_anchor
914*404b540aSrobert #else
915*404b540aSrobert #define TARGET_ASM_OUTPUT_ANCHOR NULL
916*404b540aSrobert #endif
917*404b540aSrobert 
918*404b540aSrobert /* Attempt to turn on execute permission for the stack.  This may be
919*404b540aSrobert     used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
920*404b540aSrobert     if the target machine can change execute permissions on a page).
921*404b540aSrobert 
922*404b540aSrobert     There is no way to query the execute permission of the stack, so
923*404b540aSrobert     we always issue the mprotect() call.
924*404b540aSrobert 
925*404b540aSrobert     Unfortunately it is not possible to make this namespace-clean.
926*404b540aSrobert 
927*404b540aSrobert     Also note that no errors should be emitted by this code; it is
928*404b540aSrobert     considered dangerous for library calls to send messages to
929*404b540aSrobert     stdout/stderr.  */
930*404b540aSrobert 
931*404b540aSrobert #define ENABLE_EXECUTE_STACK                                            \
932*404b540aSrobert extern void __enable_execute_stack (void *);                            \
933*404b540aSrobert void                                                                    \
934*404b540aSrobert __enable_execute_stack (void *addr)                                     \
935*404b540aSrobert {                                                                       \
936*404b540aSrobert    extern int mprotect (void *, size_t, int);                           \
937*404b540aSrobert    extern int getpagesize (void);					\
938*404b540aSrobert    static int size;                                                     \
939*404b540aSrobert    static long mask;                                                    \
940*404b540aSrobert                                                                         \
941*404b540aSrobert    char *page, *end;                                                    \
942*404b540aSrobert                                                                         \
943*404b540aSrobert    if (size == 0)                                                       \
944*404b540aSrobert      {                                                                  \
945*404b540aSrobert        size = getpagesize();						\
946*404b540aSrobert        mask = ~((long) size - 1);                                       \
947*404b540aSrobert      }                                                                  \
948*404b540aSrobert                                                                         \
949*404b540aSrobert    page = (char *) (((long) addr) & mask);                              \
950*404b540aSrobert    end  = (char *) ((((long) (addr + (TARGET_64BIT ? 48 : 40))) & mask) + size); \
951*404b540aSrobert                                                                         \
952*404b540aSrobert    /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */                        \
953*404b540aSrobert    (void) mprotect (page, end - page, 7);                               \
954*404b540aSrobert }
955*404b540aSrobert 
956*404b540aSrobert /* For Apple KEXTs, we make the constructors return this to match gcc
957*404b540aSrobert    2.95.  */
958*404b540aSrobert #define TARGET_CXX_CDTOR_RETURNS_THIS (darwin_kextabi_p)
959*404b540aSrobert extern int flag_mkernel;
960*404b540aSrobert extern int flag_apple_kext;
961*404b540aSrobert #define TARGET_KEXTABI flag_apple_kext
962*404b540aSrobert 
963*404b540aSrobert #endif /* CONFIG_DARWIN_H */
964