]>
Commit | Line | Data |
---|---|---|
956d6950 | 1 | /* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF. |
66647d44 | 2 | Copyright 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, |
dabadc52 | 3 | 2009, 2010, 2011 Free Software Foundation, Inc. |
bfe87013 DE |
4 | Contributed by David S. Miller (davem@caip.rutgers.edu) |
5 | ||
de0a398e | 6 | This file is part of GCC. |
bfe87013 | 7 | |
de0a398e | 8 | GCC is free software; you can redistribute it and/or modify |
bfe87013 | 9 | it under the terms of the GNU General Public License as published by |
2f83c7d6 | 10 | the Free Software Foundation; either version 3, or (at your option) |
bfe87013 DE |
11 | any later version. |
12 | ||
de0a398e | 13 | GCC is distributed in the hope that it will be useful, |
bfe87013 DE |
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 | |
2f83c7d6 NC |
19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
bfe87013 | 21 | |
5f7ca34b DM |
22 | #define TARGET_OS_CPP_BUILTINS() \ |
23 | do \ | |
24 | { \ | |
107fd1c1 | 25 | GNU_USER_TARGET_OS_CPP_BUILTINS(); \ |
5f7ca34b DM |
26 | if (TARGET_ARCH64) \ |
27 | builtin_define ("_LONGLONG"); \ | |
28 | if (TARGET_ARCH32 \ | |
29 | && TARGET_LONG_DOUBLE_128) \ | |
30 | builtin_define ("__LONG_DOUBLE_128__"); \ | |
31 | } \ | |
9b8466f4 NB |
32 | while (0) |
33 | ||
034e3eb0 EB |
34 | /* On Linux, the combination sparc64-* --with-cpu=v8 is supported and |
35 | selects a 32-bit compiler. */ | |
36 | #if defined(TARGET_64BIT_DEFAULT) && TARGET_CPU_DEFAULT >= TARGET_CPU_v9 | |
345a6161 DM |
37 | #undef TARGET_DEFAULT |
38 | #define TARGET_DEFAULT \ | |
4f4f4f54 DM |
39 | (MASK_V9 + MASK_PTR64 + MASK_64BIT + MASK_STACK_BIAS + \ |
40 | MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128) | |
345a6161 DM |
41 | #endif |
42 | ||
5f7ca34b DM |
43 | /* This must be v9a not just v9 because by default we enable |
44 | -mvis. */ | |
45 | #undef ASM_CPU64_DEFAULT_SPEC | |
46 | #define ASM_CPU64_DEFAULT_SPEC "-Av9a" | |
bfe87013 | 47 | |
956d6950 JL |
48 | /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on |
49 | the GNU/Linux magical crtend.o file (see crtstuff.c) which | |
bfe87013 DE |
50 | provides part of the support for getting C++ file-scope static |
51 | object constructed before entering `main', followed by a normal | |
956d6950 | 52 | GNU/Linux "finalizer" file, `crtn.o'. */ |
bfe87013 | 53 | |
5f7ca34b | 54 | #undef ENDFILE_SPEC |
5bbcd587 | 55 | #define ENDFILE_SPEC \ |
24a4dd31 | 56 | "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s\ |
0691dde9 | 57 | %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s}" |
345a6161 | 58 | |
a0a301fc DE |
59 | /* The default code model. */ |
60 | #undef SPARC_DEFAULT_CMODEL | |
be3f1ff5 | 61 | #define SPARC_DEFAULT_CMODEL CM_MEDLOW |
bfe87013 | 62 | |
bfe87013 | 63 | #undef WCHAR_TYPE |
247cfc5c JJ |
64 | #define WCHAR_TYPE "int" |
65 | ||
bfe87013 | 66 | #undef WCHAR_TYPE_SIZE |
247cfc5c JJ |
67 | #define WCHAR_TYPE_SIZE 32 |
68 | ||
ba31d94e | 69 | /* Define for support of TFmode long double. |
56149abc | 70 | SPARC ABI says that long double is 4 words. */ |
a0a301fc | 71 | #undef LONG_DOUBLE_TYPE_SIZE |
4710d3eb JJ |
72 | #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) |
73 | ||
4710d3eb JJ |
74 | /* Define this to set long double type size to use in libgcc2.c, which can |
75 | not depend on target_flags. */ | |
76 | #if defined(__arch64__) || defined(__LONG_DOUBLE_128__) | |
77 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 | |
78 | #else | |
79 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 | |
80 | #endif | |
345a6161 | 81 | |
a0a301fc DE |
82 | #undef CPP_SUBTARGET_SPEC |
83 | #define CPP_SUBTARGET_SPEC "\ | |
bfe87013 | 84 | %{posix:-D_POSIX_SOURCE} \ |
afc96791 | 85 | %{pthread:-D_REENTRANT} \ |
bfe87013 | 86 | " |
afc96791 | 87 | |
956d6950 | 88 | /* Provide a LINK_SPEC appropriate for GNU/Linux. Here we provide support |
bfe87013 DE |
89 | for the special GCC options -static and -shared, which allow us to |
90 | link things in one of these three modes by applying the appropriate | |
83c2a9ef | 91 | combinations of options at link-time. |
bfe87013 DE |
92 | |
93 | When the -shared link option is used a final link is not being | |
94 | done. */ | |
95 | ||
7bd85ce0 JM |
96 | #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2" |
97 | #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux.so.2" | |
7bd85ce0 | 98 | |
345a6161 DM |
99 | #ifdef SPARC_BI_ARCH |
100 | ||
101 | #undef SUBTARGET_EXTRA_SPECS | |
102 | #define SUBTARGET_EXTRA_SPECS \ | |
103 | { "link_arch32", LINK_ARCH32_SPEC }, \ | |
104 | { "link_arch64", LINK_ARCH64_SPEC }, \ | |
105 | { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ | |
106 | { "link_arch", LINK_ARCH_SPEC }, | |
7bd85ce0 | 107 | |
c71cfaaf | 108 | #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,%R/usr/lib %{shared:-shared} \ |
345a6161 | 109 | %{!shared: \ |
dabadc52 JM |
110 | %{!static: \ |
111 | %{rdynamic:-export-dynamic} \ | |
107fd1c1 | 112 | -dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \ |
dabadc52 | 113 | %{static:-static}} \ |
345a6161 DM |
114 | " |
115 | ||
c71cfaaf | 116 | #define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \ |
345a6161 | 117 | %{!shared: \ |
dabadc52 JM |
118 | %{!static: \ |
119 | %{rdynamic:-export-dynamic} \ | |
107fd1c1 | 120 | -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ |
dabadc52 | 121 | %{static:-static}} \ |
345a6161 DM |
122 | " |
123 | ||
124 | #define LINK_ARCH_SPEC "\ | |
125 | %{m32:%(link_arch32)} \ | |
126 | %{m64:%(link_arch64)} \ | |
127 | %{!m32:%{!m64:%(link_arch_default)}} \ | |
128 | " | |
129 | ||
130 | #define LINK_ARCH_DEFAULT_SPEC \ | |
131 | (DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) | |
132 | ||
bfe87013 | 133 | #undef LINK_SPEC |
345a6161 DM |
134 | #define LINK_SPEC "\ |
135 | %(link_arch) \ | |
136 | %{mlittle-endian:-EL} \ | |
e95b1e6a | 137 | %{!mno-relax:%{!r:-relax}} \ |
345a6161 DM |
138 | " |
139 | ||
0913b2d6 DM |
140 | /* -mcpu=native handling only makes sense with compiler running on |
141 | a SPARC chip. */ | |
a0bd60d1 | 142 | #if defined(__sparc__) && defined(__linux__) |
0913b2d6 DM |
143 | extern const char *host_detect_local_cpu (int argc, const char **argv); |
144 | # define EXTRA_SPEC_FUNCTIONS \ | |
145 | { "local_cpu_detect", host_detect_local_cpu }, | |
146 | ||
147 | # define MCPU_MTUNE_NATIVE_SPECS \ | |
148 | " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}" \ | |
149 | " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}" | |
150 | #else | |
151 | # define MCPU_MTUNE_NATIVE_SPECS "" | |
152 | #endif | |
153 | ||
154 | #define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS | |
155 | ||
345a6161 DM |
156 | #undef CC1_SPEC |
157 | #if DEFAULT_ARCH32_P | |
5f7ca34b | 158 | #define CC1_SPEC "%{profile:-p} \ |
d6964c30 | 159 | %{m32:%{m64:%emay not use both -m32 and -m64}} \ |
4710d3eb | 160 | %{m64:-mptr64 -mstack-bias -mlong-double-128 \ |
3a7b4385 | 161 | %{!mcpu*:-mcpu=ultrasparc} \ |
247cfc5c | 162 | %{!mno-vis:%{!mcpu=v9:-mvis}}} \ |
345a6161 DM |
163 | " |
164 | #else | |
5f7ca34b | 165 | #define CC1_SPEC "%{profile:-p} \ |
d6964c30 | 166 | %{m32:%{m64:%emay not use both -m32 and -m64}} \ |
4710d3eb | 167 | %{m32:-mptr32 -mno-stack-bias %{!mlong-double-128:-mlong-double-64} \ |
3a7b4385 | 168 | %{!mcpu*:-mcpu=cypress}} \ |
9ce13279 | 169 | %{!m32:%{!mcpu*:-mcpu=ultrasparc}} \ |
247cfc5c | 170 | %{!mno-vis:%{!m32:%{!mcpu=v9:-mvis}}} \ |
345a6161 DM |
171 | " |
172 | #endif | |
173 | ||
942e0f44 JJ |
174 | /* Support for a compile-time default CPU, et cetera. The rules are: |
175 | --with-cpu is ignored if -mcpu is specified. | |
176 | --with-tune is ignored if -mtune is specified. | |
177 | --with-float is ignored if -mhard-float, -msoft-float, -mfpu, or -mno-fpu | |
178 | are specified. | |
179 | In the SPARC_BI_ARCH compiler we cannot pass %{!mcpu=*:-mcpu=%(VALUE)} | |
180 | here, otherwise say -mcpu=v7 would be passed even when -m64. | |
181 | CC1_SPEC above takes care of this instead. */ | |
182 | #undef OPTION_DEFAULT_SPECS | |
183 | #if DEFAULT_ARCH32_P | |
184 | #define OPTION_DEFAULT_SPECS \ | |
185 | {"cpu", "%{!m64:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \ | |
186 | {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \ | |
c6869789 | 187 | {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" } |
942e0f44 JJ |
188 | #else |
189 | #define OPTION_DEFAULT_SPECS \ | |
190 | {"cpu", "%{!m32:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \ | |
191 | {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \ | |
c6869789 | 192 | {"float", "%{!msoft-float:%{!mhard-float:%{!mfpu:%{!mno-fpu:-m%(VALUE)-float}}}}" } |
942e0f44 JJ |
193 | #endif |
194 | ||
345a6161 DM |
195 | #if DEFAULT_ARCH32_P |
196 | #define MULTILIB_DEFAULTS { "m32" } | |
197 | #else | |
198 | #define MULTILIB_DEFAULTS { "m64" } | |
199 | #endif | |
200 | ||
201 | #else /* !SPARC_BI_ARCH */ | |
202 | ||
203 | #undef LINK_SPEC | |
c71cfaaf | 204 | #define LINK_SPEC "-m elf64_sparc -Y P,%R/usr/lib64 %{shared:-shared} \ |
bfe87013 | 205 | %{!shared: \ |
dabadc52 JM |
206 | %{!static: \ |
207 | %{rdynamic:-export-dynamic} \ | |
107fd1c1 | 208 | -dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ |
dabadc52 | 209 | %{static:-static}} \ |
bfe87013 | 210 | %{mlittle-endian:-EL} \ |
e95b1e6a | 211 | %{!mno-relax:%{!r:-relax}} \ |
bfe87013 DE |
212 | " |
213 | ||
345a6161 DM |
214 | #endif /* !SPARC_BI_ARCH */ |
215 | ||
12eb1a9c | 216 | /* It's safe to pass -s always, even if -g is not used. */ |
bfe87013 DE |
217 | #undef ASM_SPEC |
218 | #define ASM_SPEC "\ | |
1141be7e | 219 | -s \ |
40ea67af EB |
220 | %{fpic|fPIC|fpie|fPIE:-K PIC} \ |
221 | %{!.c:%{findirect-dispatch:-K PIC}} \ | |
bfe87013 | 222 | %{mlittle-endian:-EL} \ |
e95b1e6a | 223 | %(asm_cpu) %(asm_arch) %(asm_relax)" |
bfe87013 | 224 | |
bfe87013 DE |
225 | #undef ASM_OUTPUT_ALIGNED_LOCAL |
226 | #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ | |
227 | do { \ | |
228 | fputs ("\t.local\t", (FILE)); \ | |
229 | assemble_name ((FILE), (NAME)); \ | |
230 | putc ('\n', (FILE)); \ | |
231 | ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ | |
232 | } while (0) | |
233 | ||
234 | #undef COMMON_ASM_OP | |
471b6f1b | 235 | #define COMMON_ASM_OP "\t.common\t" |
bfe87013 | 236 | |
59f96879 RH |
237 | #undef LOCAL_LABEL_PREFIX |
238 | #define LOCAL_LABEL_PREFIX "." | |
239 | ||
bfe87013 DE |
240 | /* This is how to store into the string LABEL |
241 | the symbol_ref name of an internal numbered label where | |
242 | PREFIX is the class of label and NUM is the number within the class. | |
243 | This is suitable for output with `assemble_name'. */ | |
244 | ||
245 | #undef ASM_GENERATE_INTERNAL_LABEL | |
246 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ | |
e59f7d3d | 247 | sprintf (LABEL, "*.L%s%ld", PREFIX, (long)(NUM)) |
bfe87013 | 248 | |
bfe87013 DE |
249 | /* DWARF bits. */ |
250 | ||
251 | /* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. | |
d6a7951f | 252 | Obviously the Dwarf2 folks haven't tried to actually build systems |
bfe87013 DE |
253 | with their spec. On a 64-bit system, only 64-bit relocs become |
254 | RELATIVE relocations. */ | |
255 | ||
256 | /* #define DWARF_OFFSET_SIZE PTR_SIZE */ | |
275b60d6 | 257 | |
45dcc026 JJ |
258 | #undef DITF_CONVERSION_LIBFUNCS |
259 | #define DITF_CONVERSION_LIBFUNCS 1 | |
f7e0e539 | 260 | \f |
5751a10b JJ |
261 | #ifdef HAVE_AS_TLS |
262 | #undef TARGET_SUN_TLS | |
263 | #undef TARGET_GNU_TLS | |
264 | #define TARGET_SUN_TLS 0 | |
265 | #define TARGET_GNU_TLS 1 | |
266 | #endif | |
267 | \f | |
7a31a340 DM |
268 | /* We use GNU ld so undefine this so that attribute((init_priority)) works. */ |
269 | #undef CTORS_SECTION_ASM_OP | |
270 | #undef DTORS_SECTION_ASM_OP | |
db430d26 | 271 | |
260c8ba3 EB |
272 | /* Static stack checking is supported by means of probes. */ |
273 | #define STACK_CHECK_STATIC_BUILTIN 1 | |
274 | ||
548a6c4f EB |
275 | /* Linux currently uses RMO in uniprocessor mode, which is equivalent to |
276 | TMO, and TMO in multiprocessor mode. But they reserve the right to | |
277 | change their minds. */ | |
278 | #undef SPARC_RELAXED_ORDERING | |
279 | #define SPARC_RELAXED_ORDERING true | |
5e77eb53 EB |
280 | |
281 | #undef NEED_INDICATE_EXEC_STACK | |
282 | #define NEED_INDICATE_EXEC_STACK 1 | |
8ec11fe9 JJ |
283 | |
284 | #ifdef TARGET_LIBC_PROVIDES_SSP | |
285 | /* sparc glibc provides __stack_chk_guard in [%g7 + 0x14], | |
286 | sparc64 glibc provides it at [%g7 + 0x28]. */ | |
287 | #define TARGET_THREAD_SSP_OFFSET (TARGET_ARCH64 ? 0x28 : 0x14) | |
288 | #endif | |
7269aee7 AH |
289 | |
290 | /* Define if long doubles should be mangled as 'g'. */ | |
291 | #define TARGET_ALTERNATE_LONG_DOUBLE_MANGLING | |
cc44abe6 DM |
292 | |
293 | /* We use glibc _mcount for profiling. */ | |
b61eacd6 | 294 | #undef NO_PROFILE_COUNTERS |
cc44abe6 | 295 | #define NO_PROFILE_COUNTERS 1 |