freebsd.h revision 34314
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 12234285Speter/* Identify the front-end which produced this file. To keep symbol 12334285Speter space down, and not confuse kdb, only do this if the language is 12434285Speter not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ 12534285Speter#undef ASM_IDENTIFY_LANGUAGE 12634285Speter#define ASM_IDENTIFY_LANGUAGE(STREAM) \ 12734285Speter{ \ 12834285Speter if (strcmp (lang_identify (), "c") != 0) \ 12934285Speter output_lang_identify (STREAM); \ 13034285Speter} 13134285Speter 13234229Speter/* This is how to store into the string BUF 13334229Speter the symbol_ref name of an internal numbered label where 13434229Speter PREFIX is the class of label and NUM is the number within the class. 13534229Speter This is suitable for output with `assemble_name'. */ 13634229Speter#undef ASM_GENERATE_INTERNAL_LABEL 13734229Speter#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ 13834229Speter sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ 13934229Speter (PREFIX), (NUMBER)) 14018349Speter 14134229Speter/* This is how to output an internal numbered label where 14234229Speter PREFIX is the class of label and NUM is the number within the class. */ 14334229Speter#undef ASM_OUTPUT_INTERNAL_LABEL 14434229Speter#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ 14534229Speter fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ 14634229Speter PREFIX, NUM) 14718334Speter 14834229Speter/* This is how to output a reference to a user-level label named NAME. */ 14934229Speter#undef ASM_OUTPUT_LABELREF 15034229Speter#define ASM_OUTPUT_LABELREF(FILE,NAME) \ 15134229Speter fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME) 15218349Speter 15318334Speter 15434229Speter/* This is how to output an element of a case-vector that is relative. 15534229Speter This is only used for PIC code. See comments by the `casesi' insn in 15634229Speter i386.md for an explanation of the expression this outputs. */ 15734229Speter#undef ASM_OUTPUT_ADDR_DIFF_ELT 15834229Speter#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ 15934229Speter fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) 16018349Speter 16134229Speter#undef ASM_OUTPUT_ALIGN 16234229Speter#define ASM_OUTPUT_ALIGN(FILE,LOG) \ 16334229Speter if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG)) 16418349Speter 16534229Speter/* Align labels, etc. at 4-byte boundaries. 16634229Speter For the 486, align to 16-byte boundary for sake of cache. */ 16734229Speter#undef ASM_OUTPUT_ALIGN_CODE 16834229Speter#define ASM_OUTPUT_ALIGN_CODE(FILE) \ 16934229Speter fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_jumps) 17018349Speter 17134229Speter/* Align start of loop at 4-byte boundary. */ 17234229Speter#undef ASM_OUTPUT_LOOP_ALIGN 17334229Speter#define ASM_OUTPUT_LOOP_ALIGN(FILE) \ 17434229Speter fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_loops) 17518334Speter 17618334Speter 17734229Speter/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ 17834229Speter#undef USE_CONST_SECTION 17934229Speter#define USE_CONST_SECTION TARGET_ELF 18018334Speter 18134229Speter/* A C statement (sans semicolon) to output an element in the table of 18234229Speter global constructors. */ 18334229Speter#undef ASM_OUTPUT_CONSTRUCTOR 18434229Speter#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \ 18534229Speter do { \ 18634229Speter if (TARGET_ELF) { \ 18734229Speter ctors_section (); \ 18834229Speter fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 18934229Speter assemble_name (FILE, NAME); \ 19034229Speter fprintf (FILE, "\n"); \ 19134229Speter } else { \ 19234229Speter fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 19334229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 19434229Speter assemble_name (asm_out_file, name); \ 19534229Speter fputc ('\n', asm_out_file); \ 19634229Speter } \ 19734229Speter } while (0) 19818334Speter 19934229Speter/* A C statement (sans semicolon) to output an element in the table of 20034229Speter global destructors. */ 20134229Speter#undef ASM_OUTPUT_DESTRUCTOR 20234229Speter#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \ 20334229Speter do { \ 20434229Speter if (TARGET_ELF) { \ 20534229Speter dtors_section (); \ 20634229Speter fprintf (FILE, "\t%s\t ", INT_ASM_OP); \ 20734229Speter assemble_name (FILE, NAME); \ 20834229Speter fprintf (FILE, "\n"); \ 20934229Speter } else { \ 21034229Speter fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \ 21134229Speter (TARGET_UNDERSCORES) ? "_" : ""); \ 21234229Speter assemble_name (asm_out_file, name); \ 21334229Speter fputc ('\n', asm_out_file); \ 21434229Speter } \ 21534229Speter } while (0) 21618334Speter 21734229Speter/* This says how to output assembler code to declare an 21834229Speter uninitialized internal linkage data object. Under SVR4, 21934229Speter the linker seems to want the alignment of data objects 22034229Speter to depend on their types. We do exactly that here. */ 22118334Speter 22234229Speter#undef ASM_OUTPUT_ALIGNED_LOCAL 22334229Speter#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ 22434229Speterdo { \ 22534229Speter if (TARGET_ELF) { \ 22634229Speter fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ 22734229Speter assemble_name ((FILE), (NAME)); \ 22834229Speter fprintf ((FILE), "\n"); \ 22934229Speter ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ 23034229Speter } else { \ 23134229Speter int rounded = (SIZE); \ 23234229Speter if (rounded == 0) rounded = 1; \ 23334229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 23434229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 23534229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 23634229Speter fputs (".lcomm ", (FILE)); \ 23734229Speter assemble_name ((FILE), (NAME)); \ 23834229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 23934229Speter } \ 24034229Speter} while (0) 24118349Speter 24234229Speter#undef ASM_OUTPUT_ALIGNED_COMMON 24334229Speter#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ 24434229Speterdo { \ 24534229Speter if (TARGET_ELF) { \ 24634229Speter fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ 24734229Speter assemble_name ((FILE), (NAME)); \ 24834229Speter fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ 24934229Speter } else { \ 25034229Speter int rounded = (SIZE); \ 25134229Speter if (rounded == 0) rounded = 1; \ 25234229Speter rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \ 25334229Speter rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \ 25434229Speter * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \ 25534229Speter fputs (".comm ", (FILE)); \ 25634229Speter assemble_name ((FILE), (NAME)); \ 25734229Speter fprintf ((FILE), ",%u\n", (rounded)); \ 25834229Speter } \ 25934229Speter} while (0) 26018349Speter 26134229Speter/* Turn off svr4.h version, it chokes the old gas. The old layout 26234229Speter works fine under new gas anyway. */ 26334229Speter#undef ASM_OUTPUT_ASCII 26418334Speter 26534229Speter/* How to output some space */ 26634229Speter#undef ASM_OUTPUT_SKIP 26734229Speter#define ASM_OUTPUT_SKIP(FILE,SIZE) \ 26834229Speterdo { \ 26934229Speter if (TARGET_ELF) { \ 27034229Speter fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \ 27134229Speter } else { \ 27234229Speter fprintf (FILE, "\t.space %u\n", (SIZE)); \ 27334229Speter } \ 27434229Speter} while (0) 27518334Speter 27634229Speter#undef ASM_OUTPUT_SOURCE_LINE 27734229Speter#define ASM_OUTPUT_SOURCE_LINE(file, line) \ 27834229Speterdo { \ 27934229Speter static int sym_lineno = 1; \ 28034229Speter if (TARGET_ELF) { \ 28134229Speter fprintf (file, ".stabn 68,0,%d,.LM%d-", line, sym_lineno); \ 28234229Speter assemble_name (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\ 28334229Speter fprintf (file, "\n.LM%d:\n", sym_lineno); \ 28434229Speter sym_lineno += 1; \ 28534229Speter } else { \ 28634229Speter fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \ 28734229Speter } \ 28834229Speter} while (0) 28918334Speter 29034284Speter/* in elf, the function stabs come first, before the relative offsets */ 29134269Speter#undef DBX_FUNCTION_FIRST 29234269Speter#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF 29334269Speter 29434284Speter/* tag end of file in elf mode */ 29534284Speter#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END 29634284Speter#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ 29734284Speterdo { \ 29834284Speter if (TARGET_ELF) { \ 29934284Speter fprintf (FILE, "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", N_SO); \ 30034284Speter } \ 30134284Speter} while (0) 30234284Speter 30334229Speter/* stabs-in-elf has offsets relative to function beginning */ 30434229Speter#undef DBX_OUTPUT_LBRAC 30534229Speter#define DBX_OUTPUT_LBRAC(file,name) \ 30634229Speterdo { \ 30734229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \ 30834229Speter assemble_name (asmfile, buf); \ 30934229Speter if (TARGET_ELF) { \ 31034229Speter fputc ('-', asmfile); \ 31134229Speter assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ 31234229Speter } \ 31334229Speter fprintf (asmfile, "\n"); \ 31434229Speter} while (0) 31518334Speter 31634229Speter#undef DBX_OUTPUT_RBRAC 31734229Speter#define DBX_OUTPUT_RBRAC(file,name) \ 31834229Speterdo { \ 31934229Speter fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \ 32034229Speter assemble_name (asmfile, buf); \ 32134229Speter if (TARGET_ELF) { \ 32234229Speter fputc ('-', asmfile); \ 32334229Speter assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \ 32434229Speter } \ 32534229Speter fprintf (asmfile, "\n"); \ 32634229Speter} while (0) 32734229Speter 32834229Speter 32934229Speter/* Define macro used to output shift-double opcodes when the shift 33034229Speter count is in %cl. Some assemblers require %cl as an argument; 33134229Speter some don't. 33234229Speter 33334229Speter *OLD* GAS requires the %cl argument, so override i386/unix.h. */ 33434229Speter 33534229Speter#undef AS3_SHIFT_DOUBLE 33634229Speter#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d) 33734229Speter 33818334Speter/* Indicate that jump tables go in the text section. This is 33918334Speter necessary when compiling PIC code. */ 34018334Speter#define JUMP_TABLES_IN_TEXT_SECTION 34118334Speter 34234229Speter/* override the exception table positioning */ 34334229Speter#define EXCEPTION_SECTION_FUNCTION \ 34434229Speterdo { \ 34534229Speter if (TARGET_ELF) { \ 34634229Speter named_section (NULL_TREE, ".gcc_except_table"); \ 34734229Speter } else { \ 34834229Speter if (flag_pic) \ 34934229Speter data_section (); \ 35034229Speter else \ 35134229Speter readonly_data_section (); \ 35234229Speter } \ 35334229Speter} while (0); 35418334Speter 35534229Speter/* supply our own hook for calling __main() from main() */ 35634229Speter#define GEN_CALL__MAIN \ 35734229Speter do { \ 35834229Speter if (!(TARGET_ELF)) \ 35934229Speter emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ 36034229Speter VOIDmode, 0); \ 36134229Speter } while (0) 36234229Speter 36334229Speter/* Map i386 registers to the numbers dwarf expects. Of course this is different 36434229Speter from what stabs expects. */ 36534229Speter 36634229Speter#undef DWARF_DBX_REGISTER_NUMBER 36734229Speter#define DWARF_DBX_REGISTER_NUMBER(n) \ 36834229Speter((n) == 0 ? 0 \ 36934229Speter : (n) == 1 ? 2 \ 37034229Speter : (n) == 2 ? 1 \ 37134229Speter : (n) == 3 ? 3 \ 37234229Speter : (n) == 4 ? 6 \ 37334229Speter : (n) == 5 ? 7 \ 37434229Speter : (n) == 6 ? 5 \ 37534229Speter : (n) == 7 ? 4 \ 37634229Speter : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ 37734229Speter : (-1)) 37834229Speter 37934229Speter/* Now what stabs expects in the register. */ 38034229Speter#define STABS_DBX_REGISTER_NUMBER(n) \ 38134229Speter((n) == 0 ? 0 : \ 38234229Speter (n) == 1 ? 2 : \ 38334229Speter (n) == 2 ? 1 : \ 38434229Speter (n) == 3 ? 3 : \ 38534229Speter (n) == 4 ? 6 : \ 38634229Speter (n) == 5 ? 7 : \ 38734229Speter (n) == 6 ? 4 : \ 38834229Speter (n) == 7 ? 5 : \ 38934229Speter (n) + 4) 39034229Speter 39134229Speter#undef DBX_REGISTER_NUMBER 39234229Speter#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ 39334229Speter ? DWARF_DBX_REGISTER_NUMBER(n) \ 39434229Speter : STABS_DBX_REGISTER_NUMBER(n)) 39534229Speter 39618349Speter/* Tell final.c that we don't need a label passed to mcount. */ 39718349Speter#define NO_PROFILE_DATA 39818349Speter 39934229Speter/* Output assembler code to FILE to increment profiler label # LABELNO 40034229Speter for profiling a function entry. */ 40118349Speter/* Redefine this to not pass an unused label in %edx. */ 40218349Speter 40318334Speter#undef FUNCTION_PROFILER 40418334Speter#define FUNCTION_PROFILER(FILE, LABELNO) \ 40518334Speter{ \ 40618334Speter if (flag_pic) \ 40718349Speter fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ 40818334Speter else \ 40918349Speter fprintf (FILE, "\tcall mcount\n"); \ 41018349Speter} 41118349Speter 41218349Speter#define FUNCTION_PROFILER_EPILOGUE(FILE) \ 41318349Speter{ \ 41418349Speter if (TARGET_PROFILER_EPILOGUE) \ 41518334Speter { \ 41618349Speter if (flag_pic) \ 41718349Speter fprintf (FILE, "\tcall *mexitcount@GOT(%%ebx)\n"); \ 41818349Speter else \ 41918349Speter fprintf (FILE, "\tcall mexitcount\n"); \ 42018334Speter } \ 42118334Speter} 42218334Speter 42334229Speter#undef SIZE_TYPE 42434229Speter#define SIZE_TYPE "unsigned int" 42534229Speter 42634229Speter#undef PTRDIFF_TYPE 42734229Speter#define PTRDIFF_TYPE "int" 42834229Speter 42934229Speter#undef WCHAR_TYPE 43034229Speter#define WCHAR_TYPE "int" 43134229Speter 43234229Speter#define WCHAR_UNSIGNED 0 43318349Speter 43434229Speter#undef WCHAR_TYPE_SIZE 43534229Speter#define WCHAR_TYPE_SIZE BITS_PER_WORD 43618334Speter 43734229Speter/* FREEBSD_NATIVE is defined when gcc is integrated into the FreeBSD 43834229Speter source tree so it can be configured appropriately without using 43934229Speter the GNU configure/build mechanism. */ 44018334Speter 44134229Speter#ifdef FREEBSD_NATIVE 44218349Speter 44334229Speter/* Look for the include files in the system-defined places. */ 44418334Speter 44534229Speter#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++" 44618334Speter 44734229Speter#define GCC_INCLUDE_DIR "/usr/include" 44818334Speter 44934229Speter/* FreeBSD has GCC_INCLUDE_DIR first. */ 45034229Speter#define INCLUDE_DEFAULTS \ 45134229Speter { \ 45234229Speter { GCC_INCLUDE_DIR, 0, 0 }, \ 45334229Speter { GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \ 45434229Speter { 0, 0, 0 } \ 45534229Speter } 45634229Speter 45734229Speter/* Under FreeBSD, the normal location of the compiler back ends is the 45834229Speter /usr/libexec directory. */ 45934229Speter 46034229Speter#define STANDARD_EXEC_PREFIX "/usr/libexec/" 46134229Speter 46234229Speter/* Under FreeBSD, the normal location of the various *crt*.o files is the 46334229Speter /usr/lib directory. */ 46434229Speter 46534229Speter#define STANDARD_STARTFILE_PREFIX "/usr/lib/" 46634229Speter 46734229Speter/* On FreeBSD, gcc is called 'cc' */ 46834229Speter#define GCC_NAME "cc" 46934229Speter 47034229Speter/* FreeBSD is 4.4BSD derived */ 47134229Speter#define bsd4_4 47234229Speter 47334229Speter#endif /* FREEBSD_NATIVE */ 47434229Speter 47534229Speter#undef CPP_PREDEFINES 47634229Speter#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)" 47734229Speter 47834229Speter#undef CPP_SPEC 47934229Speter#if TARGET_CPU_DEFAULT == 2 48034229Speter#define CPP_SPEC "\ 48134229Speter%{!maout: -D__ELF__} \ 48234229Speter%{munderscores: -D__UNDERSCORES__} \ 48334229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 48434229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}" 48534229Speter#else 48634229Speter#define CPP_SPEC "\ 48734229Speter%{!maout: -D__ELF__} \ 48834229Speter%{munderscores: -D__UNDERSCORES__} \ 48934229Speter%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \ 49034229Speter%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}" 49118334Speter#endif 49218334Speter 49334229Speter#undef CC1_SPEC 49434229Speter#define CC1_SPEC "\ 49534229Speter%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ 49634229Speter%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" 49718334Speter 49834229Speter#undef ASM_SPEC 49934229Speter#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" 50018334Speter 50134229Speter/* Like the default, except no -lg, and no -p. */ 50234229Speter#undef LIB_SPEC 50334230Speter#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}}}" 50418334Speter 50534229Speter/* Let gcc locate this for us according to the -m rules */ 50634229Speter#undef LIBGCC_SPEC 50734229Speter#define LIBGCC_SPEC "%{!shared:libgcc.a%s}" 50818334Speter 50934229Speter/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support 51034229Speter for the special GCC options -static and -shared, which allow us to 51134229Speter link things in one of these three modes by applying the appropriate 51234229Speter combinations of options at link-time. We like to support here for 51334229Speter as many of the other GNU linker options as possible. But I don't 51434229Speter have the time to search for those flags. I am sure how to add 51534229Speter support for -soname shared_object_name. H.J. 51618334Speter 51734229Speter When the -shared link option is used a final link is not being 51834229Speter done. */ 51918334Speter 52034229Speter#undef LINK_SPEC 52134229Speter#define LINK_SPEC "\ 52234229Speter %{p:%e`-p' not supported; use `-pg' and gprof(1)} \ 52334229Speter %{maout: %{shared:-Bshareable} \ 52434229Speter %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \ 52534229Speter %{pg:-Bstatic} %{Z}} \ 52634229Speter %{assert*} %{R*}} \ 52734229Speter %{!maout: \ 52834229Speter -m elf_i386 \ 52934229Speter %{Wl,*:%*} \ 53034229Speter %{assert*} %{R*} %{rpath*} %{defsym*} \ 53134314Speter %{shared:-Bshareable %{h*} %{soname*}} \ 53234229Speter %{symbolic:-Bsymbolic} \ 53334229Speter %{!shared: \ 53434229Speter %{!static: \ 53534229Speter %{rdynamic: -export-dynamic} \ 53634229Speter %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ 53734229Speter %{static:-Bstatic}}}" 53818334Speter 53934229Speter/* Get perform_* macros to build libgcc.a. */ 54034229Speter#include "i386/perform.h" 54118334Speter 54234229Speter#undef STARTFILE_SPEC 54334229Speter#define STARTFILE_SPEC "\ 54434229Speter %{maout: %{shared:c++rt0.o%s} \ 54534229Speter %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \ 54634229Speter %{!maout: %{!shared: \ 54734229Speter %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \ 54834229Speter crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" 54918334Speter 55034229Speter#undef ENDFILE_SPEC 55134229Speter#define ENDFILE_SPEC \ 55234229Speter "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}" 55334229Speter 55434229Speter/* This goes away when the math emulator is fixed. */ 55534229Speter#undef TARGET_DEFAULT 55634229Speter#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301) 55734229Speter 55834229Speter#define HAVE_ATEXIT 55934229Speter#define HAVE_PUTENV 56034229Speter 56134229Speter/* to assist building libgcc2.c */ 56234229Speter#ifndef __ELF__ 56334229Speter#undef OBJECT_FORMAT_ELF 56434229Speter#endif 565