0
|
1 /* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
|
|
2 Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2004, 2005,
|
|
3 2006, 2007, 2008 Free Software Foundation, Inc.
|
|
4 Contributed by Eric Youngdale.
|
|
5 Modified for stabs-in-ELF by H.J. Lu.
|
|
6
|
|
7 This file is part of GCC.
|
|
8
|
|
9 GCC is free software; you can redistribute it and/or modify
|
|
10 it under the terms of the GNU General Public License as published by
|
|
11 the Free Software Foundation; either version 3, or (at your option)
|
|
12 any later version.
|
|
13
|
|
14 GCC is distributed in the hope that it will be useful,
|
|
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17 GNU General Public License for more details.
|
|
18
|
|
19 You should have received a copy of the GNU General Public License
|
|
20 along with GCC; see the file COPYING3. If not see
|
|
21 <http://www.gnu.org/licenses/>. */
|
|
22
|
|
23 /* Output at beginning of assembler file. */
|
|
24 /* The .file command should always begin the output. */
|
|
25 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
|
|
26
|
|
27 #define TARGET_VERSION fprintf (stderr, " (i386 Linux/ELF)");
|
|
28
|
|
29 /* The svr4 ABI for the i386 says that records and unions are returned
|
|
30 in memory. */
|
|
31 #undef DEFAULT_PCC_STRUCT_RETURN
|
|
32 #define DEFAULT_PCC_STRUCT_RETURN 1
|
|
33
|
|
34 /* We arrange for the whole %gs segment to map the tls area. */
|
|
35 #undef TARGET_TLS_DIRECT_SEG_REFS_DEFAULT
|
|
36 #define TARGET_TLS_DIRECT_SEG_REFS_DEFAULT MASK_TLS_DIRECT_SEG_REFS
|
|
37
|
|
38 #undef ASM_COMMENT_START
|
|
39 #define ASM_COMMENT_START "#"
|
|
40
|
|
41 #undef DBX_REGISTER_NUMBER
|
|
42 #define DBX_REGISTER_NUMBER(n) \
|
|
43 (TARGET_64BIT ? dbx64_register_map[n] : svr4_dbx_register_map[n])
|
|
44
|
|
45 /* Output assembler code to FILE to call the profiler.
|
|
46 To the best of my knowledge, no Linux libc has required the label
|
|
47 argument to mcount. */
|
|
48
|
|
49 #define NO_PROFILE_COUNTERS 1
|
|
50
|
|
51 #undef MCOUNT_NAME
|
|
52 #define MCOUNT_NAME "mcount"
|
|
53
|
|
54 /* The GLIBC version of mcount for the x86 assumes that there is a
|
|
55 frame, so we cannot allow profiling without a frame pointer. */
|
|
56
|
|
57 #undef SUBTARGET_FRAME_POINTER_REQUIRED
|
|
58 #define SUBTARGET_FRAME_POINTER_REQUIRED crtl->profile
|
|
59
|
|
60 #undef SIZE_TYPE
|
|
61 #define SIZE_TYPE "unsigned int"
|
|
62
|
|
63 #undef PTRDIFF_TYPE
|
|
64 #define PTRDIFF_TYPE "int"
|
|
65
|
|
66 #undef WCHAR_TYPE
|
|
67 #define WCHAR_TYPE "long int"
|
|
68
|
|
69 #undef WCHAR_TYPE_SIZE
|
|
70 #define WCHAR_TYPE_SIZE BITS_PER_WORD
|
|
71
|
|
72 #define TARGET_OS_CPP_BUILTINS() \
|
|
73 do \
|
|
74 { \
|
|
75 LINUX_TARGET_OS_CPP_BUILTINS(); \
|
|
76 } \
|
|
77 while (0)
|
|
78
|
|
79 #undef CPP_SPEC
|
|
80 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
|
|
81
|
|
82 #undef CC1_SPEC
|
|
83 #define CC1_SPEC "%(cc1_cpu) %{profile:-p}"
|
|
84
|
|
85 /* Provide a LINK_SPEC appropriate for Linux. Here we provide support
|
|
86 for the special GCC options -static and -shared, which allow us to
|
|
87 link things in one of these three modes by applying the appropriate
|
|
88 combinations of options at link-time. We like to support here for
|
|
89 as many of the other GNU linker options as possible. But I don't
|
|
90 have the time to search for those flags. I am sure how to add
|
|
91 support for -soname shared_object_name. H.J.
|
|
92
|
|
93 I took out %{v:%{!V:-V}}. It is too much :-(. They can use
|
|
94 -Wl,-V.
|
|
95
|
|
96 When the -shared link option is used a final link is not being
|
|
97 done. */
|
|
98
|
|
99 /* If ELF is the default format, we should not use /lib/elf. */
|
|
100
|
|
101 /* These macros may be overridden in k*bsd-gnu.h and i386/k*bsd-gnu.h. */
|
|
102 #define LINK_EMULATION "elf_i386"
|
|
103 #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
|
|
104
|
|
105 #undef ASM_SPEC
|
|
106 #define ASM_SPEC \
|
|
107 "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
|
|
108 %{!mno-sse2avx:%{mavx:-msse2avx}} %{msse2avx:%{!mavx:-msse2avx}}"
|
|
109
|
|
110 #undef SUBTARGET_EXTRA_SPECS
|
|
111 #define SUBTARGET_EXTRA_SPECS \
|
|
112 { "link_emulation", LINK_EMULATION },\
|
|
113 { "dynamic_linker", LINUX_DYNAMIC_LINKER }
|
|
114
|
|
115 #undef LINK_SPEC
|
|
116 #define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
|
|
117 %{!shared: \
|
|
118 %{!ibcs: \
|
|
119 %{!static: \
|
|
120 %{rdynamic:-export-dynamic} \
|
|
121 %{!dynamic-linker:-dynamic-linker %(dynamic_linker)}} \
|
|
122 %{static:-static}}}"
|
|
123
|
|
124 /* Similar to standard Linux, but adding -ffast-math support. */
|
|
125 #undef ENDFILE_SPEC
|
|
126 #define ENDFILE_SPEC \
|
|
127 "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
|
|
128 %{mpc32:crtprec32.o%s} \
|
|
129 %{mpc64:crtprec64.o%s} \
|
|
130 %{mpc80:crtprec80.o%s} \
|
|
131 %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
|
|
132
|
|
133 /* A C statement (sans semicolon) to output to the stdio stream
|
|
134 FILE the assembler definition of uninitialized global DECL named
|
|
135 NAME whose size is SIZE bytes and alignment is ALIGN bytes.
|
|
136 Try to use asm_output_aligned_bss to implement this macro. */
|
|
137
|
|
138 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
|
|
139 asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
|
|
140
|
|
141 /* A C statement to output to the stdio stream FILE an assembler
|
|
142 command to advance the location counter to a multiple of 1<<LOG
|
|
143 bytes if it is within MAX_SKIP bytes.
|
|
144
|
|
145 This is used to align code labels according to Intel recommendations. */
|
|
146
|
|
147 #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
|
|
148 #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
|
|
149 do { \
|
|
150 if ((LOG) != 0) { \
|
|
151 if ((MAX_SKIP) == 0) fprintf ((FILE), "\t.p2align %d\n", (LOG)); \
|
|
152 else { \
|
|
153 fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
|
|
154 /* Make sure that we have at least 8 byte alignment if > 8 byte \
|
|
155 alignment is preferred. */ \
|
|
156 if ((LOG) > 3 && (1 << (LOG)) > ((MAX_SKIP) + 1)) \
|
|
157 fprintf ((FILE), "\t.p2align 3\n"); \
|
|
158 } \
|
|
159 } \
|
|
160 } while (0)
|
|
161 #endif
|
|
162
|
|
163 /* Handle special EH pointer encodings. Absolute, pc-relative, and
|
|
164 indirect are handled automatically. */
|
|
165 #define ASM_MAYBE_OUTPUT_ENCODED_ADDR_RTX(FILE, ENCODING, SIZE, ADDR, DONE) \
|
|
166 do { \
|
|
167 if ((SIZE) == 4 && ((ENCODING) & 0x70) == DW_EH_PE_datarel) \
|
|
168 { \
|
|
169 fputs (ASM_LONG, FILE); \
|
|
170 assemble_name (FILE, XSTR (ADDR, 0)); \
|
|
171 fputs (((ENCODING) & DW_EH_PE_indirect ? "@GOT" : "@GOTOFF"), FILE); \
|
|
172 goto DONE; \
|
|
173 } \
|
|
174 } while (0)
|
|
175
|
|
176 /* Used by crtstuff.c to initialize the base of data-relative relocations.
|
|
177 These are GOT relative on x86, so return the pic register. */
|
|
178 #ifdef __PIC__
|
|
179 #define CRT_GET_RFIB_DATA(BASE) \
|
|
180 { \
|
|
181 register void *ebx_ __asm__("ebx"); \
|
|
182 BASE = ebx_; \
|
|
183 }
|
|
184 #else
|
|
185 #define CRT_GET_RFIB_DATA(BASE) \
|
|
186 __asm__ ("call\t.LPR%=\n" \
|
|
187 ".LPR%=:\n\t" \
|
|
188 "pop{l}\t%0\n\t" \
|
|
189 /* Due to a GAS bug, this cannot use EAX. That encodes \
|
|
190 smaller than the traditional EBX, which results in the \
|
|
191 offset being off by one. */ \
|
|
192 "add{l}\t{$_GLOBAL_OFFSET_TABLE_+[.-.LPR%=],%0" \
|
|
193 "|%0,_GLOBAL_OFFSET_TABLE_+(.-.LPR%=)}" \
|
|
194 : "=d"(BASE))
|
|
195 #endif
|
|
196
|
|
197 /* Put all *tf routines in libgcc. */
|
|
198 #undef LIBGCC2_HAS_TF_MODE
|
|
199 #define LIBGCC2_HAS_TF_MODE 1
|
|
200 #define LIBGCC2_TF_CEXT q
|
|
201 #define TF_SIZE 113
|
|
202
|
|
203 #undef NEED_INDICATE_EXEC_STACK
|
|
204 #define NEED_INDICATE_EXEC_STACK 1
|
|
205
|
|
206 #define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
|
|
207
|
|
208 /* This macro may be overridden in i386/k*bsd-gnu.h. */
|
|
209 #define REG_NAME(reg) reg
|
|
210
|
|
211 #ifdef TARGET_LIBC_PROVIDES_SSP
|
|
212 /* i386 glibc provides __stack_chk_guard in %gs:0x14. */
|
|
213 #define TARGET_THREAD_SSP_OFFSET 0x14
|
|
214 #endif
|