freebsd.h revision 34230
134229Speter/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format 234229Speter Copyright (C) 1994, 1995 Free Software Foundation, Inc. 334229Speter Contributed by Eric Youngdale. 434229Speter Modified for stabs-in-ELF by H.J. Lu. 534229Speter Adapted from Linux version by John Polstra. 634229Speter Added support for generating "old a.out gas" on the fly by Peter Wemm. 718334Speter 818334SpeterThis file is part of GNU CC. 918334Speter 1018334SpeterGNU CC is free software; you can redistribute it and/or modify 1118334Speterit under the terms of the GNU General Public License as published by 1218334Speterthe Free Software Foundation; either version 2, or (at your option) 1318334Speterany later version. 1418334Speter 1518334SpeterGNU CC is distributed in the hope that it will be useful, 1618334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of 1718334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1818334SpeterGNU General Public License for more details. 1918334Speter 2018334SpeterYou should have received a copy of the GNU General Public License 2118334Speteralong with GNU CC; see the file COPYING. If not, write to 2218334Speterthe Free Software Foundation, 59 Temple Place - Suite 330, 2318334SpeterBoston, MA 02111-1307, USA. */ 2418334Speter 2534229Speter/* A lie, I guess, but the general idea behind FreeBSD/ELF is that we are 2634229Speter supposed to be outputting something that will assemble under SVr4. 2734229Speter This gets us pretty close. */ 2834229Speter#include <i386/i386.h> /* Base i386 target machine definitions */ 2934229Speter#include <i386/att.h> /* Use the i386 AT&T assembler syntax */ 3034229Speter#include <linux.h> /* some common stuff */ 3118334Speter 3218334Speter/* Don't assume anything about the header files. */ 3318334Speter#define NO_IMPLICIT_EXTERN_C 3418334Speter 3534229Speter/* This defines which switch letters take arguments. On svr4, most of 3634229Speter the normal cases (defined in gcc.c) apply, and we also have -h* and 3734229Speter -z* options (for the linker). We have a slightly different mix. We 3834229Speter have -R (alias --rpath), no -z, --soname (-h), --assert etc. */ 3918334Speter 4034229Speter#undef SWITCH_TAKES_ARG 4134229Speter#define SWITCH_TAKES_ARG(CHAR) \ 4234229Speter ( (CHAR) == 'D' \ 4334229Speter || (CHAR) == 'U' \ 4434229Speter || (CHAR) == 'o' \ 4534229Speter || (CHAR) == 'e' \ 4634229Speter || (CHAR) == 'T' \ 4734229Speter || (CHAR) == 'u' \ 4834229Speter || (CHAR) == 'I' \ 4934229Speter || (CHAR) == 'm' \ 5034229Speter || (CHAR) == 'L' \ 5134229Speter || (CHAR) == 'A' \ 5234229Speter || (CHAR) == 'h' \ 5334229Speter || (CHAR) == 'z' /* ignored by ld */ \ 5434229Speter || (CHAR) == 'R') 5518334Speter 5634229Speter#undef WORD_SWITCH_TAKES_ARG 5734229Speter#define WORD_SWITCH_TAKES_ARG(STR) \ 5834229Speter (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ 5934229Speter || !strcmp (STR, "rpath") || !strcmp (STR, "rpath-link") \ 6034229Speter || !strcmp (STR, "soname") || !strcmp (STR, "defsym") \ 6134229Speter || !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker")) 6218349Speter 6334229Speter#undef TARGET_VERSION 6434229Speter#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)"); 6518349Speter 6634229Speter#define MASK_PROFILER_EPILOGUE 010000000000 6734229Speter#define MASK_AOUT 004000000000 /* a.out not elf */ 6834229Speter#define MASK_UNDERSCORES 002000000000 /* use leading _ */ 6918349Speter 7034229Speter#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE) 7134229Speter#define TARGET_AOUT (target_flags & MASK_AOUT) 7234229Speter#define TARGET_ELF ((target_flags & MASK_AOUT) == 0) 7334229Speter#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0) 7418349Speter 7534229Speter#undef SUBTARGET_SWITCHES 7634229Speter#define SUBTARGET_SWITCHES \ 7734229Speter { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \ 7834229Speter { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \ 7934229Speter { "aout", MASK_AOUT}, \ 8034229Speter { "no-aout", -MASK_AOUT}, \ 8134229Speter { "underscores", MASK_UNDERSCORES}, \ 8234229Speter { "no-underscores", -MASK_UNDERSCORES}, 8318349Speter 8434229Speter/* The svr4 ABI for the i386 says that records and unions are returned 8534229Speter in memory. */ 8634229Speter/* On FreeBSD, we do not. */ 8734229Speter#undef DEFAULT_PCC_STRUCT_RETURN 8834229Speter#define DEFAULT_PCC_STRUCT_RETURN 0 8918349Speter 9034229Speter#define SUPPORTS_WEAK TARGET_ELF 9118349Speter 9234229Speter/* Prefix for internally generated assembler labels. If we aren't using 9334229Speter underscores, we are using prefix `.'s to identify labels that should 9434229Speter be ignored, as in `i386/gas.h' --karl@cs.umb.edu */ 9534229Speter#undef LPREFIX 9634229Speter#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L") 9718349Speter 9834229Speter/* Override the default comment-starter of "/". */ 9934229Speter#undef ASM_COMMENT_START 10034229Speter#define ASM_COMMENT_START "#" 10118349Speter 10234229Speter#undef COMMENT_BEGIN 10334229Speter#define COMMENT_BEGIN "#" 10418349Speter 10534229Speter#undef ASM_APP_ON 10634229Speter#define ASM_APP_ON "#APP\n" 10718349Speter 10834229Speter#undef ASM_APP_OFF 10934229Speter#define ASM_APP_OFF "#NO_APP\n" 11018349Speter 11134229Speter/* Output at beginning of assembler file. */ 11234229Speter/* The .file command should always begin the output. */ 11318349Speter 11434229Speter#undef ASM_FILE_START 11534229Speter#define ASM_FILE_START(FILE) \ 11634229Speter do { \ 11734229Speter output_file_directive (FILE, main_input_filename); \ 11834229Speter if (TARGET_ELF) \ 11934229Speter fprintf (FILE, "\t.version\t\"01.01\"\n"); \ 12034229Speter } while (0) 12118349Speter 12234229Speter/* This is how to store into the string BUF 12334229Speter the symbol_ref name of an internal numbered label where 12434229Speter PREFIX is the class of label and NUM is the number within the class. 12534229Speter This is suitable for output with `assemble_name'. */ 12634229Speter#undef ASM_GENERATE_INTERNAL_LABEL 12734229Speter#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ 12834229Speter sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ 12934229Speter (PREFIX), (NUMBER)) 13018349Speter 13134229Speter/* This is how to output an internal numbered label where 13234229Speter PREFIX is the class of label and NUM is the number within the class. */ 13334229Speter#undef ASM_OUTPUT_INTERNAL_LABEL 13434229Speter#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 13534229Speter fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ 13634229Speter PREFIX, NUM) 13718334Speter 13834229Speter/* This is how to output a reference to a user-level label named NAME. */ 13934229Speter#undef ASM_OUTPUT_LABELREF 14034229Speter#define ASM_OUTPUT_LABELREF(FILE,NAME) \ 14134229Speter fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME) 14218349Speter 14318334Speter 14434229Speter/* This is how to output an element of a case-vector that is relative. 14534229Speter This is only used for PIC code. See comments by the `casesi' insn in 14634229Speter i386.md for an explanation of the expression this outputs. */ 14734229Speter#undef ASM_OUTPUT_ADDR_DIFF_ELT 14834229Speter#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ 14934229Speter fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) 15018349Speter 15134229Speter#undef ASM_OUTPUT_ALIGN 15234229Speter#define ASM_OUTPUT_ALIGN(FILE,LOG) \ 15334229Speter if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG)) 15418349Speter 15534229Speter/* Align labels, etc. at 4-byte boundaries. 15634229Speter For the 486, align to 16-byte boundary for sake of cache. */ 15734229Speter#undef ASM_OUTPUT_ALIGN_CODE 15834229Speter#define ASM_OUTPUT_ALIGN_CODE(FILE) \ 15934229Speter fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_jumps) 16018349Speter 16134229Speter/* Align start of loop at 4-byte boundary. */ 16234229Speter#undef ASM_OUTPUT_LOOP_ALIGN 16334229Speter#define ASM_OUTPUT_LOOP_ALIGN(FILE) \ 16434229Speter fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_loops) 16518334Speter 16618334Speter 16734229Speter/* A C statement to output assembler commands which will identify the object 16834229Speter file as having been compile with GNU CC. We don't need or want this for 16934229Speter GDB. */ 17034229Speter#undef ASM_IDENTIFY_GCC 17134229Speter#define ASM_IDENTIFY_GCC(FILE) 17218334Speter 17334229Speter/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ 17434229Speter#undef USE_CONST_SECTION 17534229Speter#define USE_CONST_SECTION TARGET_ELF 17618334Speter 17734229Speter/* A C statement (sans semicolon) to output an element in the table of 17834229Speter global constructors. */ 17934229Speter#undef ASM_OUTPUT_CONSTRUCTOR 18034229Speter#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ 18134229Speter do { \ 18234229Speter if (TARGET_ELF) { \ 18334229Speter ctors_section (); \ 18434229Speter fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 18534229Speter assemble_name (FILE, NAME); \ 18634229Speter fprintf (FILE, "\n"); \ 18734229Speter } else { \ 18834229Speter fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 18934229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 19034229Speter assemble_name (asm_out_file, name); \ 19134229Speter fputc ('\n', asm_out_file); \ 19234229Speter } \ 19334229Speter } while (0) 19418334Speter 19534229Speter/* A C statement (sans semicolon) to output an element in the table of 19634229Speter global destructors. */ 19734229Speter#undef ASM_OUTPUT_DESTRUCTOR 19834229Speter#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ 19934229Speter do { \ 20034229Speter if (TARGET_ELF) { \ 20134229Speter dtors_section (); \ 20234229Speter fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 20334229Speter assemble_name (FILE, NAME); \ 20434229Speter fprintf (FILE, "\n"); \ 20534229Speter } else { \ 20634229Speter fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 20734229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 20834229Speter assemble_name (asm_out_file, name); \ 20934229Speter fputc ('\n', asm_out_file); \ 21034229Speter } \ 21134229Speter } while (0) 21218334Speter 21334229Speter/* This says how to output assembler code to declare an 21434229Speter uninitialized internal linkage data object. Under SVR4, 21534229Speter the linker seems to want the alignment of data objects 21634229Speter to depend on their types. We do exactly that here. */ 21718334Speter 21834229Speter#undef ASM_OUTPUT_ALIGNED_LOCAL 21934229Speter#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 22034229Speterdo { \ 22134229Speter if (TARGET_ELF) { \ 22234229Speter fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 22334229Speter assemble_name ((FILE), (NAME)); \ 22434229Speter fprintf ((FILE), "\n"); \ 22534229Speter ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 22634229Speter } else { \ 22734229Speter int rounded = (SIZE); \ 22834229Speter if (rounded == 0) rounded = 1; \ 22934229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 23034229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 23134229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 23234229Speter fputs (".lcomm ", (FILE)); \ 23334229Speter assemble_name ((FILE), (NAME)); \ 23434229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 23534229Speter } \ 23634229Speter} while (0) 23718349Speter 23834229Speter#undef ASM_OUTPUT_ALIGNED_COMMON 23934229Speter#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 24034229Speterdo { \ 24134229Speter if (TARGET_ELF) { \ 24234229Speter fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ 24334229Speter assemble_name ((FILE), (NAME)); \ 24434229Speter fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 24534229Speter } else { \ 24634229Speter int rounded = (SIZE); \ 24734229Speter if (rounded == 0) rounded = 1; \ 24834229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 24934229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 25034229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 25134229Speter fputs (".comm ", (FILE)); \ 25234229Speter assemble_name ((FILE), (NAME)); \ 25334229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 25434229Speter } \ 25534229Speter} while (0) 25618349Speter 25734229Speter/* Turn off svr4.h version, it chokes the old gas. The old layout 25834229Speter works fine under new gas anyway. */ 25934229Speter#undef ASM_OUTPUT_ASCII 26018334Speter 26134229Speter/* How to output some space */ 26234229Speter#undef ASM_OUTPUT_SKIP 26334229Speter#define ASM_OUTPUT_SKIP(FILE,SIZE) \ 26434229Speterdo { \ 26534229Speter if (TARGET_ELF) { \ 26634229Speter fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \ 26734229Speter } else { \ 26834229Speter fprintf (FILE, "\t.space %u\n", (SIZE)); \ 26934229Speter } \ 27034229Speter} while (0) 27118334Speter 27234229Speter#undef ASM_OUTPUT_SOURCE_LINE 27334229Speter#define ASM_OUTPUT_SOURCE_LINE(file, line) \ 27434229Speterdo { \ 27534229Speter static int sym_lineno = 1; \ 27634229Speter if (TARGET_ELF) { \ 27734229Speter fprintf (file, ".stabn 68,0,%d,.LM%d-", line, sym_lineno); \ 27834229Speter assemble_name (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\ 27934229Speter fprintf (file, "\n.LM%d:\n", sym_lineno); \ 28034229Speter sym_lineno += 1; \ 28134229Speter } else { \ 28234229Speter fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \ 28334229Speter } \ 28434229Speter} while (0) 28518334Speter 28634229Speter/* stabs-in-elf has offsets relative to function beginning */ 28734229Speter#undef DBX_OUTPUT_LBRAC 28834229Speter#define DBX_OUTPUT_LBRAC(file,name) \ 28934229Speterdo { \ 29034229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ 29134229Speter assemble_name (asmfile, buf); \ 29234229Speter if (TARGET_ELF) { \ 29334229Speter fputc ('-', asmfile); \ 29434229Speter assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ 29534229Speter } \ 29634229Speter fprintf (asmfile, "\n"); \ 29734229Speter} while (0) 29818334Speter 29934229Speter#undef DBX_OUTPUT_RBRAC 30034229Speter#define DBX_OUTPUT_RBRAC(file,name) \ 30134229Speterdo { \ 30234229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ 30334229Speter assemble_name (asmfile, buf); \ 30434229Speter if (TARGET_ELF) { \ 30534229Speter fputc ('-', asmfile); \ 30634229Speter assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ 30734229Speter } \ 30834229Speter fprintf (asmfile, "\n"); \ 30934229Speter} while (0) 31034229Speter 31134229Speter 31234229Speter/* Define macro used to output shift-double opcodes when the shift 31334229Speter count is in %cl. Some assemblers require %cl as an argument; 31434229Speter some don't. 31534229Speter 31634229Speter *OLD* GAS requires the %cl argument, so override i386/unix.h. */ 31734229Speter 31834229Speter#undef AS3_SHIFT_DOUBLE 31934229Speter#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) 32034229Speter 32118334Speter/* Indicate that jump tables go in the text section. This is 32218334Speter necessary when compiling PIC code. */ 32318334Speter#define JUMP_TABLES_IN_TEXT_SECTION 32418334Speter 32534229Speter/* override the exception table positioning */ 32634229Speter#define EXCEPTION_SECTION_FUNCTION \ 32734229Speterdo { \ 32834229Speter if (TARGET_ELF) { \ 32934229Speter named_section (NULL_TREE, ".gcc_except_table"); \ 33034229Speter } else { \ 33134229Speter if (flag_pic) \ 33234229Speter data_section (); \ 33334229Speter else \ 33434229Speter readonly_data_section (); \ 33534229Speter } \ 33634229Speter} while (0); 33718334Speter 33834229Speter/* supply our own hook for calling __main() from main() */ 33934229Speter#define GEN_CALL__MAIN \ 34034229Speter do { \ 34134229Speter if (!(TARGET_ELF)) \ 34234229Speter emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ 34334229Speter VOIDmode, 0); \ 34434229Speter } while (0) 34534229Speter 34634229Speter/* Map i386 registers to the numbers dwarf expects. Of course this is different 34734229Speter from what stabs expects. */ 34834229Speter 34934229Speter#undef DWARF_DBX_REGISTER_NUMBER 35034229Speter#define DWARF_DBX_REGISTER_NUMBER(n) \ 35134229Speter((n) == 0 ? 0 \ 35234229Speter : (n) == 1 ? 2 \ 35334229Speter : (n) == 2 ? 1 \ 35434229Speter : (n) == 3 ? 3 \ 35534229Speter : (n) == 4 ? 6 \ 35634229Speter : (n) == 5 ? 7 \ 35734229Speter : (n) == 6 ? 5 \ 35834229Speter : (n) == 7 ? 4 \ 35934229Speter : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ 36034229Speter : (-1)) 36134229Speter 36234229Speter/* Now what stabs expects in the register. */ 36334229Speter#define STABS_DBX_REGISTER_NUMBER(n) \ 36434229Speter((n) == 0 ? 0 : \ 36534229Speter (n) == 1 ? 2 : \ 36634229Speter (n) == 2 ? 1 : \ 36734229Speter (n) == 3 ? 3 : \ 36834229Speter (n) == 4 ? 6 : \ 36934229Speter (n) == 5 ? 7 : \ 37034229Speter (n) == 6 ? 4 : \ 37134229Speter (n) == 7 ? 5 : \ 37234229Speter (n) + 4) 37334229Speter 37434229Speter#undef DBX_REGISTER_NUMBER 37534229Speter#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ 37634229Speter ? DWARF_DBX_REGISTER_NUMBER(n) \ 37734229Speter : STABS_DBX_REGISTER_NUMBER(n)) 37834229Speter 37918349Speter/* Tell final.c that we don't need a label passed to mcount. */ 38018349Speter#define NO_PROFILE_DATA 38118349Speter 38234229Speter/* Output assembler code to FILE to increment profiler label # LABELNO 38334229Speter for profiling a function entry. */ 38418349Speter/* Redefine this to not pass an unused label in %edx. */ 38518349Speter 38618334Speter#undef FUNCTION_PROFILER 38718334Speter#define FUNCTION_PROFILER(FILE, LABELNO) \ 38818334Speter{ \ 38918334Speter if (flag_pic) \ 39018349Speter fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ 39118334Speter else \ 39218349Speter fprintf (FILE, "\tcall mcount\n"); \ 39318349Speter} 39418349Speter 39518349Speter#define FUNCTION_PROFILER_EPILOGUE(FILE) \ 39618349Speter{ \ 39718349Speter if (TARGET_PROFILER_EPILOGUE) \ 39818334Speter { \ 39918349Speter if (flag_pic) \ 40018349Speter fprintf (FILE, "\tcall *mexitcount@GOT(%%ebx)\n"); \ 40118349Speter else \ 40218349Speter fprintf (FILE, "\tcall mexitcount\n"); \ 40318334Speter } \ 40418334Speter} 40518334Speter 40634229Speter#undef SIZE_TYPE 40734229Speter#define SIZE_TYPE "unsigned int" 40834229Speter 40934229Speter#undef PTRDIFF_TYPE 41034229Speter#define PTRDIFF_TYPE "int" 41134229Speter 41234229Speter#undef WCHAR_TYPE 41334229Speter#define WCHAR_TYPE "int" 41434229Speter 41534229Speter#define WCHAR_UNSIGNED 0 41618349Speter 41734229Speter#undef WCHAR_TYPE_SIZE 41834229Speter#define WCHAR_TYPE_SIZE BITS_PER_WORD 41918334Speter 42034229Speter/* FREEBSD_NATIVE is defined when gcc is integrated into the FreeBSD 42134229Speter source tree so it can be configured appropriately without using 42234229Speter the GNU configure/build mechanism. */ 42318334Speter 42434229Speter#ifdef FREEBSD_NATIVE 42518349Speter 42634229Speter/* Look for the include files in the system-defined places. */ 42718334Speter 42834229Speter#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++" 42918334Speter 43034229Speter#define GCC_INCLUDE_DIR "/usr/include" 43118334Speter 43234229Speter/* FreeBSD has GCC_INCLUDE_DIR first. */ 43334229Speter#define INCLUDE_DEFAULTS \ 43434229Speter { \ 43534229Speter { GCC_INCLUDE_DIR, 0, 0 }, \ 43634229Speter { GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \ 43734229Speter { 0, 0, 0 } \ 43834229Speter } 43934229Speter 44034229Speter/* Under FreeBSD, the normal location of the compiler back ends is the 44134229Speter /usr/libexec directory. */ 44234229Speter 44334229Speter#define STANDARD_EXEC_PREFIX "/usr/libexec/" 44434229Speter 44534229Speter/* Under FreeBSD, the normal location of the various *crt*.o files is the 44634229Speter /usr/lib directory. */ 44734229Speter 44834229Speter#define STANDARD_STARTFILE_PREFIX "/usr/lib/" 44934229Speter 45034229Speter/* On FreeBSD, gcc is called 'cc' */ 45134229Speter#define GCC_NAME "cc" 45234229Speter 45334229Speter/* FreeBSD is 4.4BSD derived */ 45434229Speter#define bsd4_4 45534229Speter 45634229Speter#endif /* FREEBSD_NATIVE */ 45734229Speter 45834229Speter#undef CPP_PREDEFINES 45934229Speter#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)" 46034229Speter 46134229Speter#undef CPP_SPEC 46234229Speter#if TARGET_CPU_DEFAULT == 2 46334229Speter#define CPP_SPEC "\ 46434229Speter%{!maout: -D__ELF__} \ 46534229Speter%{munderscores: -D__UNDERSCORES__} \ 46634229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 46734229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}" 46834229Speter#else 46934229Speter#define CPP_SPEC "\ 47034229Speter%{!maout: -D__ELF__} \ 47134229Speter%{munderscores: -D__UNDERSCORES__} \ 47234229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 47334229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}" 47418334Speter#endif 47518334Speter 47634229Speter#undef CC1_SPEC 47734229Speter#define CC1_SPEC "\ 47834229Speter%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ 47934229Speter%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" 48018334Speter 48134229Speter#undef ASM_SPEC 48234229Speter#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" 48318334Speter 48434229Speter/* Like the default, except no -lg, and no -p. */ 48534229Speter#undef LIB_SPEC 48634230Speter#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:%{!kthread:-lc}%{kthread:-lpthread -lc}}%{pthread:-lc_r}}%{pg:%{!pthread:%{!kthread:-lc_r}%{kthread:-lpthread_p -lc_p}}%{pthread:-lc_r_p}}}" 48718334Speter 48834229Speter/* Let gcc locate this for us according to the -m rules */ 48934229Speter#undef LIBGCC_SPEC 49034229Speter#define LIBGCC_SPEC "%{!shared:libgcc.a%s}" 49118334Speter 49234229Speter/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support 49334229Speter for the special GCC options -static and -shared, which allow us to 49434229Speter link things in one of these three modes by applying the appropriate 49534229Speter combinations of options at link-time. We like to support here for 49634229Speter as many of the other GNU linker options as possible. But I don't 49734229Speter have the time to search for those flags. I am sure how to add 49834229Speter support for -soname shared_object_name. H.J. 49918334Speter 50034229Speter When the -shared link option is used a final link is not being 50134229Speter done. */ 50218334Speter 50334229Speter#undef LINK_SPEC 50434229Speter#define LINK_SPEC "\ 50534229Speter %{p:%e`-p' not supported; use `-pg' and gprof(1)} \ 50634229Speter %{maout: %{shared:-Bshareable} \ 50734229Speter %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \ 50834229Speter %{pg:-Bstatic} %{Z}} \ 50934229Speter %{assert*} %{R*}} \ 51034229Speter %{!maout: \ 51134229Speter -m elf_i386 \ 51234229Speter %{Wl,*:%*} \ 51334229Speter %{assert*} %{R*} %{rpath*} %{defsym*} \ 51434229Speter %{shared:-Bshared %{h*} %{soname*}} \ 51534229Speter %{symbolic:-Bsymbolic} \ 51634229Speter %{!shared: \ 51734229Speter %{!static: \ 51834229Speter %{rdynamic: -export-dynamic} \ 51934229Speter %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ 52034229Speter %{static:-Bstatic}}}" 52118334Speter 52234229Speter/* Get perform_* macros to build libgcc.a. */ 52334229Speter#include "i386/perform.h" 52418334Speter 52534229Speter#undef STARTFILE_SPEC 52634229Speter#define STARTFILE_SPEC "\ 52734229Speter %{maout: %{shared:c++rt0.o%s} \ 52834229Speter %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \ 52934229Speter %{!maout: %{!shared: \ 53034229Speter %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \ 53134229Speter crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" 53218334Speter 53334229Speter#undef ENDFILE_SPEC 53434229Speter#define ENDFILE_SPEC \ 53534229Speter "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}" 53634229Speter 53734229Speter/* This goes away when the math emulator is fixed. */ 53834229Speter#undef TARGET_DEFAULT 53934229Speter#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301) 54034229Speter 54134229Speter#define HAVE_ATEXIT 54234229Speter#define HAVE_PUTENV 54334229Speter 54434229Speter/* to assist building libgcc2.c */ 54534229Speter#ifndef __ELF__ 54634229Speter#undef OBJECT_FORMAT_ELF 54734229Speter#endif 548