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