summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-03-08 05:29:49 +0000
committerpeter <peter@FreeBSD.org>1998-03-08 05:29:49 +0000
commitc39aed21a8d0e0849e9678f826151961a0762e3b (patch)
treea6ca8932d003c3051dc60b05e31670c8902de0bb /contrib
parent2bddba52f1a956b695317bf8be9a633f302c4df3 (diff)
downloadFreeBSD-src-c39aed21a8d0e0849e9678f826151961a0762e3b.zip
FreeBSD-src-c39aed21a8d0e0849e9678f826151961a0762e3b.tar.gz
First round of changes to support generation of assembler for the old
a.out gas and the binutils gas (elf or a.out) with a single compiler. This uses other infrastructure not yet committed, in order to support both a.out and elf it needs to be able to get to both a.out and elf gas, ld, libs, crt* etc. So for now, the support is pretty much dormant. The new freebsd.h file is based on the old freebsd-elf.h file (which has a long lineage, right back through linux and svr4 files). The change is pretty dramatic from a gcc internals standpoint as it overrides a lot of definitions in order to generate different output based on target mode. There is potential for screw-ups, so please be on the lookout - gcc's configuration mechanism wasn't really meant for this kind of thing. It's believed to compile world etc just fine under both a.out and elf, can handle global constructors and destructors, handles the differences in a.out and elf stabs, and what sections things like exceptions go in. The initial idea came from i386/osfrose.h which is a dual rose/elf format target. These two are not as diverse as a.out and elf it would seem. The cc front-end uses external configuration to determine default object format (still being thrashed out, so read the source if you want to see it so far), and has a '-aout' and '-elf' override command line switch. There are some other internal switches that can be accessed, namely -maout, -mno-aout, -munderscores and -mnounderscores. The underscore and local symbol prefixing rules are controllable seperately to the output format. (ie: it's possible to generate a.out without the _ prefixes on symbols and also to generate elf with the _ prefixes. This isn't quite optimal, but does seem to work pretty well, except the linkers don't always recognise the local symbols without their normal names) The default format is a.out (still), nobody should see any major changes. With both elf and a.out tools and libraries installed: [1:26pm]/tmp-223> cc -elf -o hello hello.c peter@beast[1:27pm]/tmp-224> file hello hello: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked, not stripped [1:27pm]/tmp-225> ./hello hello world! [1:27pm]/tmp-226> cc -aout -o hello hello.c [1:27pm]/tmp-227> file hello hello: FreeBSD/i386 compact demand paged dynamically linked executable not stripped 1:27pm]/tmp-228> ./hello hello world! Since my co-conspirators put a lot of effort into this too, I'll add them so they can share the blame^H^H^H^H^Hglory. :-) Reviewed by: sos, jdp
Diffstat (limited to 'contrib')
-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
7 files changed, 1022 insertions, 704 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};
OpenPOWER on IntegriCloud