From 844dfb548cf6ac909593d98015452e848198d240 Mon Sep 17 00:00:00 2001 From: "David E. O'Brien" Date: Sun, 19 Sep 1999 10:28:57 +0000 Subject: [PATCH] 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. --- contrib/gcc/config/i386/freebsd.h | 246 +++++++++++++----------- contrib/gcc/config/i386/freebsd.h.fixed | 246 +++++++++++++----------- 2 files changed, 278 insertions(+), 214 deletions(-) diff --git a/contrib/gcc/config/i386/freebsd.h b/contrib/gcc/config/i386/freebsd.h index cfef1bc55c90..b7b2752733cb 100644 --- a/contrib/gcc/config/i386/freebsd.h +++ b/contrib/gcc/config/i386/freebsd.h @@ -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,35 +22,36 @@ 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 /* Base i386 target machine definitions */ -#include /* Use the i386 AT&T assembler syntax */ -#include /* some common stuff */ +/* $FreeBSD$ */ -/* Don't assume anything about the header files. */ + +#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' \ - || (CHAR) == 'h' \ - || (CHAR) == 'z' /* ignored by ld */ \ +#define SWITCH_TAKES_ARG(CHAR) \ + (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ + || (CHAR) == 'h' \ + || (CHAR) == 'z' /* ignored by ld */ \ || (CHAR) == 'R') #undef WORD_SWITCH_TAKES_ARG @@ -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) - +#define ASM_OUTPUT_ALIGN(FILE,LOG) \ + 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", \ + { \ + fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \ TARGET_AOUT ? "mcount" : ".mcount"); \ + } \ else \ - fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ + { \ + fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ + } \ } #define FUNCTION_PROFILER_EPILOGUE(FILE) \ @@ -437,47 +493,9 @@ 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< /* Base i386 target machine definitions */ -#include /* Use the i386 AT&T assembler syntax */ -#include /* some common stuff */ +/* $FreeBSD$ */ -/* Don't assume anything about the header files. */ + +#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' \ - || (CHAR) == 'h' \ - || (CHAR) == 'z' /* ignored by ld */ \ +#define SWITCH_TAKES_ARG(CHAR) \ + (DEFAULT_SWITCH_TAKES_ARG (CHAR) \ + || (CHAR) == 'h' \ + || (CHAR) == 'z' /* ignored by ld */ \ || (CHAR) == 'R') #undef WORD_SWITCH_TAKES_ARG @@ -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) - +#define ASM_OUTPUT_ALIGN(FILE,LOG) \ + 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", \ + { \ + fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", \ TARGET_AOUT ? "mcount" : ".mcount"); \ + } \ else \ - fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ + { \ + fprintf (FILE, "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \ + } \ } #define FUNCTION_PROFILER_EPILOGUE(FILE) \ @@ -437,47 +493,9 @@ 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<