freebsd.h revision 52112
134229Speter/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format 251408Sobrien Copyright (C) 1996 Free Software Foundation, Inc. 334229Speter Contributed by Eric Youngdale. 434229Speter Modified for stabs-in-ELF by H.J. Lu. 551408Sobrien Adapted from GNU/Linux version by John Polstra. 634229Speter Added support for generating "old a.out gas" on the fly by Peter Wemm. 752112Sobrien Continued development by David O'Brien <obrien@freebsd.org> 818334Speter 918334SpeterThis file is part of GNU CC. 1018334Speter 1118334SpeterGNU CC is free software; you can redistribute it and/or modify 1218334Speterit under the terms of the GNU General Public License as published by 1318334Speterthe Free Software Foundation; either version 2, or (at your option) 1418334Speterany later version. 1518334Speter 1618334SpeterGNU CC is distributed in the hope that it will be useful, 1718334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of 1818334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1918334SpeterGNU General Public License for more details. 2018334Speter 2118334SpeterYou should have received a copy of the GNU General Public License 2218334Speteralong with GNU CC; see the file COPYING. If not, write to 2318334Speterthe Free Software Foundation, 59 Temple Place - Suite 330, 2418334SpeterBoston, MA 02111-1307, USA. */ 2518334Speter 2651408Sobrien/* $FreeBSD: head/contrib/gcc/config/i386/freebsd.h 52112 1999-10-10 22:33:40Z obrien $ */ 2718334Speter 2851408Sobrien 2951408Sobrien#undef TARGET_VERSION 3051408Sobrien#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); 3151408Sobrien 3234229Speter#define MASK_PROFILER_EPILOGUE 010000000000 3334229Speter#define MASK_AOUT 004000000000 /* a.out not elf */ 3434229Speter#define MASK_UNDERSCORES 002000000000 /* use leading _ */ 3518349Speter 3634229Speter#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE) 3734229Speter#define TARGET_AOUT (target_flags & MASK_AOUT) 3834229Speter#define TARGET_ELF ((target_flags & MASK_AOUT) == 0) 3934229Speter#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0) 4018349Speter 4134229Speter#undef SUBTARGET_SWITCHES 4252112Sobrien#define SUBTARGET_SWITCHES \ 4352112Sobrien { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \ 4452112Sobrien { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \ 4552112Sobrien { "aout", MASK_AOUT}, \ 4652112Sobrien { "no-aout", -MASK_AOUT}, \ 4752112Sobrien { "underscores", MASK_UNDERSCORES}, \ 4834229Speter { "no-underscores", -MASK_UNDERSCORES}, 4918349Speter 5034229Speter/* Prefix for internally generated assembler labels. If we aren't using 5134229Speter underscores, we are using prefix `.'s to identify labels that should 5234229Speter be ignored, as in `i386/gas.h' --karl@cs.umb.edu */ 5334229Speter#undef LPREFIX 5434229Speter#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L") 5518349Speter 5634229Speter/* Override the default comment-starter of "/". */ 5734229Speter#undef ASM_COMMENT_START 5834229Speter#define ASM_COMMENT_START "#" 5918349Speter 6034229Speter#undef ASM_APP_ON 6134229Speter#define ASM_APP_ON "#APP\n" 6218349Speter 6334229Speter#undef ASM_APP_OFF 6434229Speter#define ASM_APP_OFF "#NO_APP\n" 6518349Speter 6652112Sobrien#undef SET_ASM_OP 6751408Sobrien#define SET_ASM_OP ".set" 6851408Sobrien 6934229Speter/* Output at beginning of assembler file. */ 7034229Speter/* The .file command should always begin the output. */ 7118349Speter 7234229Speter#undef ASM_FILE_START 7334229Speter#define ASM_FILE_START(FILE) \ 7434229Speter do { \ 7552112Sobrien output_file_directive ((FILE), main_input_filename); \ 7634229Speter if (TARGET_ELF) \ 7752112Sobrien fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ 7834229Speter } while (0) 7918349Speter 8034285Speter/* Identify the front-end which produced this file. To keep symbol 8134285Speter space down, and not confuse kdb, only do this if the language is 8234285Speter not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ 8334285Speter#undef ASM_IDENTIFY_LANGUAGE 8434285Speter#define ASM_IDENTIFY_LANGUAGE(STREAM) \ 8534285Speter{ \ 8634285Speter if (strcmp (lang_identify (), "c") != 0) \ 8734285Speter output_lang_identify (STREAM); \ 8834285Speter} 8934285Speter 9034229Speter/* This is how to store into the string BUF 9134229Speter the symbol_ref name of an internal numbered label where 9234229Speter PREFIX is the class of label and NUM is the number within the class. 9334229Speter This is suitable for output with `assemble_name'. */ 9434229Speter#undef ASM_GENERATE_INTERNAL_LABEL 9534229Speter#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ 9634229Speter sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ 9734229Speter (PREFIX), (NUMBER)) 9818349Speter 9934229Speter/* This is how to output an internal numbered label where 10034229Speter PREFIX is the class of label and NUM is the number within the class. */ 10134229Speter#undef ASM_OUTPUT_INTERNAL_LABEL 10234229Speter#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 10352112Sobrien fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ 10452112Sobrien (PREFIX), (NUM)) 10518334Speter 10634229Speter/* This is how to output a reference to a user-level label named NAME. */ 10734229Speter#undef ASM_OUTPUT_LABELREF 10852112Sobrien#define ASM_OUTPUT_LABELREF(FILE, NAME) \ 10952112Sobrien fprintf ((FILE), "%s%s", (TARGET_UNDERSCORES) ? "_" : "", (NAME)) 11018349Speter 11118334Speter 11234229Speter/* This is how to output an element of a case-vector that is relative. 11334229Speter This is only used for PIC code. See comments by the `casesi' insn in 11434229Speter i386.md for an explanation of the expression this outputs. */ 11534229Speter#undef ASM_OUTPUT_ADDR_DIFF_ELT 11651408Sobrien#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ 11752112Sobrien fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE)) 11818349Speter 11934229Speter#undef ASM_OUTPUT_ALIGN 12052112Sobrien#define ASM_OUTPUT_ALIGN(FILE, LOG) \ 12151408Sobrien if ((LOG)!=0) { \ 12251408Sobrien if (in_text_section()) \ 12351408Sobrien fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG)); \ 12451408Sobrien else \ 12551408Sobrien fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ 12651408Sobrien } 12718349Speter 12834229Speter/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ 12934229Speter#undef USE_CONST_SECTION 13034229Speter#define USE_CONST_SECTION TARGET_ELF 13118334Speter 13251408Sobrien/* The a.out tools do not support "linkonce" sections. */ 13352112Sobrien#undef SUPPORTS_ONE_ONLY 13451408Sobrien#define SUPPORTS_ONE_ONLY TARGET_ELF 13551408Sobrien 13651408Sobrien/* The a.out tools do not support "Lscope" .stabs symbols. */ 13752112Sobrien#undef NO_DBX_FUNCTION_END 13851408Sobrien#define NO_DBX_FUNCTION_END TARGET_AOUT 13951408Sobrien 14034229Speter/* A C statement (sans semicolon) to output an element in the table of 14134229Speter global constructors. */ 14234229Speter#undef ASM_OUTPUT_CONSTRUCTOR 14352112Sobrien#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME) \ 14434229Speter do { \ 14534229Speter if (TARGET_ELF) { \ 14634229Speter ctors_section (); \ 14752112Sobrien fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 14852112Sobrien assemble_name ((FILE), (NAME)); \ 14952112Sobrien fprintf ((FILE), "\n"); \ 15034229Speter } else { \ 15134229Speter fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 15234229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 15334229Speter assemble_name (asm_out_file, name); \ 15434229Speter fputc ('\n', asm_out_file); \ 15534229Speter } \ 15634229Speter } while (0) 15718334Speter 15834229Speter/* A C statement (sans semicolon) to output an element in the table of 15934229Speter global destructors. */ 16034229Speter#undef ASM_OUTPUT_DESTRUCTOR 16152112Sobrien#define ASM_OUTPUT_DESTRUCTOR(FILE, NAME) \ 16234229Speter do { \ 16334229Speter if (TARGET_ELF) { \ 16434229Speter dtors_section (); \ 16552112Sobrien fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ 16652112Sobrien assemble_name ((FILE), (NAME)); \ 16752112Sobrien fprintf ((FILE), "\n"); \ 16834229Speter } else { \ 16934229Speter fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 17034229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 17134229Speter assemble_name (asm_out_file, name); \ 17234229Speter fputc ('\n', asm_out_file); \ 17334229Speter } \ 17434229Speter } while (0) 17518334Speter 17634229Speter/* This says how to output assembler code to declare an 17734229Speter uninitialized internal linkage data object. Under SVR4, 17834229Speter the linker seems to want the alignment of data objects 17934229Speter to depend on their types. We do exactly that here. */ 18018334Speter 18134229Speter#undef ASM_OUTPUT_ALIGNED_LOCAL 18234229Speter#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 18334229Speterdo { \ 18434229Speter if (TARGET_ELF) { \ 18534229Speter fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 18634229Speter assemble_name ((FILE), (NAME)); \ 18734229Speter fprintf ((FILE), "\n"); \ 18852112Sobrien ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN)); \ 18934229Speter } else { \ 19034229Speter int rounded = (SIZE); \ 19134229Speter if (rounded == 0) rounded = 1; \ 19234229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 19334229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 19434229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 19534229Speter fputs (".lcomm ", (FILE)); \ 19634229Speter assemble_name ((FILE), (NAME)); \ 19734229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 19834229Speter } \ 19934229Speter} while (0) 20018349Speter 20134229Speter#undef ASM_OUTPUT_ALIGNED_COMMON 20234229Speter#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 20334229Speterdo { \ 20434229Speter if (TARGET_ELF) { \ 20534229Speter fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ 20634229Speter assemble_name ((FILE), (NAME)); \ 20734229Speter fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 20834229Speter } else { \ 20934229Speter int rounded = (SIZE); \ 21034229Speter if (rounded == 0) rounded = 1; \ 21134229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 21234229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 21334229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 21434229Speter fputs (".comm ", (FILE)); \ 21534229Speter assemble_name ((FILE), (NAME)); \ 21634229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 21734229Speter } \ 21834229Speter} while (0) 21918349Speter 22034229Speter/* Turn off svr4.h version, it chokes the old gas. The old layout 22134229Speter works fine under new gas anyway. */ 22234229Speter#undef ASM_OUTPUT_ASCII 22318334Speter 22434229Speter/* How to output some space */ 22534229Speter#undef ASM_OUTPUT_SKIP 22652112Sobrien#define ASM_OUTPUT_SKIP(FILE, SIZE) \ 22734229Speterdo { \ 22834229Speter if (TARGET_ELF) { \ 22952112Sobrien fprintf ((FILE), "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \ 23034229Speter } else { \ 23152112Sobrien fprintf ((FILE), "\t.space %u\n", (SIZE)); \ 23234229Speter } \ 23334229Speter} while (0) 23418334Speter 23534229Speter#undef ASM_OUTPUT_SOURCE_LINE 23652112Sobrien#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \ 23734229Speterdo { \ 23834229Speter static int sym_lineno = 1; \ 23934229Speter if (TARGET_ELF) { \ 24052112Sobrien fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno); \ 24152112Sobrien assemble_name ((FILE), XSTR (XEXP (DECL_RTL (current_function_decl),\ 24252112Sobrien 0), 0)); \ 24352112Sobrien fprintf ((FILE), "\n.LM%d:\n", sym_lineno); \ 24434229Speter sym_lineno += 1; \ 24534229Speter } else { \ 24652112Sobrien fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \ 24734229Speter } \ 24834229Speter} while (0) 24918334Speter 25034284Speter/* in elf, the function stabs come first, before the relative offsets */ 25134269Speter#undef DBX_FUNCTION_FIRST 25234269Speter#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF 25334269Speter 25434284Speter/* tag end of file in elf mode */ 25534284Speter#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END 25634284Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 25734284Speterdo { \ 25834284Speter if (TARGET_ELF) { \ 25952112Sobrien fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ 26052112Sobrien N_SO); \ 26134284Speter } \ 26234284Speter} while (0) 26334284Speter 26434229Speter/* stabs-in-elf has offsets relative to function beginning */ 26534229Speter#undef DBX_OUTPUT_LBRAC 26652112Sobrien#define DBX_OUTPUT_LBRAC(FILE, NAME) \ 26734229Speterdo { \ 26834229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ 26934229Speter assemble_name (asmfile, buf); \ 27034229Speter if (TARGET_ELF) { \ 27134229Speter fputc ('-', asmfile); \ 27252112Sobrien assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 27352112Sobrien 0), 0)); \ 27434229Speter } \ 27534229Speter fprintf (asmfile, "\n"); \ 27634229Speter} while (0) 27718334Speter 27834229Speter#undef DBX_OUTPUT_RBRAC 27952112Sobrien#define DBX_OUTPUT_RBRAC(FILE, NAME) \ 28034229Speterdo { \ 28134229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ 28234229Speter assemble_name (asmfile, buf); \ 28334229Speter if (TARGET_ELF) { \ 28434229Speter fputc ('-', asmfile); \ 28552112Sobrien assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\ 28652112Sobrien 0), 0)); \ 28734229Speter } \ 28834229Speter fprintf (asmfile, "\n"); \ 28934229Speter} while (0) 29034229Speter 29134229Speter 29234229Speter/* Define macro used to output shift-double opcodes when the shift 29334229Speter count is in %cl. Some assemblers require %cl as an argument; 29434229Speter some don't. 29534229Speter 29634229Speter *OLD* GAS requires the %cl argument, so override i386/unix.h. */ 29734229Speter 29834229Speter#undef AS3_SHIFT_DOUBLE 29934229Speter#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) 30034229Speter 30118334Speter/* Indicate that jump tables go in the text section. This is 30218334Speter necessary when compiling PIC code. */ 30352112Sobrien#undef JUMP_TABLES_IN_TEXT_SECTION 30451408Sobrien#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) 30518334Speter 30634229Speter/* override the exception table positioning */ 30752112Sobrien#undef EXCEPTION_SECTION 30851408Sobrien#define EXCEPTION_SECTION() \ 30934229Speterdo { \ 31034229Speter if (TARGET_ELF) { \ 31151408Sobrien named_section (NULL_TREE, ".gcc_except_table", 0); \ 31234229Speter } else { \ 31334229Speter if (flag_pic) \ 31434229Speter data_section (); \ 31534229Speter else \ 31634229Speter readonly_data_section (); \ 31734229Speter } \ 31834229Speter} while (0); 31918334Speter 32034229Speter/* supply our own hook for calling __main() from main() */ 32152112Sobrien#undef GEN_CALL__MAIN 32234229Speter#define GEN_CALL__MAIN \ 32334229Speter do { \ 32434229Speter if (!(TARGET_ELF)) \ 32534229Speter emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ 32634229Speter VOIDmode, 0); \ 32734229Speter } while (0) 32834229Speter 32951408Sobrien/* Copy this from the svr4 specifications... */ 33051408Sobrien/* Define the register numbers to be used in Dwarf debugging information. 33151408Sobrien The SVR4 reference port C compiler uses the following register numbers 33251408Sobrien in its Dwarf output code: 33351408Sobrien 0 for %eax (gnu regno = 0) 33451408Sobrien 1 for %ecx (gnu regno = 2) 33551408Sobrien 2 for %edx (gnu regno = 1) 33651408Sobrien 3 for %ebx (gnu regno = 3) 33751408Sobrien 4 for %esp (gnu regno = 7) 33851408Sobrien 5 for %ebp (gnu regno = 6) 33951408Sobrien 6 for %esi (gnu regno = 4) 34051408Sobrien 7 for %edi (gnu regno = 5) 34151408Sobrien The following three DWARF register numbers are never generated by 34251408Sobrien the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 34351408Sobrien believes these numbers have these meanings. 34451408Sobrien 8 for %eip (no gnu equivalent) 34551408Sobrien 9 for %eflags (no gnu equivalent) 34651408Sobrien 10 for %trapno (no gnu equivalent) 34751408Sobrien It is not at all clear how we should number the FP stack registers 34851408Sobrien for the x86 architecture. If the version of SDB on x86/svr4 were 34951408Sobrien a bit less brain dead with respect to floating-point then we would 35051408Sobrien have a precedent to follow with respect to DWARF register numbers 35151408Sobrien for x86 FP registers, but the SDB on x86/svr4 is so completely 35251408Sobrien broken with respect to FP registers that it is hardly worth thinking 35351408Sobrien of it as something to strive for compatibility with. 35451408Sobrien The version of x86/svr4 SDB I have at the moment does (partially) 35551408Sobrien seem to believe that DWARF register number 11 is associated with 35651408Sobrien the x86 register %st(0), but that's about all. Higher DWARF 35751408Sobrien register numbers don't seem to be associated with anything in 35851408Sobrien particular, and even for DWARF regno 11, SDB only seems to under- 35951408Sobrien stand that it should say that a variable lives in %st(0) (when 36051408Sobrien asked via an `=' command) if we said it was in DWARF regno 11, 36151408Sobrien but SDB still prints garbage when asked for the value of the 36251408Sobrien variable in question (via a `/' command). 36351408Sobrien (Also note that the labels SDB prints for various FP stack regs 36451408Sobrien when doing an `x' command are all wrong.) 36551408Sobrien Note that these problems generally don't affect the native SVR4 36651408Sobrien C compiler because it doesn't allow the use of -O with -g and 36751408Sobrien because when it is *not* optimizing, it allocates a memory 36851408Sobrien location for each floating-point variable, and the memory 36951408Sobrien location is what gets described in the DWARF AT_location 37051408Sobrien attribute for the variable in question. 37151408Sobrien Regardless of the severe mental illness of the x86/svr4 SDB, we 37251408Sobrien do something sensible here and we use the following DWARF 37351408Sobrien register numbers. Note that these are all stack-top-relative 37451408Sobrien numbers. 37551408Sobrien 11 for %st(0) (gnu regno = 8) 37651408Sobrien 12 for %st(1) (gnu regno = 9) 37751408Sobrien 13 for %st(2) (gnu regno = 10) 37851408Sobrien 14 for %st(3) (gnu regno = 11) 37951408Sobrien 15 for %st(4) (gnu regno = 12) 38051408Sobrien 16 for %st(5) (gnu regno = 13) 38151408Sobrien 17 for %st(6) (gnu regno = 14) 38251408Sobrien 18 for %st(7) (gnu regno = 15) 38351408Sobrien*/ 38434229Speter#undef DWARF_DBX_REGISTER_NUMBER 38534229Speter#define DWARF_DBX_REGISTER_NUMBER(n) \ 38634229Speter((n) == 0 ? 0 \ 38734229Speter : (n) == 1 ? 2 \ 38834229Speter : (n) == 2 ? 1 \ 38934229Speter : (n) == 3 ? 3 \ 39034229Speter : (n) == 4 ? 6 \ 39134229Speter : (n) == 5 ? 7 \ 39234229Speter : (n) == 6 ? 5 \ 39334229Speter : (n) == 7 ? 4 \ 39434229Speter : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ 39534229Speter : (-1)) 39634229Speter 39734229Speter/* Now what stabs expects in the register. */ 39852112Sobrien#undef STABS_DBX_REGISTER_NUMBER 39934229Speter#define STABS_DBX_REGISTER_NUMBER(n) \ 40034229Speter((n) == 0 ? 0 : \ 40134229Speter (n) == 1 ? 2 : \ 40234229Speter (n) == 2 ? 1 : \ 40334229Speter (n) == 3 ? 3 : \ 40434229Speter (n) == 4 ? 6 : \ 40534229Speter (n) == 5 ? 7 : \ 40634229Speter (n) == 6 ? 4 : \ 40734229Speter (n) == 7 ? 5 : \ 40834229Speter (n) + 4) 40934229Speter 41034229Speter#undef DBX_REGISTER_NUMBER 41134229Speter#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ 41234229Speter ? DWARF_DBX_REGISTER_NUMBER(n) \ 41334229Speter : STABS_DBX_REGISTER_NUMBER(n)) 41434229Speter 41518349Speter/* Tell final.c that we don't need a label passed to mcount. */ 41618349Speter#define NO_PROFILE_DATA 41718349Speter 41834229Speter/* Output assembler code to FILE to increment profiler label # LABELNO 41934229Speter for profiling a function entry. */ 42018349Speter/* Redefine this to not pass an unused label in %edx. */ 42118349Speter 42218334Speter#undef FUNCTION_PROFILER 42318334Speter#define FUNCTION_PROFILER(FILE, LABELNO) \ 42418334Speter{ \ 42518334Speter if (flag_pic) \ 42651408Sobrien { \ 42752112Sobrien fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ 42838928Sjdp TARGET_AOUT ? "mcount" : ".mcount"); \ 42951408Sobrien } \ 43018334Speter else \ 43151408Sobrien { \ 43252112Sobrien fprintf ((FILE), "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ 43351408Sobrien } \ 43418349Speter} 43518349Speter 43652112Sobrien#undef FUNCTION_PROFILER_EPILOGUE 43718349Speter#define FUNCTION_PROFILER_EPILOGUE(FILE) \ 43818349Speter{ \ 43918349Speter if (TARGET_PROFILER_EPILOGUE) \ 44018334Speter { \ 44118349Speter if (flag_pic) \ 44252112Sobrien fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", \ 44338928Sjdp TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 44418349Speter else \ 44552112Sobrien fprintf ((FILE), "\tcall %s\n", \ 44638928Sjdp TARGET_AOUT ? "mexitcount" : ".mexitcount"); \ 44718334Speter } \ 44818334Speter} 44918334Speter 45034229Speter#undef SIZE_TYPE 45134229Speter#define SIZE_TYPE "unsigned int" 45234229Speter 45334229Speter#undef PTRDIFF_TYPE 45434229Speter#define PTRDIFF_TYPE "int" 45552112Sobrien 45634229Speter#undef WCHAR_TYPE 45734229Speter#define WCHAR_TYPE "int" 45834229Speter 45952112Sobrien#undef WCHAR_UNSIGNED 46034229Speter#define WCHAR_UNSIGNED 0 46118349Speter 46234229Speter#undef WCHAR_TYPE_SIZE 46334229Speter#define WCHAR_TYPE_SIZE BITS_PER_WORD 46452112Sobrien 46534229Speter#undef CPP_PREDEFINES 46652111Sobrien#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES 46734229Speter 46834229Speter#undef CPP_SPEC 46934229Speter#if TARGET_CPU_DEFAULT == 2 47034229Speter#define CPP_SPEC "\ 47134229Speter%{!maout: -D__ELF__} \ 47234229Speter%{munderscores: -D__UNDERSCORES__} \ 47334229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 47434229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}" 47534229Speter#else 47634229Speter#define CPP_SPEC "\ 47734229Speter%{!maout: -D__ELF__} \ 47834229Speter%{munderscores: -D__UNDERSCORES__} \ 47934229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 48034229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}" 48118334Speter#endif 48218334Speter 48334229Speter#undef CC1_SPEC 48434229Speter#define CC1_SPEC "\ 48534229Speter%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ 48634229Speter%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" 48718334Speter 48834229Speter#undef ASM_SPEC 48934229Speter#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" 49018334Speter 49134229Speter/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support 49234229Speter for the special GCC options -static and -shared, which allow us to 49334229Speter link things in one of these three modes by applying the appropriate 49434229Speter combinations of options at link-time. We like to support here for 49534229Speter as many of the other GNU linker options as possible. But I don't 49634229Speter have the time to search for those flags. I am sure how to add 49734229Speter support for -soname shared_object_name. H.J. 49818334Speter 49951408Sobrien I took out %{v:%{!V:-V}}. It is too much :-(. They can use 50051408Sobrien -Wl,-V. 50151408Sobrien 50234229Speter When the -shared link option is used a final link is not being 50334229Speter done. */ 50418334Speter 50534229Speter#undef LINK_SPEC 50634229Speter#define LINK_SPEC "\ 50734229Speter %{p:%e`-p' not supported; use `-pg' and gprof(1)} \ 50834229Speter %{maout: %{shared:-Bshareable} \ 50934229Speter %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \ 51034229Speter %{pg:-Bstatic} %{Z}} \ 51134229Speter %{assert*} %{R*}} \ 51234229Speter %{!maout: \ 51334229Speter -m elf_i386 \ 51434229Speter %{Wl,*:%*} \ 51534229Speter %{assert*} %{R*} %{rpath*} %{defsym*} \ 51634314Speter %{shared:-Bshareable %{h*} %{soname*}} \ 51734229Speter %{symbolic:-Bsymbolic} \ 51834229Speter %{!shared: \ 51934229Speter %{!static: \ 52034229Speter %{rdynamic: -export-dynamic} \ 52134229Speter %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ 52234229Speter %{static:-Bstatic}}}" 52318334Speter 52451408Sobrien/* A C statement to output to the stdio stream FILE an assembler 52551408Sobrien command to advance the location counter to a multiple of 1<<LOG 52651408Sobrien bytes if it is within MAX_SKIP bytes. 52718334Speter 52851408Sobrien This is used to align code labels according to Intel recommendations. */ 52951408Sobrien 53051408Sobrien#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN 53151408Sobrien#error "we don't have this for the aout gas" 53252112Sobrien#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ 53352112Sobrien if ((LOG)!=0) \ 53452112Sobrien if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ 53551408Sobrien else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) 53651408Sobrien#endif 53751408Sobrien 53834229Speter#undef STARTFILE_SPEC 53934229Speter#define STARTFILE_SPEC "\ 54034229Speter %{maout: %{shared:c++rt0.o%s} \ 54134229Speter %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \ 54234229Speter %{!maout: %{!shared: \ 54334229Speter %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \ 54434229Speter crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" 54518334Speter 54634229Speter#undef ENDFILE_SPEC 54734229Speter#define ENDFILE_SPEC \ 54834229Speter "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}" 54934229Speter 55034229Speter/* This goes away when the math emulator is fixed. */ 55134229Speter#undef TARGET_DEFAULT 55234229Speter#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301) 55334229Speter 55451408Sobrien/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the 55551408Sobrien DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with 55651408Sobrien the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions 55751408Sobrien type exception machanism. */ 55851408Sobrien#define DWARF2_UNWIND_INFO 0 559