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