1 /* Target definitions for Darwin (Mac OS X) systems. 2 Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002 3 Free Software Foundation, Inc. 4 Contributed by Apple Computer Inc. 5 6 This file is part of GNU CC. 7 8 GNU CC is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2, or (at your option) 11 any later version. 12 13 GNU CC is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GNU CC; see the file COPYING. If not, write to 20 the Free Software Foundation, 59 Temple Place - Suite 330, 21 Boston, MA 02111-1307, USA. */ 22 23 /* The definitions in this file are common to all processor types 24 running Darwin, which is the kernel for Mac OS X. Darwin is 25 basically a BSD user layer laid over a Mach kernel, then evolved 26 for many years (at NeXT) in parallel with other Unix systems. So 27 while the runtime is a somewhat idiosyncratic Mach-based thing, 28 other definitions look like they would for a BSD variant. */ 29 30 /* Although NeXT ran on many different architectures, as of Jan 2001 31 the only supported Darwin targets are PowerPC and x86. */ 32 33 /* Technically, STANDARD_EXEC_PREFIX should be /usr/libexec/, but in 34 practice this makes it hard to install new compilers elsewhere, so 35 leave it undefined and expect system builders to set configure args 36 correctly. */ 37 38 /* One of Darwin's NeXT legacies is the Mach-O format, which is partly 39 like a.out and partly like COFF, with additional features like 40 multi-architecture binary support. */ 41 42 #define OBJECT_FORMAT_MACHO 43 44 /* Suppress g++ attempt to link in the math library automatically. 45 (Some Darwin versions have a libm, but they seem to cause problems 46 for C++ executables.) */ 47 48 #define MATH_LIBRARY "" 49 50 /* We have atexit. */ 51 52 #define HAVE_ATEXIT 53 54 /* Define an empty body for the function do_global_dtors() in libgcc2.c. */ 55 56 #define DO_GLOBAL_DTORS_BODY 57 58 /* The string value for __SIZE_TYPE__. */ 59 60 #ifndef SIZE_TYPE 61 #define SIZE_TYPE "long unsigned int" 62 #endif 63 64 /* Type used for ptrdiff_t, as a string used in a declaration. */ 65 66 #undef PTRDIFF_TYPE 67 #define PTRDIFF_TYPE "int" 68 69 /* wchar_t is int. */ 70 71 #undef WCHAR_TYPE 72 #define WCHAR_TYPE "int" 73 #undef WCHAR_TYPE_SIZE 74 #define WCHAR_TYPE_SIZE 32 75 76 /* Default to using the NeXT-style runtime, since that's what is 77 pre-installed on Darwin systems. */ 78 79 #define NEXT_OBJC_RUNTIME 80 81 /* Don't default to pcc-struct-return, because gcc is the only compiler, and 82 we want to retain compatibility with older gcc versions. */ 83 84 #undef DEFAULT_PCC_STRUCT_RETURN 85 #define DEFAULT_PCC_STRUCT_RETURN 0 86 87 /* This table intercepts weirdo options whose names would interfere 88 with normal driver conventions, and either translates them into 89 standardly-named options, or adds a 'Z' so that they can get to 90 specs processing without interference. 91 92 Do not expand a linker option to "-Xlinker -<option>", since that 93 forfeits the ability to control via spec strings later. However, 94 as a special exception, do this translation with -filelist, because 95 otherwise the driver will think there are no input files and quit. 96 (The alternative would be to hack the driver to recognize -filelist 97 specially, but it's simpler to use the translation table.) 98 99 Note that an option name with a prefix that matches another option 100 name, that also takes an argument, needs to be modified so the 101 prefix is different, otherwise a '*' after the shorter option will 102 match with the longer one. */ 103 #define TARGET_OPTION_TRANSLATE_TABLE \ 104 { "-all_load", "-Zall_load" }, \ 105 { "-allowable_client", "-Zallowable_client" }, \ 106 { "-arch_errors_fatal", "-Zarch_errors_fatal" }, \ 107 { "-bind_at_load", "-Zbind_at_load" }, \ 108 { "-bundle", "-Zbundle" }, \ 109 { "-bundle_loader", "-Zbundle_loader" }, \ 110 { "-weak_reference_mismatches", "-Zweak_reference_mismatches" }, \ 111 { "-dependency-file", "-MF" }, \ 112 { "-dylib_file", "-Zdylib_file" }, \ 113 { "-dynamic", "-Zdynamic" }, \ 114 { "-dynamiclib", "-Zdynamiclib" }, \ 115 { "-exported_symbols_list", "-Zexported_symbols_list" }, \ 116 { "-seg_addr_table_filename", "-Zseg_addr_table_filename" }, \ 117 { "-filelist", "-Xlinker -filelist -Xlinker" }, \ 118 { "-flat_namespace", "-Zflat_namespace" }, \ 119 { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" }, \ 120 { "-force_flat_namespace", "-Zforce_flat_namespace" }, \ 121 { "-image_base", "-Zimage_base" }, \ 122 { "-init", "-Zinit" }, \ 123 { "-install_name", "-Zinstall_name" }, \ 124 { "-multiply_defined_unused", "-Zmultiplydefinedunused" }, \ 125 { "-multiply_defined", "-Zmultiply_defined" }, \ 126 { "-multi_module", "-Zmulti_module" }, \ 127 { "-static", "-static -Wa,-static" }, \ 128 { "-single_module", "-Zsingle_module" }, \ 129 { "-unexported_symbols_list", "-Zunexported_symbols_list" } 130 131 /* These compiler options take n arguments. */ 132 133 #undef WORD_SWITCH_TAKES_ARG 134 #define WORD_SWITCH_TAKES_ARG(STR) \ 135 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \ 136 !strcmp (STR, "Zallowable_client") ? 1 : \ 137 !strcmp (STR, "arch") ? 1 : \ 138 !strcmp (STR, "arch_only") ? 1 : \ 139 !strcmp (STR, "Zbundle_loader") ? 1 : \ 140 !strcmp (STR, "client_name") ? 1 : \ 141 !strcmp (STR, "compatibility_version") ? 1 : \ 142 !strcmp (STR, "current_version") ? 1 : \ 143 !strcmp (STR, "Zdylib_file") ? 1 : \ 144 !strcmp (STR, "Zexported_symbols_list") ? 1 : \ 145 !strcmp (STR, "Zimage_base") ? 1 : \ 146 !strcmp (STR, "Zinit") ? 1 : \ 147 !strcmp (STR, "Zinstall_name") ? 1 : \ 148 !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \ 149 !strcmp (STR, "Zmultiply_defined") ? 1 : \ 150 !strcmp (STR, "precomp-trustfile") ? 1 : \ 151 !strcmp (STR, "read_only_relocs") ? 1 : \ 152 !strcmp (STR, "sectcreate") ? 3 : \ 153 !strcmp (STR, "sectorder") ? 3 : \ 154 !strcmp (STR, "Zseg_addr_table_filename") ?1 :\ 155 !strcmp (STR, "seg1addr") ? 1 : \ 156 !strcmp (STR, "segprot") ? 3 : \ 157 !strcmp (STR, "seg_addr_table") ? 1 : \ 158 !strcmp (STR, "sub_library") ? 1 : \ 159 !strcmp (STR, "sub_umbrella") ? 1 : \ 160 !strcmp (STR, "umbrella") ? 1 : \ 161 !strcmp (STR, "undefined") ? 1 : \ 162 !strcmp (STR, "Zunexported_symbols_list") ? 1 : \ 163 !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \ 164 !strcmp (STR, "pagezero_size") ? 1 : \ 165 !strcmp (STR, "segs_read_only_addr") ? 1 : \ 166 !strcmp (STR, "segs_read_write_addr") ? 1 : \ 167 !strcmp (STR, "sectalign") ? 3 : \ 168 !strcmp (STR, "sectobjectsymbols") ? 2 : \ 169 !strcmp (STR, "segcreate") ? 3 : \ 170 !strcmp (STR, "dylinker_install_name") ? 1 : \ 171 0) 172 173 /* Machine dependent cpp options. */ 174 175 #undef CPP_SPEC 176 #define CPP_SPEC "%{static:%{!dynamic:-D__STATIC__}}%{!static:-D__DYNAMIC__}" 177 178 /* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus 179 precomp, libtool, and fat build additions. Also we 180 don't specify a second %G after %L because libSystem is 181 self-contained and doesn't need to link against libgcc.a. */ 182 /* In general, random Darwin linker flags should go into LINK_SPEC 183 instead of LINK_COMMAND_SPEC. The command spec is better for 184 specifying the handling of options understood by generic Unix 185 linkers, and for positional arguments like libraries. */ 186 #define LINK_COMMAND_SPEC "\ 187 %{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\ 188 %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \ 189 %l %X %{d} %{s} %{t} %{Z} \ 190 %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \ 191 %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \ 192 %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \ 193 %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%G %L}} \ 194 %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \ 195 %{!--help:%{!no-c++filt|c++filt:| c++filt }} }}}}}}}}" 196 197 /* Please keep the random linker options in alphabetical order (modulo 198 'Z' and 'no' prefixes). Options that can only go to one of libtool 199 or ld must be listed twice, under both !Zdynamiclib and 200 Zdynamiclib, with one of the cases reporting an error. */ 201 /* Note that options taking arguments may appear multiple times on a 202 command line with different arguments each time, so put a * after 203 their names so all of them get passed. */ 204 #define LINK_SPEC \ 205 "%{static}%{!static:-dynamic} \ 206 %{!Zdynamiclib: \ 207 %{Zbundle:-bundle} \ 208 %{Zbundle_loader*:-bundle_loader %*} \ 209 %{client_name*} \ 210 %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\ 211 } \ 212 %{current_version*:%e-current_version only allowed with -dynamiclib} \ 213 %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \ 214 %{Zforce_flat_namespace:-force_flat_namespace} \ 215 %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \ 216 %{keep_private_externs} \ 217 %{private_bundle} \ 218 } \ 219 %{Zdynamiclib: \ 220 %{Zbundle:%e-bundle not allowed with -dynamiclib} \ 221 %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \ 222 %{client_name*:%e-client_name not allowed with -dynamiclib} \ 223 %{compatibility_version*} \ 224 %{current_version*} \ 225 %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \ 226 %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \ 227 %{Zinstall_name*:-install_name %*} \ 228 %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \ 229 %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \ 230 } \ 231 %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \ 232 %{Zallowable_client*:-allowable_client %*} \ 233 %{Zbind_at_load:-bind_at_load} \ 234 %{Zarch_errors_fatal:-arch_errors_fatal} \ 235 %{Zdylib_file*:-dylib_file %*} \ 236 %{Zdynamic:-dynamic}\ 237 %{Zexported_symbols_list*:-exported_symbols_list %*} \ 238 %{Zflat_namespace:-flat_namespace} \ 239 %{headerpad_max_install_names*} \ 240 %{Zimage_base*:-image_base %*} \ 241 %{Zinit*:-init %*} \ 242 %{nomultidefs} \ 243 %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \ 244 %{Zmultiply_defined*:-multiply_defined %*} \ 245 %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \ 246 %{prebind} %{noprebind} %{prebind_all_twolevel_modules} \ 247 %{read_only_relocs} \ 248 %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \ 249 %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \ 250 %{sub_library*} %{sub_umbrella*} \ 251 %{twolevel_namespace} %{twolevel_namespace_hints} \ 252 %{umbrella*} \ 253 %{undefined*} \ 254 %{Zunexported_symbols_list*:-unexported_symbols_list %*} \ 255 %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \ 256 %{X} \ 257 %{y*} \ 258 %{w} \ 259 %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \ 260 %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \ 261 %{whatsloaded} %{dylinker_install_name*} \ 262 %{dylinker} %{Mach} " 263 264 265 /* Machine dependent libraries. */ 266 267 #undef LIB_SPEC 268 #define LIB_SPEC "%{!static:-lSystem}" 269 270 /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */ 271 272 #undef STARTFILE_SPEC 273 #define STARTFILE_SPEC \ 274 "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \ 275 %{!Zbundle:%{pg:%{static:-lgcrt0.o} \ 276 %{!static:%{object:-lgcrt0.o} \ 277 %{!object:%{preload:-lgcrt0.o} \ 278 %{!preload:-lgcrt1.o -lcrt2.o}}}} \ 279 %{!pg:%{static:-lcrt0.o} \ 280 %{!static:%{object:-lcrt0.o} \ 281 %{!object:%{preload:-lcrt0.o} \ 282 %{!preload:-lcrt1.o -lcrt2.o}}}}}}" 283 284 /* The native Darwin linker doesn't necessarily place files in the order 285 that they're specified on the link line. Thus, it is pointless 286 to put anything in ENDFILE_SPEC. */ 287 /* #define ENDFILE_SPEC "" */ 288 289 #undef DOLLARS_IN_IDENTIFIERS 290 #define DOLLARS_IN_IDENTIFIERS 2 291 292 /* We use Dbx symbol format. */ 293 294 #define DBX_DEBUGGING_INFO 1 295 296 /* When generating stabs debugging, use N_BINCL entries. */ 297 298 #define DBX_USE_BINCL 299 300 /* There is no limit to the length of stabs strings. */ 301 302 #define DBX_CONTIN_LENGTH 0 303 304 /* gdb needs a null N_SO at the end of each file for scattered loading. */ 305 306 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END 307 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 308 do { text_section (); \ 309 fprintf (FILE, \ 310 "\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", "" , N_SO); \ 311 } while (0) 312 313 /* Our profiling scheme doesn't LP labels and counter words. */ 314 315 #define NO_PROFILE_COUNTERS 316 317 #undef INIT_SECTION_ASM_OP 318 #define INIT_SECTION_ASM_OP 319 320 #undef INVOKE__main 321 322 #define TARGET_ASM_CONSTRUCTOR machopic_asm_out_constructor 323 #define TARGET_ASM_DESTRUCTOR machopic_asm_out_destructor 324 325 /* Always prefix with an underscore. */ 326 327 #define USER_LABEL_PREFIX "_" 328 329 /* Don't output a .file directive. That is only used by the assembler for 330 error reporting. */ 331 332 #undef ASM_FILE_START 333 #define ASM_FILE_START(FILE) 334 335 #undef ASM_FILE_END 336 #define ASM_FILE_END(FILE) \ 337 do { \ 338 machopic_finish (asm_out_file); \ 339 if (strcmp (lang_hooks.name, "GNU C++") == 0) \ 340 { \ 341 constructor_section (); \ 342 destructor_section (); \ 343 ASM_OUTPUT_ALIGN (FILE, 1); \ 344 } \ 345 } while (0) 346 347 #define ASM_OUTPUT_SKIP(FILE,SIZE) \ 348 fprintf (FILE, "\t.space %d\n", SIZE) 349 350 /* Give ObjC methods pretty symbol names. */ 351 352 #undef OBJC_GEN_METHOD_LABEL 353 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \ 354 do { if (CAT_NAME) \ 355 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \ 356 (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \ 357 else \ 358 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \ 359 (CLASS_NAME), (SEL_NAME)); \ 360 } while (0) 361 362 /* The RTTI data (e.g., __ti4name) is common and public (and static), 363 but it does need to be referenced via indirect PIC data pointers. 364 The machopic_define_name calls are telling the machopic subsystem 365 that the name *is* defined in this module, so it doesn't need to 366 make them indirect. */ 367 368 #undef ASM_DECLARE_OBJECT_NAME 369 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ 370 do { \ 371 const char *xname = NAME; \ 372 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \ 373 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \ 374 if ((TREE_STATIC (DECL) \ 375 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 376 || DECL_INITIAL (DECL)) \ 377 machopic_define_name (xname); \ 378 if ((TREE_STATIC (DECL) \ 379 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 380 || DECL_INITIAL (DECL)) \ 381 (* targetm.encode_section_info) (DECL, false); \ 382 ASM_OUTPUT_LABEL (FILE, xname); \ 383 /* Darwin doesn't support zero-size objects, so give them a \ 384 byte. */ \ 385 if (tree_low_cst (DECL_SIZE_UNIT (DECL), 1) == 0) \ 386 assemble_zeros (1); \ 387 } while (0) 388 389 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 390 do { \ 391 const char *xname = NAME; \ 392 if (GET_CODE (XEXP (DECL_RTL (DECL), 0)) != SYMBOL_REF) \ 393 xname = IDENTIFIER_POINTER (DECL_NAME (DECL)); \ 394 if ((TREE_STATIC (DECL) \ 395 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 396 || DECL_INITIAL (DECL)) \ 397 machopic_define_name (xname); \ 398 if ((TREE_STATIC (DECL) \ 399 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 400 || DECL_INITIAL (DECL)) \ 401 (* targetm.encode_section_info) (DECL, false); \ 402 ASM_OUTPUT_LABEL (FILE, xname); \ 403 /* Avoid generating stubs for functions we've just defined by \ 404 outputting any required stub name label now. */ \ 405 machopic_output_possible_stub_label (FILE, xname); \ 406 } while (0) 407 408 #define ASM_DECLARE_CONSTANT_NAME(FILE, NAME, EXP, SIZE) \ 409 do { \ 410 ASM_OUTPUT_LABEL (FILE, NAME); \ 411 /* Darwin doesn't support zero-size objects, so give them a \ 412 byte. */ \ 413 if ((SIZE) == 0) \ 414 assemble_zeros (1); \ 415 } while (0) 416 417 /* Wrap new method names in quotes so the assembler doesn't gag. 418 Make Objective-C internal symbols local. */ 419 420 #undef ASM_OUTPUT_LABELREF 421 #define ASM_OUTPUT_LABELREF(FILE,NAME) \ 422 do { \ 423 const char *xname = darwin_strip_name_encoding (NAME); \ 424 if (xname[0] == '&' || xname[0] == '*') \ 425 { \ 426 int len = strlen (xname); \ 427 if (len > 6 && !strcmp ("$stub", xname + len - 5)) \ 428 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \ 429 else if (len > 7 && !strcmp ("$stub\"", xname + len - 6)) \ 430 machopic_validate_stub_or_non_lazy_ptr (xname, 1); \ 431 else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \ 432 machopic_validate_stub_or_non_lazy_ptr (xname, 0); \ 433 fputs (&xname[1], FILE); \ 434 } \ 435 else if (xname[0] == '+' || xname[0] == '-') \ 436 fprintf (FILE, "\"%s\"", xname); \ 437 else if (!strncmp (xname, "_OBJC_", 6)) \ 438 fprintf (FILE, "L%s", xname); \ 439 else if (!strncmp (xname, ".objc_class_name_", 17)) \ 440 fprintf (FILE, "%s", xname); \ 441 else \ 442 fprintf (FILE, "_%s", xname); \ 443 } while (0) 444 445 /* Output before executable code. */ 446 #undef TEXT_SECTION_ASM_OP 447 #define TEXT_SECTION_ASM_OP ".text" 448 449 /* Output before writable data. */ 450 451 #undef DATA_SECTION_ASM_OP 452 #define DATA_SECTION_ASM_OP ".data" 453 454 #undef ALIGN_ASM_OP 455 #define ALIGN_ASM_OP ".align" 456 457 #undef ASM_OUTPUT_ALIGN 458 #define ASM_OUTPUT_ALIGN(FILE,LOG) \ 459 if ((LOG) != 0) \ 460 fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG)) 461 462 /* Ensure correct alignment of bss data. */ 463 464 #undef ASM_OUTPUT_ALIGNED_DECL_LOCAL 465 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN) \ 466 do { \ 467 fputs (".lcomm ", (FILE)); \ 468 assemble_name ((FILE), (NAME)); \ 469 fprintf ((FILE), ",%u,%u\n", (SIZE), \ 470 floor_log2 ((ALIGN) / BITS_PER_UNIT)); \ 471 if ((DECL) && ((TREE_STATIC (DECL) \ 472 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 473 || DECL_INITIAL (DECL))) \ 474 (* targetm.encode_section_info) (DECL, false); \ 475 if ((DECL) && ((TREE_STATIC (DECL) \ 476 && (!DECL_COMMON (DECL) || !TREE_PUBLIC (DECL))) \ 477 || DECL_INITIAL (DECL))) \ 478 machopic_define_name (NAME); \ 479 } while (0) 480 481 /* The maximum alignment which the object file format can support. 482 For Mach-O, this is 2^15. */ 483 484 #undef MAX_OFILE_ALIGNMENT 485 #define MAX_OFILE_ALIGNMENT 0x8000 486 487 /* Create new Mach-O sections. */ 488 489 #undef SECTION_FUNCTION 490 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, OBJC) \ 491 extern void FUNCTION PARAMS ((void)); \ 492 void \ 493 FUNCTION () \ 494 { \ 495 if (in_section != SECTION) \ 496 { \ 497 if (OBJC) \ 498 objc_section_init (); \ 499 data_section (); \ 500 if (asm_out_file) \ 501 fprintf (asm_out_file, "%s\n", DIRECTIVE); \ 502 in_section = SECTION; \ 503 } \ 504 } \ 505 506 /* Darwin uses many types of special sections. */ 507 508 #undef EXTRA_SECTIONS 509 #define EXTRA_SECTIONS \ 510 in_const, in_const_data, in_cstring, in_literal4, in_literal8, \ 511 in_constructor, in_destructor, in_mod_init, in_mod_term, \ 512 in_objc_class, in_objc_meta_class, in_objc_category, \ 513 in_objc_class_vars, in_objc_instance_vars, \ 514 in_objc_cls_meth, in_objc_inst_meth, \ 515 in_objc_cat_cls_meth, in_objc_cat_inst_meth, \ 516 in_objc_selector_refs, \ 517 in_objc_selector_fixup, \ 518 in_objc_symbols, in_objc_module_info, \ 519 in_objc_protocol, in_objc_string_object, \ 520 in_objc_constant_string_object, \ 521 in_objc_class_names, in_objc_meth_var_names, \ 522 in_objc_meth_var_types, in_objc_cls_refs, \ 523 in_machopic_nl_symbol_ptr, \ 524 in_machopic_lazy_symbol_ptr, \ 525 in_machopic_symbol_stub, \ 526 in_machopic_picsymbol_stub, \ 527 in_darwin_exception, in_darwin_eh_frame, \ 528 num_sections 529 530 #undef EXTRA_SECTION_FUNCTIONS 531 #define EXTRA_SECTION_FUNCTIONS \ 532 static void objc_section_init PARAMS ((void)); \ 533 SECTION_FUNCTION (const_section, \ 534 in_const, \ 535 ".const", 0) \ 536 SECTION_FUNCTION (const_data_section, \ 537 in_const_data, \ 538 ".const_data", 0) \ 539 SECTION_FUNCTION (cstring_section, \ 540 in_cstring, \ 541 ".cstring", 0) \ 542 SECTION_FUNCTION (literal4_section, \ 543 in_literal4, \ 544 ".literal4", 0) \ 545 SECTION_FUNCTION (literal8_section, \ 546 in_literal8, \ 547 ".literal8", 0) \ 548 SECTION_FUNCTION (constructor_section, \ 549 in_constructor, \ 550 ".constructor", 0) \ 551 SECTION_FUNCTION (mod_init_section, \ 552 in_mod_init, \ 553 ".mod_init_func", 0) \ 554 SECTION_FUNCTION (mod_term_section, \ 555 in_mod_term, \ 556 ".mod_term_func", 0) \ 557 SECTION_FUNCTION (destructor_section, \ 558 in_destructor, \ 559 ".destructor", 0) \ 560 SECTION_FUNCTION (objc_class_section, \ 561 in_objc_class, \ 562 ".objc_class", 1) \ 563 SECTION_FUNCTION (objc_meta_class_section, \ 564 in_objc_meta_class, \ 565 ".objc_meta_class", 1) \ 566 SECTION_FUNCTION (objc_category_section, \ 567 in_objc_category, \ 568 ".objc_category", 1) \ 569 SECTION_FUNCTION (objc_class_vars_section, \ 570 in_objc_class_vars, \ 571 ".objc_class_vars", 1) \ 572 SECTION_FUNCTION (objc_instance_vars_section, \ 573 in_objc_instance_vars, \ 574 ".objc_instance_vars", 1) \ 575 SECTION_FUNCTION (objc_cls_meth_section, \ 576 in_objc_cls_meth, \ 577 ".objc_cls_meth", 1) \ 578 SECTION_FUNCTION (objc_inst_meth_section, \ 579 in_objc_inst_meth, \ 580 ".objc_inst_meth", 1) \ 581 SECTION_FUNCTION (objc_cat_cls_meth_section, \ 582 in_objc_cat_cls_meth, \ 583 ".objc_cat_cls_meth", 1) \ 584 SECTION_FUNCTION (objc_cat_inst_meth_section, \ 585 in_objc_cat_inst_meth, \ 586 ".objc_cat_inst_meth", 1) \ 587 SECTION_FUNCTION (objc_selector_refs_section, \ 588 in_objc_selector_refs, \ 589 ".objc_message_refs", 1) \ 590 SECTION_FUNCTION (objc_selector_fixup_section, \ 591 in_objc_selector_fixup, \ 592 ".section __OBJC, __sel_fixup", 1) \ 593 SECTION_FUNCTION (objc_symbols_section, \ 594 in_objc_symbols, \ 595 ".objc_symbols", 1) \ 596 SECTION_FUNCTION (objc_module_info_section, \ 597 in_objc_module_info, \ 598 ".objc_module_info", 1) \ 599 SECTION_FUNCTION (objc_protocol_section, \ 600 in_objc_protocol, \ 601 ".objc_protocol", 1) \ 602 SECTION_FUNCTION (objc_string_object_section, \ 603 in_objc_string_object, \ 604 ".objc_string_object", 1) \ 605 SECTION_FUNCTION (objc_constant_string_object_section, \ 606 in_objc_constant_string_object, \ 607 ".section __OBJC, __cstring_object", 1) \ 608 SECTION_FUNCTION (objc_class_names_section, \ 609 in_objc_class_names, \ 610 ".objc_class_names", 1) \ 611 SECTION_FUNCTION (objc_meth_var_names_section, \ 612 in_objc_meth_var_names, \ 613 ".objc_meth_var_names", 1) \ 614 SECTION_FUNCTION (objc_meth_var_types_section, \ 615 in_objc_meth_var_types, \ 616 ".objc_meth_var_types", 1) \ 617 SECTION_FUNCTION (objc_cls_refs_section, \ 618 in_objc_cls_refs, \ 619 ".objc_cls_refs", 1) \ 620 \ 621 SECTION_FUNCTION (machopic_lazy_symbol_ptr_section, \ 622 in_machopic_lazy_symbol_ptr, \ 623 ".lazy_symbol_pointer", 0) \ 624 SECTION_FUNCTION (machopic_nl_symbol_ptr_section, \ 625 in_machopic_nl_symbol_ptr, \ 626 ".non_lazy_symbol_pointer", 0) \ 627 SECTION_FUNCTION (machopic_symbol_stub_section, \ 628 in_machopic_symbol_stub, \ 629 ".symbol_stub", 0) \ 630 SECTION_FUNCTION (machopic_picsymbol_stub_section, \ 631 in_machopic_picsymbol_stub, \ 632 ".picsymbol_stub", 0) \ 633 SECTION_FUNCTION (darwin_exception_section, \ 634 in_darwin_exception, \ 635 ".section __DATA,__gcc_except_tab", 0) \ 636 SECTION_FUNCTION (darwin_eh_frame_section, \ 637 in_darwin_eh_frame, \ 638 ".section __TEXT,__eh_frame", 0) \ 639 \ 640 static void \ 641 objc_section_init () \ 642 { \ 643 static int been_here = 0; \ 644 \ 645 if (been_here == 0) \ 646 { \ 647 been_here = 1; \ 648 /* written, cold -> hot */ \ 649 objc_cat_cls_meth_section (); \ 650 objc_cat_inst_meth_section (); \ 651 objc_string_object_section (); \ 652 objc_constant_string_object_section (); \ 653 objc_selector_refs_section (); \ 654 objc_selector_fixup_section (); \ 655 objc_cls_refs_section (); \ 656 objc_class_section (); \ 657 objc_meta_class_section (); \ 658 /* shared, hot -> cold */ \ 659 objc_cls_meth_section (); \ 660 objc_inst_meth_section (); \ 661 objc_protocol_section (); \ 662 objc_class_names_section (); \ 663 objc_meth_var_types_section (); \ 664 objc_meth_var_names_section (); \ 665 objc_category_section (); \ 666 objc_class_vars_section (); \ 667 objc_instance_vars_section (); \ 668 objc_module_info_section (); \ 669 objc_symbols_section (); \ 670 } \ 671 } 672 673 #define READONLY_DATA_SECTION const_section 674 675 #undef TARGET_ASM_SELECT_SECTION 676 #define TARGET_ASM_SELECT_SECTION machopic_select_section 677 #undef TARGET_ASM_SELECT_RTX_SECTION 678 #define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section 679 680 #define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \ 681 do { \ 682 if (FILE) { \ 683 if (flag_pic) \ 684 fprintf (FILE, "\t.lazy_reference "); \ 685 else \ 686 fprintf (FILE, "\t.reference "); \ 687 assemble_name (FILE, NAME); \ 688 fprintf (FILE, "\n"); \ 689 } \ 690 } while (0) 691 692 #define ASM_DECLARE_CLASS_REFERENCE(FILE,NAME) \ 693 do { \ 694 if (FILE) { \ 695 fprintf (FILE, "\t"); \ 696 assemble_name (FILE, NAME); \ 697 fprintf (FILE, "=0\n"); \ 698 (*targetm.asm_out.globalize_label) (FILE, NAME); \ 699 } \ 700 } while (0) 701 702 /* Globalizing directive for a label. */ 703 #define GLOBAL_ASM_OP ".globl " 704 #define TARGET_ASM_GLOBALIZE_LABEL darwin_globalize_label 705 706 #undef ASM_GENERATE_INTERNAL_LABEL 707 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ 708 sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM)) 709 710 /* This is how to output an internal numbered label where PREFIX is 711 the class of label and NUM is the number within the class. */ 712 713 #undef ASM_OUTPUT_INTERNAL_LABEL 714 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 715 fprintf (FILE, "%s%d:\n", PREFIX, NUM) 716 717 /* Since we have a separate readonly data section, define this so that 718 jump tables end up in text rather than data. */ 719 720 #ifndef JUMP_TABLES_IN_TEXT_SECTION 721 #define JUMP_TABLES_IN_TEXT_SECTION 1 722 #endif 723 724 /* Symbolic names for various things we might know about a symbol. */ 725 726 enum machopic_addr_class { 727 MACHOPIC_UNDEFINED, 728 MACHOPIC_DEFINED_DATA, 729 MACHOPIC_UNDEFINED_DATA, 730 MACHOPIC_DEFINED_FUNCTION, 731 MACHOPIC_UNDEFINED_FUNCTION 732 }; 733 734 /* Macros defining the various PIC cases. */ 735 736 #define MACHOPIC_INDIRECT (flag_pic) 737 #define MACHOPIC_JUST_INDIRECT (flag_pic == 1) 738 #define MACHOPIC_PURE (flag_pic == 2) 739 740 #undef TARGET_ENCODE_SECTION_INFO 741 #define TARGET_ENCODE_SECTION_INFO darwin_encode_section_info 742 #undef TARGET_STRIP_NAME_ENCODING 743 #define TARGET_STRIP_NAME_ENCODING darwin_strip_name_encoding 744 745 #define GEN_BINDER_NAME_FOR_STUB(BUF,STUB,STUB_LENGTH) \ 746 do { \ 747 const char *const stub_ = (STUB); \ 748 char *buffer_ = (BUF); \ 749 strcpy (buffer_, stub_); \ 750 if (stub_[0] == '"') \ 751 { \ 752 strcpy (buffer_ + (STUB_LENGTH) - 1, "_binder\""); \ 753 } \ 754 else \ 755 { \ 756 strcpy (buffer_ + (STUB_LENGTH), "_binder"); \ 757 } \ 758 } while (0) 759 760 #define GEN_SYMBOL_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ 761 do { \ 762 const char *const symbol_ = (SYMBOL); \ 763 char *buffer_ = (BUF); \ 764 if (name_needs_quotes (symbol_) && symbol_[0] != '"') \ 765 { \ 766 sprintf (buffer_, "\"%s\"", symbol_); \ 767 } \ 768 else \ 769 { \ 770 strcpy (buffer_, symbol_); \ 771 } \ 772 } while (0) 773 774 /* Given a symbol name string, create the lazy pointer version 775 of the symbol name. */ 776 777 #define GEN_LAZY_PTR_NAME_FOR_SYMBOL(BUF,SYMBOL,SYMBOL_LENGTH) \ 778 do { \ 779 const char *symbol_ = darwin_strip_name_encoding (SYMBOL); \ 780 char *buffer_ = (BUF); \ 781 if (symbol_[0] == '"') \ 782 { \ 783 strcpy (buffer_, "\"L"); \ 784 strcpy (buffer_ + 2, symbol_ + 1); \ 785 strcpy (buffer_ + (SYMBOL_LENGTH), "$lazy_ptr\""); \ 786 } \ 787 else if (name_needs_quotes (symbol_)) \ 788 { \ 789 strcpy (buffer_, "\"L"); \ 790 strcpy (buffer_ + 2, symbol_); \ 791 strcpy (buffer_ + (SYMBOL_LENGTH) + 2, "$lazy_ptr\""); \ 792 } \ 793 else \ 794 { \ 795 strcpy (buffer_, "L"); \ 796 strcpy (buffer_ + 1, symbol_); \ 797 strcpy (buffer_ + (SYMBOL_LENGTH) + 1, "$lazy_ptr"); \ 798 } \ 799 } while (0) 800 801 #define TARGET_ASM_EXCEPTION_SECTION darwin_exception_section 802 803 #define TARGET_ASM_EH_FRAME_SECTION darwin_eh_frame_section 804 805 #undef ASM_PREFERRED_EH_DATA_FORMAT 806 #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL) \ 807 (((CODE) == 2 && (GLOBAL) == 1) \ 808 ? (DW_EH_PE_pcrel | DW_EH_PE_indirect) : \ 809 ((CODE) == 1 || (GLOBAL) == 0) ? DW_EH_PE_pcrel : DW_EH_PE_absptr) 810 811 #define ASM_OUTPUT_DWARF_DELTA(FILE,SIZE,LABEL1,LABEL2) \ 812 darwin_asm_output_dwarf_delta (FILE, SIZE, LABEL1, LABEL2) 813 814 #define TARGET_TERMINATE_DW2_EH_FRAME_INFO false 815 816 #define DARWIN_REGISTER_TARGET_PRAGMAS(PFILE) \ 817 do { \ 818 cpp_register_pragma (PFILE, 0, "mark", darwin_pragma_ignore); \ 819 cpp_register_pragma (PFILE, 0, "options", darwin_pragma_options); \ 820 cpp_register_pragma (PFILE, 0, "segment", darwin_pragma_ignore); \ 821 cpp_register_pragma (PFILE, 0, "unused", darwin_pragma_unused); \ 822 } while (0) 823 824 #undef ASM_APP_ON 825 #define ASM_APP_ON "" 826 #undef ASM_APP_OFF 827 #define ASM_APP_OFF "" 828