|
|
1.1 ! root 1: /* Target definitions for GNU compiler for Intel 80386 running System V.4 ! 2: Copyright (C) 1991 Free Software Foundation, Inc. ! 3: ! 4: Written by Ron Guilmette ([email protected]). ! 5: ! 6: This file is part of GNU CC. ! 7: ! 8: GNU CC is free software; you can redistribute it and/or modify ! 9: it under the terms of the GNU General Public License as published by ! 10: the Free Software Foundation; either version 2, or (at your option) ! 11: any later version. ! 12: ! 13: GNU CC is distributed in the hope that it will be useful, ! 14: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 16: GNU General Public License for more details. ! 17: ! 18: You should have received a copy of the GNU General Public License ! 19: along with GNU CC; see the file COPYING. If not, write to ! 20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 21: ! 22: #include "i386/i386.h" /* Base i386 target machine definitions */ ! 23: #include "i386/att.h" /* Use the i386 AT&T assembler syntax */ ! 24: #include "svr4.h" /* Definitions common to all SVR4 targets */ ! 25: ! 26: #undef TARGET_VERSION ! 27: #define TARGET_VERSION fprintf (stderr, " (i386 System V Release 4)"); ! 28: ! 29: /* The svr4 ABI for the i386 says that records and unions are returned ! 30: in memory. */ ! 31: ! 32: #undef RETURN_IN_MEMORY ! 33: #define RETURN_IN_MEMORY(TYPE) \ ! 34: (TYPE_MODE (TYPE) == BLKmode) ! 35: ! 36: /* Define which macros to predefine. __svr4__ is our extension. */ ! 37: /* This used to define X86, but [email protected] says that ! 38: is supposed to be defined optionally by user programs--not by default. */ ! 39: #define CPP_PREDEFINES \ ! 40: "-Di386 -Dunix -D__svr4__ -Asystem(unix) -Acpu(i386) -Amachine(i386)" ! 41: ! 42: /* If the host and target formats match, output the floats as hex. */ ! 43: #if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT ! 44: #if defined (HOST_WORDS_BIG_ENDIAN) == WORDS_BIG_ENDIAN ! 45: /* This is how to output assembly code to define a `float' constant. ! 46: We always have to use a .long pseudo-op to do this because the native ! 47: SVR4 ELF assembler is buggy and it generates incorrect values when we ! 48: try to use the .float pseudo-op instead. */ ! 49: ! 50: #undef ASM_OUTPUT_FLOAT ! 51: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \ ! 52: do { long value; \ ! 53: REAL_VALUE_TO_TARGET_SINGLE ((VALUE), value); \ ! 54: fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value); \ ! 55: } while (0) ! 56: ! 57: /* This is how to output assembly code to define a `double' constant. ! 58: We always have to use a pair of .long pseudo-ops to do this because ! 59: the native SVR4 ELF assembler is buggy and it generates incorrect ! 60: values when we try to use the the .double pseudo-op instead. */ ! 61: ! 62: #undef ASM_OUTPUT_DOUBLE ! 63: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ ! 64: do { long value[2]; \ ! 65: REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), value); \ ! 66: fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value[0]); \ ! 67: fprintf((FILE), "%s\t0x%x\n", ASM_LONG, value[1]); \ ! 68: } while (0) ! 69: #endif /* word order matches */ ! 70: #endif /* HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT */ ! 71: ! 72: /* Output at beginning of assembler file. */ ! 73: /* The .file command should always begin the output. */ ! 74: ! 75: #undef ASM_FILE_START ! 76: #define ASM_FILE_START(FILE) \ ! 77: do { \ ! 78: output_file_directive (FILE, main_input_filename); \ ! 79: fprintf (FILE, "\t.version\t\"01.01\"\n"); \ ! 80: } while (0) ! 81: ! 82: /* Define the register numbers to be used in Dwarf debugging information. ! 83: The SVR4 reference port C compiler uses the following register numbers ! 84: in its Dwarf output code: ! 85: ! 86: 0 for %eax (gnu regno = 0) ! 87: 1 for %ecx (gnu regno = 2) ! 88: 2 for %edx (gnu regno = 1) ! 89: 3 for %ebx (gnu regno = 3) ! 90: 4 for %esp (gnu regno = 7) ! 91: 5 for %ebp (gnu regno = 6) ! 92: 6 for %esi (gnu regno = 4) ! 93: 7 for %edi (gnu regno = 5) ! 94: ! 95: The following three DWARF register numbers are never generated by ! 96: the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 ! 97: believes these numbers have these meanings. ! 98: ! 99: 8 for %eip (no gnu equivalent) ! 100: 9 for %eflags (no gnu equivalent) ! 101: 10 for %trapno (no gnu equivalent) ! 102: ! 103: It is not at all clear how we should number the FP stack registers ! 104: for the x86 architecture. If the version of SDB on x86/svr4 were ! 105: a bit less brain dead with respect to floating-point then we would ! 106: have a precedent to follow with respect to DWARF register numbers ! 107: for x86 FP registers, but the SDB on x86/svr4 is so completely ! 108: broken with respect to FP registers that it is hardly worth thinking ! 109: of it as something to strive for compatibility with. ! 110: ! 111: The verison of x86/svr4 SDB I have at the moment does (partially) ! 112: seem to believe that DWARF register number 11 is associated with ! 113: the x86 register %st(0), but that's about all. Higher DWARF ! 114: register numbers don't seem to be associated with anything in ! 115: particular, and even for DWARF regno 11, SDB only seems to under- ! 116: stand that it should say that a variable lives in %st(0) (when ! 117: asked via an `=' command) if we said it was in DWARF regno 11, ! 118: but SDB still prints garbage when asked for the value of the ! 119: variable in question (via a `/' command). ! 120: ! 121: (Also note that the labels SDB prints for various FP stack regs ! 122: when doing an `x' command are all wrong.) ! 123: ! 124: Note that these problems generally don't affect the native SVR4 ! 125: C compiler because it doesn't allow the use of -O with -g and ! 126: because when it is *not* optimizing, it allocates a memory ! 127: location for each floating-point variable, and the memory ! 128: location is what gets described in the DWARF AT_location ! 129: attribute for the variable in question. ! 130: ! 131: Regardless of the severe mental illness of the x86/svr4 SDB, we ! 132: do something sensible here and we use the following DWARF ! 133: register numbers. Note that these are all stack-top-relative ! 134: numbers. ! 135: ! 136: 11 for %st(0) (gnu regno = 8) ! 137: 12 for %st(1) (gnu regno = 9) ! 138: 13 for %st(2) (gnu regno = 10) ! 139: 14 for %st(3) (gnu regno = 11) ! 140: 15 for %st(4) (gnu regno = 12) ! 141: 16 for %st(5) (gnu regno = 13) ! 142: 17 for %st(6) (gnu regno = 14) ! 143: 18 for %st(7) (gnu regno = 15) ! 144: */ ! 145: ! 146: #undef DBX_REGISTER_NUMBER ! 147: #define DBX_REGISTER_NUMBER(n) \ ! 148: ((n) == 0 ? 0 \ ! 149: : (n) == 1 ? 2 \ ! 150: : (n) == 2 ? 1 \ ! 151: : (n) == 3 ? 3 \ ! 152: : (n) == 4 ? 6 \ ! 153: : (n) == 5 ? 7 \ ! 154: : (n) == 6 ? 5 \ ! 155: : (n) == 7 ? 4 \ ! 156: : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ ! 157: : (-1)) ! 158: ! 159: /* The routine used to output sequences of byte values. We use a special ! 160: version of this for most svr4 targets because doing so makes the ! 161: generated assembly code more compact (and thus faster to assemble) ! 162: as well as more readable. Note that if we find subparts of the ! 163: character sequence which end with NUL (and which are shorter than ! 164: STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING. */ ! 165: ! 166: #undef ASM_OUTPUT_ASCII ! 167: #define ASM_OUTPUT_ASCII(FILE, STR, LENGTH) \ ! 168: do \ ! 169: { \ ! 170: register unsigned char *_ascii_bytes = (unsigned char *) (STR); \ ! 171: register unsigned char *limit = _ascii_bytes + (LENGTH); \ ! 172: register unsigned bytes_in_chunk = 0; \ ! 173: for (; _ascii_bytes < limit; _ascii_bytes++) \ ! 174: { \ ! 175: register unsigned char *p; \ ! 176: if (bytes_in_chunk >= 64) \ ! 177: { \ ! 178: fputc ('\n', (FILE)); \ ! 179: bytes_in_chunk = 0; \ ! 180: } \ ! 181: for (p = _ascii_bytes; p < limit && *p != '\0'; p++) \ ! 182: continue; \ ! 183: if (p < limit && (p - _ascii_bytes) <= STRING_LIMIT) \ ! 184: { \ ! 185: if (bytes_in_chunk > 0) \ ! 186: { \ ! 187: fputc ('\n', (FILE)); \ ! 188: bytes_in_chunk = 0; \ ! 189: } \ ! 190: ASM_OUTPUT_LIMITED_STRING ((FILE), _ascii_bytes); \ ! 191: _ascii_bytes = p; \ ! 192: } \ ! 193: else \ ! 194: { \ ! 195: if (bytes_in_chunk == 0) \ ! 196: fprintf ((FILE), "\t.byte\t"); \ ! 197: else \ ! 198: fputc (',', (FILE)); \ ! 199: fprintf ((FILE), "0x%02x", *_ascii_bytes); \ ! 200: bytes_in_chunk += 5; \ ! 201: } \ ! 202: } \ ! 203: if (bytes_in_chunk > 0) \ ! 204: fprintf ((FILE), "\n"); \ ! 205: } \ ! 206: while (0) ! 207: ! 208: /* This is how to output an element of a case-vector that is relative. ! 209: This is only used for PIC code. See comments by the `casesi' insn in ! 210: i386.md for an explanation of the expression this outputs. */ ! 211: ! 212: #undef ASM_OUTPUT_ADDR_DIFF_ELT ! 213: #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ ! 214: fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) ! 215: ! 216: /* Indicate that jump tables go in the text section. This is ! 217: necessary when compiling PIC code. */ ! 218: ! 219: #define JUMP_TABLES_IN_TEXT_SECTION
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.