--- gcc/config/i386v4.h 2018/04/24 17:51:37 1.1 +++ gcc/config/i386v4.h 2018/04/24 18:05:49 1.1.1.3 @@ -26,24 +26,6 @@ the Free Software Foundation, 675 Mass A #undef TARGET_VERSION #define TARGET_VERSION fprintf (stderr, " (i386 System V Release 4)"); -/* By default, target has a 80387. */ - -#define TARGET_DEFAULT 1 - -/* Machines that use the AT&T assembler syntax - also return floating point values in an FP register. */ -/* Define how to find the value returned by a function. - VALTYPE is the data type of the value (as a tree). - If the precise function being called is known, FUNC is its FUNCTION_DECL; - otherwise, FUNC is 0. */ - -#define VALUE_REGNO(MODE) \ - (((MODE) == SFmode || (MODE) == DFmode) ? FIRST_FLOAT_REG : 0) - -/* 1 if N is a possible register number for a function value. */ - -#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0 || (N)== FIRST_FLOAT_REG) - /* The svr4 ABI for the i386 says that records and unions are returned in memory. */ @@ -57,6 +39,36 @@ the Free Software Foundation, 675 Mass A #define CPP_PREDEFINES \ "-Di386 -Dunix -D__svr4__ -Asystem(unix) -Acpu(i386) -Amachine(i386)" +/* If the host and target formats match, output the floats as hex. */ +#if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT +#if defined (HOST_WORDS_BIG_ENDIAN) == WORDS_BIG_ENDIAN +/* This is how to output assembly code to define a `float' constant. + We always have to use a .long pseudo-op to do this because the native + SVR4 ELF assembler is buggy and it generates incorrect values when we + try to use the .float pseudo-op instead. */ + +#undef ASM_OUTPUT_FLOAT +#define ASM_OUTPUT_FLOAT(FILE,VALUE) \ +do { long value; \ + REAL_VALUE_TO_TARGET_SINGLE ((VALUE), value); \ + fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value); \ + } while (0) + +/* This is how to output assembly code to define a `double' constant. + We always have to use a pair of .long pseudo-ops to do this because + the native SVR4 ELF assembler is buggy and it generates incorrect + values when we try to use the the .double pseudo-op instead. */ + +#undef ASM_OUTPUT_DOUBLE +#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ +do { long value[2]; \ + REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), value); \ + fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value[0]); \ + fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value[1]); \ + } while (0) +#endif /* word order matches */ +#endif /* HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT */ + /* Output at beginning of assembler file. */ /* The .file command should always begin the output. */ @@ -71,23 +83,64 @@ the Free Software Foundation, 675 Mass A The SVR4 reference port C compiler uses the following register numbers in its Dwarf output code: - 0 for %eax (regno = 0) - 1 for %ecx (regno = 2) - 2 for %edx (regno = 1) - 3 for %ebx (regno = 3) - 4 for %esp (regno = 7) - 5 for %ebp (regno = 6) - 6 for %esi (regno = 4) - 7 for %edi (regno = 5) - - 8 for FP_REGS[tos] (regno = 8) - 9 for FP_REGS[tos-1] (regno = 9) - 10 for FP_REGS[tos-2] (regno = 10) - 11 for FP_REGS[tos-3] (regno = 11) - 12 for FP_REGS[tos-4] (regno = 12) - 13 for FP_REGS[tos-5] (regno = 13) - 14 for FP_REGS[tos-6] (regno = 14) - 15 for FP_REGS[tos-7] (regno = 15) + 0 for %eax (gnu regno = 0) + 1 for %ecx (gnu regno = 2) + 2 for %edx (gnu regno = 1) + 3 for %ebx (gnu regno = 3) + 4 for %esp (gnu regno = 7) + 5 for %ebp (gnu regno = 6) + 6 for %esi (gnu regno = 4) + 7 for %edi (gnu regno = 5) + + The following three DWARF register numbers are never generated by + the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 + believes these numbers have these meanings. + + 8 for %eip (no gnu equivalent) + 9 for %eflags (no gnu equivalent) + 10 for %trapno (no gnu equivalent) + + It is not at all clear how we should number the FP stack registers + for the x86 architecture. If the version of SDB on x86/svr4 were + a bit less brain dead with respect to floating-point then we would + have a precedent to follow with respect to DWARF register numbers + for x86 FP registers, but the SDB on x86/svr4 is so completely + broken with respect to FP registers that it is hardly worth thinking + of it as something to strive for compatibility with. + + The verison of x86/svr4 SDB I have at the moment does (partially) + seem to believe that DWARF register number 11 is associated with + the x86 register %st(0), but that's about all. Higher DWARF + register numbers don't seem to be associated with anything in + particular, and even for DWARF regno 11, SDB only seems to under- + stand that it should say that a variable lives in %st(0) (when + asked via an `=' command) if we said it was in DWARF regno 11, + but SDB still prints garbage when asked for the value of the + variable in question (via a `/' command). + + (Also note that the labels SDB prints for various FP stack regs + when doing an `x' command are all wrong.) + + Note that these problems generally don't affect the native SVR4 + C compiler because it doesn't allow the use of -O with -g and + because when it is *not* optimizing, it allocates a memory + location for each floating-point variable, and the memory + location is what gets described in the DWARF AT_location + attribute for the variable in question. + + Regardless of the severe mental illness of the x86/svr4 SDB, we + do something sensible here and we use the following DWARF + register numbers. Note that these are all stack-top-relative + numbers. + + 11 for %st(0) (gnu regno = 8) + 12 for %st(1) (gnu regno = 9) + 13 for %st(2) (gnu regno = 10) + 14 for %st(3) (gnu regno = 11) + 15 for %st(4) (gnu regno = 12) + 16 for %st(5) (gnu regno = 13) + 17 for %st(6) (gnu regno = 14) + 18 for %st(7) (gnu regno = 15) */ #undef DBX_REGISTER_NUMBER @@ -100,8 +153,8 @@ the Free Software Foundation, 675 Mass A : (n) == 5 ? 7 \ : (n) == 6 ? 5 \ : (n) == 7 ? 4 \ - : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n) \ - : (abort (), 0)) + : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ + : (-1)) /* The routine used to output sequences of byte values. We use a special version of this for most svr4 targets because doing so makes the @@ -165,9 +218,6 @@ the Free Software Foundation, 675 Mass A #define JUMP_TABLES_IN_TEXT_SECTION -#define WEAK_ASM_OP ".weak" -#define DEF_ASM_OP ".set" - /* Biggest alignment that any structure field can require on this machine, in bits. If packing is in effect, this can be smaller than normal. */ @@ -185,43 +235,5 @@ extern int maximum_field_alignment; #undef PCC_BITFIELD_TYPE_MATTERS #define PCC_BITFIELD_TYPE_MATTERS (maximum_field_alignment == 0) -/* Code to handle #pragma directives. The interface is a bit messy, - but there's no simpler way to do this while still using yylex. */ -#define HANDLE_PRAGMA(FILE) \ - do { \ - while (c == ' ' || c == '\t') \ - c = getc (FILE); \ - if (c == '\n' || c == EOF) \ - { \ - handle_pragma_token (0, 0); \ - return c; \ - } \ - ungetc (c, FILE); \ - switch (yylex ()) \ - { \ - case IDENTIFIER: \ - case TYPENAME: \ - case STRING: \ - case CONSTANT: \ - handle_pragma_token (token_buffer, yylval.ttype); \ - break; \ - default: \ - handle_pragma_token (token_buffer, 0); \ - } \ - if (nextchar >= 0) \ - c = nextchar, nextchar = -1; \ - else \ - c = getc (FILE); \ - } while (1) - -/* 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 { \ - fprintf (FILE, "\t.local\t%s\n", NAME); \ - ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN); \ -} while (0) +/* Handle #pragma pack and sometimes #pragma weak. */ +#define HANDLE_SYSV_PRAGMA