freebsd.h revision 52112
1/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format 2 Copyright (C) 1996 Free Software Foundation, Inc. 3 Contributed by Eric Youngdale. 4 Modified for stabs-in-ELF by H.J. Lu. 5 Adapted from GNU/Linux version by John Polstra. 6 Added support for generating "old a.out gas" on the fly by Peter Wemm. 7 Continued development by David O'Brien <obrien@freebsd.org> 8 9This file is part of GNU CC. 10 11GNU CC is free software; you can redistribute it and/or modify 12it under the terms of the GNU General Public License as published by 13the Free Software Foundation; either version 2, or (at your option) 14any later version. 15 16GNU CC is distributed in the hope that it will be useful, 17but WITHOUT ANY WARRANTY; without even the implied warranty of 18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19GNU General Public License for more details. 20 21You should have received a copy of the GNU General Public License 22along with GNU CC; see the file COPYING. If not, write to 23the Free Software Foundation, 59 Temple Place - Suite 330, 24Boston, MA 02111-1307, USA. */ 25 26/* $FreeBSD: head/contrib/gcc/config/i386/freebsd.h 52112 1999-10-10 22:33:40Z obrien $ */ 27 28 29#undef TARGET_VERSION 30#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); 31 32#define MASK_PROFILER_EPILOGUE 010000000000 33#define MASK_AOUT 004000000000 /* a.out not elf */ 34#define MASK_UNDERSCORES 002000000000 /* use leading _ */ 35 36#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE) 37#define TARGET_AOUT (target_flags & MASK_AOUT) 38#define TARGET_ELF ((target_flags & MASK_AOUT) == 0) 39#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0) 40 41#undef SUBTARGET_SWITCHES 42#define SUBTARGET_SWITCHES \ 43 { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \ 44 { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \ 45 { "aout", MASK_AOUT}, \ 46 { "no-aout", -MASK_AOUT}, \ 47 { "underscores", MASK_UNDERSCORES}, \ 48 { "no-underscores", -MASK_UNDERSCORES}, 49 50/* Prefix for internally generated assembler labels. If we aren't using 51 underscores, we are using prefix `.'s to identify labels that should 52 be ignored, as in `i386/gas.h' --karl@cs.umb.edu */ 53#undef LPREFIX 54#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L") 55 56/* Override the default comment-starter of "/". */ 57#undef ASM_COMMENT_START 58#define ASM_COMMENT_START "#" 59 60#undef ASM_APP_ON 61#define ASM_APP_ON "#APP\n" 62 63#undef ASM_APP_OFF 64#define ASM_APP_OFF "#NO_APP\n" 65 66#undef SET_ASM_OP 67#define SET_ASM_OP ".set" 68 69/* Output at beginning of assembler file. */ 70/* The .file command should always begin the output. */ 71 72#undef ASM_FILE_START 73#define ASM_FILE_START(FILE) \ 74 do { \ 75 output_file_directive ((FILE), main_input_filename); \ 76 if (TARGET_ELF) \ 77 fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ 78 } while (0) 79 80/* Identify the front-end which produced this file. To keep symbol 81 space down, and not confuse kdb, only do this if the language is 82 not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ 83#undef ASM_IDENTIFY_LANGUAGE 84#define ASM_IDENTIFY_LANGUAGE(STREAM) \ 85{ \ 86 if (strcmp (lang_identify (), "c") != 0) \ 87 output_lang_identify (STREAM); \ 88} 89 90/* This is how to store into the string BUF 91 the symbol_ref name of an internal numbered label where 92 PREFIX is the class of label and NUM is the number within the class. 93 This is suitable for output with `assemble_name'. */ 94#undef ASM_GENERATE_INTERNAL_LABEL 95#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ 96 sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ 97 (PREFIX), (NUMBER)) 98 99/* This is how to output an internal numbered label where 100 PREFIX is the class of label and NUM is the number within the class. */ 101#undef ASM_OUTPUT_INTERNAL_LABEL 102#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 103 fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ 104 (PREFIX), (NUM)) 105 106/* This is how to output a reference to a user-level label named NAME. */ 107#undef ASM_OUTPUT_LABELREF 108#define ASM_OUTPUT_LABELREF(FILE, NAME) \ 109 fprintf ((FILE), "%s%s", (TARGET_UNDERSCORES) ? "_" : "", (NAME)) 110 111 112/* This is how to output an element of a case-vector that is relative. 113 This is only used for PIC code. See comments by the `casesi' insn in 114 i386.md for an explanation of the expression this outputs. */ 115#undef ASM_OUTPUT_ADDR_DIFF_ELT 116#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ 117 fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE)) 118 119#undef ASM_OUTPUT_ALIGN 120#define ASM_OUTPUT_ALIGN(FILE, LOG) \ 121 if ((LOG)!=0) { \ 122 if (in_text_section()) \ 123 fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG)); \ 124 else \ 125 fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ 126 } 127 128/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ 129#undef USE_CONST_SECTION 130#define USE_CONST_SECTION TARGET_ELF 131 132/* The a.out tools do not support "linkonce" sections. */ 133#undef SUPPORTS_ONE_ONLY 134#define SUPPORTS_ONE_ONLY TARGET_ELF 135 136/* The a.out tools do not support "Lscope" .stabs symbols. */ 137#undef NO_DBX_FUNCTION_END 138#define NO_DBX_FUNCTION_END TARGET_AOUT 139 140/* A C statement (sans semicolon) to output an element in the table of 141 global constructors. */ 142#undef ASM_OUTPUT_CONSTRUCTOR 143#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME) \ 144 do { \ 145 if (TARGET_ELF) { \ 146 ctors_section (); \ 147 fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 148 assemble_name ((FILE), (NAME)); \ 149 fprintf ((FILE), "\n"); \ 150 } else { \ 151 fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 152 (TARGET_UNDERSCORES) ? "_" : ""); \ 153 assemble_name (asm_out_file, name); \ 154 fputc ('\n', asm_out_file); \ 155 } \ 156 } while (0) 157 158/* A C statement (sans semicolon) to output an element in the table of 159 global destructors. */ 160#undef ASM_OUTPUT_DESTRUCTOR 161#define ASM_OUTPUT_DESTRUCTOR(FILE, NAME) \ 162 do { \ 163 if (TARGET_ELF) { \ 164 dtors_section (); \ 165 fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 166 assemble_name ((FILE), (NAME)); \ 167 fprintf ((FILE), "\n"); \ 168 } else { \ 169 fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 170 (TARGET_UNDERSCORES) ? "_" : ""); \ 171 assemble_name (asm_out_file, name); \ 172 fputc ('\n', asm_out_file); \ 173 } \ 174 } while (0) 175 176/* This says how to output assembler code to declare an 177 uninitialized internal linkage data object. Under SVR4, 178 the linker seems to want the alignment of data objects 179 to depend on their types. We do exactly that here. */ 180 181#undef ASM_OUTPUT_ALIGNED_LOCAL 182#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 183do { \ 184 if (TARGET_ELF) { \ 185 fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 186 assemble_name ((FILE), (NAME)); \ 187 fprintf ((FILE), "\n"); \ 188 ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN)); \ 189 } else { \ 190 int rounded = (SIZE); \ 191 if (rounded == 0) rounded = 1; \ 192 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 193 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 194 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 195 fputs (".lcomm ", (FILE)); \ 196 assemble_name ((FILE), (NAME)); \ 197 fprintf ((FILE), ",%u\n", (rounded)); \ 198 } \ 199} while (0) 200 201#undef ASM_OUTPUT_ALIGNED_COMMON 202#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 203do { \ 204 if (TARGET_ELF) { \ 205 fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ 206 assemble_name ((FILE), (NAME)); \ 207 fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 208 } else { \ 209 int rounded = (SIZE); \ 210 if (rounded == 0) rounded = 1; \ 211 rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 212 rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 213 * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 214 fputs (".comm ", (FILE)); \ 215 assemble_name ((FILE), (NAME)); \ 216 fprintf ((FILE), ",%u\n", (rounded)); \ 217 } \ 218} while (0) 219 220/* Turn off svr4.h version, it chokes the old gas. The old layout 221 works fine under new gas anyway. */ 222#undef ASM_OUTPUT_ASCII 223 224/* How to output some space */ 225#undef ASM_OUTPUT_SKIP 226#define ASM_OUTPUT_SKIP(FILE, SIZE) \ 227do { \ 228 if (TARGET_ELF) { \ 229 fprintf ((FILE), "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \ 230 } else { \ 231 fprintf ((FILE), "\t.space %u\n", (SIZE)); \ 232 } \ 233} while (0) 234 235#undef ASM_OUTPUT_SOURCE_LINE 236#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \ 237do { \ 238 static int sym_lineno = 1; \ 239 if (TARGET_ELF) { \ 240 fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno); \ 241 assemble_name ((FILE), XSTR (XEXP (DECL_RTL (current_function_decl),\ 242 0), 0)); \ 243 fprintf ((FILE), "\n.LM%d:\n", sym_lineno); \ 244 sym_lineno += 1; \ 245 } else { \ 246 fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \ 247 } \ 248} while (0) 249 250/* in elf, the function stabs come first, before the relative offsets */ 251#undef DBX_FUNCTION_FIRST 252#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF 253 254/* tag end of file in elf mode */ 255#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END 256#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 257do { \ 258 if (TARGET_ELF) { \ 259 fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ 260 N_SO); \ 261 } \ 262} while (0) 263 264/* stabs-in-elf has offsets relative to function beginning */ 265#undef DBX_OUTPUT_LBRAC 266#define DBX_OUTPUT_LBRAC(FILE, NAME) \ 267do { \ 268 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ 269 assemble_name (asmfile, buf); \ 270 if (TARGET_ELF) { \ 271 fputc ('-', asmfile); \ 272 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 273 0), 0)); \ 274 } \ 275 fprintf (asmfile, "\n"); \ 276} while (0) 277 278#undef DBX_OUTPUT_RBRAC 279#define DBX_OUTPUT_RBRAC(FILE, NAME) \ 280do { \ 281 fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ 282 assemble_name (asmfile, buf); \ 283 if (TARGET_ELF) { \ 284 fputc ('-', asmfile); \ 285 assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 286 0), 0)); \ 287 } \ 288 fprintf (asmfile, "\n"); \ 289} while (0) 290 291 292/* Define macro used to output shift-double opcodes when the shift 293 count is in %cl. Some assemblers require %cl as an argument; 294 some don't. 295 296 *OLD* GAS requires the %cl argument, so override i386/unix.h. */ 297 298#undef AS3_SHIFT_DOUBLE 299#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) 300 301/* Indicate that jump tables go in the text section. This is 302 necessary when compiling PIC code. */ 303#undef JUMP_TABLES_IN_TEXT_SECTION 304#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) 305 306/* override the exception table positioning */ 307#undef EXCEPTION_SECTION 308#define EXCEPTION_SECTION() \ 309do { \ 310 if (TARGET_ELF) { \ 311 named_section (NULL_TREE, ".gcc_except_table", 0); \ 312 } else { \ 313 if (flag_pic) \ 314 data_section (); \ 315 else \ 316 readonly_data_section (); \ 317 } \ 318} while (0); 319 320/* supply our own hook for calling __main() from main() */ 321#undef GEN_CALL__MAIN 322#define GEN_CALL__MAIN \ 323 do { \ 324 if (!(TARGET_ELF)) \ 325 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ 326 VOIDmode, 0); \ 327 } while (0) 328 329/* Copy this from the svr4 specifications... */ 330/* Define the register numbers to be used in Dwarf debugging information. 331 The SVR4 reference port C compiler uses the following register numbers 332 in its Dwarf output code: 333 0 for %eax (gnu regno = 0) 334 1 for %ecx (gnu regno = 2) 335 2 for %edx (gnu regno = 1) 336 3 for %ebx (gnu regno = 3) 337 4 for %esp (gnu regno = 7) 338 5 for %ebp (gnu regno = 6) 339 6 for %esi (gnu regno = 4) 340 7 for %edi (gnu regno = 5) 341 The following three DWARF register numbers are never generated by 342 the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 343 believes these numbers have these meanings. 344 8 for %eip (no gnu equivalent) 345 9 for %eflags (no gnu equivalent) 346 10 for %trapno (no gnu equivalent) 347 It is not at all clear how we should number the FP stack registers 348 for the x86 architecture. If the version of SDB on x86/svr4 were 349 a bit less brain dead with respect to floating-point then we would 350 have a precedent to follow with respect to DWARF register numbers 351 for x86 FP registers, but the SDB on x86/svr4 is so completely 352 broken with respect to FP registers that it is hardly worth thinking 353 of it as something to strive for compatibility with. 354 The version of x86/svr4 SDB I have at the moment does (partially) 355 seem to believe that DWARF register number 11 is associated with 356 the x86 register %st(0), but that's about all. Higher DWARF 357 register numbers don't seem to be associated with anything in 358 particular, and even for DWARF regno 11, SDB only seems to under- 359 stand that it should say that a variable lives in %st(0) (when 360 asked via an `=' command) if we said it was in DWARF regno 11, 361 but SDB still prints garbage when asked for the value of the 362 variable in question (via a `/' command). 363 (Also note that the labels SDB prints for various FP stack regs 364 when doing an `x' command are all wrong.) 365 Note that these problems generally don't affect the native SVR4 366 C compiler because it doesn't allow the use of -O with -g and 367 because when it is *not* optimizing, it allocates a memory 368 location for each floating-point variable, and the memory 369 location is what gets described in the DWARF AT_location 370 attribute for the variable in question. 371 Regardless of the severe mental illness of the x86/svr4 SDB, we 372 do something sensible here and we use the following DWARF 373 register numbers. Note that these are all stack-top-relative 374 numbers. 375 11 for %st(0) (gnu regno = 8) 376 12 for %st(1) (gnu regno = 9) 377 13 for %st(2) (gnu regno = 10) 378 14 for %st(3) (gnu regno = 11) 379 15 for %st(4) (gnu regno = 12) 380 16 for %st(5) (gnu regno = 13) 381 17 for %st(6) (gnu regno = 14) 382 18 for %st(7) (gnu regno = 15) 383*/ 384#undef DWARF_DBX_REGISTER_NUMBER 385#define DWARF_DBX_REGISTER_NUMBER(n) \ 386((n) == 0 ? 0 \ 387 : (n) == 1 ? 2 \ 388 : (n) == 2 ? 1 \ 389 : (n) == 3 ? 3 \ 390 : (n) == 4 ? 6 \ 391 : (n) == 5 ? 7 \ 392 : (n) == 6 ? 5 \ 393 : (n) == 7 ? 4 \ 394 : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ 395 : (-1)) 396 397/* Now what stabs expects in the register. */ 398#undef STABS_DBX_REGISTER_NUMBER 399#define STABS_DBX_REGISTER_NUMBER(n) \ 400((n) == 0 ? 0 : \ 401 (n) == 1 ? 2 : \ 402 (n) == 2 ? 1 : \ 403 (n) == 3 ? 3 : \ 404 (n) == 4 ? 6 : \ 405 (n) == 5 ? 7 : \ 406 (n) == 6 ? 4 : \ 407 (n) == 7 ? 5 : \ 408 (n) + 4) 409 410#undef DBX_REGISTER_NUMBER 411#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ 412 ? DWARF_DBX_REGISTER_NUMBER(n) \ 413 : STABS_DBX_REGISTER_NUMBER(n)) 414 415/* Tell final.c that we don't need a label passed to mcount. */ 416#define NO_PROFILE_DATA 417 418/* Output assembler code to FILE to increment profiler label # LABELNO 419 for profiling a function entry. */ 420/* Redefine this to not pass an unused label in %edx. */ 421 422#undef FUNCTION_PROFILER 423#define FUNCTION_PROFILER(FILE, LABELNO) \ 424{ \ 425 if (flag_pic) \ 426 { \ 427 fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ 428 TARGET_AOUT ? "mcount" : ".mcount"); \ 429 } \ 430 else \ 431 { \ 432 fprintf ((FILE), "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ 433 } \ 434} 435 436#undef FUNCTION_PROFILER_EPILOGUE 437#define FUNCTION_PROFILER_EPILOGUE(FILE) \ 438{ \ 439 if (TARGET_PROFILER_EPILOGUE) \ 440 { \ 441 if (flag_pic) \ 442 fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ 443 TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 444 else \ 445 fprintf ((FILE), "\tcall %s\n", \ 446 TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 447 } \ 448} 449 450#undef SIZE_TYPE 451#define SIZE_TYPE "unsigned int" 452 453#undef PTRDIFF_TYPE 454#define PTRDIFF_TYPE "int" 455 456#undef WCHAR_TYPE 457#define WCHAR_TYPE "int" 458 459#undef WCHAR_UNSIGNED 460#define WCHAR_UNSIGNED 0 461 462#undef WCHAR_TYPE_SIZE 463#define WCHAR_TYPE_SIZE BITS_PER_WORD 464 465#undef CPP_PREDEFINES 466#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES 467 468#undef CPP_SPEC 469#if TARGET_CPU_DEFAULT == 2 470#define CPP_SPEC "\ 471%{!maout: -D__ELF__} \ 472%{munderscores: -D__UNDERSCORES__} \ 473%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 474%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}" 475#else 476#define CPP_SPEC "\ 477%{!maout: -D__ELF__} \ 478%{munderscores: -D__UNDERSCORES__} \ 479%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 480%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}" 481#endif 482 483#undef CC1_SPEC 484#define CC1_SPEC "\ 485%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ 486%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" 487 488#undef ASM_SPEC 489#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" 490 491/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support 492 for the special GCC options -static and -shared, which allow us to 493 link things in one of these three modes by applying the appropriate 494 combinations of options at link-time. We like to support here for 495 as many of the other GNU linker options as possible. But I don't 496 have the time to search for those flags. I am sure how to add 497 support for -soname shared_object_name. H.J. 498 499 I took out %{v:%{!V:-V}}. It is too much :-(. They can use 500 -Wl,-V. 501 502 When the -shared link option is used a final link is not being 503 done. */ 504 505#undef LINK_SPEC 506#define LINK_SPEC "\ 507 %{p:%e`-p' not supported; use `-pg' and gprof(1)} \ 508 %{maout: %{shared:-Bshareable} \ 509 %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \ 510 %{pg:-Bstatic} %{Z}} \ 511 %{assert*} %{R*}} \ 512 %{!maout: \ 513 -m elf_i386 \ 514 %{Wl,*:%*} \ 515 %{assert*} %{R*} %{rpath*} %{defsym*} \ 516 %{shared:-Bshareable %{h*} %{soname*}} \ 517 %{symbolic:-Bsymbolic} \ 518 %{!shared: \ 519 %{!static: \ 520 %{rdynamic: -export-dynamic} \ 521 %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ 522 %{static:-Bstatic}}}" 523 524/* A C statement to output to the stdio stream FILE an assembler 525 command to advance the location counter to a multiple of 1<<LOG 526 bytes if it is within MAX_SKIP bytes. 527 528 This is used to align code labels according to Intel recommendations. */ 529 530#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN 531#error "we don't have this for the aout gas" 532#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ 533 if ((LOG)!=0) \ 534 if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ 535 else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) 536#endif 537 538#undef STARTFILE_SPEC 539#define STARTFILE_SPEC "\ 540 %{maout: %{shared:c++rt0.o%s} \ 541 %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \ 542 %{!maout: %{!shared: \ 543 %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \ 544 crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" 545 546#undef ENDFILE_SPEC 547#define ENDFILE_SPEC \ 548 "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}" 549 550/* This goes away when the math emulator is fixed. */ 551#undef TARGET_DEFAULT 552#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301) 553 554/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the 555 DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with 556 the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions 557 type exception machanism. */ 558#define DWARF2_UNWIND_INFO 0 559