]>
Commit | Line | Data |
---|---|---|
9ec36da5 JL |
1 | /* Definitions for Intel 386 running Linux-based GNU systems with ELF format. |
2 | Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
bb1835d2 RK |
3 | Contributed by Eric Youngdale. |
4 | Modified for stabs-in-ELF by H.J. Lu. | |
4a86a6d2 RK |
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 | |
97aadbb9 RK |
20 | the Free Software Foundation, 59 Temple Place - Suite 330, |
21 | Boston, MA 02111-1307, USA. */ | |
1cf549b1 | 22 | |
bb1835d2 RK |
23 | #define LINUX_DEFAULT_ELF |
24 | ||
25 | /* A lie, I guess, but the general idea behind linux/ELF is that we are | |
26 | supposed to be outputting something that will assemble under SVr4. | |
27 | This gets us pretty close. */ | |
f17dfa93 RK |
28 | #include <i386/i386.h> /* Base i386 target machine definitions */ |
29 | #include <i386/att.h> /* Use the i386 AT&T assembler syntax */ | |
30 | #include <linux.h> /* some common stuff */ | |
bb1835d2 RK |
31 | |
32 | #undef TARGET_VERSION | |
c3b11311 | 33 | #define TARGET_VERSION fprintf (stderr, " (i386 Linux/ELF)"); |
bb1835d2 RK |
34 | |
35 | /* The svr4 ABI for the i386 says that records and unions are returned | |
36 | in memory. */ | |
37 | #undef DEFAULT_PCC_STRUCT_RETURN | |
38 | #define DEFAULT_PCC_STRUCT_RETURN 1 | |
39 | ||
bebc4663 JL |
40 | #undef ASM_COMMENT_START |
41 | #define ASM_COMMENT_START "#" | |
42 | ||
bb1835d2 RK |
43 | /* This is how to output an element of a case-vector that is relative. |
44 | This is only used for PIC code. See comments by the `casesi' insn in | |
45 | i386.md for an explanation of the expression this outputs. */ | |
46 | #undef ASM_OUTPUT_ADDR_DIFF_ELT | |
33f7f353 | 47 | #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ |
bb1835d2 RK |
48 | fprintf (FILE, "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, VALUE) |
49 | ||
50 | /* Indicate that jump tables go in the text section. This is | |
51 | necessary when compiling PIC code. */ | |
75197b37 | 52 | #define JUMP_TABLES_IN_TEXT_SECTION (flag_pic) |
bb1835d2 RK |
53 | |
54 | /* Copy this from the svr4 specifications... */ | |
55 | /* Define the register numbers to be used in Dwarf debugging information. | |
56 | The SVR4 reference port C compiler uses the following register numbers | |
57 | in its Dwarf output code: | |
58 | 0 for %eax (gnu regno = 0) | |
59 | 1 for %ecx (gnu regno = 2) | |
60 | 2 for %edx (gnu regno = 1) | |
61 | 3 for %ebx (gnu regno = 3) | |
62 | 4 for %esp (gnu regno = 7) | |
63 | 5 for %ebp (gnu regno = 6) | |
64 | 6 for %esi (gnu regno = 4) | |
65 | 7 for %edi (gnu regno = 5) | |
66 | The following three DWARF register numbers are never generated by | |
67 | the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4 | |
68 | believes these numbers have these meanings. | |
69 | 8 for %eip (no gnu equivalent) | |
70 | 9 for %eflags (no gnu equivalent) | |
71 | 10 for %trapno (no gnu equivalent) | |
72 | It is not at all clear how we should number the FP stack registers | |
73 | for the x86 architecture. If the version of SDB on x86/svr4 were | |
74 | a bit less brain dead with respect to floating-point then we would | |
75 | have a precedent to follow with respect to DWARF register numbers | |
76 | for x86 FP registers, but the SDB on x86/svr4 is so completely | |
77 | broken with respect to FP registers that it is hardly worth thinking | |
78 | of it as something to strive for compatibility with. | |
ddd5a7c1 | 79 | The version of x86/svr4 SDB I have at the moment does (partially) |
bb1835d2 RK |
80 | seem to believe that DWARF register number 11 is associated with |
81 | the x86 register %st(0), but that's about all. Higher DWARF | |
82 | register numbers don't seem to be associated with anything in | |
83 | particular, and even for DWARF regno 11, SDB only seems to under- | |
84 | stand that it should say that a variable lives in %st(0) (when | |
85 | asked via an `=' command) if we said it was in DWARF regno 11, | |
86 | but SDB still prints garbage when asked for the value of the | |
87 | variable in question (via a `/' command). | |
88 | (Also note that the labels SDB prints for various FP stack regs | |
89 | when doing an `x' command are all wrong.) | |
90 | Note that these problems generally don't affect the native SVR4 | |
91 | C compiler because it doesn't allow the use of -O with -g and | |
92 | because when it is *not* optimizing, it allocates a memory | |
93 | location for each floating-point variable, and the memory | |
94 | location is what gets described in the DWARF AT_location | |
95 | attribute for the variable in question. | |
96 | Regardless of the severe mental illness of the x86/svr4 SDB, we | |
97 | do something sensible here and we use the following DWARF | |
98 | register numbers. Note that these are all stack-top-relative | |
99 | numbers. | |
100 | 11 for %st(0) (gnu regno = 8) | |
101 | 12 for %st(1) (gnu regno = 9) | |
102 | 13 for %st(2) (gnu regno = 10) | |
103 | 14 for %st(3) (gnu regno = 11) | |
104 | 15 for %st(4) (gnu regno = 12) | |
105 | 16 for %st(5) (gnu regno = 13) | |
106 | 17 for %st(6) (gnu regno = 14) | |
107 | 18 for %st(7) (gnu regno = 15) | |
108 | */ | |
109 | #undef DBX_REGISTER_NUMBER | |
110 | #define DBX_REGISTER_NUMBER(n) \ | |
111 | ((n) == 0 ? 0 \ | |
112 | : (n) == 1 ? 2 \ | |
113 | : (n) == 2 ? 1 \ | |
114 | : (n) == 3 ? 3 \ | |
115 | : (n) == 4 ? 6 \ | |
116 | : (n) == 5 ? 7 \ | |
117 | : (n) == 6 ? 5 \ | |
118 | : (n) == 7 ? 4 \ | |
119 | : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \ | |
120 | : (-1)) | |
121 | ||
122 | /* Output assembler code to FILE to increment profiler label # LABELNO | |
123 | for profiling a function entry. */ | |
124 | ||
125 | #undef FUNCTION_PROFILER | |
126 | #define FUNCTION_PROFILER(FILE, LABELNO) \ | |
127 | { \ | |
128 | if (flag_pic) \ | |
129 | { \ | |
130 | fprintf (FILE, "\tleal %sP%d@GOTOFF(%%ebx),%%edx\n", \ | |
131 | LPREFIX, (LABELNO)); \ | |
132 | fprintf (FILE, "\tcall *mcount@GOT(%%ebx)\n"); \ | |
133 | } \ | |
134 | else \ | |
135 | { \ | |
136 | fprintf (FILE, "\tmovl $%sP%d,%%edx\n", LPREFIX, (LABELNO)); \ | |
137 | fprintf (FILE, "\tcall mcount\n"); \ | |
138 | } \ | |
139 | } | |
d345a981 | 140 | |
1cf549b1 RS |
141 | #undef SIZE_TYPE |
142 | #define SIZE_TYPE "unsigned int" | |
bb1835d2 | 143 | |
1cf549b1 RS |
144 | #undef PTRDIFF_TYPE |
145 | #define PTRDIFF_TYPE "int" | |
bb1835d2 | 146 | |
1cf549b1 RS |
147 | #undef WCHAR_TYPE |
148 | #define WCHAR_TYPE "long int" | |
bb1835d2 | 149 | |
1cf549b1 RS |
150 | #undef WCHAR_TYPE_SIZE |
151 | #define WCHAR_TYPE_SIZE BITS_PER_WORD | |
bb1835d2 RK |
152 | |
153 | #undef CPP_PREDEFINES | |
8524774e | 154 | #define CPP_PREDEFINES "-D__ELF__ -Dunix -Dlinux -Asystem(posix)" |
1cf549b1 | 155 | |
bb1835d2 | 156 | #undef CPP_SPEC |
5f62d4e1 | 157 | #ifdef USE_GNULIBC_1 |
1228a9bd | 158 | #define CPP_SPEC "%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE}" |
5f62d4e1 | 159 | #else |
1228a9bd | 160 | #define CPP_SPEC "%(cpp_cpu) %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}" |
5f62d4e1 | 161 | #endif |
1cf549b1 | 162 | |
b52fbc26 RK |
163 | #undef CC1_SPEC |
164 | #define CC1_SPEC "%(cc1_cpu) %{profile:-p}" | |
165 | ||
c3b11311 | 166 | /* Provide a LINK_SPEC appropriate for Linux. Here we provide support |
bb1835d2 RK |
167 | for the special GCC options -static and -shared, which allow us to |
168 | link things in one of these three modes by applying the appropriate | |
169 | combinations of options at link-time. We like to support here for | |
170 | as many of the other GNU linker options as possible. But I don't | |
171 | have the time to search for those flags. I am sure how to add | |
172 | support for -soname shared_object_name. H.J. | |
173 | ||
174 | I took out %{v:%{!V:-V}}. It is too much :-(. They can use | |
175 | -Wl,-V. | |
176 | ||
177 | When the -shared link option is used a final link is not being | |
178 | done. */ | |
179 | ||
180 | /* If ELF is the default format, we should not use /lib/elf. */ | |
181 | ||
182 | #undef LINK_SPEC | |
5f62d4e1 | 183 | #ifdef USE_GNULIBC_1 |
bb1835d2 RK |
184 | #ifndef LINUX_DEFAULT_ELF |
185 | #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ | |
186 | %{!shared: \ | |
187 | %{!ibcs: \ | |
188 | %{!static: \ | |
189 | %{rdynamic:-export-dynamic} \ | |
190 | %{!dynamic-linker:-dynamic-linker /lib/elf/ld-linux.so.1} \ | |
191 | %{!rpath:-rpath /lib/elf/}} %{static:-static}}}" | |
22cc53bc | 192 | #else |
bb1835d2 RK |
193 | #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ |
194 | %{!shared: \ | |
195 | %{!ibcs: \ | |
196 | %{!static: \ | |
197 | %{rdynamic:-export-dynamic} \ | |
198 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ | |
199 | %{static:-static}}}" | |
22cc53bc | 200 | #endif |
5f62d4e1 RK |
201 | #else |
202 | #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ | |
203 | %{!shared: \ | |
204 | %{!ibcs: \ | |
205 | %{!static: \ | |
206 | %{rdynamic:-export-dynamic} \ | |
207 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | |
208 | %{static:-static}}}" | |
209 | #endif | |
6c2afd82 MM |
210 | |
211 | /* Get perform_* macros to build libgcc.a. */ | |
212 | #include "i386/perform.h" | |
17d6fedc JM |
213 | |
214 | /* A C statement (sans semicolon) to output to the stdio stream | |
ca4fca3e | 215 | FILE the assembler definition of uninitialized global DECL named |
17d6fedc JM |
216 | NAME whose size is SIZE bytes and alignment is ALIGN bytes. |
217 | Try to use asm_output_aligned_bss to implement this macro. */ | |
218 | ||
ca4fca3e DE |
219 | #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ |
220 | asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) | |
de3eb7b7 L |
221 | |
222 | /* A C statement to output to the stdio stream FILE an assembler | |
223 | command to advance the location counter to a multiple of 1<<LOG | |
224 | bytes if it is within MAX_SKIP bytes. | |
225 | ||
226 | This is used to align code labels according to Intel recommendations. */ | |
227 | ||
80de1662 | 228 | #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN |
de3eb7b7 L |
229 | #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \ |
230 | if ((LOG)!=0) \ | |
231 | if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \ | |
232 | else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)) | |
80de1662 | 233 | #endif |