summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/gcc/config/i386/freebsd-elf.h255
-rw-r--r--contrib/gcc/config/i386/freebsd.h681
-rw-r--r--contrib/gcc/config/i386/freebsd.h.fixed681
-rw-r--r--contrib/gcc/cp/except.c4
-rw-r--r--contrib/gcc/function.c21
-rw-r--r--contrib/gcc/gcc.c78
-rw-r--r--contrib/gcc/libgcc2.c6
-rw-r--r--gnu/usr.bin/cc/Makefile.inc6
-rw-r--r--gnu/usr.bin/cc/cc/Makefile6
-rw-r--r--gnu/usr.bin/cc/cc_tools/Makefile39
10 files changed, 1039 insertions, 738 deletions
diff --git a/contrib/gcc/config/i386/freebsd-elf.h b/contrib/gcc/config/i386/freebsd-elf.h
deleted file mode 100644
index 061d595..0000000
--- a/contrib/gcc/config/i386/freebsd-elf.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/* Definitions for Intel 386 running FreeBSD with ELF format
- Copyright (C) 1994, 1995 Free Software Foundation, Inc.
- Contributed by Eric Youngdale.
- Modified for stabs-in-ELF by H.J. Lu.
- Adapted from Linux version by John Polstra.
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-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 */
-
-#undef TARGET_VERSION
-#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)");
-
-#define MASK_PROFILER_EPILOGUE 010000000000
-
-#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
-
-#undef SUBTARGET_SWITCHES
-#define SUBTARGET_SWITCHES \
- { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
- { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE},
-
-/* 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 is how to output an element of a case-vector that is relative.
- 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) \
- fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
-
-/* Indicate that jump tables go in the text section. This is
- necessary when compiling PIC code. */
-#define JUMP_TABLES_IN_TEXT_SECTION
-
-/* 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 DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(n) \
-((n) == 0 ? 0 \
- : (n) == 1 ? 2 \
- : (n) == 2 ? 1 \
- : (n) == 3 ? 3 \
- : (n) == 4 ? 6 \
- : (n) == 5 ? 7 \
- : (n) == 6 ? 5 \
- : (n) == 7 ? 4 \
- : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
- : (-1))
-
-/* Tell final.c that we don't need a label passed to mcount. */
-#define NO_PROFILE_DATA
-
-/* Output assembler code to FILE to increment profiler label # LABELNO
- for profiling a function entry. */
-/* Redefine this to not pass an unused label in %edx. */
-
-#undef FUNCTION_PROFILER
-#define FUNCTION_PROFILER(FILE, LABELNO) \
-{ \
- if (flag_pic) \
- fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \
- else \
- fprintf (FILE, "\tcall mcount\n"); \
-}
-
-#define FUNCTION_PROFILER_EPILOGUE(FILE) \
-{ \
- if (TARGET_PROFILER_EPILOGUE) \
- { \
- if (flag_pic) \
- fprintf (FILE, "\tcall *mexitcount@GOT(%%ebx)\n"); \
- else \
- fprintf (FILE, "\tcall mexitcount\n"); \
- } \
-}
-
-#undef SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
-
-#undef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
-
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-
-#define WCHAR_UNSIGNED 0
-
-#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__ELF__ -D__FreeBSD__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
-
-#undef CPP_SPEC
-#if TARGET_CPU_DEFAULT == 2
-#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}"
-#else
-#define CPP_SPEC "%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}"
-#endif
-
-/* Like the default, except no -lg, and no -p. */
-#undef LIB_SPEC
-#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:-lc}%{pthread:-lc_r}}%{pg:%{!pthread:-lc_p}%{pthread:-lc_r_p}}}"
-
-/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
- for the special GCC options -static and -shared, which allow us to
- link things in one of these three modes by applying the appropriate
- combinations of options at link-time. We like to support here for
- as many of the other GNU linker options as possible. But I don't
- 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. */
-
-#undef LINK_SPEC
-#define LINK_SPEC \
- "-m elf_i386 -L/usr/lib %{shared:-shared} \
- %{!shared: \
- %{!static: \
- %{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker /usr/libexec/ld-elf.so.1}} \
- %{static:-static}}"
-
-/* Get perform_* macros to build libgcc.a. */
-#include "i386/perform.h"
-
-#define LINK_LIBGCC_SPECIAL_1 1
-
-/* This goes away when the math emulator is fixed. */
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
-
-#define HAVE_ATEXIT
-#define HAVE_PUTENV
-
diff --git a/contrib/gcc/config/i386/freebsd.h b/contrib/gcc/config/i386/freebsd.h
index d27ef63..913fb09 100644
--- a/contrib/gcc/config/i386/freebsd.h
+++ b/contrib/gcc/config/i386/freebsd.h
@@ -1,7 +1,9 @@
-/* Definitions of target machine for GNU compiler for Intel 80386
- running FreeBSD.
- Copyright (C) 1988, 1992, 1994 Free Software Foundation, Inc.
- Contributed by Poul-Henning Kamp <phk@login.dkuug.dk>
+/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
+ Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+ Contributed by Eric Youngdale.
+ Modified for stabs-in-ELF by H.J. Lu.
+ Adapted from 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.
@@ -20,145 +22,365 @@ 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. */
-/* This is tested by i386gas.h. */
-#define YES_UNDERSCORES
+/* 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 */
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
-#include "i386/gstabs.h"
+/* This defines which switch letters take arguments. On svr4, 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. */
+
+#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 */ \
+ || (CHAR) == 'R')
+
+#undef WORD_SWITCH_TAKES_ARG
+#define WORD_SWITCH_TAKES_ARG(STR) \
+ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \
+ || !strcmp (STR, "rpath") || !strcmp (STR, "rpath-link") \
+ || !strcmp (STR, "soname") || !strcmp (STR, "defsym") \
+ || !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker"))
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)");
-/* Get perform_* macros to build libgcc.a. */
-#include "i386/perform.h"
-
-/* This was cloned from ../netbsd.h. It and several other things in
- this file should be in ../freebsd.h. */
-/* 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"
+#define MASK_PROFILER_EPILOGUE 010000000000
+#define MASK_AOUT 004000000000 /* a.out not elf */
+#define MASK_UNDERSCORES 002000000000 /* use leading _ */
-/* FreeBSD is 4.4BSD derived */
-#define bsd4_4
+#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
+#define TARGET_AOUT (target_flags & MASK_AOUT)
+#define TARGET_ELF ((target_flags & MASK_AOUT) == 0)
+#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0)
-#endif /* FREEBSD_NATIVE */
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
+ { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \
+ { "aout", MASK_AOUT}, \
+ { "no-aout", -MASK_AOUT}, \
+ { "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
-#define MASK_PROFILER_EPILOGUE 010000000000
+#define SUPPORTS_WEAK TARGET_ELF
-#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
+/* 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 */
+#undef LPREFIX
+#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
-#undef SUBTARGET_SWITCHES
-#define SUBTARGET_SWITCHES \
- { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
- { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE},
+/* Override the default comment-starter of "/". */
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START "#"
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
+#undef COMMENT_BEGIN
+#define COMMENT_BEGIN "#"
-#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}"
+#undef ASM_APP_ON
+#define ASM_APP_ON "#APP\n"
-/* Like the default, except no -lg, and no -p. */
-#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:-lc}%{pthread:-lc_r}}%{pg:%{!pthread:-lc_p}%{pthread:-lc_r_p}}}"
+#undef ASM_APP_OFF
+#define ASM_APP_OFF "#NO_APP\n"
-#define LINK_SPEC \
- "%{p:%e`-p' not supported; use `-pg' and gprof(1)} \
- %{shared:-Bshareable} \
- %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
- %{pg:-Bstatic} %{Z}} \
- %{assert*} %{R*}"
+/* Output at beginning of assembler file. */
+/* The .file command should always begin the output. */
-#define LINK_LIBGCC_SPECIAL_1 1
+#undef ASM_FILE_START
+#define ASM_FILE_START(FILE) \
+ do { \
+ output_file_directive (FILE, main_input_filename); \
+ if (TARGET_ELF) \
+ fprintf (FILE, "\t.version\t\"01.01\"\n"); \
+ } while (0)
-#define STARTFILE_SPEC \
- "%{shared:c++rt0.o%s} \
- %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}"
+/* This is how to store into the string BUF
+ the symbol_ref name of an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class.
+ This is suitable for output with `assemble_name'. */
+#undef ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
+ sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \
+ (PREFIX), (NUMBER))
-/* This goes away when the math emulator is fixed. */
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
-
-#undef SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
+/* This is how to output an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
+#undef ASM_OUTPUT_INTERNAL_LABEL
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
+ fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \
+ PREFIX, NUM)
-#undef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
+/* This is how to output a reference to a user-level label named NAME. */
+#undef ASM_OUTPUT_LABELREF
+#define ASM_OUTPUT_LABELREF(FILE,NAME) \
+ fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME)
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-#define WCHAR_UNSIGNED 0
+/* This is how to output an element of a case-vector that is relative.
+ 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) \
+ fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
+ if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG))
-#define HAVE_ATEXIT
+/* 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)
-#define HAVE_PUTENV
+/* 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)
-/* Override the default comment-starter of "/". */
-#undef ASM_COMMENT_START
-#define ASM_COMMENT_START "#"
+/* A C statement to output assembler commands which will identify the object
+ file as having been compile with GNU CC. We don't need or want this for
+ GDB. */
+#undef ASM_IDENTIFY_GCC
+#define ASM_IDENTIFY_GCC(FILE)
-#undef ASM_APP_ON
-#define ASM_APP_ON "#APP\n"
+/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
+#undef USE_CONST_SECTION
+#define USE_CONST_SECTION TARGET_ELF
-#undef ASM_APP_OFF
-#define ASM_APP_OFF "#NO_APP\n"
-
-/* The following macros are stolen from i386v4.h */
-/* These have to be defined to get PIC code correct */
+/* A C statement (sans semicolon) to output an element in the table of
+ global constructors. */
+#undef ASM_OUTPUT_CONSTRUCTOR
+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ ctors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
-/* This is how to output an element of a case-vector that is relative.
- This is only used for PIC code. See comments by the `casesi' insn in
- i386.md for an explanation of the expression this outputs. */
+/* A C statement (sans semicolon) to output an element in the table of
+ global destructors. */
+#undef ASM_OUTPUT_DESTRUCTOR
+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ dtors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
-#undef ASM_OUTPUT_ADDR_DIFF_ELT
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
- fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
+/* This says how to output assembler code to declare an
+ uninitialized internal linkage data object. Under SVR4,
+ the linker seems to want the alignment of data objects
+ to depend on their types. We do exactly that here. */
+
+#undef ASM_OUTPUT_ALIGNED_LOCAL
+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), "\n"); \
+ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".lcomm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_ALIGNED_COMMON
+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".comm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+/* Turn off svr4.h version, it chokes the old gas. The old layout
+ works fine under new gas anyway. */
+#undef ASM_OUTPUT_ASCII
+
+/* How to output some space */
+#undef ASM_OUTPUT_SKIP
+#define ASM_OUTPUT_SKIP(FILE,SIZE) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \
+ } else { \
+ fprintf (FILE, "\t.space %u\n", (SIZE)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_SOURCE_LINE
+#define ASM_OUTPUT_SOURCE_LINE(file, line) \
+do { \
+ static int sym_lineno = 1; \
+ if (TARGET_ELF) { \
+ fprintf (file, ".stabn 68,0,%d,.LM%d-", line, sym_lineno); \
+ assemble_name (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
+ fprintf (file, "\n.LM%d:\n", sym_lineno); \
+ sym_lineno += 1; \
+ } else { \
+ fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \
+ } \
+} while (0)
+
+/* stabs-in-elf has offsets relative to function beginning */
+#undef DBX_OUTPUT_LBRAC
+#define DBX_OUTPUT_LBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+#undef DBX_OUTPUT_RBRAC
+#define DBX_OUTPUT_RBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+
+/* Define macro used to output shift-double opcodes when the shift
+ count is in %cl. Some assemblers require %cl as an argument;
+ some don't.
+
+ *OLD* GAS requires the %cl argument, so override i386/unix.h. */
+
+#undef AS3_SHIFT_DOUBLE
+#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
/* Indicate that jump tables go in the text section. This is
necessary when compiling PIC code. */
-
#define JUMP_TABLES_IN_TEXT_SECTION
-/* Don't default to pcc-struct-return, because gcc is the only compiler, and
- we want to retain compatibility with older gcc versions. */
-#define DEFAULT_PCC_STRUCT_RETURN 0
+/* override the exception table positioning */
+#define EXCEPTION_SECTION_FUNCTION \
+do { \
+ if (TARGET_ELF) { \
+ named_section (NULL_TREE, ".gcc_except_table"); \
+ } else { \
+ if (flag_pic) \
+ data_section (); \
+ else \
+ readonly_data_section (); \
+ } \
+} while (0);
+
+/* supply our own hook for calling __main() from main() */
+#define GEN_CALL__MAIN \
+ do { \
+ if (!(TARGET_ELF)) \
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \
+ VOIDmode, 0); \
+ } while (0)
-/* Tell final.c that we don't need a label passed to mcount. */
+/* Map i386 registers to the numbers dwarf expects. Of course this is different
+ from what stabs expects. */
+
+#undef DWARF_DBX_REGISTER_NUMBER
+#define DWARF_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 \
+ : (n) == 1 ? 2 \
+ : (n) == 2 ? 1 \
+ : (n) == 3 ? 3 \
+ : (n) == 4 ? 6 \
+ : (n) == 5 ? 7 \
+ : (n) == 6 ? 5 \
+ : (n) == 7 ? 4 \
+ : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
+ : (-1))
+
+/* Now what stabs expects in the register. */
+#define STABS_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 : \
+ (n) == 1 ? 2 : \
+ (n) == 2 ? 1 : \
+ (n) == 3 ? 3 : \
+ (n) == 4 ? 6 : \
+ (n) == 5 ? 7 : \
+ (n) == 6 ? 4 : \
+ (n) == 7 ? 5 : \
+ (n) + 4)
+
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \
+ ? DWARF_DBX_REGISTER_NUMBER(n) \
+ : STABS_DBX_REGISTER_NUMBER(n))
+/* Tell final.c that we don't need a label passed to mcount. */
#define NO_PROFILE_DATA
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. */
/* Redefine this to not pass an unused label in %edx. */
#undef FUNCTION_PROFILER
@@ -180,123 +402,146 @@ Boston, MA 02111-1307, USA. */
fprintf (FILE, "\tcall mexitcount\n"); \
} \
}
-
-/*
- * Some imports from svr4.h in support of shared libraries.
- * Currently, we need the DECLARE_OBJECT_SIZE stuff.
- */
-
-#define HANDLE_SYSV_PRAGMA
-
-/* Define the strings used for the special svr4 .type and .size directives.
- These strings generally do not vary from one system running svr4 to
- another, but if a given system (e.g. m88k running svr) needs to use
- different pseudo-op names for these, they may be overridden in the
- file which includes this one. */
-
-#define TYPE_ASM_OP ".type"
-#define SIZE_ASM_OP ".size"
-#define SET_ASM_OP ".set"
-
-/* This is how we tell the assembler that a symbol is weak. */
-#define ASM_WEAKEN_LABEL(FILE,NAME) \
- do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
- fputc ('\n', FILE); } while (0)
-
-/* The following macro defines the format used to output the second
- operand of the .type assembler directive. Different svr4 assemblers
- expect various different forms for this operand. The one given here
- is just a default. You may need to override it in your machine-
- specific tm.h file (depending upon the particulars of your assembler). */
-
-#define TYPE_OPERAND_FMT "@%s"
-
-/* Write the extra assembler code needed to declare a function's result.
- Most svr4 assemblers don't require any special declaration of the
- result value, but there are exceptions. */
-
-#ifndef ASM_DECLARE_RESULT
-#define ASM_DECLARE_RESULT(FILE, RESULT)
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#define WCHAR_UNSIGNED 0
+
+#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__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
+
+#undef CPP_SPEC
+#if TARGET_CPU_DEFAULT == 2
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}"
+#else
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}"
#endif
-/* These macros generate the special .type and .size directives which
- are used to set the corresponding fields of the linker symbol table
- entries in an ELF object file under SVR4. These macros also output
- the starting labels for the relevant functions/objects. */
+#undef CC1_SPEC
+#define CC1_SPEC "\
+%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
+%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
-/* Write the extra assembler code needed to declare a function properly.
- Some svr4 assemblers need to also have something extra said about the
- function's return value. We allow for that here. */
+#undef ASM_SPEC
+#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
- do { \
- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
- assemble_name (FILE, NAME); \
- putc (',', FILE); \
- fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
- putc ('\n', FILE); \
- ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
- ASM_OUTPUT_LABEL(FILE, NAME); \
- } while (0)
+/* Like the default, except no -lg, and no -p. */
+#undef LIB_SPEC
+#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:-lc}%{pthread:-lc_r}}%{pg:%{!pthread:-lc_p}%{pthread:-lc_r_p}}}"
-/* Write the extra assembler code needed to declare an object properly. */
+/* Let gcc locate this for us according to the -m rules */
+#undef LIBGCC_SPEC
+#define LIBGCC_SPEC "%{!shared:libgcc.a%s}"
+
+/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
+ for the special GCC options -static and -shared, which allow us to
+ link things in one of these three modes by applying the appropriate
+ combinations of options at link-time. We like to support here for
+ as many of the other GNU linker options as possible. But I don't
+ have the time to search for those flags. I am sure how to add
+ support for -soname shared_object_name. H.J.
+
+ When the -shared link option is used a final link is not being
+ done. */
+
+#undef LINK_SPEC
+#define LINK_SPEC "\
+ %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
+ %{maout: %{shared:-Bshareable} \
+ %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
+ %{pg:-Bstatic} %{Z}} \
+ %{assert*} %{R*}} \
+ %{!maout: \
+ -m elf_i386 \
+ %{Wl,*:%*} \
+ %{assert*} %{R*} %{rpath*} %{defsym*} \
+ %{shared:-Bshared %{h*} %{soname*}} \
+ %{symbolic:-Bsymbolic} \
+ %{!shared: \
+ %{!static: \
+ %{rdynamic: -export-dynamic} \
+ %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
+ %{static:-Bstatic}}}"
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
- do { \
- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
- assemble_name (FILE, NAME); \
- putc (',', FILE); \
- fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
- putc ('\n', FILE); \
- size_directive_output = 0; \
- if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
- { \
- size_directive_output = 1; \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, NAME); \
- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
- } \
- ASM_OUTPUT_LABEL(FILE, NAME); \
- } while (0)
+/* Get perform_* macros to build libgcc.a. */
+#include "i386/perform.h"
-/* Output the size directive for a decl in rest_of_decl_compilation
- in the case where we did not do so before the initializer.
- Once we find the error_mark_node, we know that the value of
- size_directive_output was set
- by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
-
-#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
-do { \
- char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
- if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
- && ! AT_END && TOP_LEVEL \
- && DECL_INITIAL (DECL) == error_mark_node \
- && !size_directive_output) \
- { \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, name); \
- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL)));\
- } \
- } while (0)
-
-
-/* This is how to declare the size of a function. */
-
-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
- do { \
- if (!flag_inhibit_size_directive) \
- { \
- char label[256]; \
- static int labelno; \
- labelno++; \
- ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, (FNAME)); \
- fprintf (FILE, ","); \
- assemble_name (FILE, label); \
- fprintf (FILE, "-"); \
- assemble_name (FILE, (FNAME)); \
- putc ('\n', FILE); \
- } \
- } while (0)
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "\
+ %{maout: %{shared:c++rt0.o%s} \
+ %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \
+ %{!maout: %{!shared: \
+ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
+ crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}"
+
+/* This goes away when the math emulator is fixed. */
+#undef TARGET_DEFAULT
+#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
diff --git a/contrib/gcc/config/i386/freebsd.h.fixed b/contrib/gcc/config/i386/freebsd.h.fixed
index d27ef63..913fb09 100644
--- a/contrib/gcc/config/i386/freebsd.h.fixed
+++ b/contrib/gcc/config/i386/freebsd.h.fixed
@@ -1,7 +1,9 @@
-/* Definitions of target machine for GNU compiler for Intel 80386
- running FreeBSD.
- Copyright (C) 1988, 1992, 1994 Free Software Foundation, Inc.
- Contributed by Poul-Henning Kamp <phk@login.dkuug.dk>
+/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
+ Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+ Contributed by Eric Youngdale.
+ Modified for stabs-in-ELF by H.J. Lu.
+ Adapted from 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.
@@ -20,145 +22,365 @@ 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. */
-/* This is tested by i386gas.h. */
-#define YES_UNDERSCORES
+/* 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 */
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
-#include "i386/gstabs.h"
+/* This defines which switch letters take arguments. On svr4, 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. */
+
+#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 */ \
+ || (CHAR) == 'R')
+
+#undef WORD_SWITCH_TAKES_ARG
+#define WORD_SWITCH_TAKES_ARG(STR) \
+ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \
+ || !strcmp (STR, "rpath") || !strcmp (STR, "rpath-link") \
+ || !strcmp (STR, "soname") || !strcmp (STR, "defsym") \
+ || !strcmp (STR, "assert") || !strcmp (STR, "dynamic-linker"))
+
+#undef TARGET_VERSION
+#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD)");
-/* Get perform_* macros to build libgcc.a. */
-#include "i386/perform.h"
-
-/* This was cloned from ../netbsd.h. It and several other things in
- this file should be in ../freebsd.h. */
-/* 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"
+#define MASK_PROFILER_EPILOGUE 010000000000
+#define MASK_AOUT 004000000000 /* a.out not elf */
+#define MASK_UNDERSCORES 002000000000 /* use leading _ */
-/* FreeBSD is 4.4BSD derived */
-#define bsd4_4
+#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
+#define TARGET_AOUT (target_flags & MASK_AOUT)
+#define TARGET_ELF ((target_flags & MASK_AOUT) == 0)
+#define TARGET_UNDERSCORES ((target_flags & MASK_UNDERSCORES) != 0)
-#endif /* FREEBSD_NATIVE */
+#undef SUBTARGET_SWITCHES
+#define SUBTARGET_SWITCHES \
+ { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
+ { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE}, \
+ { "aout", MASK_AOUT}, \
+ { "no-aout", -MASK_AOUT}, \
+ { "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
-#define MASK_PROFILER_EPILOGUE 010000000000
+#define SUPPORTS_WEAK TARGET_ELF
-#define TARGET_PROFILER_EPILOGUE (target_flags & MASK_PROFILER_EPILOGUE)
+/* 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 */
+#undef LPREFIX
+#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
-#undef SUBTARGET_SWITCHES
-#define SUBTARGET_SWITCHES \
- { "profiler-epilogue", MASK_PROFILER_EPILOGUE}, \
- { "no-profiler-epilogue", -MASK_PROFILER_EPILOGUE},
+/* Override the default comment-starter of "/". */
+#undef ASM_COMMENT_START
+#define ASM_COMMENT_START "#"
-
-#undef CPP_PREDEFINES
-#define CPP_PREDEFINES "-Dunix -Di386 -D__FreeBSD__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
+#undef COMMENT_BEGIN
+#define COMMENT_BEGIN "#"
-#define ASM_SPEC " %| %{fpic:-k} %{fPIC:-k}"
+#undef ASM_APP_ON
+#define ASM_APP_ON "#APP\n"
-/* Like the default, except no -lg, and no -p. */
-#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:-lc}%{pthread:-lc_r}}%{pg:%{!pthread:-lc_p}%{pthread:-lc_r_p}}}"
+#undef ASM_APP_OFF
+#define ASM_APP_OFF "#NO_APP\n"
-#define LINK_SPEC \
- "%{p:%e`-p' not supported; use `-pg' and gprof(1)} \
- %{shared:-Bshareable} \
- %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
- %{pg:-Bstatic} %{Z}} \
- %{assert*} %{R*}"
+/* Output at beginning of assembler file. */
+/* The .file command should always begin the output. */
-#define LINK_LIBGCC_SPECIAL_1 1
+#undef ASM_FILE_START
+#define ASM_FILE_START(FILE) \
+ do { \
+ output_file_directive (FILE, main_input_filename); \
+ if (TARGET_ELF) \
+ fprintf (FILE, "\t.version\t\"01.01\"\n"); \
+ } while (0)
-#define STARTFILE_SPEC \
- "%{shared:c++rt0.o%s} \
- %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}"
+/* This is how to store into the string BUF
+ the symbol_ref name of an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class.
+ This is suitable for output with `assemble_name'. */
+#undef ASM_GENERATE_INTERNAL_LABEL
+#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \
+ sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \
+ (PREFIX), (NUMBER))
-/* This goes away when the math emulator is fixed. */
-#undef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_NO_FANCY_MATH_387 | 0301)
-
-#undef SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
+/* This is how to output an internal numbered label where
+ PREFIX is the class of label and NUM is the number within the class. */
+#undef ASM_OUTPUT_INTERNAL_LABEL
+#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
+ fprintf (FILE, "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \
+ PREFIX, NUM)
-#undef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
+/* This is how to output a reference to a user-level label named NAME. */
+#undef ASM_OUTPUT_LABELREF
+#define ASM_OUTPUT_LABELREF(FILE,NAME) \
+ fprintf (FILE, "%s%s", (TARGET_UNDERSCORES) ? "_" : "", NAME)
-#undef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-#define WCHAR_UNSIGNED 0
+/* This is how to output an element of a case-vector that is relative.
+ 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) \
+ fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
-#undef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
+#undef ASM_OUTPUT_ALIGN
+#define ASM_OUTPUT_ALIGN(FILE,LOG) \
+ if ((LOG)!=0) fprintf ((FILE), "\t.p2align %d\n", (LOG))
-#define HAVE_ATEXIT
+/* 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)
-#define HAVE_PUTENV
+/* 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)
-/* Override the default comment-starter of "/". */
-#undef ASM_COMMENT_START
-#define ASM_COMMENT_START "#"
+/* A C statement to output assembler commands which will identify the object
+ file as having been compile with GNU CC. We don't need or want this for
+ GDB. */
+#undef ASM_IDENTIFY_GCC
+#define ASM_IDENTIFY_GCC(FILE)
-#undef ASM_APP_ON
-#define ASM_APP_ON "#APP\n"
+/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
+#undef USE_CONST_SECTION
+#define USE_CONST_SECTION TARGET_ELF
-#undef ASM_APP_OFF
-#define ASM_APP_OFF "#NO_APP\n"
-
-/* The following macros are stolen from i386v4.h */
-/* These have to be defined to get PIC code correct */
+/* A C statement (sans semicolon) to output an element in the table of
+ global constructors. */
+#undef ASM_OUTPUT_CONSTRUCTOR
+#define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ ctors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
-/* This is how to output an element of a case-vector that is relative.
- This is only used for PIC code. See comments by the `casesi' insn in
- i386.md for an explanation of the expression this outputs. */
+/* A C statement (sans semicolon) to output an element in the table of
+ global destructors. */
+#undef ASM_OUTPUT_DESTRUCTOR
+#define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
+ do { \
+ if (TARGET_ELF) { \
+ dtors_section (); \
+ fprintf (FILE, "\t%s\t ", INT_ASM_OP); \
+ assemble_name (FILE, NAME); \
+ fprintf (FILE, "\n"); \
+ } else { \
+ fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
+ (TARGET_UNDERSCORES) ? "_" : ""); \
+ assemble_name (asm_out_file, name); \
+ fputc ('\n', asm_out_file); \
+ } \
+ } while (0)
-#undef ASM_OUTPUT_ADDR_DIFF_ELT
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
- fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE)
+/* This says how to output assembler code to declare an
+ uninitialized internal linkage data object. Under SVR4,
+ the linker seems to want the alignment of data objects
+ to depend on their types. We do exactly that here. */
+
+#undef ASM_OUTPUT_ALIGNED_LOCAL
+#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), "\n"); \
+ ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".lcomm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_ALIGNED_COMMON
+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
+ } else { \
+ int rounded = (SIZE); \
+ if (rounded == 0) rounded = 1; \
+ rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1; \
+ rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT) \
+ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); \
+ fputs (".comm ", (FILE)); \
+ assemble_name ((FILE), (NAME)); \
+ fprintf ((FILE), ",%u\n", (rounded)); \
+ } \
+} while (0)
+
+/* Turn off svr4.h version, it chokes the old gas. The old layout
+ works fine under new gas anyway. */
+#undef ASM_OUTPUT_ASCII
+
+/* How to output some space */
+#undef ASM_OUTPUT_SKIP
+#define ASM_OUTPUT_SKIP(FILE,SIZE) \
+do { \
+ if (TARGET_ELF) { \
+ fprintf (FILE, "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)); \
+ } else { \
+ fprintf (FILE, "\t.space %u\n", (SIZE)); \
+ } \
+} while (0)
+
+#undef ASM_OUTPUT_SOURCE_LINE
+#define ASM_OUTPUT_SOURCE_LINE(file, line) \
+do { \
+ static int sym_lineno = 1; \
+ if (TARGET_ELF) { \
+ fprintf (file, ".stabn 68,0,%d,.LM%d-", line, sym_lineno); \
+ assemble_name (file, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
+ fprintf (file, "\n.LM%d:\n", sym_lineno); \
+ sym_lineno += 1; \
+ } else { \
+ fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno); \
+ } \
+} while (0)
+
+/* stabs-in-elf has offsets relative to function beginning */
+#undef DBX_OUTPUT_LBRAC
+#define DBX_OUTPUT_LBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+#undef DBX_OUTPUT_RBRAC
+#define DBX_OUTPUT_RBRAC(file,name) \
+do { \
+ fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC); \
+ assemble_name (asmfile, buf); \
+ if (TARGET_ELF) { \
+ fputc ('-', asmfile); \
+ assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0)); \
+ } \
+ fprintf (asmfile, "\n"); \
+} while (0)
+
+
+/* Define macro used to output shift-double opcodes when the shift
+ count is in %cl. Some assemblers require %cl as an argument;
+ some don't.
+
+ *OLD* GAS requires the %cl argument, so override i386/unix.h. */
+
+#undef AS3_SHIFT_DOUBLE
+#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
/* Indicate that jump tables go in the text section. This is
necessary when compiling PIC code. */
-
#define JUMP_TABLES_IN_TEXT_SECTION
-/* Don't default to pcc-struct-return, because gcc is the only compiler, and
- we want to retain compatibility with older gcc versions. */
-#define DEFAULT_PCC_STRUCT_RETURN 0
+/* override the exception table positioning */
+#define EXCEPTION_SECTION_FUNCTION \
+do { \
+ if (TARGET_ELF) { \
+ named_section (NULL_TREE, ".gcc_except_table"); \
+ } else { \
+ if (flag_pic) \
+ data_section (); \
+ else \
+ readonly_data_section (); \
+ } \
+} while (0);
+
+/* supply our own hook for calling __main() from main() */
+#define GEN_CALL__MAIN \
+ do { \
+ if (!(TARGET_ELF)) \
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \
+ VOIDmode, 0); \
+ } while (0)
-/* Tell final.c that we don't need a label passed to mcount. */
+/* Map i386 registers to the numbers dwarf expects. Of course this is different
+ from what stabs expects. */
+
+#undef DWARF_DBX_REGISTER_NUMBER
+#define DWARF_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 \
+ : (n) == 1 ? 2 \
+ : (n) == 2 ? 1 \
+ : (n) == 3 ? 3 \
+ : (n) == 4 ? 6 \
+ : (n) == 5 ? 7 \
+ : (n) == 6 ? 5 \
+ : (n) == 7 ? 4 \
+ : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
+ : (-1))
+
+/* Now what stabs expects in the register. */
+#define STABS_DBX_REGISTER_NUMBER(n) \
+((n) == 0 ? 0 : \
+ (n) == 1 ? 2 : \
+ (n) == 2 ? 1 : \
+ (n) == 3 ? 3 : \
+ (n) == 4 ? 6 : \
+ (n) == 5 ? 7 : \
+ (n) == 6 ? 4 : \
+ (n) == 7 ? 5 : \
+ (n) + 4)
+
+#undef DBX_REGISTER_NUMBER
+#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \
+ ? DWARF_DBX_REGISTER_NUMBER(n) \
+ : STABS_DBX_REGISTER_NUMBER(n))
+/* Tell final.c that we don't need a label passed to mcount. */
#define NO_PROFILE_DATA
+/* Output assembler code to FILE to increment profiler label # LABELNO
+ for profiling a function entry. */
/* Redefine this to not pass an unused label in %edx. */
#undef FUNCTION_PROFILER
@@ -180,123 +402,146 @@ Boston, MA 02111-1307, USA. */
fprintf (FILE, "\tcall mexitcount\n"); \
} \
}
-
-/*
- * Some imports from svr4.h in support of shared libraries.
- * Currently, we need the DECLARE_OBJECT_SIZE stuff.
- */
-
-#define HANDLE_SYSV_PRAGMA
-
-/* Define the strings used for the special svr4 .type and .size directives.
- These strings generally do not vary from one system running svr4 to
- another, but if a given system (e.g. m88k running svr) needs to use
- different pseudo-op names for these, they may be overridden in the
- file which includes this one. */
-
-#define TYPE_ASM_OP ".type"
-#define SIZE_ASM_OP ".size"
-#define SET_ASM_OP ".set"
-
-/* This is how we tell the assembler that a symbol is weak. */
-#define ASM_WEAKEN_LABEL(FILE,NAME) \
- do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \
- fputc ('\n', FILE); } while (0)
-
-/* The following macro defines the format used to output the second
- operand of the .type assembler directive. Different svr4 assemblers
- expect various different forms for this operand. The one given here
- is just a default. You may need to override it in your machine-
- specific tm.h file (depending upon the particulars of your assembler). */
-
-#define TYPE_OPERAND_FMT "@%s"
-
-/* Write the extra assembler code needed to declare a function's result.
- Most svr4 assemblers don't require any special declaration of the
- result value, but there are exceptions. */
-
-#ifndef ASM_DECLARE_RESULT
-#define ASM_DECLARE_RESULT(FILE, RESULT)
+
+#undef SIZE_TYPE
+#define SIZE_TYPE "unsigned int"
+
+#undef PTRDIFF_TYPE
+#define PTRDIFF_TYPE "int"
+
+#undef WCHAR_TYPE
+#define WCHAR_TYPE "int"
+
+#define WCHAR_UNSIGNED 0
+
+#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__=3 -Asystem(unix) -Asystem(FreeBSD) -Acpu(i386) -Amachine(i386)"
+
+#undef CPP_SPEC
+#if TARGET_CPU_DEFAULT == 2
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}"
+#else
+#define CPP_SPEC "\
+%{!maout: -D__ELF__} \
+%{munderscores: -D__UNDERSCORES__} \
+%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
+%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}"
#endif
-/* These macros generate the special .type and .size directives which
- are used to set the corresponding fields of the linker symbol table
- entries in an ELF object file under SVR4. These macros also output
- the starting labels for the relevant functions/objects. */
+#undef CC1_SPEC
+#define CC1_SPEC "\
+%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
+%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
-/* Write the extra assembler code needed to declare a function properly.
- Some svr4 assemblers need to also have something extra said about the
- function's return value. We allow for that here. */
+#undef ASM_SPEC
+#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
- do { \
- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
- assemble_name (FILE, NAME); \
- putc (',', FILE); \
- fprintf (FILE, TYPE_OPERAND_FMT, "function"); \
- putc ('\n', FILE); \
- ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
- ASM_OUTPUT_LABEL(FILE, NAME); \
- } while (0)
+/* Like the default, except no -lg, and no -p. */
+#undef LIB_SPEC
+#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:-lc}%{pthread:-lc_r}}%{pg:%{!pthread:-lc_p}%{pthread:-lc_r_p}}}"
-/* Write the extra assembler code needed to declare an object properly. */
+/* Let gcc locate this for us according to the -m rules */
+#undef LIBGCC_SPEC
+#define LIBGCC_SPEC "%{!shared:libgcc.a%s}"
+
+/* Provide a LINK_SPEC appropriate for FreeBSD. Here we provide support
+ for the special GCC options -static and -shared, which allow us to
+ link things in one of these three modes by applying the appropriate
+ combinations of options at link-time. We like to support here for
+ as many of the other GNU linker options as possible. But I don't
+ have the time to search for those flags. I am sure how to add
+ support for -soname shared_object_name. H.J.
+
+ When the -shared link option is used a final link is not being
+ done. */
+
+#undef LINK_SPEC
+#define LINK_SPEC "\
+ %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
+ %{maout: %{shared:-Bshareable} \
+ %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
+ %{pg:-Bstatic} %{Z}} \
+ %{assert*} %{R*}} \
+ %{!maout: \
+ -m elf_i386 \
+ %{Wl,*:%*} \
+ %{assert*} %{R*} %{rpath*} %{defsym*} \
+ %{shared:-Bshared %{h*} %{soname*}} \
+ %{symbolic:-Bsymbolic} \
+ %{!shared: \
+ %{!static: \
+ %{rdynamic: -export-dynamic} \
+ %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
+ %{static:-Bstatic}}}"
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \
- do { \
- fprintf (FILE, "\t%s\t ", TYPE_ASM_OP); \
- assemble_name (FILE, NAME); \
- putc (',', FILE); \
- fprintf (FILE, TYPE_OPERAND_FMT, "object"); \
- putc ('\n', FILE); \
- size_directive_output = 0; \
- if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
- { \
- size_directive_output = 1; \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, NAME); \
- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
- } \
- ASM_OUTPUT_LABEL(FILE, NAME); \
- } while (0)
+/* Get perform_* macros to build libgcc.a. */
+#include "i386/perform.h"
-/* Output the size directive for a decl in rest_of_decl_compilation
- in the case where we did not do so before the initializer.
- Once we find the error_mark_node, we know that the value of
- size_directive_output was set
- by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
-
-#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
-do { \
- char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
- if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
- && ! AT_END && TOP_LEVEL \
- && DECL_INITIAL (DECL) == error_mark_node \
- && !size_directive_output) \
- { \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, name); \
- fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL)));\
- } \
- } while (0)
-
-
-/* This is how to declare the size of a function. */
-
-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
- do { \
- if (!flag_inhibit_size_directive) \
- { \
- char label[256]; \
- static int labelno; \
- labelno++; \
- ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno); \
- ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno); \
- fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
- assemble_name (FILE, (FNAME)); \
- fprintf (FILE, ","); \
- assemble_name (FILE, label); \
- fprintf (FILE, "-"); \
- assemble_name (FILE, (FNAME)); \
- putc ('\n', FILE); \
- } \
- } while (0)
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC "\
+ %{maout: %{shared:c++rt0.o%s} \
+ %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \
+ %{!maout: %{!shared: \
+ %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
+ crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}"
+
+/* This goes away when the math emulator is fixed. */
+#undef TARGET_DEFAULT
+#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
diff --git a/contrib/gcc/cp/except.c b/contrib/gcc/cp/except.c
index 4443b98..40894cb 100644
--- a/contrib/gcc/cp/except.c
+++ b/contrib/gcc/cp/except.c
@@ -148,6 +148,9 @@ asm (TEXT_SECTION_ASM_OP);
void
exception_section ()
{
+#ifdef EXCEPTION_SECTION_FUNCTION
+ EXCEPTION_SECTION_FUNCTION;
+#else
#ifdef ASM_OUTPUT_SECTION_NAME
named_section (NULL_TREE, ".gcc_except_table");
#else
@@ -160,6 +163,7 @@ exception_section ()
readonly_data_section ();
#endif
#endif
+#endif
}
diff --git a/contrib/gcc/function.c b/contrib/gcc/function.c
index e45eec6..b1c342f 100644
--- a/contrib/gcc/function.c
+++ b/contrib/gcc/function.c
@@ -4887,18 +4887,23 @@ mark_varargs ()
#define HAS_INIT_SECTION
#endif
+#ifndef GEN_CALL__MAIN
+#ifndef HAS_INIT_SECTION
+#define GEN_CALL__MAIN \
+ do { \
+ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \
+ VOIDmode, 0); \
+ } while (0)
+#endif
+#endif
+
void
expand_main_function ()
{
+#ifdef GEN_CALL__MAIN
if (!output_bytecode)
- {
- /* The zero below avoids a possible parse error */
- 0;
-#if !defined (HAS_INIT_SECTION)
- emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0,
- VOIDmode, 0);
-#endif /* not HAS_INIT_SECTION */
- }
+ GEN_CALL__MAIN;
+#endif
}
extern struct obstack permanent_obstack;
diff --git a/contrib/gcc/gcc.c b/contrib/gcc/gcc.c
index c40097e..d234c1d 100644
--- a/contrib/gcc/gcc.c
+++ b/contrib/gcc/gcc.c
@@ -2327,6 +2327,14 @@ struct infile
char *language;
};
+#if defined(FREEBSD_NATIVE)
+#if defined(FREEBSD_AOUT) /* XXX: revisit this */
+static int objformat_aout = 1; /* set default format in absense of */
+#else /* any other hints. */
+static int objformat_aout = 0;
+#endif
+#endif
+
/* Also a vector of input files specified. */
static struct infile *infiles;
@@ -2472,6 +2480,39 @@ process_command (argc, argv)
}
}
+#if defined(FREEBSD_NATIVE)
+ {
+ /* first hint is /etc/objectformat */
+ FILE *fp = fopen("/etc/objectformat", "r");
+ if (fp) {
+ char buf[1024];
+ buf[1023] = '\0';
+ while (fgets(buf, sizeof(buf) - 1, fp) != NULL) {
+ i = strlen(buf);
+ if (buf[i - 1] == '\n')
+ buf[i - 1] = '\0';
+ if (strcmp(buf, "OBJFORMAT=aout") == 0)
+ objformat_aout = 1;
+ else if (strcmp(buf, "OBJFORMAT=elf") == 0)
+ objformat_aout = 0;
+ else
+ fprintf(stderr, "Unrecognized line in /etc/objectformat: %s\n", buf);
+ }
+ fclose(fp);
+ }
+ /* but the user $OBJFORMAT overrides system default */
+ temp = getenv("OBJFORMAT");
+ if (temp) {
+ if (strcmp(temp, "aout") == 0)
+ objformat_aout = 1;
+ else if (strcmp(temp, "elf") == 0)
+ objformat_aout = 0;
+ else
+ fprintf(stderr, "Unrecognized value of $OBJFORMAT: %s\n", temp);
+ }
+ }
+#endif
+
/* Convert new-style -- options to old-style. */
translate_options (&argc, &argv);
@@ -2481,6 +2522,19 @@ process_command (argc, argv)
for (i = 1; i < argc; i++)
{
+#if defined(FREEBSD_NATIVE)
+ /* .. and command line args override all */
+ if (strcmp (argv[i], "-aout") == 0)
+ {
+ objformat_aout = 1;
+ continue;
+ }
+ else if (strcmp (argv[i], "-elf") == 0)
+ {
+ objformat_aout = 0;
+ continue;
+ }
+#endif
if (! strcmp (argv[i], "-dumpspecs"))
{
printf ("*asm:\n%s\n\n", asm_spec);
@@ -2707,6 +2761,11 @@ process_command (argc, argv)
/* Use 2 as fourth arg meaning try just the machine as a suffix,
as well as trying the machine and the version. */
#ifdef FREEBSD_NATIVE
+ if (objformat_aout) {
+ n_switches++; /* add implied -maout */
+ add_prefix (&exec_prefixes, "/usr/libexec/aout/", 0, 0, NULL_PTR);
+ } else
+ add_prefix (&exec_prefixes, "/usr/libexec/elf/", 0, 0, NULL_PTR);
add_prefix (&exec_prefixes, "/usr/libexec/", 0, 0, NULL_PTR);
add_prefix (&exec_prefixes, "/usr/bin/", 0, 0, NULL_PTR);
add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", 0, 0, NULL_PTR);
@@ -2779,6 +2838,19 @@ process_command (argc, argv)
to the copy in the vector of switches.
Store all the infiles in their vector. */
+#ifdef FREEBSD_NATIVE
+ if (objformat_aout == 1) {
+ switches[n_switches].part1 = "maout";
+ switches[n_switches].args = 0;
+ switches[n_switches].live_cond = 0;
+ switches[n_switches].valid = 0;
+ n_switches++;
+ putenv("OBJFORMAT=aout");
+ } else {
+ putenv("OBJFORMAT=elf");
+ }
+#endif
+
for (i = 1; i < argc; i++)
{
/* Just skip the switches that were handled by the preceding loop. */
@@ -2798,6 +2870,12 @@ process_command (argc, argv)
;
else if (! strcmp (argv[i], "-print-multi-directory"))
;
+#ifdef FREEBSD_NATIVE
+ else if (! strcmp (argv[i], "-aout"))
+ ;
+ else if (! strcmp (argv[i], "-elf"))
+ ;
+#endif
else if (argv[i][0] == '+' && argv[i][1] == 'e')
{
/* Compensate for the +e options to the C++ front-end;
diff --git a/contrib/gcc/libgcc2.c b/contrib/gcc/libgcc2.c
index 1e01e91..99693bb 100644
--- a/contrib/gcc/libgcc2.c
+++ b/contrib/gcc/libgcc2.c
@@ -2106,9 +2106,7 @@ __do_global_dtors ()
(*p++) ();
#endif
}
-#endif
-#ifndef INIT_SECTION_ASM_OP
/* Run all the global constructors on entry to the program. */
#ifndef ON_EXIT
@@ -2128,9 +2126,7 @@ __do_global_ctors ()
DO_GLOBAL_CTORS_BODY;
ON_EXIT (__do_global_dtors, 0);
}
-#endif /* no INIT_SECTION_ASM_OP */
-#if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
/* Subroutine called automatically by `main'.
Compiling a global function named `main'
produces an automatic call to this function at the beginning.
@@ -2165,7 +2161,7 @@ SYMBOL__MAIN ()
/* We declare the lists here with two elements each,
so that they are valid empty lists if no other definition is loaded. */
-#if !defined(INIT_SECTION_ASM_OP) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
+#if (!defined(INIT_SECTION_ASM_OP) || !defined(OBJECT_FORMAT_ELF)) && !defined(CTOR_LISTS_DEFINED_EXTERNALLY)
#if defined(__NeXT__) || defined(_AIX)
/* After 2.3, try this definition on all systems. */
func_ptr __CTOR_LIST__[2] = {0, 0};
diff --git a/gnu/usr.bin/cc/Makefile.inc b/gnu/usr.bin/cc/Makefile.inc
index 0284d7d..f5c9c2b 100644
--- a/gnu/usr.bin/cc/Makefile.inc
+++ b/gnu/usr.bin/cc/Makefile.inc
@@ -1,5 +1,5 @@
#
-# $Id: Makefile.inc,v 1.21 1998/01/11 04:10:26 jb Exp $
+# $Id: Makefile.inc,v 1.22 1998/01/25 09:49:00 jb Exp $
#
# Sometimes this is .include'd several times...
@@ -23,15 +23,15 @@ BINFORMAT?= aout
#BINFORMAT?= elf
.endif
+# same backend, just change compiled-in default.
.if ${BINFORMAT} == aout
CFLAGS+= -DFREEBSD_AOUT
-target= ${MACHINE_ARCH}-unknown-freebsd
.endif
.if ${BINFORMAT} == elf
CFLAGS+= -DFREEBSD_ELF
-target= ${MACHINE_ARCH}-unknown-freebsdelf
.endif
+target= ${MACHINE_ARCH}-unknown-freebsd
version!= sed -e 's/.*\"\([^ \"]*\)[ \"].*/\1/' < ${GCCDIR}/version.c
CFLAGS+= -I${GCCDIR} -I${GCCDIR}/config
diff --git a/gnu/usr.bin/cc/cc/Makefile b/gnu/usr.bin/cc/cc/Makefile
index 8fd206a..91400cc 100644
--- a/gnu/usr.bin/cc/cc/Makefile
+++ b/gnu/usr.bin/cc/cc/Makefile
@@ -1,5 +1,5 @@
#
-# $Id$
+# $Id: Makefile,v 1.12 1997/02/22 15:44:52 peter Exp $
#
PROG = cc
@@ -14,9 +14,7 @@ CLEANFILES+= multilib.h
CFLAGS+= -I. # I mean it!
CFLAGS+= -I${.CURDIR}
-# I have NO idea what this is for, it appears to be m68k specific.
multilib.h: genmultilib
- sh ${GCCDIR}/genmultilib "$(MULTILIB_OPTIONS)" \
- "$(MULTILIB_DIRNAMES)" "$(MULTILIB_MATCHES)" > multilib.h
+ echo '#define MULTILIB_SELECT "aout maout;elf !maout;"' > multilib.h
.include <bsd.prog.mk>
diff --git a/gnu/usr.bin/cc/cc_tools/Makefile b/gnu/usr.bin/cc/cc_tools/Makefile
index 1d22fc6..76ba045 100644
--- a/gnu/usr.bin/cc/cc_tools/Makefile
+++ b/gnu/usr.bin/cc/cc_tools/Makefile
@@ -1,5 +1,5 @@
#
-# $Id: Makefile,v 1.6 1998/01/25 09:47:46 jb Exp $
+# $Id: Makefile,v 1.7 1998/03/06 13:34:36 bde Exp $
#
#
@@ -116,24 +116,11 @@ CLEANFILES+= objc-parse.y # insurance
#-----------------------------------------------------------------------
# CPP parser done in its own makefile
#-----------------------------------------------------------------------
-# Everything in ${SRCS} is generated
-CLEANFILES+= ${SRCS}
-
-#-----------------------------------------------------------------------
-all: ${BINFORMAT} ${SRCS}
-
-#-----------------------------------------------------------------------
-beforedepend: ${BINFORMAT}
-
-#-----------------------------------------------------------------------
# the host/target compiler config.
COMMONHDRS= config.h hconfig.h tconfig.h tm.h options.h specs.h
-${COMMONHDRS}: ${BINFORMAT}
-
-aout:
- @rm -f elf
+${COMMONHDRS}:
echo '#include "${MACHINE_ARCH}/freebsd.h"' > tm.h
echo '#include "${MACHINE_ARCH}/xm-freebsd.h"' > config.h
echo '#include "${MACHINE_ARCH}/xm-freebsd.h"' > hconfig.h
@@ -141,22 +128,20 @@ aout:
echo '#include "cp/lang-options.h"' > options.h
echo '#include "cp/lang-specs.h"' > specs.h
echo '#include "f2c-specs.h"' >> specs.h
- @touch aout
-
-elf:
- @rm -f aout
- echo '#include "${MACHINE_ARCH}/freebsd-elf.h"' > tm.h
- echo '#include "${MACHINE_ARCH}/xm-freebsd.h"' > config.h
- echo '#include "${MACHINE_ARCH}/xm-freebsd.h"' > hconfig.h
- echo '#include "${MACHINE_ARCH}/xm-freebsd.h"' > tconfig.h
- echo '#include "cp/lang-options.h"' > options.h
- echo '#include "cp/lang-specs.h"' > specs.h
- echo '#include "f2c-specs.h"' >> specs.h
- @touch elf
SRCS+= ${COMMONHDRS}
CLEANFILES+= elf aout
+#-----------------------------------------------------------------------
+# Everything in ${SRCS} is generated
+CLEANFILES+= ${SRCS}
+
+#-----------------------------------------------------------------------
+all: ${COMMONHDRS} ${SRCS}
+
+#-----------------------------------------------------------------------
+beforedepend: ${COMMONHDRS}
+
# We kept ${LOCOBJS} separate from ${OBJS} because adding all the
# objects to ${OBJS} would give too many (cyclic) dependencies.
# Add just enough dependencies for `make -j 1000' to work.
OpenPOWER on IntegriCloud