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