diff options
author | obrien <obrien@FreeBSD.org> | 2000-03-23 10:18:26 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2000-03-23 10:18:26 +0000 |
commit | 13cef0c010be3315fcfa5a6f3ddbe31584d4c032 (patch) | |
tree | cb52c4ff007ce6d9c1448aec0f3d9d41e5788d5b /contrib/gcc/config | |
parent | 16d518267b5d1c92e3740ebb6746326029dbac6a (diff) | |
download | FreeBSD-src-13cef0c010be3315fcfa5a6f3ddbe31584d4c032.zip FreeBSD-src-13cef0c010be3315fcfa5a6f3ddbe31584d4c032.tar.gz |
Clean up the FreeBSD configuration files -- includes removing the usage
of svr4.h on the i386, and moving all the shared arch neutral bits into
the FreeBSD general config header.
Diffstat (limited to 'contrib/gcc/config')
-rw-r--r-- | contrib/gcc/config/alpha/freebsd.h | 548 | ||||
-rw-r--r-- | contrib/gcc/config/freebsd.h | 500 | ||||
-rw-r--r-- | contrib/gcc/config/i386/freebsd.h | 925 | ||||
-rw-r--r-- | contrib/gcc/config/i386/freebsd.h.fixed | 925 |
4 files changed, 1674 insertions, 1224 deletions
diff --git a/contrib/gcc/config/alpha/freebsd.h b/contrib/gcc/config/alpha/freebsd.h index a3052d8..da88be2 100644 --- a/contrib/gcc/config/alpha/freebsd.h +++ b/contrib/gcc/config/alpha/freebsd.h @@ -1,6 +1,6 @@ -/* Definitions of target machine for GNU compiler, - for Alpha FreeBSD systems. - Copyright (C) 1998 Free Software Foundation, Inc. +/* Definitions for DEC AXP Alpha running FreeBSD using the ELF format + Copyright (C) 2000 Free Software Foundation, Inc. + Contributed by David O'Brien <obrien@FreeBSD.org> This file is part of GNU CC. @@ -25,45 +25,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* $FreeBSD$ */ -/* Make gcc agree with <machine/ansi.h> */ - -#undef WCHAR_TYPE -#define WCHAR_TYPE "int" - -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE 32 - -#undef WCHAR_UNSIGNED -#define WCHAR_UNSIGNED 0 - -/* Provide an ASM_SPEC appropriate for a FreeBSD/Alpha target. This differs - from the generic FreeBSD ASM_SPEC in that no special handling of PIC is - necessary on the Alpha. */ - -#undef ASM_SPEC -#define ASM_SPEC " %| %{mcpu=*:-m%*}" - -#undef ASM_FINAL_SPEC - -/* Output assembler code to FILE to increment profiler label # LABELNO - for profiling a function entry. Under FreeBSD/Alpha, the assembler does - nothing special with -pg. */ - -#undef FUNCTION_PROFILER -#define FUNCTION_PROFILER(FILE, LABELNO) \ - fputs ("\tjsr $28,_mcount\n", (FILE)) /* at */ - -/* Show that we need a GP when profiling. */ -#define TARGET_PROFILING_NEEDS_GP - -#undef HAS_INIT_SECTION - -#undef PREFERRED_DEBUGGING_TYPE -#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG - -#undef TARGET_VERSION -#define TARGET_VERSION fprintf (stderr, " (FreeBSD/Alpha ELF)"); - /* Names to predefine in the preprocessor for this target machine. XXX FreeBSD, by convention, shouldn't do __alpha, but lots of applications expect it because that's what OSF/1 does. */ @@ -71,7 +32,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #undef CPP_PREDEFINES #define CPP_PREDEFINES \ "-D__alpha__ -D__alpha -Acpu(alpha) -Amachine(alpha)" \ - CPP_FBSD_PREDEFINES + FBSD_CPP_PREDEFINES #undef LINK_SPEC #define LINK_SPEC "-m elf64alpha \ @@ -86,6 +47,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ %{!dynamic-linker:-dynamic-linker /usr/libexec/ld-elf.so.1}} \ %{static:-Bstatic}}" +/* Provide an ASM_SPEC appropriate for a FreeBSD/Alpha target. This differs + from the generic FreeBSD ASM_SPEC in that no special handling of PIC is + necessary on the Alpha. */ + +#undef ASM_SPEC +#define ASM_SPEC " %| %{mcpu=*:-m%*}" + +#undef ASM_FINAL_SPEC + /* Provide a STARTFILE_SPEC for FreeBSD that is compatible with the non-aout version used on i386. */ @@ -103,448 +73,144 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #define ENDFILE_SPEC \ "%{!shared:crtend.o%s} %{shared:crtendS.o%s}" -/* Handle #pragma weak and #pragma pack. */ -#define HANDLE_SYSV_PRAGMA - -#undef OBJECT_FORMAT_COFF -#undef EXTENDED_COFF -#define OBJECT_FORMAT_ELF - -/* This is the char to use for continuation (in case we need to turn - continuation back on). */ +/************************[ Target stuff ]***********************************/ -#undef DBX_CONTIN_CHAR -#define DBX_CONTIN_CHAR '?' +/* Define the actual types of some ANSI-mandated types. + Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, + c-common.c, and config/<arch>/<arch>.h. */ -#undef TARGET_DEFAULT -#define TARGET_DEFAULT (MASK_FP | MASK_FPREGS | MASK_GAS) +/* alpha.h gets this wrong for FreeBSD. We use the GCC defaults instead. */ +#undef WCHAR_TYPE -/* Output at beginning of assembler file. */ +/* Handle cross-compilation on 32-bits machines (such as i386) for 64-bits + machines (Alpha in this case). */ -#undef ASM_FILE_START -#define ASM_FILE_START(FILE) \ -{ \ - alpha_write_verstamp (FILE); \ - output_file_directive ((FILE), main_input_filename); \ - fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ - fprintf ((FILE), "\t.set noat\n"); \ -} - -#undef ASM_OUTPUT_SOURCE_LINE -#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \ - alpha_output_lineno ((STREAM), (LINE)) -extern void alpha_output_lineno (); +#if defined(__i386__) +#undef HOST_BITS_PER_LONG +#define HOST_BITS_PER_LONG 32 +#undef HOST_WIDE_INT +#define HOST_WIDE_INT long long +#undef HOST_BITS_PER_WIDE_INT +#define HOST_BITS_PER_WIDE_INT 64 +#endif -extern void output_file_directive (); +/* This is the pseudo-op used to generate a 64-bit word of data with a + specific value in some section. */ -/* Attach a special .ident directive to the end of the file to identify - the version of GCC which compiled this code. The format of the - .ident string is patterned after the ones produced by native svr4 - C compilers. */ - -#undef IDENT_ASM_OP -#define IDENT_ASM_OP ".ident" - -#ifdef IDENTIFY_WITH_IDENT -#undef ASM_IDENTIFY_GCC -#define ASM_IDENTIFY_GCC(FILE) /* nothing */ -#undef ASM_IDENTIFY_LANGUAGE -#define ASM_IDENTIFY_LANGUAGE(FILE) \ - fprintf((FILE), "\t%s \"GCC (%s) %s\"\n", IDENT_ASM_OP, \ - lang_identify(), version_string) -#else -#undef ASM_FILE_END -#define ASM_FILE_END(FILE) \ -do { \ - fprintf ((FILE), "\t%s\t\"GCC: (GNU) %s\"\n", \ - IDENT_ASM_OP, version_string); \ - } while (0) -#endif +#undef INT_ASM_OP +#define INT_ASM_OP ".quad" -/* Allow #sccs in preprocessor. */ +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (FreeBSD/Alpha ELF)"); -#define SCCS_DIRECTIVE +#define TARGET_AOUT (0) +#define TARGET_ELF (1) +#define TARGET_UNDERSCORES (0) -/* Output #ident as a .ident. */ +#undef OBJECT_FORMAT_COFF +#undef EXTENDED_COFF -#undef ASM_OUTPUT_IDENT -#define ASM_OUTPUT_IDENT(FILE, NAME) \ - fprintf ((FILE), "\t%s\t\"%s\"\n", IDENT_ASM_OP, (NAME)); +#undef TARGET_DEFAULT +#define TARGET_DEFAULT (MASK_FP | MASK_FPREGS | MASK_GAS) -/* This is how to allocate empty space in some section. The .zero - pseudo-op is used for this on most svr4 assemblers. */ +#undef HAS_INIT_SECTION -#undef SKIP_ASM_OP -#define SKIP_ASM_OP ".zero" +/* Output assembler code to FILE to increment profiler label # LABELNO + for profiling a function entry. Under FreeBSD/Alpha, the assembler does + nothing special with -pg. */ -#undef ASM_OUTPUT_SKIP -#define ASM_OUTPUT_SKIP(FILE, SIZE) \ - fprintf ((FILE), "\t%s\t%u\n", SKIP_ASM_OP, (SIZE)) +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ + fputs ("\tjsr $28,_mcount\n", (FILE)) /* at */ -/* Output the label which precedes a jumptable. Note that for all svr4 - systems where we actually generate jumptables (which is to say every - svr4 target except i386, where we use casesi instead) we put the jump- - tables into the .rodata section and since other stuff could have been - put into the .rodata section prior to any given jumptable, we have to - make sure that the location counter for the .rodata section gets pro- - perly re-aligned prior to the actual beginning of the jump table. */ +/* Show that we need a GP when profiling. */ +#undef TARGET_PROFILING_NEEDS_GP +#define TARGET_PROFILING_NEEDS_GP -#undef ALIGN_ASM_OP -#define ALIGN_ASM_OP ".align" +/* We always use gas here, so we don't worry about ECOFF assembler problems. */ +#undef TARGET_GAS +#define TARGET_GAS 1 -#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL -#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \ - ASM_OUTPUT_ALIGN ((FILE), 2); -#endif -#undef ASM_OUTPUT_CASE_LABEL -#define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \ - do { \ - ASM_OUTPUT_BEFORE_CASE_LABEL ((FILE), (PREFIX), (NUM), (JUMPTABLE)) \ - ASM_OUTPUT_INTERNAL_LABEL ((FILE), (PREFIX), (NUM)); \ - } while (0) +/************************[ Assembler stuff ]********************************/ -/* The standard SVR4 assembler seems to require that certain builtin - library routines (e.g. .udiv) be explicitly declared as .globl - in each assembly file where they are referenced. */ - -#undef ASM_OUTPUT_EXTERNAL_LIBCALL -#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ - ASM_GLOBALIZE_LABEL ((FILE), XSTR ((FUN), 0)) - -/* This says how to output assembler code to declare an - uninitialized external 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 COMMON_ASM_OP -#define COMMON_ASM_OP ".comm" - -#undef ASM_OUTPUT_ALIGNED_COMMON -#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ -do { \ - fprintf ((FILE), "\t%s\t", COMMON_ASM_OP); \ - assemble_name ((FILE), (NAME)); \ - fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ -} while (0) - -/* 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 LOCAL_ASM_OP -#define LOCAL_ASM_OP ".local" - -#undef ASM_OUTPUT_ALIGNED_LOCAL -#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ -do { \ - fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP); \ - assemble_name ((FILE), (NAME)); \ - fprintf ((FILE), "\n"); \ - ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN)); \ -} while (0) +/* This is how to begin an assembly language file. + ELF also needs a .version. */ -/* This is the pseudo-op used to generate a 64-bit word of data with a - specific value in some section. */ +#undef ASM_FILE_START +#define ASM_FILE_START(FILE) \ + { \ + alpha_write_verstamp (FILE); \ + output_file_directive ((FILE), main_input_filename); \ + fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ + fprintf ((FILE), "\t.set noat\n"); \ + } -#undef INT_ASM_OP -#define INT_ASM_OP ".quad" +extern void output_file_directive (); +extern void alpha_output_lineno (); -/* This is the pseudo-op used to generate a contiguous sequence of byte - values from a double-quoted string WITHOUT HAVING A TERMINATING NUL - AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */ - -#undef ASCII_DATA_ASM_OP -#define ASCII_DATA_ASM_OP ".ascii" - -/* Support const sections and the ctors and dtors sections for g++. - Note that there appears to be two different ways to support const - sections at the moment. You can either #define the symbol - READONLY_DATA_SECTION (giving it some code which switches to the - readonly data section) or else you can #define the symbols - EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and - SELECT_RTX_SECTION. We do both here just to be on the safe side. */ - -#undef USE_CONST_SECTION -#define USE_CONST_SECTION 1 - -#undef CONST_SECTION_ASM_OP -#define CONST_SECTION_ASM_OP ".section\t.rodata" - -/* Define the pseudo-ops used to switch to the .ctors and .dtors sections. - - Note that we want to give these sections the SHF_WRITE attribute - because these sections will actually contain data (i.e. tables of - addresses of functions in the current root executable or shared library - file) and, in the case of a shared library, the relocatable addresses - will have to be properly resolved/relocated (and then written into) by - the dynamic linker when it actually attaches the given shared library - to the executing process. (Note that on SVR4, you may wish to use the - `-z text' option to the ELF linker, when building a shared library, as - an additional check that you are doing everything right. But if you do - use the `-z text' option when building a shared library, you will get - errors unless the .ctors and .dtors sections are marked as writable - via the SHF_WRITE attribute.) */ - -#undef CTORS_SECTION_ASM_OP -#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\"" -#undef DTORS_SECTION_ASM_OP -#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\"" - -/* On svr4, we *do* have support for the .init and .fini sections, and we - can put stuff in there to be executed before and after `main'. We let - crtstuff.c and other files know this by defining the following symbols. - The definitions say how to change sections to the .init and .fini - sections. This is the same for all known svr4 assemblers. */ - -#undef INIT_SECTION_ASM_OP -#define INIT_SECTION_ASM_OP ".section\t.init" -#undef FINI_SECTION_ASM_OP -#define FINI_SECTION_ASM_OP ".section\t.fini" - -/* A default list of other sections which we might be "in" at any given - time. For targets that use additional sections (e.g. .tdesc) you - should override this definition in the target-specific file which - includes this file. */ - -#undef EXTRA_SECTIONS -#define EXTRA_SECTIONS in_const, in_ctors, in_dtors - -/* A default list of extra section function definitions. For targets - that use additional sections (e.g. .tdesc) you should override this - definition in the target-specific file which includes this file. */ - -#undef EXTRA_SECTION_FUNCTIONS -#define EXTRA_SECTION_FUNCTIONS \ - CONST_SECTION_FUNCTION \ - CTORS_SECTION_FUNCTION \ - DTORS_SECTION_FUNCTION - -#undef READONLY_DATA_SECTION -#define READONLY_DATA_SECTION() const_section () - -extern void text_section (); - -#undef CONST_SECTION_FUNCTION -#define CONST_SECTION_FUNCTION \ -void \ -const_section () \ -{ \ - if (!USE_CONST_SECTION) \ - text_section(); \ - else if (in_section != in_const) \ - { \ - fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \ - in_section = in_const; \ - } \ -} - -#undef CTORS_SECTION_FUNCTION -#define CTORS_SECTION_FUNCTION \ -void \ -ctors_section () \ -{ \ - if (in_section != in_ctors) \ - { \ - fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \ - in_section = in_ctors; \ - } \ -} - -#undef DTORS_SECTION_FUNCTION -#define DTORS_SECTION_FUNCTION \ -void \ -dtors_section () \ -{ \ - if (in_section != in_dtors) \ - { \ - fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \ - in_section = in_dtors; \ - } \ -} +#undef ASM_OUTPUT_SOURCE_LINE +#define ASM_OUTPUT_SOURCE_LINE(STREAM, LINE) \ + alpha_output_lineno ((STREAM), (LINE)) /* Switch into a generic section. This is currently only used to support section attributes. We make the section read-only and executable for a function decl, read-only for a const data decl, and writable for a non-const data decl. */ -#undef ASM_OUTPUT_SECTION_NAME +#undef ASM_OUTPUT_SECTION_NAME #define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \ fprintf ((FILE), ".section\t%s,\"%s\",@progbits\n", (NAME), \ (DECL) && TREE_CODE (DECL) == FUNCTION_DECL ? "ax" : \ (DECL) && DECL_READONLY_SECTION ((DECL), (RELOC)) ? "a" : "aw") - -/* 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 { \ - ctors_section (); \ - fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ - assemble_name ((FILE), (NAME)); \ - fprintf ((FILE), "\n"); \ - } while (0) - -/* 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 { \ - dtors_section (); \ - fprintf ((FILE), "\t%s\t ", INT_ASM_OP); \ - assemble_name ((FILE), (NAME)); \ - fprintf ((FILE), "\n"); \ - } while (0) - /* A C statement or statements to switch to the appropriate section for output of DECL. DECL is either a `VAR_DECL' node or a constant of some sort. RELOC indicates whether forming the initial value of DECL requires link-time relocations. */ -#undef SELECT_SECTION +#undef SELECT_SECTION #define SELECT_SECTION(DECL, RELOC) \ -{ \ - if (TREE_CODE (DECL) == STRING_CST) \ - { \ - if (! flag_writable_strings) \ - const_section (); \ - else \ - data_section (); \ - } \ - else if (TREE_CODE (DECL) == VAR_DECL) \ - { \ - if ((flag_pic && (RELOC)) \ - || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \ - || !DECL_INITIAL (DECL) \ - || (DECL_INITIAL (DECL) != error_mark_node \ - && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \ - data_section (); \ - else \ - const_section (); \ - } \ - else \ - const_section (); \ -} - -/* A C statement or statements to switch to the appropriate - section for output of RTX in mode MODE. RTX is some kind - of constant in RTL. The argument MODE is redundant except - in the case of a `const_int' rtx. Currently, these always - go into the const section. */ - -#undef SELECT_RTX_SECTION -#define SELECT_RTX_SECTION(MODE,RTX) const_section() - -/* Define the strings used for the .type, .size and .set 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. */ - -#undef TYPE_ASM_OP -#define TYPE_ASM_OP ".type" -#undef SIZE_ASM_OP -#define SIZE_ASM_OP ".size" + { \ + if (TREE_CODE (DECL) == STRING_CST) \ + { \ + if (! flag_writable_strings) \ + const_section (); \ + else \ + data_section (); \ + } \ + else if (TREE_CODE (DECL) == VAR_DECL) \ + { \ + if ((flag_pic && (RELOC)) \ + || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \ + || !DECL_INITIAL (DECL) \ + || (DECL_INITIAL (DECL) != error_mark_node \ + && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \ + data_section (); \ + else \ + const_section (); \ + } \ + else \ + const_section (); \ + } /* This is how we tell the assembler that two symbols have the same value. */ -#undef ASM_OUTPUT_DEF +#undef ASM_OUTPUT_DEF #define ASM_OUTPUT_DEF(FILE,NAME1,NAME2) \ - do { assemble_name((FILE), (NAME1)); \ - fputs(" = ", (FILE)); \ - assemble_name((FILE), (NAME2)); \ - fputc('\n', (FILE)); } while (0) - -/* A table of bytes codes used by the ASM_OUTPUT_ASCII and - ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table - corresponds to a particular byte value [0..255]. For any - given byte value, if the value in the corresponding table - position is zero, the given character can be output directly. - If the table value is 1, the byte must be output as a \ooo - octal escape. If the tables value is anything else, then the - byte value should be output as a \ followed by the value - in the table. Note that we can use standard UN*X escape - sequences for many control characters, but we don't use - \a to represent BEL because some svr4 assemblers (e.g. on - the i386) don't know about that. Also, we don't use \v - since some versions of gas, such as 2.2 did not accept it. */ - -#undef ESCAPES -#define ESCAPES \ -"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ -\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ -\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ -\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" - -/* Some svr4 assemblers have a limit on the number of characters which - can appear in the operand of a .string directive. If your assembler - has such a limitation, you should define STRING_LIMIT to reflect that - limit. Note that at least some svr4 assemblers have a limit on the - actual number of bytes in the double-quoted string, and that they - count each character in an escape sequence as one byte. Thus, an - escape sequence like \377 would count as four bytes. - - If your target assembler doesn't support the .string directive, you - should define this to zero. */ - -#undef STRING_LIMIT -#define STRING_LIMIT ((unsigned) 256) - -#undef STRING_ASM_OP -#define STRING_ASM_OP ".string" - -/* We always use gas here, so we don't worry about ECOFF assembler problems. */ -#undef TARGET_GAS -#define TARGET_GAS 1 - -/* Implicit library calls should use memcpy, not bcopy, etc. */ - -#define TARGET_MEM_FUNCTIONS - -/* Some imports from svr4.h in support of shared libraries. Currently, we - need the DECLARE_OBJECT_SIZE stuff. */ - -/* This is how we tell the assembler that a symbol is weak. */ - -#undef ASM_WEAKEN_LABEL -#define ASM_WEAKEN_LABEL(FILE, NAME) \ - do { fputs ("\t.globl\t", (FILE)); assemble_name ((FILE), (NAME)); \ - fputc ('\n', (FILE)); \ - 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). */ - -#undef TYPE_OPERAND_FMT -#define TYPE_OPERAND_FMT "@%s" + do { \ + assemble_name((FILE), (NAME1)); \ + fputs(" = ", (FILE)); \ + assemble_name((FILE), (NAME2)); \ + fputc('\n', (FILE)); \ + } while (0) -/* 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) -#endif +/************************[ Debugger stuff ]*********************************/ -/* Handle cross-compilation on 32-bits machines (such as i386) for 64-bits - machines (Alpha in this case). */ +/* This is the char to use for continuation (in case we need to turn + continuation back on). */ -#if defined(__i386__) -#undef HOST_BITS_PER_LONG -#define HOST_BITS_PER_LONG 32 -#undef HOST_WIDE_INT -#define HOST_WIDE_INT long long -#undef HOST_BITS_PER_WIDE_INT -#define HOST_BITS_PER_WIDE_INT 64 -#endif +#undef DBX_CONTIN_CHAR +#define DBX_CONTIN_CHAR '?' diff --git a/contrib/gcc/config/freebsd.h b/contrib/gcc/config/freebsd.h index d9a193e..019b3d3 100644 --- a/contrib/gcc/config/freebsd.h +++ b/contrib/gcc/config/freebsd.h @@ -1,5 +1,5 @@ /* Base configuration file for all FreeBSD targets. - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. @@ -21,15 +21,14 @@ Boston, MA 02111-1307, USA. */ /* Common FreeBSD configuration. All FreeBSD architectures should include this file, which will specify their commonalities. - Adapted from /usr/src/contrib/gcc/config/i386/freebsd.h & + Adapted from /usr/src/contrib/gcc/config/i386/freebsd.h, + /usr/src/contrib/gcc/config/svr4.h & egcs/gcc/config/i386/freebsd-elf.h version by David O'Brien */ /* $FreeBSD$ */ -/* Don't assume anything about the header files. */ -#undef NO_IMPLICIT_EXTERN_C -#define NO_IMPLICIT_EXTERN_C +/* Cpp, assembler, linker, library, and startfile spec's. */ /* This defines which switch letters take arguments. On FreeBSD, most of the normal cases (defined in gcc.c) apply, and we also have -h* and @@ -42,8 +41,10 @@ Boston, MA 02111-1307, USA. */ || (CHAR) == 'z' /* ignored by ld */ \ || (CHAR) == 'R') -#undef SWITCH_TAKES_ARG -#define SWITCH_TAKES_ARG(CHAR) (FBSD_SWITCH_TAKES_ARG(CHAR)) +#undef SWITCH_TAKES_ARG +#define SWITCH_TAKES_ARG(CHAR) (FBSD_SWITCH_TAKES_ARG(CHAR)) + +/* This defines which multi-letter switches take arguments. */ #define FBSD_WORD_SWITCH_TAKES_ARG(STR) \ (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) \ @@ -51,12 +52,12 @@ Boston, MA 02111-1307, USA. */ || !strcmp ((STR), "soname") || !strcmp ((STR), "defsym") \ || !strcmp ((STR), "assert") || !strcmp ((STR), "dynamic-linker")) -#undef WORD_SWITCH_TAKES_ARG -#define WORD_SWITCH_TAKES_ARG(STR) (FBSD_WORD_SWITCH_TAKES_ARG(STR)) +#undef WORD_SWITCH_TAKES_ARG +#define WORD_SWITCH_TAKES_ARG(STR) (FBSD_WORD_SWITCH_TAKES_ARG(STR)) /* Place spaces around this string. We depend on string splicing to produce the final CPP_PREDEFINES value. */ -#define CPP_FBSD_PREDEFINES " -Dunix -D__FreeBSD__=5 -D__FreeBSD_cc_version=500001 -Asystem(unix) -Asystem(FreeBSD) " +#define FBSD_CPP_PREDEFINES " -Dunix -D__FreeBSD__=5 -D__FreeBSD_cc_version=500001 -Asystem(unix) -Asystem(FreeBSD) " #define FBSD_CPP_SPEC "\ %(cpp_cpu) \ @@ -66,15 +67,44 @@ Boston, MA 02111-1307, USA. */ %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} \ %{posix:-D_POSIX_SOURCE}" -#undef CPP_SPEC +#undef CPP_SPEC #define CPP_SPEC FBSD_CPP_SPEC /* Provide a LIB_SPEC appropriate for FreeBSD. Just select the appropriate libc, depending on whether we're doing profiling. (like the default, except no -lg, and no -p). */ -#undef LIB_SPEC -#define LIB_SPEC "%{!shared:%{!pg:%{!pthread:%{!kthread:-lc}%{kthread:-lpthread -lc}}%{pthread:-lc_r}}%{pg:%{!pthread:%{!kthread:-lc_p}%{kthread:-lpthread_p -lc_p}}%{pthread:-lc_r_p}}}" +#undef LIB_SPEC +#define LIB_SPEC "\ + %{!shared: \ + %{!pg: \ + %{!pthread:%{!kthread:-lc}%{kthread:-lpthread -lc}} \ + %{pthread:-lc_r}} \ + %{pg: \ + %{!pthread:%{!kthread:-lc_p}%{kthread:-lpthread_p -lc_p}} \ + %{pthread:-lc_r_p}}}" + + +/************************[ Target stuff ]***********************************/ + +/* All FreeBSD Architectures support the ELF object file format. */ +#undef OBJECT_FORMAT_ELF +#define OBJECT_FORMAT_ELF + +/* Don't assume anything about the header files. */ +#undef NO_IMPLICIT_EXTERN_C +#define NO_IMPLICIT_EXTERN_C + +/* Implicit library calls should use memcpy, not bcopy, etc. */ +#undef TARGET_MEM_FUNCTIONS +#define TARGET_MEM_FUNCTIONS + +/* Allow #sccs in preprocessor. */ +#undef SCCS_DIRECTIVE +#define SCCS_DIRECTIVE +/* Tell libgcc2.c that FreeBSD targets support atexit(3). */ +#undef HAVE_ATEXIT +#define HAVE_ATEXIT /* Code generation parameters. */ @@ -82,27 +112,455 @@ Boston, MA 02111-1307, USA. */ we want to retain compatibility with older gcc versions (even though the svr4 ABI for the i386 says that records and unions are returned in memory). */ -#undef DEFAULT_PCC_STRUCT_RETURN +#undef DEFAULT_PCC_STRUCT_RETURN #define DEFAULT_PCC_STRUCT_RETURN 0 -/* Ensure we the configuration knows our system correctly so we can link with - libraries compiled with the native cc. */ +/* Writing `int' for a bitfield forces int alignment for the structure. */ +/* XXX: ok for Alpha?? */ +#undef PCC_BITFIELD_TYPE_MATTERS +#define PCC_BITFIELD_TYPE_MATTERS 1 + +/* Use periods rather than dollar signs in special g++ assembler names. + This ensures the configuration knows our system correctly so we can link + with libraries compiled with the native cc. */ #undef NO_DOLLAR_IN_LABEL +/* The prefix to add to user-visible assembler symbols. + For System V Release 4 & ELF the convention is *not* to prepend a leading + underscore onto user-level symbol names. */ + +#undef USER_LABEL_PREFIX +#define USER_LABEL_PREFIX "" + +/* Handle #pragma weak and #pragma pack. */ +#undef HANDLE_SYSV_PRAGMA +#define HANDLE_SYSV_PRAGMA + /* Do not use ``thunks'' to implement C++ vtables. This method still has fatal bugs. Also, GCC 3.0 will have a new C++ ABI that may not even support `thunks'. */ #undef DEFAULT_VTABLE_THUNKS + +/************************[ Assembler stuff ]********************************/ + +/* Override the default comment-starter of "/". */ +#undef ASM_COMMENT_START +#define ASM_COMMENT_START "#" + +/* Attach a special .ident directive to the end of the file to identify + the version of GCC which compiled this code. The format of the + .ident string is patterned after the ones produced by native svr4 + C compilers. */ + +#undef IDENT_ASM_OP +#define IDENT_ASM_OP ".ident" + +/* Output #ident as a .ident. */ + +#undef ASM_OUTPUT_IDENT +#define ASM_OUTPUT_IDENT(FILE, NAME) \ + fprintf ((FILE), "\t%s\t\"%s\"\n", IDENT_ASM_OP, (NAME)); + +/* Identify the front-end which produced this file. To keep symbol + space down, and not confuse kdb, only do this if the language is + not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ + +#undef ASM_IDENTIFY_LANGUAGE +#define ASM_IDENTIFY_LANGUAGE(FILE) \ + { \ + if (strcmp (lang_identify (), "c") != 0) \ + output_lang_identify (FILE); \ + } + +#undef ASM_FILE_END +#define ASM_FILE_END(FILE) \ + do { \ + if (!flag_no_ident) \ + fprintf ((FILE), "\t%s\t\"[ASM_FILE_END]GCC: (%s) %s\"\n", \ + IDENT_ASM_OP, lang_identify(), version_string); \ + } while (0) + +/* This is the pseudo-op used to generate a contiguous sequence of byte + values from a double-quoted string WITHOUT HAVING A TERMINATING NUL + AUTOMATICALLY APPENDED. This is the same for most svr4 assemblers. */ + +#undef ASCII_DATA_ASM_OP +#define ASCII_DATA_ASM_OP ".ascii" + +#undef ASM_BYTE_OP +#define ASM_BYTE_OP ".byte" + +/* This is how to allocate empty space in some section. The .zero + pseudo-op is used for this on most ELF assemblers. */ + +#undef SKIP_ASM_OP +#define SKIP_ASM_OP ".zero" + +/* How to output some space. The rules are different depending on the + object format. */ +#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) + +/* A table of bytes codes used by the ASM_OUTPUT_ASCII and + ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table + corresponds to a particular byte value [0..255]. For any + given byte value, if the value in the corresponding table + position is zero, the given character can be output directly. + If the table value is 1, the byte must be output as a \ooo + octal escape. If the tables value is anything else, then the + byte value should be output as a \ followed by the value + in the table. Note that we can use standard UN*X escape + sequences for many control characters, but we don't use + \a to represent BEL because some svr4 assemblers (e.g. on + the i386) don't know about that. Also, we don't use \v + since some versions of gas, such as 2.2 did not accept it. */ + +#define ESCAPES \ +"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ +\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\ +\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\ +\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ +\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ +\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\ +\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1" + +/* Some svr4 assemblers have a limit on the number of characters which + can appear in the operand of a .string directive. If your assembler + has such a limitation, you should define STRING_LIMIT to reflect that + limit. Note that at least some svr4 assemblers have a limit on the + actual number of bytes in the double-quoted string, and that they + count each character in an escape sequence as one byte. Thus, an + escape sequence like \377 would count as four bytes. + + If your target assembler doesn't support the .string directive, you + should define this to zero. +*/ + +#undef STRING_LIMIT +#define STRING_LIMIT ((unsigned) 256) + +#undef STRING_ASM_OP +#define STRING_ASM_OP ".string" + +/* Output the label which precedes a jumptable. Note that for all svr4/ELF + systems where we actually generate jumptables (which is to say every + svr4 target except i386, where we use casesi instead) we put the jump- + tables into the .rodata section and since other stuff could have been + put into the .rodata section prior to any given jumptable, we have to + make sure that the location counter for the .rodata section gets pro- + perly re-aligned prior to the actual beginning of the jump table. */ + +#undef ALIGN_ASM_OP +#define ALIGN_ASM_OP ".align" + +/* This says how to output assembler code to declare an + uninitialized external linkage data object. Under SVR4/ELF, + the linker seems to want the alignment of data objects + to depend on their types. We do exactly that here. */ + +#undef COMMON_ASM_OP +#define COMMON_ASM_OP ".comm" + +#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) + +/* This says how to output assembler code to declare an + uninitialized internal linkage data object. Under SVR4/ELF, + the linker seems to want the alignment of data objects + to depend on their types. We do exactly that here. */ + +#undef LOCAL_ASM_OP +#define LOCAL_ASM_OP ".local" + +/* 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_BEFORE_CASE_LABEL +#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \ + ASM_OUTPUT_ALIGN ((FILE), 2); + +#undef ASM_OUTPUT_CASE_LABEL +#define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE) \ + do { \ + ASM_OUTPUT_BEFORE_CASE_LABEL ((FILE), (PREFIX), (NUM), (JUMPTABLE)) \ + ASM_OUTPUT_INTERNAL_LABEL ((FILE), (PREFIX), (NUM)); \ + } while (0) + +/* The standard SVR4/ELF assembler seems to require that certain builtin + library routines (e.g. .udiv) be explicitly declared as .globl + in each assembly file where they are referenced. */ + +#undef ASM_OUTPUT_EXTERNAL_LIBCALL +#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN) \ + ASM_GLOBALIZE_LABEL ((FILE), XSTR ((FUN), 0)) + +/* Support const sections and the ctors and dtors sections for g++. + Note that there appears to be two different ways to support const + sections at the moment. You can either #define the symbol + READONLY_DATA_SECTION (giving it some code which switches to the + readonly data section) or else you can #define the symbols + EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and + SELECT_RTX_SECTION. We do both here just to be on the safe side. + FreeBSD conditionalizes the use of ".section rodata" depending on + ELF mode - otherwise .text. */ + +#undef USE_CONST_SECTION +#define USE_CONST_SECTION TARGET_ELF + +#undef CONST_SECTION_ASM_OP +#define CONST_SECTION_ASM_OP ".section\t.rodata" + +/* Define the pseudo-ops used to switch to the .ctors and .dtors sections. + + Note that we want to give these sections the SHF_WRITE attribute + because these sections will actually contain data (i.e. tables of + addresses of functions in the current root executable or shared library + file) and, in the case of a shared library, the relocatable addresses + will have to be properly resolved/relocated (and then written into) by + the dynamic linker when it actually attaches the given shared library + to the executing process. (Note that on SVR4, you may wish to use the + `-z text' option to the ELF linker, when building a shared library, as + an additional check that you are doing everything right. But if you do + use the `-z text' option when building a shared library, you will get + errors unless the .ctors and .dtors sections are marked as writable + via the SHF_WRITE attribute.) */ + +#undef CTORS_SECTION_ASM_OP +#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\"" +#undef DTORS_SECTION_ASM_OP +#define DTORS_SECTION_ASM_OP ".section\t.dtors,\"aw\"" + +/* On svr4, we *do* have support for the .init and .fini sections, and we + can put stuff in there to be executed before and after `main'. We let + crtstuff.c and other files know this by defining the following symbols. + The definitions say how to change sections to the .init and .fini + sections. This is the same for all known svr4 assemblers. */ + +#undef INIT_SECTION_ASM_OP +#define INIT_SECTION_ASM_OP ".section\t.init" +#undef FINI_SECTION_ASM_OP +#define FINI_SECTION_ASM_OP ".section\t.fini" + +/* A default list of other sections which we might be "in" at any given + time. For targets that use additional sections (e.g. .tdesc) you + should override this definition in the target-specific file which + includes this file. */ + +#undef EXTRA_SECTIONS +#define EXTRA_SECTIONS in_const, in_ctors, in_dtors + +/* A default list of extra section function definitions. For targets + that use additional sections (e.g. .tdesc) you should override this + definition in the target-specific file which includes this file. */ + +#undef EXTRA_SECTION_FUNCTIONS +#define EXTRA_SECTION_FUNCTIONS \ + CONST_SECTION_FUNCTION \ + CTORS_SECTION_FUNCTION \ + DTORS_SECTION_FUNCTION + +#undef READONLY_DATA_SECTION +#define READONLY_DATA_SECTION() const_section () + +extern void text_section (); + +#undef CONST_SECTION_FUNCTION +#define CONST_SECTION_FUNCTION \ + void \ + const_section () \ + { \ + if (!USE_CONST_SECTION) \ + text_section(); \ + else if (in_section != in_const) \ + { \ + fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP); \ + in_section = in_const; \ + } \ + } + +#undef CTORS_SECTION_FUNCTION +#define CTORS_SECTION_FUNCTION \ + void \ + ctors_section () \ + { \ + if (in_section != in_ctors) \ + { \ + fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP); \ + in_section = in_ctors; \ + } \ + } + +#undef DTORS_SECTION_FUNCTION +#define DTORS_SECTION_FUNCTION \ + void \ + dtors_section () \ + { \ + if (in_section != in_dtors) \ + { \ + fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP); \ + in_section = in_dtors; \ + } \ + } + +/* 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) + +/* 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) + +/* A C statement or statements to switch to the appropriate + section for output of RTX in mode MODE. RTX is some kind + of constant in RTL. The argument MODE is redundant except + in the case of a `const_int' rtx. Currently, these always + go into the const section. */ + +#undef SELECT_RTX_SECTION +#define SELECT_RTX_SECTION(MODE, RTX) const_section() + +/* Define the strings used for the special svr4/ELF .type and .size + directives. These strings generally do not vary from one svr4/ELF + system to another. */ + +#undef TYPE_ASM_OP +#define TYPE_ASM_OP ".type" +#undef SIZE_ASM_OP +#define SIZE_ASM_OP ".size" + +/* This is how we tell the assembler that a symbol is weak. */ + +#undef ASM_WEAKEN_LABEL +#define ASM_WEAKEN_LABEL(FILE, NAME) \ + do { \ + fputs ("\t.globl\t", (FILE)); assemble_name ((FILE), (NAME)); \ + fputc ('\n', (FILE)); \ + fputs ("\t.weak\t", (FILE)); assemble_name ((FILE), (NAME)); \ + fputc ('\n', (FILE)); \ + } while (0) + +/* The following macro defines the [default] format used with ELF to output + the second operand of the .type assembler directive. */ + +#undef TYPE_OPERAND_FMT +#define TYPE_OPERAND_FMT "@%s" + +/* Write the extra assembler code needed to declare a function's result. + Most svr4/ELF assemblers don't require any special declaration of the + result value. */ + +#undef ASM_DECLARE_RESULT +#define ASM_DECLARE_RESULT(FILE, RESULT) + + +/************************[ Debugger stuff ]*********************************/ + +/* All ELF targets can support DWARF-2. */ +#undef DWARF2_DEBUGGING_INFO +#define DWARF2_DEBUGGING_INFO + /* This is BSD, so we want the DBX format. */ +#undef DBX_DEBUGGING_INFO #define DBX_DEBUGGING_INFO /* Use stabs instead of DWARF debug format. */ -#undef PREFERRED_DEBUGGING_TYPE +#undef PREFERRED_DEBUGGING_TYPE #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG +/* But allow STABS to be supported as well. + Note that we want to override some definition settings done for some + architecture's native OS's tools that don't apply to us. */ +#undef ASM_IDENTIFY_GCC +#undef ASM_IDENTIFY_LANGUAGE -/* Miscellaneous parameters. */ - -/* Tell libgcc2.c that FreeBSD targets support atexit(3). */ -#define HAVE_ATEXIT +#include "dbxelf.h" diff --git a/contrib/gcc/config/i386/freebsd.h b/contrib/gcc/config/i386/freebsd.h index c1b41a5..207bcd2 100644 --- a/contrib/gcc/config/i386/freebsd.h +++ b/contrib/gcc/config/i386/freebsd.h @@ -1,5 +1,5 @@ /* Definitions for Intel 386 running FreeBSD with either a.out or ELF format - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996-2000 Free Software Foundation, Inc. Contributed by Eric Youngdale. Modified for stabs-in-ELF by H.J. Lu. Adapted from GNU/Linux version by John Polstra. @@ -25,9 +25,109 @@ Boston, MA 02111-1307, USA. */ /* $FreeBSD$ */ +#undef CPP_PREDEFINES +#define CPP_PREDEFINES \ + "-Di386 -Acpu(i386) -Amachine(i386)" \ + FBSD_CPP_PREDEFINES -#undef TARGET_VERSION -#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); +#undef CC1_SPEC +#define CC1_SPEC "\ + %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ + %{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" + +#undef ASM_SPEC +#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" + +#undef ASM_FINAL_SPEC +#define ASM_FINAL_SPEC "%|" + +/* 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 "\ + %{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:-Bshareable %{h*} %{soname*}} \ + %{symbolic:-Bsymbolic} \ + %{!shared: \ + %{!static: \ + %{rdynamic: -export-dynamic} \ + %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ + %{static:-Bstatic}}}" + +#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}}" + +/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386. Here we tack on our + own magical crtend.o file (compare w/crtstuff.c) which provides part of the + support for getting C++ file-scope static object constructed before + entering `main', followed by the normal "finalizer" file, `crtn.o'. */ + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "\ + %{!maout: \ + %{!shared:crtend.o%s} \ + %{shared:crtendS.o%s} crtn.o%s}" + + +/************************[ Target stuff ]***********************************/ + +/* Define the actual types of some ANSI-mandated types. + Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, + c-common.c, and config/<arch>/<arch>.h. */ + +#undef SIZE_TYPE +#define SIZE_TYPE "unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "int" + +/* This is the pseudo-op used to generate a 32-bit word of data with a + specific value in some section. */ + +#undef INT_ASM_OP +#define INT_ASM_OP ".long" + +/* Biggest alignment supported by the object file format of this + machine. Use this macro to limit the alignment which can be + specified using the `__attribute__ ((aligned (N)))' construct. If + not defined, the default value is `BIGGEST_ALIGNMENT'. */ + +#define MAX_OFILE_ALIGNMENT (32768*8) + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); #define MASK_PROFILER_EPILOGUE 010000000000 #define MASK_AOUT 004000000000 /* a.out not elf */ @@ -47,104 +147,198 @@ Boston, MA 02111-1307, USA. */ { "underscores", MASK_UNDERSCORES}, \ { "no-underscores", -MASK_UNDERSCORES}, +/* This goes away when the math emulator is fixed. */ +#undef TARGET_DEFAULT +#define TARGET_DEFAULT \ + (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387) + /* 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") -/* Override the default comment-starter of "/". */ -#undef ASM_COMMENT_START -#define ASM_COMMENT_START "#" +/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the + DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with + the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions + type exception machanism. */ +#define DWARF2_UNWIND_INFO 0 -#undef ASM_APP_ON -#define ASM_APP_ON "#APP\n" +/* The a.out tools do not support "linkonce" sections. */ +#undef SUPPORTS_ONE_ONLY +#define SUPPORTS_ONE_ONLY TARGET_ELF -#undef ASM_APP_OFF -#define ASM_APP_OFF "#NO_APP\n" +/* Enable alias attribute support. */ +#undef SET_ASM_OP +#define SET_ASM_OP ".set" -#undef SET_ASM_OP -#define SET_ASM_OP ".set" +/* The a.out tools do not support "Lscope" .stabs symbols. */ +#undef NO_DBX_FUNCTION_END +#define NO_DBX_FUNCTION_END TARGET_AOUT -/* Output at beginning of assembler file. */ -/* The .file command should always begin the output. */ +/* In ELF, the function stabs come first, before the relative offsets. */ +#undef DBX_FUNCTION_FIRST +#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF -#undef ASM_FILE_START -#define ASM_FILE_START(FILE) \ +/* supply our own hook for calling __main() from main() */ +#undef INVOKE__main +#define INVOKE__main +#undef GEN_CALL__MAIN +#define GEN_CALL__MAIN \ + do { \ + if (!(TARGET_ELF)) \ + emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ + VOIDmode, 0); \ + } while (0) + +/* Indicate that jump tables go in the text section. This is + necessary when compiling PIC code. */ +#undef JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) + +/* override the exception table positioning */ +#undef EXCEPTION_SECTION +#define EXCEPTION_SECTION() \ + do { \ + if (TARGET_ELF) \ + { \ + named_section (NULL_TREE, ".gcc_except_table", 0); \ + } \ + else \ + { \ + if (flag_pic) \ + data_section (); \ + else \ + readonly_data_section (); \ + } \ + } while (0); + +/* Tell final.c that we don't need a label passed to mcount. */ +#undef NO_PROFILE_DATA +#define NO_PROFILE_DATA + +/* Output assembler code to FILE to begin profiling of the current function. + LABELNO is an optional label. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ + do { \ + char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ + if (flag_pic) \ + fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name); \ + else \ + fprintf ((FILE), "\tcall %s\n", _name); \ + } while (0) + +/* Output assembler code to FILE to end profiling of the current function. */ + +#undef FUNCTION_PROFILER_EPILOGUE +#define FUNCTION_PROFILER_EPILOGUE(FILE, DO_RTL) \ do { \ - output_file_directive ((FILE), main_input_filename); \ - if (TARGET_ELF) \ - fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ + if (TARGET_PROFILER_EPILOGUE) \ + { \ + if (DO_RTL) \ + { \ + /* ".mexitcount" is specially handled in \ + ASM_HACK_SYMBOLREF () so that we don't need to handle \ + flag_pic or TARGET_AOUT here. */ \ + rtx xop; \ + xop = gen_rtx_MEM (FUNCTION_MODE, \ + gen_rtx_SYMBOL_REF (Pmode, ".mexitcount")); \ + emit_call_insn (gen_rtx (CALL, VOIDmode, xop, const0_rtx)); \ + } \ + else \ + { \ + /* XXX this !DO_RTL case is broken but not actually used. */ \ + char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ + if (flag_pic) \ + fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", _name); \ + else \ + fprintf (FILE, "\tcall %s\n", _name); \ + } \ + } \ } while (0) -/* Identify the front-end which produced this file. To keep symbol - space down, and not confuse kdb, only do this if the language is - not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ -#undef ASM_IDENTIFY_LANGUAGE -#define ASM_IDENTIFY_LANGUAGE(STREAM) \ -{ \ - if (strcmp (lang_identify (), "c") != 0) \ - output_lang_identify (STREAM); \ -} + +/************************[ Assembler stuff ]********************************/ + +#undef ASM_APP_ON +#define ASM_APP_ON "#APP\n" + +#undef ASM_APP_OFF +#define ASM_APP_OFF "#NO_APP\n" + +/* This is how to begin an assembly language file. + The .file command should always begin the output. + ELF also needs a .version. */ + +#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) /* 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)) +#define ASM_GENERATE_INTERNAL_LABEL(BUF, PREFIX, NUMBER) \ + sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ + (PREFIX), (NUMBER)) /* This is how to output an internal numbered label where - PREFIX is the class of label and NUM is the number within the class. */ + PREFIX is the class of label and NUM is the number within the class. + For most svr4/ELF systems, the convention is that any symbol which begins + with a period is not put into the linker symbol table by the assembler. */ #undef ASM_OUTPUT_INTERNAL_LABEL #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ (PREFIX), (NUM)) +/* This is how to output a reference to a user-level label named NAME. */ +#undef ASM_OUTPUT_LABELREF +#define ASM_OUTPUT_LABELREF(FILE, NAME) \ + do { \ + char *_name = (NAME); \ + /* Hack to avoid writing lots of rtl in \ + FUNCTION_PROFILER_EPILOGUE (). */ \ + if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ + { \ + if (TARGET_AOUT) \ + _name++; \ + if (flag_pic) \ + fprintf ((FILE), "*%s@GOT(%%ebx)", _name); \ + else \ + fprintf ((FILE), "%s", _name); \ + } \ + else \ + fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name); \ +} while (0) + /* This is how to hack on the symbol code of certain relcalcitrant symbols to modify their output in output_pic_addr_const (). */ -#undef ASM_HACK_SYMBOLREF_CODE +#undef ASM_HACK_SYMBOLREF_CODE #define ASM_HACK_SYMBOLREF_CODE(NAME, CODE) \ -do { \ - /* Part of hack to avoid writing lots of rtl in \ - FUNCTION_PROFILER_EPILOGUE (). */ \ - char *_name = (NAME); \ - if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ - (CODE) = 'X'; \ -} while (0) - -/* This is how to output a reference to a user-level label named NAME. */ - -#undef ASM_OUTPUT_LABELREF -#define ASM_OUTPUT_LABELREF(FILE, NAME) \ -do { \ - char *_name = (NAME); \ - /* Hack to avoid writing lots of rtl in \ - FUNCTION_PROFILER_EPILOGUE (). */ \ - if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ - { \ - if (TARGET_AOUT) \ - _name++; \ - if (flag_pic) \ - fprintf ((FILE), "*%s@GOT(%%ebx)", _name); \ - else \ - fprintf ((FILE), "%s", _name); \ - } \ - else \ - fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name); \ -} while (0) + do { \ + /* Part of hack to avoid writing lots of rtl in \ + FUNCTION_PROFILER_EPILOGUE (). */ \ + char *_name = (NAME); \ + if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ + (CODE) = 'X'; \ + } 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. */ -#undef ASM_OUTPUT_ADDR_DIFF_ELT -#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ +#undef ASM_OUTPUT_ADDR_DIFF_ELT +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE)) -#undef ASM_OUTPUT_ALIGN +#undef ASM_OUTPUT_ALIGN #define ASM_OUTPUT_ALIGN(FILE, LOG) \ if ((LOG)!=0) { \ if (in_text_section()) \ @@ -153,169 +347,267 @@ do { \ fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ } -/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ -#undef USE_CONST_SECTION -#define USE_CONST_SECTION TARGET_ELF +#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) -/* The a.out tools do not support "linkonce" sections. */ -#undef SUPPORTS_ONE_ONLY -#define SUPPORTS_ONE_ONLY TARGET_ELF +/* 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. */ -/* The a.out tools do not support "Lscope" .stabs symbols. */ -#undef NO_DBX_FUNCTION_END -#define NO_DBX_FUNCTION_END TARGET_AOUT +/* 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. */ -/* 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) \ +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 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); \ - } \ + 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) -/* 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) \ +/* Write the extra assembler code needed to declare an object properly. */ + +#undef ASM_DECLARE_OBJECT_NAME +#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ 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); \ - } \ + 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); \ + putc (',', FILE); \ + fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \ + int_size_in_bytes (TREE_TYPE (DECL))); \ + fputc ('\n', FILE); \ + } \ + ASM_OUTPUT_LABEL(FILE, NAME); \ } while (0) -/* 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) +/* 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. */ -#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) +#undef ASM_FINISH_DECLARE_OBJECT +#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) \ + { \ + size_directive_output = 1; \ + fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ + assemble_name (FILE, name); \ + putc (',', FILE); \ + fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \ + int_size_in_bytes (TREE_TYPE (DECL))); \ + fputc ('\n', FILE); \ + } \ + } 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) +/* This is how to declare the size of a function. */ -#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) +#undef ASM_DECLARE_FUNCTION_SIZE +#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) -/* in elf, the function stabs come first, before the relative offsets */ -#undef DBX_FUNCTION_FIRST -#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF -/* tag end of file in elf mode */ -#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END -#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ -do { \ - if (TARGET_ELF) { \ - fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ - N_SO); \ - } \ -} while (0) +/* The routine used to output NUL terminated strings. We use a special + version of this for most svr4 targets because doing so makes the + generated assembly code more compact (and thus faster to assemble) + as well as more readable, especially for targets like the i386 + (where the only alternative is to output character sequences as + comma separated lists of numbers). */ -/* 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 ASM_OUTPUT_LIMITED_STRING +#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ + do { \ + register unsigned char *_limited_str = (unsigned char *) (STR); \ + register unsigned ch; \ + fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \ + for (; (ch = *_limited_str); _limited_str++) \ + { \ + register int escape; \ + switch (escape = ESCAPES[ch]) \ + { \ + case 0: \ + putc (ch, (FILE)); \ + break; \ + case 1: \ + fprintf ((FILE), "\\%03o", ch); \ + break; \ + default: \ + putc ('\\', (FILE)); \ + putc (escape, (FILE)); \ + break; \ + } \ + } \ + fprintf ((FILE), "\"\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) +/* Switch into a generic section. + + We make the section read-only and executable for a function decl, + read-only for a const data decl, and writable for a non-const data decl. + + If the section has already been defined, we must not + emit the attributes here. The SVR4 assembler does not + recognize section redefinitions. + If DECL is NULL, no attributes are emitted. */ + +#undef ASM_OUTPUT_SECTION_NAME +#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \ + do { \ + static struct section_info \ + { \ + struct section_info *next; \ + char *name; \ + enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type; \ + } *sections; \ + struct section_info *s; \ + char *mode; \ + enum sect_enum type; \ + \ + for (s = sections; s; s = s->next) \ + if (!strcmp (NAME, s->name)) \ + break; \ + \ + if (DECL && TREE_CODE (DECL) == FUNCTION_DECL) \ + type = SECT_EXEC, mode = "ax"; \ + else if (DECL && DECL_READONLY_SECTION (DECL, RELOC)) \ + type = SECT_RO, mode = "a"; \ + else \ + type = SECT_RW, mode = "aw"; \ + \ + if (s == 0) \ + { \ + s = (struct section_info *) xmalloc (sizeof (struct section_info)); \ + s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME)); \ + strcpy (s->name, NAME); \ + s->type = type; \ + s->next = sections; \ + sections = s; \ + fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, mode); \ + } \ + else \ + { \ + if (DECL && s->type != type) \ + error_with_decl (DECL, "%s causes a section type conflict"); \ + \ + fprintf (FILE, ".section\t%s\n", NAME); \ + } \ + } while (0) +#undef MAKE_DECL_ONE_ONLY +#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) +#undef UNIQUE_SECTION_P +#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL)) +#undef UNIQUE_SECTION +#define UNIQUE_SECTION(DECL,RELOC) \ + do { \ + int len; \ + char *name, *string, *prefix; \ + \ + name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ + \ + if (! DECL_ONE_ONLY (DECL)) \ + { \ + prefix = "."; \ + if (TREE_CODE (DECL) == FUNCTION_DECL) \ + prefix = ".text."; \ + else if (DECL_READONLY_SECTION (DECL, RELOC)) \ + prefix = ".rodata."; \ + else \ + prefix = ".data."; \ + } \ + else if (TREE_CODE (DECL) == FUNCTION_DECL) \ + prefix = ".gnu.linkonce.t."; \ + else if (DECL_READONLY_SECTION (DECL, RELOC)) \ + prefix = ".gnu.linkonce.r."; \ + else \ + prefix = ".gnu.linkonce.d."; \ + \ + len = strlen (name) + strlen (prefix); \ + string = alloca (len + 1); \ + sprintf (string, "%s%s", prefix, name); \ + \ + DECL_SECTION_NAME (DECL) = build_string (len, string); \ + } while (0) + +/* A C statement or statements to switch to the appropriate + section for output of DECL. DECL is either a `VAR_DECL' node + or a constant of some sort. RELOC indicates whether forming + the initial value of DECL requires link-time relocations. */ + +#undef SELECT_SECTION +#define SELECT_SECTION(DECL,RELOC) \ + { \ + if (flag_pic && RELOC) \ + data_section (); \ + else if (TREE_CODE (DECL) == STRING_CST) \ + { \ + if (! flag_writable_strings) \ + const_section (); \ + else \ + data_section (); \ + } \ + else if (TREE_CODE (DECL) == VAR_DECL) \ + { \ + if (! DECL_READONLY_SECTION (DECL, RELOC)) \ + data_section (); \ + else \ + const_section (); \ + } \ + else \ + const_section (); \ + } /* Define macro used to output shift-double opcodes when the shift count is in %cl. Some assemblers require %cl as an argument; @@ -323,38 +615,11 @@ do { \ *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) +#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. */ -#undef JUMP_TABLES_IN_TEXT_SECTION -#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) - -/* override the exception table positioning */ -#undef EXCEPTION_SECTION -#define EXCEPTION_SECTION() \ -do { \ - if (TARGET_ELF) { \ - named_section (NULL_TREE, ".gcc_except_table", 0); \ - } else { \ - if (flag_pic) \ - data_section (); \ - else \ - readonly_data_section (); \ - } \ -} while (0); -/* supply our own hook for calling __main() from main() */ -#undef INVOKE__main -#define INVOKE__main -#undef GEN_CALL__MAIN -#define GEN_CALL__MAIN \ - do { \ - if (!(TARGET_ELF)) \ - emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ - VOIDmode, 0); \ - } while (0) +/************************[ Debugger stuff ]*********************************/ /* Copy this from the svr4 specifications... */ /* Define the register numbers to be used in Dwarf debugging information. @@ -411,7 +676,7 @@ do { \ 17 for %st(6) (gnu regno = 14) 18 for %st(7) (gnu regno = 15) */ -#undef DWARF_DBX_REGISTER_NUMBER +#undef DWARF_DBX_REGISTER_NUMBER #define DWARF_DBX_REGISTER_NUMBER(n) \ ((n) == 0 ? 0 \ : (n) == 1 ? 2 \ @@ -425,7 +690,7 @@ do { \ : (-1)) /* Now what stabs expects in the register. */ -#undef STABS_DBX_REGISTER_NUMBER +#undef STABS_DBX_REGISTER_NUMBER #define STABS_DBX_REGISTER_NUMBER(n) \ ((n) == 0 ? 0 : \ (n) == 1 ? 2 : \ @@ -438,147 +703,45 @@ do { \ (n) + 4) #undef DBX_REGISTER_NUMBER -#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ - ? DWARF_DBX_REGISTER_NUMBER(n) \ +#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 begin profiling of the current function. - LABELNO is an optional label. */ - -#undef FUNCTION_PROFILER -#define FUNCTION_PROFILER(FILE, LABELNO) \ -do { \ - char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ - if (flag_pic) \ - fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name); \ - else \ - fprintf ((FILE), "\tcall %s\n", _name); \ -} while (0) - -/* Output assembler code to FILE to end profiling of the current function. */ - -#undef FUNCTION_PROFILER_EPILOGUE -#define FUNCTION_PROFILER_EPILOGUE(FILE, DO_RTL) \ -do { \ - if (TARGET_PROFILER_EPILOGUE) \ - { \ - if (DO_RTL) \ - { \ - /* ".mexitcount" is specially handled in \ - ASM_HACK_SYMBOLREF () so that we don't need to handle \ - flag_pic or TARGET_AOUT here. */ \ - rtx xop; \ - xop = gen_rtx_MEM (FUNCTION_MODE, \ - gen_rtx_SYMBOL_REF (Pmode, ".mexitcount")); \ - emit_call_insn (gen_rtx (CALL, VOIDmode, xop, const0_rtx)); \ - } \ - else \ - { \ - /* XXX this !DO_RTL case is broken but not actually used. */ \ - char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ - if (flag_pic) \ - fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", _name); \ - else \ - fprintf (FILE, "\tcall %s\n", _name); \ - } \ +/* tag end of file in elf mode */ +#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END +#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ + do { \ + if (TARGET_ELF) { \ + fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ + N_SO); \ } \ -} while (0) - -#undef SIZE_TYPE -#define SIZE_TYPE "unsigned int" - -#undef PTRDIFF_TYPE -#define PTRDIFF_TYPE "int" - -#undef WCHAR_TYPE -#define WCHAR_TYPE "int" - -#undef WCHAR_UNSIGNED -#define WCHAR_UNSIGNED 0 - -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE BITS_PER_WORD - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES - -#undef CC1_SPEC -#define CC1_SPEC "\ -%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ -%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" - -#undef ASM_SPEC -#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" - -/* 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 "\ - %{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:-Bshareable %{h*} %{soname*}} \ - %{symbolic:-Bsymbolic} \ - %{!shared: \ - %{!static: \ - %{rdynamic: -export-dynamic} \ - %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ - %{static:-Bstatic}}}" - -/* A C statement to output to the stdio stream FILE an assembler - command to advance the location counter to a multiple of 1<<LOG - bytes if it is within MAX_SKIP bytes. - - This is used to align code labels according to Intel recommendations. */ - -#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN -#error "we don't have this for the aout gas" -#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ - if ((LOG)!=0) \ - if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ - else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) -#endif - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "\ - %{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}" + } while (0) -/* This goes away when the math emulator is fixed. */ -#undef TARGET_DEFAULT -#define TARGET_DEFAULT \ - (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387) +/* 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) -/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the - DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with - the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions - type exception machanism. */ -#define DWARF2_UNWIND_INFO 0 +#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) diff --git a/contrib/gcc/config/i386/freebsd.h.fixed b/contrib/gcc/config/i386/freebsd.h.fixed index c1b41a5..207bcd2 100644 --- a/contrib/gcc/config/i386/freebsd.h.fixed +++ b/contrib/gcc/config/i386/freebsd.h.fixed @@ -1,5 +1,5 @@ /* Definitions for Intel 386 running FreeBSD with either a.out or ELF format - Copyright (C) 1996 Free Software Foundation, Inc. + Copyright (C) 1996-2000 Free Software Foundation, Inc. Contributed by Eric Youngdale. Modified for stabs-in-ELF by H.J. Lu. Adapted from GNU/Linux version by John Polstra. @@ -25,9 +25,109 @@ Boston, MA 02111-1307, USA. */ /* $FreeBSD$ */ +#undef CPP_PREDEFINES +#define CPP_PREDEFINES \ + "-Di386 -Acpu(i386) -Amachine(i386)" \ + FBSD_CPP_PREDEFINES -#undef TARGET_VERSION -#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); +#undef CC1_SPEC +#define CC1_SPEC "\ + %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ + %{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" + +#undef ASM_SPEC +#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" + +#undef ASM_FINAL_SPEC +#define ASM_FINAL_SPEC "%|" + +/* 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 "\ + %{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:-Bshareable %{h*} %{soname*}} \ + %{symbolic:-Bsymbolic} \ + %{!shared: \ + %{!static: \ + %{rdynamic: -export-dynamic} \ + %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ + %{static:-Bstatic}}}" + +#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}}" + +/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386. Here we tack on our + own magical crtend.o file (compare w/crtstuff.c) which provides part of the + support for getting C++ file-scope static object constructed before + entering `main', followed by the normal "finalizer" file, `crtn.o'. */ + +#undef ENDFILE_SPEC +#define ENDFILE_SPEC "\ + %{!maout: \ + %{!shared:crtend.o%s} \ + %{shared:crtendS.o%s} crtn.o%s}" + + +/************************[ Target stuff ]***********************************/ + +/* Define the actual types of some ANSI-mandated types. + Needs to agree with <machine/ansi.h>. GCC defaults come from c-decl.c, + c-common.c, and config/<arch>/<arch>.h. */ + +#undef SIZE_TYPE +#define SIZE_TYPE "unsigned int" + +#undef PTRDIFF_TYPE +#define PTRDIFF_TYPE "int" + +/* This is the pseudo-op used to generate a 32-bit word of data with a + specific value in some section. */ + +#undef INT_ASM_OP +#define INT_ASM_OP ".long" + +/* Biggest alignment supported by the object file format of this + machine. Use this macro to limit the alignment which can be + specified using the `__attribute__ ((aligned (N)))' construct. If + not defined, the default value is `BIGGEST_ALIGNMENT'. */ + +#define MAX_OFILE_ALIGNMENT (32768*8) + +#undef TARGET_VERSION +#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)"); #define MASK_PROFILER_EPILOGUE 010000000000 #define MASK_AOUT 004000000000 /* a.out not elf */ @@ -47,104 +147,198 @@ Boston, MA 02111-1307, USA. */ { "underscores", MASK_UNDERSCORES}, \ { "no-underscores", -MASK_UNDERSCORES}, +/* This goes away when the math emulator is fixed. */ +#undef TARGET_DEFAULT +#define TARGET_DEFAULT \ + (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387) + /* 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") -/* Override the default comment-starter of "/". */ -#undef ASM_COMMENT_START -#define ASM_COMMENT_START "#" +/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the + DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with + the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions + type exception machanism. */ +#define DWARF2_UNWIND_INFO 0 -#undef ASM_APP_ON -#define ASM_APP_ON "#APP\n" +/* The a.out tools do not support "linkonce" sections. */ +#undef SUPPORTS_ONE_ONLY +#define SUPPORTS_ONE_ONLY TARGET_ELF -#undef ASM_APP_OFF -#define ASM_APP_OFF "#NO_APP\n" +/* Enable alias attribute support. */ +#undef SET_ASM_OP +#define SET_ASM_OP ".set" -#undef SET_ASM_OP -#define SET_ASM_OP ".set" +/* The a.out tools do not support "Lscope" .stabs symbols. */ +#undef NO_DBX_FUNCTION_END +#define NO_DBX_FUNCTION_END TARGET_AOUT -/* Output at beginning of assembler file. */ -/* The .file command should always begin the output. */ +/* In ELF, the function stabs come first, before the relative offsets. */ +#undef DBX_FUNCTION_FIRST +#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF -#undef ASM_FILE_START -#define ASM_FILE_START(FILE) \ +/* supply our own hook for calling __main() from main() */ +#undef INVOKE__main +#define INVOKE__main +#undef GEN_CALL__MAIN +#define GEN_CALL__MAIN \ + do { \ + if (!(TARGET_ELF)) \ + emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ + VOIDmode, 0); \ + } while (0) + +/* Indicate that jump tables go in the text section. This is + necessary when compiling PIC code. */ +#undef JUMP_TABLES_IN_TEXT_SECTION +#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) + +/* override the exception table positioning */ +#undef EXCEPTION_SECTION +#define EXCEPTION_SECTION() \ + do { \ + if (TARGET_ELF) \ + { \ + named_section (NULL_TREE, ".gcc_except_table", 0); \ + } \ + else \ + { \ + if (flag_pic) \ + data_section (); \ + else \ + readonly_data_section (); \ + } \ + } while (0); + +/* Tell final.c that we don't need a label passed to mcount. */ +#undef NO_PROFILE_DATA +#define NO_PROFILE_DATA + +/* Output assembler code to FILE to begin profiling of the current function. + LABELNO is an optional label. */ + +#undef FUNCTION_PROFILER +#define FUNCTION_PROFILER(FILE, LABELNO) \ + do { \ + char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ + if (flag_pic) \ + fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name); \ + else \ + fprintf ((FILE), "\tcall %s\n", _name); \ + } while (0) + +/* Output assembler code to FILE to end profiling of the current function. */ + +#undef FUNCTION_PROFILER_EPILOGUE +#define FUNCTION_PROFILER_EPILOGUE(FILE, DO_RTL) \ do { \ - output_file_directive ((FILE), main_input_filename); \ - if (TARGET_ELF) \ - fprintf ((FILE), "\t.version\t\"01.01\"\n"); \ + if (TARGET_PROFILER_EPILOGUE) \ + { \ + if (DO_RTL) \ + { \ + /* ".mexitcount" is specially handled in \ + ASM_HACK_SYMBOLREF () so that we don't need to handle \ + flag_pic or TARGET_AOUT here. */ \ + rtx xop; \ + xop = gen_rtx_MEM (FUNCTION_MODE, \ + gen_rtx_SYMBOL_REF (Pmode, ".mexitcount")); \ + emit_call_insn (gen_rtx (CALL, VOIDmode, xop, const0_rtx)); \ + } \ + else \ + { \ + /* XXX this !DO_RTL case is broken but not actually used. */ \ + char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ + if (flag_pic) \ + fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", _name); \ + else \ + fprintf (FILE, "\tcall %s\n", _name); \ + } \ + } \ } while (0) -/* Identify the front-end which produced this file. To keep symbol - space down, and not confuse kdb, only do this if the language is - not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */ -#undef ASM_IDENTIFY_LANGUAGE -#define ASM_IDENTIFY_LANGUAGE(STREAM) \ -{ \ - if (strcmp (lang_identify (), "c") != 0) \ - output_lang_identify (STREAM); \ -} + +/************************[ Assembler stuff ]********************************/ + +#undef ASM_APP_ON +#define ASM_APP_ON "#APP\n" + +#undef ASM_APP_OFF +#define ASM_APP_OFF "#NO_APP\n" + +/* This is how to begin an assembly language file. + The .file command should always begin the output. + ELF also needs a .version. */ + +#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) /* 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)) +#define ASM_GENERATE_INTERNAL_LABEL(BUF, PREFIX, NUMBER) \ + sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".", \ + (PREFIX), (NUMBER)) /* This is how to output an internal numbered label where - PREFIX is the class of label and NUM is the number within the class. */ + PREFIX is the class of label and NUM is the number within the class. + For most svr4/ELF systems, the convention is that any symbol which begins + with a period is not put into the linker symbol table by the assembler. */ #undef ASM_OUTPUT_INTERNAL_LABEL #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".", \ (PREFIX), (NUM)) +/* This is how to output a reference to a user-level label named NAME. */ +#undef ASM_OUTPUT_LABELREF +#define ASM_OUTPUT_LABELREF(FILE, NAME) \ + do { \ + char *_name = (NAME); \ + /* Hack to avoid writing lots of rtl in \ + FUNCTION_PROFILER_EPILOGUE (). */ \ + if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ + { \ + if (TARGET_AOUT) \ + _name++; \ + if (flag_pic) \ + fprintf ((FILE), "*%s@GOT(%%ebx)", _name); \ + else \ + fprintf ((FILE), "%s", _name); \ + } \ + else \ + fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name); \ +} while (0) + /* This is how to hack on the symbol code of certain relcalcitrant symbols to modify their output in output_pic_addr_const (). */ -#undef ASM_HACK_SYMBOLREF_CODE +#undef ASM_HACK_SYMBOLREF_CODE #define ASM_HACK_SYMBOLREF_CODE(NAME, CODE) \ -do { \ - /* Part of hack to avoid writing lots of rtl in \ - FUNCTION_PROFILER_EPILOGUE (). */ \ - char *_name = (NAME); \ - if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ - (CODE) = 'X'; \ -} while (0) - -/* This is how to output a reference to a user-level label named NAME. */ - -#undef ASM_OUTPUT_LABELREF -#define ASM_OUTPUT_LABELREF(FILE, NAME) \ -do { \ - char *_name = (NAME); \ - /* Hack to avoid writing lots of rtl in \ - FUNCTION_PROFILER_EPILOGUE (). */ \ - if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ - { \ - if (TARGET_AOUT) \ - _name++; \ - if (flag_pic) \ - fprintf ((FILE), "*%s@GOT(%%ebx)", _name); \ - else \ - fprintf ((FILE), "%s", _name); \ - } \ - else \ - fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name); \ -} while (0) + do { \ + /* Part of hack to avoid writing lots of rtl in \ + FUNCTION_PROFILER_EPILOGUE (). */ \ + char *_name = (NAME); \ + if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0) \ + (CODE) = 'X'; \ + } 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. */ -#undef ASM_OUTPUT_ADDR_DIFF_ELT -#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ +#undef ASM_OUTPUT_ADDR_DIFF_ELT +#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE)) -#undef ASM_OUTPUT_ALIGN +#undef ASM_OUTPUT_ALIGN #define ASM_OUTPUT_ALIGN(FILE, LOG) \ if ((LOG)!=0) { \ if (in_text_section()) \ @@ -153,169 +347,267 @@ do { \ fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ } -/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */ -#undef USE_CONST_SECTION -#define USE_CONST_SECTION TARGET_ELF +#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) -/* The a.out tools do not support "linkonce" sections. */ -#undef SUPPORTS_ONE_ONLY -#define SUPPORTS_ONE_ONLY TARGET_ELF +/* 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. */ -/* The a.out tools do not support "Lscope" .stabs symbols. */ -#undef NO_DBX_FUNCTION_END -#define NO_DBX_FUNCTION_END TARGET_AOUT +/* 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. */ -/* 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) \ +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 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); \ - } \ + 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) -/* 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) \ +/* Write the extra assembler code needed to declare an object properly. */ + +#undef ASM_DECLARE_OBJECT_NAME +#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ 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); \ - } \ + 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); \ + putc (',', FILE); \ + fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \ + int_size_in_bytes (TREE_TYPE (DECL))); \ + fputc ('\n', FILE); \ + } \ + ASM_OUTPUT_LABEL(FILE, NAME); \ } while (0) -/* 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) +/* 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. */ -#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) +#undef ASM_FINISH_DECLARE_OBJECT +#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) \ + { \ + size_directive_output = 1; \ + fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ + assemble_name (FILE, name); \ + putc (',', FILE); \ + fprintf (FILE, HOST_WIDE_INT_PRINT_DEC, \ + int_size_in_bytes (TREE_TYPE (DECL))); \ + fputc ('\n', FILE); \ + } \ + } 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) +/* This is how to declare the size of a function. */ -#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) +#undef ASM_DECLARE_FUNCTION_SIZE +#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) -/* in elf, the function stabs come first, before the relative offsets */ -#undef DBX_FUNCTION_FIRST -#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF -/* tag end of file in elf mode */ -#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END -#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ -do { \ - if (TARGET_ELF) { \ - fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ - N_SO); \ - } \ -} while (0) +/* The routine used to output NUL terminated strings. We use a special + version of this for most svr4 targets because doing so makes the + generated assembly code more compact (and thus faster to assemble) + as well as more readable, especially for targets like the i386 + (where the only alternative is to output character sequences as + comma separated lists of numbers). */ -/* 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 ASM_OUTPUT_LIMITED_STRING +#define ASM_OUTPUT_LIMITED_STRING(FILE, STR) \ + do { \ + register unsigned char *_limited_str = (unsigned char *) (STR); \ + register unsigned ch; \ + fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP); \ + for (; (ch = *_limited_str); _limited_str++) \ + { \ + register int escape; \ + switch (escape = ESCAPES[ch]) \ + { \ + case 0: \ + putc (ch, (FILE)); \ + break; \ + case 1: \ + fprintf ((FILE), "\\%03o", ch); \ + break; \ + default: \ + putc ('\\', (FILE)); \ + putc (escape, (FILE)); \ + break; \ + } \ + } \ + fprintf ((FILE), "\"\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) +/* Switch into a generic section. + + We make the section read-only and executable for a function decl, + read-only for a const data decl, and writable for a non-const data decl. + + If the section has already been defined, we must not + emit the attributes here. The SVR4 assembler does not + recognize section redefinitions. + If DECL is NULL, no attributes are emitted. */ + +#undef ASM_OUTPUT_SECTION_NAME +#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC) \ + do { \ + static struct section_info \ + { \ + struct section_info *next; \ + char *name; \ + enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type; \ + } *sections; \ + struct section_info *s; \ + char *mode; \ + enum sect_enum type; \ + \ + for (s = sections; s; s = s->next) \ + if (!strcmp (NAME, s->name)) \ + break; \ + \ + if (DECL && TREE_CODE (DECL) == FUNCTION_DECL) \ + type = SECT_EXEC, mode = "ax"; \ + else if (DECL && DECL_READONLY_SECTION (DECL, RELOC)) \ + type = SECT_RO, mode = "a"; \ + else \ + type = SECT_RW, mode = "aw"; \ + \ + if (s == 0) \ + { \ + s = (struct section_info *) xmalloc (sizeof (struct section_info)); \ + s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME)); \ + strcpy (s->name, NAME); \ + s->type = type; \ + s->next = sections; \ + sections = s; \ + fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, mode); \ + } \ + else \ + { \ + if (DECL && s->type != type) \ + error_with_decl (DECL, "%s causes a section type conflict"); \ + \ + fprintf (FILE, ".section\t%s\n", NAME); \ + } \ + } while (0) +#undef MAKE_DECL_ONE_ONLY +#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) +#undef UNIQUE_SECTION_P +#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL)) +#undef UNIQUE_SECTION +#define UNIQUE_SECTION(DECL,RELOC) \ + do { \ + int len; \ + char *name, *string, *prefix; \ + \ + name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL)); \ + \ + if (! DECL_ONE_ONLY (DECL)) \ + { \ + prefix = "."; \ + if (TREE_CODE (DECL) == FUNCTION_DECL) \ + prefix = ".text."; \ + else if (DECL_READONLY_SECTION (DECL, RELOC)) \ + prefix = ".rodata."; \ + else \ + prefix = ".data."; \ + } \ + else if (TREE_CODE (DECL) == FUNCTION_DECL) \ + prefix = ".gnu.linkonce.t."; \ + else if (DECL_READONLY_SECTION (DECL, RELOC)) \ + prefix = ".gnu.linkonce.r."; \ + else \ + prefix = ".gnu.linkonce.d."; \ + \ + len = strlen (name) + strlen (prefix); \ + string = alloca (len + 1); \ + sprintf (string, "%s%s", prefix, name); \ + \ + DECL_SECTION_NAME (DECL) = build_string (len, string); \ + } while (0) + +/* A C statement or statements to switch to the appropriate + section for output of DECL. DECL is either a `VAR_DECL' node + or a constant of some sort. RELOC indicates whether forming + the initial value of DECL requires link-time relocations. */ + +#undef SELECT_SECTION +#define SELECT_SECTION(DECL,RELOC) \ + { \ + if (flag_pic && RELOC) \ + data_section (); \ + else if (TREE_CODE (DECL) == STRING_CST) \ + { \ + if (! flag_writable_strings) \ + const_section (); \ + else \ + data_section (); \ + } \ + else if (TREE_CODE (DECL) == VAR_DECL) \ + { \ + if (! DECL_READONLY_SECTION (DECL, RELOC)) \ + data_section (); \ + else \ + const_section (); \ + } \ + else \ + const_section (); \ + } /* Define macro used to output shift-double opcodes when the shift count is in %cl. Some assemblers require %cl as an argument; @@ -323,38 +615,11 @@ do { \ *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) +#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. */ -#undef JUMP_TABLES_IN_TEXT_SECTION -#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) - -/* override the exception table positioning */ -#undef EXCEPTION_SECTION -#define EXCEPTION_SECTION() \ -do { \ - if (TARGET_ELF) { \ - named_section (NULL_TREE, ".gcc_except_table", 0); \ - } else { \ - if (flag_pic) \ - data_section (); \ - else \ - readonly_data_section (); \ - } \ -} while (0); -/* supply our own hook for calling __main() from main() */ -#undef INVOKE__main -#define INVOKE__main -#undef GEN_CALL__MAIN -#define GEN_CALL__MAIN \ - do { \ - if (!(TARGET_ELF)) \ - emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0, \ - VOIDmode, 0); \ - } while (0) +/************************[ Debugger stuff ]*********************************/ /* Copy this from the svr4 specifications... */ /* Define the register numbers to be used in Dwarf debugging information. @@ -411,7 +676,7 @@ do { \ 17 for %st(6) (gnu regno = 14) 18 for %st(7) (gnu regno = 15) */ -#undef DWARF_DBX_REGISTER_NUMBER +#undef DWARF_DBX_REGISTER_NUMBER #define DWARF_DBX_REGISTER_NUMBER(n) \ ((n) == 0 ? 0 \ : (n) == 1 ? 2 \ @@ -425,7 +690,7 @@ do { \ : (-1)) /* Now what stabs expects in the register. */ -#undef STABS_DBX_REGISTER_NUMBER +#undef STABS_DBX_REGISTER_NUMBER #define STABS_DBX_REGISTER_NUMBER(n) \ ((n) == 0 ? 0 : \ (n) == 1 ? 2 : \ @@ -438,147 +703,45 @@ do { \ (n) + 4) #undef DBX_REGISTER_NUMBER -#define DBX_REGISTER_NUMBER(n) ((write_symbols == DWARF_DEBUG) \ - ? DWARF_DBX_REGISTER_NUMBER(n) \ +#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 begin profiling of the current function. - LABELNO is an optional label. */ - -#undef FUNCTION_PROFILER -#define FUNCTION_PROFILER(FILE, LABELNO) \ -do { \ - char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ - if (flag_pic) \ - fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name); \ - else \ - fprintf ((FILE), "\tcall %s\n", _name); \ -} while (0) - -/* Output assembler code to FILE to end profiling of the current function. */ - -#undef FUNCTION_PROFILER_EPILOGUE -#define FUNCTION_PROFILER_EPILOGUE(FILE, DO_RTL) \ -do { \ - if (TARGET_PROFILER_EPILOGUE) \ - { \ - if (DO_RTL) \ - { \ - /* ".mexitcount" is specially handled in \ - ASM_HACK_SYMBOLREF () so that we don't need to handle \ - flag_pic or TARGET_AOUT here. */ \ - rtx xop; \ - xop = gen_rtx_MEM (FUNCTION_MODE, \ - gen_rtx_SYMBOL_REF (Pmode, ".mexitcount")); \ - emit_call_insn (gen_rtx (CALL, VOIDmode, xop, const0_rtx)); \ - } \ - else \ - { \ - /* XXX this !DO_RTL case is broken but not actually used. */ \ - char *_name = TARGET_AOUT ? "mcount" : ".mcount"; \ - if (flag_pic) \ - fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", _name); \ - else \ - fprintf (FILE, "\tcall %s\n", _name); \ - } \ +/* tag end of file in elf mode */ +#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END +#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ + do { \ + if (TARGET_ELF) { \ + fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \ + N_SO); \ } \ -} while (0) - -#undef SIZE_TYPE -#define SIZE_TYPE "unsigned int" - -#undef PTRDIFF_TYPE -#define PTRDIFF_TYPE "int" - -#undef WCHAR_TYPE -#define WCHAR_TYPE "int" - -#undef WCHAR_UNSIGNED -#define WCHAR_UNSIGNED 0 - -#undef WCHAR_TYPE_SIZE -#define WCHAR_TYPE_SIZE BITS_PER_WORD - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES - -#undef CC1_SPEC -#define CC1_SPEC "\ -%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \ -%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}" - -#undef ASM_SPEC -#define ASM_SPEC "%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}" - -/* 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 "\ - %{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:-Bshareable %{h*} %{soname*}} \ - %{symbolic:-Bsymbolic} \ - %{!shared: \ - %{!static: \ - %{rdynamic: -export-dynamic} \ - %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \ - %{static:-Bstatic}}}" - -/* A C statement to output to the stdio stream FILE an assembler - command to advance the location counter to a multiple of 1<<LOG - bytes if it is within MAX_SKIP bytes. - - This is used to align code labels according to Intel recommendations. */ - -#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN -#error "we don't have this for the aout gas" -#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) \ - if ((LOG)!=0) \ - if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ - else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) -#endif - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC "\ - %{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}" + } while (0) -/* This goes away when the math emulator is fixed. */ -#undef TARGET_DEFAULT -#define TARGET_DEFAULT \ - (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387) +/* 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) -/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the - DWARF2 unwinding mechanisms. Once `make world' bootstraping problems with - the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions - type exception machanism. */ -#define DWARF2_UNWIND_INFO 0 +#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) |