mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-30 05:36:10 +00:00
This should get us the same functionality we had with GCC 2.7.2.1.
* Support for our dual ELF/a.out building ability * Our custom ASM_* definitions * Our custom debugger and profiling related definitions * Our custom STARTFILE/ENDFILE specs * The stock EGCS 1.1.2 freebsd-elf.h file depended on egcs-1.1.2/gcc/config/linux.h, which included "svr4.h". We will include "svr4.h" via our "tm.h" definition. So add the few bits from "linux.h" we actually needed. * Using our current crtbegin.o/crtend.o we cannot support the DWARF2 unwinding mechanisms. In the future we will switch to the non-sjlj-exceptions type exception machanism. However the `make world' bootstrap problems with the EGCS crtstuff.c must be overcome first. * Our a.out gas doesn't "know" to use NOP's for aligns while in the text section. Thus the a.out alignment generation needed tweaking from what we did with GCC 2.7.2. [from BDE] * The definition of SUPPORTS_ONE_ONLY prevents the compiler from trying to use "linkonce" sections for a.out. The definition of NO_DBX_FUNCTION_END we had causes it to avoid .stabs symbols that the assembler cannot handle for a.out. [from JDP] * The previous "EXCEPTION_SECTION_FUNCTION" is the wrong name for EGCS. It also needed tweaking for EGCS. [from JDP] Also bump __FreeBSD_cc_version to 400002 in case we need to know we are using EGCS at some point.
This commit is contained in:
parent
fc80907389
commit
844dfb548c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=51408
|
@ -1,8 +1,8 @@
|
|||
/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
|
||||
Copyright (C) 1994, 1995 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Contributed by Eric Youngdale.
|
||||
Modified for stabs-in-ELF by H.J. Lu.
|
||||
Adapted from Linux version by John Polstra.
|
||||
Adapted from GNU/Linux version by John Polstra.
|
||||
Added support for generating "old a.out gas" on the fly by Peter Wemm.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
@ -22,33 +22,34 @@ along with GNU CC; see the file COPYING. If not, write to
|
|||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* A lie, I guess, but the general idea behind FreeBSD/ELF is that we are
|
||||
supposed to be outputting something that will assemble under SVr4.
|
||||
This gets us pretty close. */
|
||||
#include <i386/i386.h> /* Base i386 target machine definitions */
|
||||
#include <i386/att.h> /* Use the i386 AT&T assembler syntax */
|
||||
#include <linux.h> /* some common stuff */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)");
|
||||
|
||||
/* The svr4 ABI for the i386 says that records and unions are returned
|
||||
in memory. */
|
||||
/* On FreeBSD, we do not. */
|
||||
#undef DEFAULT_PCC_STRUCT_RETURN
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 0
|
||||
|
||||
/* This gets defined in tm.h->linux.h->svr4.h, and keeps us from using
|
||||
libraries compiled with the native cc, so undef it. */
|
||||
#undef NO_DOLLAR_IN_LABEL
|
||||
|
||||
/* Don't assume anything about the header files. */
|
||||
#undef NO_IMPLICIT_EXTERN_C
|
||||
#define NO_IMPLICIT_EXTERN_C
|
||||
|
||||
/* This defines which switch letters take arguments. On svr4, most of
|
||||
/* This defines which switch letters take arguments. On FreeBSD, most of
|
||||
the normal cases (defined in gcc.c) apply, and we also have -h* and
|
||||
-z* options (for the linker). We have a slightly different mix. We
|
||||
have -R (alias --rpath), no -z, --soname (-h), --assert etc. */
|
||||
-z* options (for the linker) (comming from svr4).
|
||||
We also have -R (alias --rpath), no -z, --soname (-h), --assert etc. */
|
||||
|
||||
#undef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) \
|
||||
( (CHAR) == 'D' \
|
||||
|| (CHAR) == 'U' \
|
||||
|| (CHAR) == 'o' \
|
||||
|| (CHAR) == 'e' \
|
||||
|| (CHAR) == 'T' \
|
||||
|| (CHAR) == 'u' \
|
||||
|| (CHAR) == 'I' \
|
||||
|| (CHAR) == 'm' \
|
||||
|| (CHAR) == 'L' \
|
||||
|| (CHAR) == 'A' \
|
||||
(DEFAULT_SWITCH_TAKES_ARG (CHAR) \
|
||||
|| (CHAR) == 'h' \
|
||||
|| (CHAR) == 'z' /* ignored by ld */ \
|
||||
|| (CHAR) == 'R')
|
||||
|
@ -60,9 +61,6 @@ Boston, MA 02111-1307, USA. */
|
|||
|| !strcmp (STR, "soname") || !strcmp (STR, "defsym") \
|
||||
|| !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker"))
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)");
|
||||
|
||||
#define MASK_PROFILER_EPILOGUE 010000000000
|
||||
#define MASK_AOUT 004000000000 /* a.out not elf */
|
||||
#define MASK_UNDERSCORES 002000000000 /* use leading _ */
|
||||
|
@ -81,12 +79,6 @@ Boston, MA 02111-1307, USA. */
|
|||
{ "underscores", MASK_UNDERSCORES}, \
|
||||
{ "no-underscores", -MASK_UNDERSCORES},
|
||||
|
||||
/* The svr4 ABI for the i386 says that records and unions are returned
|
||||
in memory. */
|
||||
/* On FreeBSD, we do not. */
|
||||
#undef DEFAULT_PCC_STRUCT_RETURN
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 0
|
||||
|
||||
/* Prefix for internally generated assembler labels. If we aren't using
|
||||
underscores, we are using prefix `.'s to identify labels that should
|
||||
be ignored, as in `i386/gas.h' --karl@cs.umb.edu */
|
||||
|
@ -106,6 +98,8 @@ Boston, MA 02111-1307, USA. */
|
|||
#undef ASM_APP_OFF
|
||||
#define ASM_APP_OFF "#NO_APP\n"
|
||||
|
||||
#define SET_ASM_OP ".set"
|
||||
|
||||
/* Output at beginning of assembler file. */
|
||||
/* The .file command should always begin the output. */
|
||||
|
||||
|
@ -153,29 +147,28 @@ Boston, MA 02111-1307, USA. */
|
|||
This is only used for PIC code. See comments by the `casesi' insn in
|
||||
i386.md for an explanation of the expression this outputs. */
|
||||
#undef ASM_OUTPUT_ADDR_DIFF_ELT
|
||||
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
|
||||
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
|
||||
fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
|
||||
|
||||
#undef ASM_OUTPUT_ALIGN
|
||||
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
|
||||
if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG))
|
||||
|
||||
/* Align labels, etc. at 4-byte boundaries.
|
||||
For the 486, align to 16-byte boundary for sake of cache. */
|
||||
#undef ASM_OUTPUT_ALIGN_CODE
|
||||
#define ASM_OUTPUT_ALIGN_CODE(FILE) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_jumps)
|
||||
|
||||
/* Align start of loop at 4-byte boundary. */
|
||||
#undef ASM_OUTPUT_LOOP_ALIGN
|
||||
#define ASM_OUTPUT_LOOP_ALIGN(FILE) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_loops)
|
||||
|
||||
if ((LOG)!=0) { \
|
||||
if (in_text_section()) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG)); \
|
||||
else \
|
||||
fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
|
||||
}
|
||||
|
||||
/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
|
||||
#undef USE_CONST_SECTION
|
||||
#define USE_CONST_SECTION TARGET_ELF
|
||||
|
||||
/* The a.out tools do not support "linkonce" sections. */
|
||||
#define SUPPORTS_ONE_ONLY TARGET_ELF
|
||||
|
||||
/* The a.out tools do not support "Lscope" .stabs symbols. */
|
||||
#define NO_DBX_FUNCTION_END TARGET_AOUT
|
||||
|
||||
/* A C statement (sans semicolon) to output an element in the table of
|
||||
global constructors. */
|
||||
#undef ASM_OUTPUT_CONSTRUCTOR
|
||||
|
@ -285,6 +278,16 @@ do { \
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#undef DEFAULT_VTABLE_THUNKS
|
||||
#define DEFAULT_VTABLE_THUNKS 1
|
||||
|
||||
/* This is BSD, so we want the DBX format. */
|
||||
#define DBX_DEBUGGING_INFO
|
||||
|
||||
/* Use stabs instead of DWARF debug format. */
|
||||
#undef PREFERRED_DEBUGGING_TYPE
|
||||
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
|
||||
|
||||
/* in elf, the function stabs come first, before the relative offsets */
|
||||
#undef DBX_FUNCTION_FIRST
|
||||
#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
|
||||
|
@ -335,13 +338,13 @@ do { \
|
|||
|
||||
/* Indicate that jump tables go in the text section. This is
|
||||
necessary when compiling PIC code. */
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)
|
||||
|
||||
/* override the exception table positioning */
|
||||
#define EXCEPTION_SECTION_FUNCTION \
|
||||
#define EXCEPTION_SECTION() \
|
||||
do { \
|
||||
if (TARGET_ELF) { \
|
||||
named_section (NULL_TREE, ".gcc_except_table"); \
|
||||
named_section (NULL_TREE, ".gcc_except_table", 0); \
|
||||
} else { \
|
||||
if (flag_pic) \
|
||||
data_section (); \
|
||||
|
@ -358,12 +361,61 @@ do { \
|
|||
VOIDmode, 0); \
|
||||
} while (0)
|
||||
|
||||
/* Use dollar signs in special g++ assembler names. */
|
||||
#undef NO_DOLLAR_IN_LABEL
|
||||
|
||||
/* Map i386 registers to the numbers dwarf expects. Of course this is different
|
||||
from what stabs expects. */
|
||||
|
||||
/* Copy this from the svr4 specifications... */
|
||||
/* Define the register numbers to be used in Dwarf debugging information.
|
||||
The SVR4 reference port C compiler uses the following register numbers
|
||||
in its Dwarf output code:
|
||||
0 for %eax (gnu regno = 0)
|
||||
1 for %ecx (gnu regno = 2)
|
||||
2 for %edx (gnu regno = 1)
|
||||
3 for %ebx (gnu regno = 3)
|
||||
4 for %esp (gnu regno = 7)
|
||||
5 for %ebp (gnu regno = 6)
|
||||
6 for %esi (gnu regno = 4)
|
||||
7 for %edi (gnu regno = 5)
|
||||
The following three DWARF register numbers are never generated by
|
||||
the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
|
||||
believes these numbers have these meanings.
|
||||
8 for %eip (no gnu equivalent)
|
||||
9 for %eflags (no gnu equivalent)
|
||||
10 for %trapno (no gnu equivalent)
|
||||
It is not at all clear how we should number the FP stack registers
|
||||
for the x86 architecture. If the version of SDB on x86/svr4 were
|
||||
a bit less brain dead with respect to floating-point then we would
|
||||
have a precedent to follow with respect to DWARF register numbers
|
||||
for x86 FP registers, but the SDB on x86/svr4 is so completely
|
||||
broken with respect to FP registers that it is hardly worth thinking
|
||||
of it as something to strive for compatibility with.
|
||||
The version of x86/svr4 SDB I have at the moment does (partially)
|
||||
seem to believe that DWARF register number 11 is associated with
|
||||
the x86 register %st(0), but that's about all. Higher DWARF
|
||||
register numbers don't seem to be associated with anything in
|
||||
particular, and even for DWARF regno 11, SDB only seems to under-
|
||||
stand that it should say that a variable lives in %st(0) (when
|
||||
asked via an `=' command) if we said it was in DWARF regno 11,
|
||||
but SDB still prints garbage when asked for the value of the
|
||||
variable in question (via a `/' command).
|
||||
(Also note that the labels SDB prints for various FP stack regs
|
||||
when doing an `x' command are all wrong.)
|
||||
Note that these problems generally don't affect the native SVR4
|
||||
C compiler because it doesn't allow the use of -O with -g and
|
||||
because when it is *not* optimizing, it allocates a memory
|
||||
location for each floating-point variable, and the memory
|
||||
location is what gets described in the DWARF AT_location
|
||||
attribute for the variable in question.
|
||||
Regardless of the severe mental illness of the x86/svr4 SDB, we
|
||||
do something sensible here and we use the following DWARF
|
||||
register numbers. Note that these are all stack-top-relative
|
||||
numbers.
|
||||
11 for %st(0) (gnu regno = 8)
|
||||
12 for %st(1) (gnu regno = 9)
|
||||
13 for %st(2) (gnu regno = 10)
|
||||
14 for %st(3) (gnu regno = 11)
|
||||
15 for %st(4) (gnu regno = 12)
|
||||
16 for %st(5) (gnu regno = 13)
|
||||
17 for %st(6) (gnu regno = 14)
|
||||
18 for %st(7) (gnu regno = 15)
|
||||
*/
|
||||
#undef DWARF_DBX_REGISTER_NUMBER
|
||||
#define DWARF_DBX_REGISTER_NUMBER(n) \
|
||||
((n) == 0 ? 0 \
|
||||
|
@ -405,10 +457,14 @@ do { \
|
|||
#define FUNCTION_PROFILER(FILE, LABELNO) \
|
||||
{ \
|
||||
if (flag_pic) \
|
||||
{ \
|
||||
fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \
|
||||
TARGET_AOUT ? "mcount" : ".mcount"); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define FUNCTION_PROFILER_EPILOGUE(FILE) \
|
||||
|
@ -438,46 +494,8 @@ do { \
|
|||
#undef WCHAR_TYPE_SIZE
|
||||
#define WCHAR_TYPE_SIZE BITS_PER_WORD
|
||||
|
||||
/* FREEBSD_NATIVE is defined when gcc is integrated into the FreeBSD
|
||||
source tree so it can be configured appropriately without using
|
||||
the GNU configure/build mechanism. */
|
||||
|
||||
#ifdef FREEBSD_NATIVE
|
||||
|
||||
/* Look for the include files in the system-defined places. */
|
||||
|
||||
#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
|
||||
|
||||
#define GCC_INCLUDE_DIR "/usr/include"
|
||||
|
||||
/* FreeBSD has GCC_INCLUDE_DIR first. */
|
||||
#define INCLUDE_DEFAULTS \
|
||||
{ \
|
||||
{ GCC_INCLUDE_DIR, 0, 0 }, \
|
||||
{ GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \
|
||||
{ 0, 0, 0 } \
|
||||
}
|
||||
|
||||
/* Under FreeBSD, the normal location of the compiler back ends is the
|
||||
/usr/libexec directory. */
|
||||
|
||||
#define STANDARD_EXEC_PREFIX "/usr/libexec/"
|
||||
|
||||
/* Under FreeBSD, the normal location of the various *crt*.o files is the
|
||||
/usr/lib directory. */
|
||||
|
||||
#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
|
||||
|
||||
/* On FreeBSD, gcc is called 'cc' */
|
||||
#define GCC_NAME "cc"
|
||||
|
||||
/* FreeBSD is 4.4BSD derived */
|
||||
#define bsd4_4
|
||||
|
||||
#endif /* FREEBSD_NATIVE */
|
||||
|
||||
#undef CPP_PREDEFINES
|
||||
#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=4 -D__FreeBSD_cc_version=400001 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
|
||||
#define CPP_PREDEFINES "-Di386 -Dunix -D__FreeBSD__=4 -D__FreeBSD_cc_version=400002 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
|
||||
|
||||
#undef CPP_SPEC
|
||||
#if TARGET_CPU_DEFAULT == 2
|
||||
|
@ -518,6 +536,9 @@ do { \
|
|||
have the time to search for those flags. I am sure how to add
|
||||
support for -soname shared_object_name. H.J.
|
||||
|
||||
I took out %{v:%{!V:-V}}. It is too much :-(. They can use
|
||||
-Wl,-V.
|
||||
|
||||
When the -shared link option is used a final link is not being
|
||||
done. */
|
||||
|
||||
|
@ -540,8 +561,19 @@ do { \
|
|||
%{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
|
||||
%{static:-Bstatic}}}"
|
||||
|
||||
/* Get perform_* macros to build libgcc.a. */
|
||||
#include "i386/perform.h"
|
||||
/* A C statement to output to the stdio stream FILE an assembler
|
||||
command to advance the location counter to a multiple of 1<<LOG
|
||||
bytes if it is within MAX_SKIP bytes.
|
||||
|
||||
This is used to align code labels according to Intel recommendations. */
|
||||
|
||||
#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
|
||||
#error "we don't have this for the aout gas"
|
||||
#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
|
||||
if ((LOG)!=0) \
|
||||
if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
|
||||
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP))
|
||||
#endif
|
||||
|
||||
#undef STARTFILE_SPEC
|
||||
#define STARTFILE_SPEC "\
|
||||
|
@ -560,9 +592,9 @@ do { \
|
|||
#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
|
||||
|
||||
#define HAVE_ATEXIT
|
||||
#define HAVE_PUTENV
|
||||
|
||||
/* to assist building libgcc2.c */
|
||||
#ifndef __ELF__
|
||||
#undef OBJECT_FORMAT_ELF
|
||||
#endif
|
||||
/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the
|
||||
DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with
|
||||
the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions
|
||||
type exception machanism. */
|
||||
#define DWARF2_UNWIND_INFO 0
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
|
||||
Copyright (C) 1994, 1995 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Contributed by Eric Youngdale.
|
||||
Modified for stabs-in-ELF by H.J. Lu.
|
||||
Adapted from Linux version by John Polstra.
|
||||
Adapted from GNU/Linux version by John Polstra.
|
||||
Added support for generating "old a.out gas" on the fly by Peter Wemm.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
@ -22,33 +22,34 @@ along with GNU CC; see the file COPYING. If not, write to
|
|||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* A lie, I guess, but the general idea behind FreeBSD/ELF is that we are
|
||||
supposed to be outputting something that will assemble under SVr4.
|
||||
This gets us pretty close. */
|
||||
#include <i386/i386.h> /* Base i386 target machine definitions */
|
||||
#include <i386/att.h> /* Use the i386 AT&T assembler syntax */
|
||||
#include <linux.h> /* some common stuff */
|
||||
/* $FreeBSD$ */
|
||||
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)");
|
||||
|
||||
/* The svr4 ABI for the i386 says that records and unions are returned
|
||||
in memory. */
|
||||
/* On FreeBSD, we do not. */
|
||||
#undef DEFAULT_PCC_STRUCT_RETURN
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 0
|
||||
|
||||
/* This gets defined in tm.h->linux.h->svr4.h, and keeps us from using
|
||||
libraries compiled with the native cc, so undef it. */
|
||||
#undef NO_DOLLAR_IN_LABEL
|
||||
|
||||
/* Don't assume anything about the header files. */
|
||||
#undef NO_IMPLICIT_EXTERN_C
|
||||
#define NO_IMPLICIT_EXTERN_C
|
||||
|
||||
/* This defines which switch letters take arguments. On svr4, most of
|
||||
/* This defines which switch letters take arguments. On FreeBSD, most of
|
||||
the normal cases (defined in gcc.c) apply, and we also have -h* and
|
||||
-z* options (for the linker). We have a slightly different mix. We
|
||||
have -R (alias --rpath), no -z, --soname (-h), --assert etc. */
|
||||
-z* options (for the linker) (comming from svr4).
|
||||
We also have -R (alias --rpath), no -z, --soname (-h), --assert etc. */
|
||||
|
||||
#undef SWITCH_TAKES_ARG
|
||||
#define SWITCH_TAKES_ARG(CHAR) \
|
||||
( (CHAR) == 'D' \
|
||||
|| (CHAR) == 'U' \
|
||||
|| (CHAR) == 'o' \
|
||||
|| (CHAR) == 'e' \
|
||||
|| (CHAR) == 'T' \
|
||||
|| (CHAR) == 'u' \
|
||||
|| (CHAR) == 'I' \
|
||||
|| (CHAR) == 'm' \
|
||||
|| (CHAR) == 'L' \
|
||||
|| (CHAR) == 'A' \
|
||||
(DEFAULT_SWITCH_TAKES_ARG (CHAR) \
|
||||
|| (CHAR) == 'h' \
|
||||
|| (CHAR) == 'z' /* ignored by ld */ \
|
||||
|| (CHAR) == 'R')
|
||||
|
@ -60,9 +61,6 @@ Boston, MA 02111-1307, USA. */
|
|||
|| !strcmp (STR, "soname") || !strcmp (STR, "defsym") \
|
||||
|| !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker"))
|
||||
|
||||
#undef TARGET_VERSION
|
||||
#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)");
|
||||
|
||||
#define MASK_PROFILER_EPILOGUE 010000000000
|
||||
#define MASK_AOUT 004000000000 /* a.out not elf */
|
||||
#define MASK_UNDERSCORES 002000000000 /* use leading _ */
|
||||
|
@ -81,12 +79,6 @@ Boston, MA 02111-1307, USA. */
|
|||
{ "underscores", MASK_UNDERSCORES}, \
|
||||
{ "no-underscores", -MASK_UNDERSCORES},
|
||||
|
||||
/* The svr4 ABI for the i386 says that records and unions are returned
|
||||
in memory. */
|
||||
/* On FreeBSD, we do not. */
|
||||
#undef DEFAULT_PCC_STRUCT_RETURN
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 0
|
||||
|
||||
/* Prefix for internally generated assembler labels. If we aren't using
|
||||
underscores, we are using prefix `.'s to identify labels that should
|
||||
be ignored, as in `i386/gas.h' --karl@cs.umb.edu */
|
||||
|
@ -106,6 +98,8 @@ Boston, MA 02111-1307, USA. */
|
|||
#undef ASM_APP_OFF
|
||||
#define ASM_APP_OFF "#NO_APP\n"
|
||||
|
||||
#define SET_ASM_OP ".set"
|
||||
|
||||
/* Output at beginning of assembler file. */
|
||||
/* The .file command should always begin the output. */
|
||||
|
||||
|
@ -153,29 +147,28 @@ Boston, MA 02111-1307, USA. */
|
|||
This is only used for PIC code. See comments by the `casesi' insn in
|
||||
i386.md for an explanation of the expression this outputs. */
|
||||
#undef ASM_OUTPUT_ADDR_DIFF_ELT
|
||||
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
|
||||
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
|
||||
fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
|
||||
|
||||
#undef ASM_OUTPUT_ALIGN
|
||||
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
|
||||
if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG))
|
||||
|
||||
/* Align labels, etc. at 4-byte boundaries.
|
||||
For the 486, align to 16-byte boundary for sake of cache. */
|
||||
#undef ASM_OUTPUT_ALIGN_CODE
|
||||
#define ASM_OUTPUT_ALIGN_CODE(FILE) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_jumps)
|
||||
|
||||
/* Align start of loop at 4-byte boundary. */
|
||||
#undef ASM_OUTPUT_LOOP_ALIGN
|
||||
#define ASM_OUTPUT_LOOP_ALIGN(FILE) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", i386_align_loops)
|
||||
|
||||
if ((LOG)!=0) { \
|
||||
if (in_text_section()) \
|
||||
fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG)); \
|
||||
else \
|
||||
fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
|
||||
}
|
||||
|
||||
/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
|
||||
#undef USE_CONST_SECTION
|
||||
#define USE_CONST_SECTION TARGET_ELF
|
||||
|
||||
/* The a.out tools do not support "linkonce" sections. */
|
||||
#define SUPPORTS_ONE_ONLY TARGET_ELF
|
||||
|
||||
/* The a.out tools do not support "Lscope" .stabs symbols. */
|
||||
#define NO_DBX_FUNCTION_END TARGET_AOUT
|
||||
|
||||
/* A C statement (sans semicolon) to output an element in the table of
|
||||
global constructors. */
|
||||
#undef ASM_OUTPUT_CONSTRUCTOR
|
||||
|
@ -285,6 +278,16 @@ do { \
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#undef DEFAULT_VTABLE_THUNKS
|
||||
#define DEFAULT_VTABLE_THUNKS 1
|
||||
|
||||
/* This is BSD, so we want the DBX format. */
|
||||
#define DBX_DEBUGGING_INFO
|
||||
|
||||
/* Use stabs instead of DWARF debug format. */
|
||||
#undef PREFERRED_DEBUGGING_TYPE
|
||||
#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
|
||||
|
||||
/* in elf, the function stabs come first, before the relative offsets */
|
||||
#undef DBX_FUNCTION_FIRST
|
||||
#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
|
||||
|
@ -335,13 +338,13 @@ do { \
|
|||
|
||||
/* Indicate that jump tables go in the text section. This is
|
||||
necessary when compiling PIC code. */
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION
|
||||
#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)
|
||||
|
||||
/* override the exception table positioning */
|
||||
#define EXCEPTION_SECTION_FUNCTION \
|
||||
#define EXCEPTION_SECTION() \
|
||||
do { \
|
||||
if (TARGET_ELF) { \
|
||||
named_section (NULL_TREE, ".gcc_except_table"); \
|
||||
named_section (NULL_TREE, ".gcc_except_table", 0); \
|
||||
} else { \
|
||||
if (flag_pic) \
|
||||
data_section (); \
|
||||
|
@ -358,12 +361,61 @@ do { \
|
|||
VOIDmode, 0); \
|
||||
} while (0)
|
||||
|
||||
/* Use dollar signs in special g++ assembler names. */
|
||||
#undef NO_DOLLAR_IN_LABEL
|
||||
|
||||
/* Map i386 registers to the numbers dwarf expects. Of course this is different
|
||||
from what stabs expects. */
|
||||
|
||||
/* Copy this from the svr4 specifications... */
|
||||
/* Define the register numbers to be used in Dwarf debugging information.
|
||||
The SVR4 reference port C compiler uses the following register numbers
|
||||
in its Dwarf output code:
|
||||
0 for %eax (gnu regno = 0)
|
||||
1 for %ecx (gnu regno = 2)
|
||||
2 for %edx (gnu regno = 1)
|
||||
3 for %ebx (gnu regno = 3)
|
||||
4 for %esp (gnu regno = 7)
|
||||
5 for %ebp (gnu regno = 6)
|
||||
6 for %esi (gnu regno = 4)
|
||||
7 for %edi (gnu regno = 5)
|
||||
The following three DWARF register numbers are never generated by
|
||||
the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
|
||||
believes these numbers have these meanings.
|
||||
8 for %eip (no gnu equivalent)
|
||||
9 for %eflags (no gnu equivalent)
|
||||
10 for %trapno (no gnu equivalent)
|
||||
It is not at all clear how we should number the FP stack registers
|
||||
for the x86 architecture. If the version of SDB on x86/svr4 were
|
||||
a bit less brain dead with respect to floating-point then we would
|
||||
have a precedent to follow with respect to DWARF register numbers
|
||||
for x86 FP registers, but the SDB on x86/svr4 is so completely
|
||||
broken with respect to FP registers that it is hardly worth thinking
|
||||
of it as something to strive for compatibility with.
|
||||
The version of x86/svr4 SDB I have at the moment does (partially)
|
||||
seem to believe that DWARF register number 11 is associated with
|
||||
the x86 register %st(0), but that's about all. Higher DWARF
|
||||
register numbers don't seem to be associated with anything in
|
||||
particular, and even for DWARF regno 11, SDB only seems to under-
|
||||
stand that it should say that a variable lives in %st(0) (when
|
||||
asked via an `=' command) if we said it was in DWARF regno 11,
|
||||
but SDB still prints garbage when asked for the value of the
|
||||
variable in question (via a `/' command).
|
||||
(Also note that the labels SDB prints for various FP stack regs
|
||||
when doing an `x' command are all wrong.)
|
||||
Note that these problems generally don't affect the native SVR4
|
||||
C compiler because it doesn't allow the use of -O with -g and
|
||||
because when it is *not* optimizing, it allocates a memory
|
||||
location for each floating-point variable, and the memory
|
||||
location is what gets described in the DWARF AT_location
|
||||
attribute for the variable in question.
|
||||
Regardless of the severe mental illness of the x86/svr4 SDB, we
|
||||
do something sensible here and we use the following DWARF
|
||||
register numbers. Note that these are all stack-top-relative
|
||||
numbers.
|
||||
11 for %st(0) (gnu regno = 8)
|
||||
12 for %st(1) (gnu regno = 9)
|
||||
13 for %st(2) (gnu regno = 10)
|
||||
14 for %st(3) (gnu regno = 11)
|
||||
15 for %st(4) (gnu regno = 12)
|
||||
16 for %st(5) (gnu regno = 13)
|
||||
17 for %st(6) (gnu regno = 14)
|
||||
18 for %st(7) (gnu regno = 15)
|
||||
*/
|
||||
#undef DWARF_DBX_REGISTER_NUMBER
|
||||
#define DWARF_DBX_REGISTER_NUMBER(n) \
|
||||
((n) == 0 ? 0 \
|
||||
|
@ -405,10 +457,14 @@ do { \
|
|||
#define FUNCTION_PROFILER(FILE, LABELNO) \
|
||||
{ \
|
||||
if (flag_pic) \
|
||||
{ \
|
||||
fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \
|
||||
TARGET_AOUT ? "mcount" : ".mcount"); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define FUNCTION_PROFILER_EPILOGUE(FILE) \
|
||||
|
@ -438,46 +494,8 @@ do { \
|
|||
#undef WCHAR_TYPE_SIZE
|
||||
#define WCHAR_TYPE_SIZE BITS_PER_WORD
|
||||
|
||||
/* FREEBSD_NATIVE is defined when gcc is integrated into the FreeBSD
|
||||
source tree so it can be configured appropriately without using
|
||||
the GNU configure/build mechanism. */
|
||||
|
||||
#ifdef FREEBSD_NATIVE
|
||||
|
||||
/* Look for the include files in the system-defined places. */
|
||||
|
||||
#define GPLUSPLUS_INCLUDE_DIR "/usr/include/g++"
|
||||
|
||||
#define GCC_INCLUDE_DIR "/usr/include"
|
||||
|
||||
/* FreeBSD has GCC_INCLUDE_DIR first. */
|
||||
#define INCLUDE_DEFAULTS \
|
||||
{ \
|
||||
{ GCC_INCLUDE_DIR, 0, 0 }, \
|
||||
{ GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \
|
||||
{ 0, 0, 0 } \
|
||||
}
|
||||
|
||||
/* Under FreeBSD, the normal location of the compiler back ends is the
|
||||
/usr/libexec directory. */
|
||||
|
||||
#define STANDARD_EXEC_PREFIX "/usr/libexec/"
|
||||
|
||||
/* Under FreeBSD, the normal location of the various *crt*.o files is the
|
||||
/usr/lib directory. */
|
||||
|
||||
#define STANDARD_STARTFILE_PREFIX "/usr/lib/"
|
||||
|
||||
/* On FreeBSD, gcc is called 'cc' */
|
||||
#define GCC_NAME "cc"
|
||||
|
||||
/* FreeBSD is 4.4BSD derived */
|
||||
#define bsd4_4
|
||||
|
||||
#endif /* FREEBSD_NATIVE */
|
||||
|
||||
#undef CPP_PREDEFINES
|
||||
#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=4 -D__FreeBSD_cc_version=400001 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
|
||||
#define CPP_PREDEFINES "-Di386 -Dunix -D__FreeBSD__=4 -D__FreeBSD_cc_version=400002 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
|
||||
|
||||
#undef CPP_SPEC
|
||||
#if TARGET_CPU_DEFAULT == 2
|
||||
|
@ -518,6 +536,9 @@ do { \
|
|||
have the time to search for those flags. I am sure how to add
|
||||
support for -soname shared_object_name. H.J.
|
||||
|
||||
I took out %{v:%{!V:-V}}. It is too much :-(. They can use
|
||||
-Wl,-V.
|
||||
|
||||
When the -shared link option is used a final link is not being
|
||||
done. */
|
||||
|
||||
|
@ -540,8 +561,19 @@ do { \
|
|||
%{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
|
||||
%{static:-Bstatic}}}"
|
||||
|
||||
/* Get perform_* macros to build libgcc.a. */
|
||||
#include "i386/perform.h"
|
||||
/* A C statement to output to the stdio stream FILE an assembler
|
||||
command to advance the location counter to a multiple of 1<<LOG
|
||||
bytes if it is within MAX_SKIP bytes.
|
||||
|
||||
This is used to align code labels according to Intel recommendations. */
|
||||
|
||||
#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
|
||||
#error "we don't have this for the aout gas"
|
||||
#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
|
||||
if ((LOG)!=0) \
|
||||
if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
|
||||
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP))
|
||||
#endif
|
||||
|
||||
#undef STARTFILE_SPEC
|
||||
#define STARTFILE_SPEC "\
|
||||
|
@ -560,9 +592,9 @@ do { \
|
|||
#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
|
||||
|
||||
#define HAVE_ATEXIT
|
||||
#define HAVE_PUTENV
|
||||
|
||||
/* to assist building libgcc2.c */
|
||||
#ifndef __ELF__
|
||||
#undef OBJECT_FORMAT_ELF
|
||||
#endif
|
||||
/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the
|
||||
DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with
|
||||
the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions
|
||||
type exception machanism. */
|
||||
#define DWARF2_UNWIND_INFO 0
|
||||
|
|
Loading…
Reference in a new issue