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