]>
Commit | Line | Data |
---|---|---|
956d6950 | 1 | /* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF. |
047142d3 | 2 | Copyright 1996, 1997, 1998, 2000 Free Software Foundation, Inc. |
bfe87013 DE |
3 | Contributed by David S. Miller (davem@caip.rutgers.edu) |
4 | ||
5 | This file is part of GNU CC. | |
6 | ||
7 | GNU CC is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GNU CC is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GNU CC; see the file COPYING. If not, write to | |
19 | the Free Software Foundation, 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, USA. */ | |
21 | ||
345a6161 | 22 | #define SPARC_BI_ARCH |
bfe87013 | 23 | |
a0a301fc | 24 | #define LINUX_DEFAULT_ELF |
bfe87013 DE |
25 | |
26 | /* Don't assume anything about the header files. */ | |
27 | #define NO_IMPLICIT_EXTERN_C | |
28 | ||
bfe87013 DE |
29 | #include <sparc/sysv4.h> |
30 | ||
31 | #undef MD_EXEC_PREFIX | |
32 | #undef MD_STARTFILE_PREFIX | |
33 | ||
345a6161 DM |
34 | #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc |
35 | /* A 64 bit v9 compiler with stack-bias, | |
36 | in a Medium/Low code model environment. */ | |
37 | ||
38 | #undef TARGET_DEFAULT | |
39 | #define TARGET_DEFAULT \ | |
40 | (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ | |
4710d3eb | 41 | + MASK_STACK_BIAS + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU + MASK_LONG_DOUBLE_128) |
345a6161 DM |
42 | #endif |
43 | ||
a0a301fc DE |
44 | #undef ASM_CPU_DEFAULT_SPEC |
45 | #define ASM_CPU_DEFAULT_SPEC "-Av9a" | |
bfe87013 | 46 | |
4710d3eb JJ |
47 | #ifdef SPARC_BI_ARCH |
48 | ||
49 | #undef CPP_ARCH32_SPEC | |
50 | #define CPP_ARCH32_SPEC "%{mlong-double-128:-D__LONG_DOUBLE_128__} \ | |
51 | -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int \ | |
2b57e919 | 52 | -D__GCC_NEW_VARARGS__ -Acpu=sparc -Amachine=sparc" |
4710d3eb JJ |
53 | |
54 | #endif | |
55 | ||
956d6950 JL |
56 | /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add |
57 | the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | |
bfe87013 DE |
58 | provides part of the support for getting C++ file-scope static |
59 | object constructed before entering `main'. */ | |
60 | ||
61 | #undef STARTFILE_SPEC | |
345a6161 DM |
62 | |
63 | #define STARTFILE_SPEC32 \ | |
bfe87013 DE |
64 | "%{!shared: \ |
65 | %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}\ | |
66 | crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" | |
67 | ||
345a6161 DM |
68 | #define STARTFILE_SPEC64 \ |
69 | "%{!shared: \ | |
70 | %{pg:/usr/lib64/gcrt1.o%s} %{!pg:%{p:/usr/lib64/gcrt1.o%s} %{!p:/usr/lib64/crt1.o%s}}}\ | |
71 | /usr/lib64/crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" | |
72 | ||
73 | #ifdef SPARC_BI_ARCH | |
74 | ||
75 | #if DEFAULT_ARCH32_P | |
76 | #define STARTFILE_SPEC "\ | |
77 | %{m32:" STARTFILE_SPEC32 "} \ | |
78 | %{m64:" STARTFILE_SPEC64 "} \ | |
79 | %{!m32:%{!m64:" STARTFILE_SPEC32 "}}" | |
80 | #else | |
81 | #define STARTFILE_SPEC "\ | |
82 | %{m32:" STARTFILE_SPEC32 "} \ | |
83 | %{m64:" STARTFILE_SPEC64 "} \ | |
84 | %{!m32:%{!m64:" STARTFILE_SPEC64 "}}" | |
85 | #endif | |
86 | ||
87 | #else | |
88 | ||
89 | #define STARTFILE_SPEC STARTFILE_SPEC64 | |
90 | ||
91 | #endif | |
92 | ||
956d6950 JL |
93 | /* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on |
94 | the GNU/Linux magical crtend.o file (see crtstuff.c) which | |
bfe87013 DE |
95 | provides part of the support for getting C++ file-scope static |
96 | object constructed before entering `main', followed by a normal | |
956d6950 | 97 | GNU/Linux "finalizer" file, `crtn.o'. */ |
bfe87013 DE |
98 | |
99 | #undef ENDFILE_SPEC | |
345a6161 DM |
100 | |
101 | #define ENDFILE_SPEC32 \ | |
bfe87013 DE |
102 | "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" |
103 | ||
345a6161 DM |
104 | #define ENDFILE_SPEC64 \ |
105 | "%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s" | |
106 | ||
107 | #ifdef SPARC_BI_ARCH | |
bfe87013 | 108 | |
345a6161 DM |
109 | #if DEFAULT_ARCH32_P |
110 | #define ENDFILE_SPEC "\ | |
111 | %{m32:" ENDFILE_SPEC32 "} \ | |
112 | %{m64:" ENDFILE_SPEC64 "} \ | |
113 | %{!m32:%{!m64:" ENDFILE_SPEC32 "}}" | |
114 | #else | |
115 | #define ENDFILE_SPEC "\ | |
116 | %{m32:" ENDFILE_SPEC32 "} \ | |
117 | %{m64:" ENDFILE_SPEC64 "} \ | |
118 | %{!m32:%{!m64:" ENDFILE_SPEC64 "}}" | |
119 | #endif | |
bfe87013 | 120 | |
345a6161 DM |
121 | #else |
122 | ||
123 | #define ENDFILE_SPEC ENDFILE_SPEC64 | |
124 | ||
125 | #endif | |
126 | ||
127 | #undef TARGET_VERSION | |
128 | #define TARGET_VERSION fprintf (stderr, " (sparc64 GNU/Linux with ELF)"); | |
a0a301fc DE |
129 | |
130 | /* The default code model. */ | |
131 | #undef SPARC_DEFAULT_CMODEL | |
be3f1ff5 | 132 | #define SPARC_DEFAULT_CMODEL CM_MEDLOW |
bfe87013 | 133 | |
4710d3eb | 134 | #undef SUBTARGET_SWITCHES |
047142d3 PT |
135 | #define SUBTARGET_SWITCHES \ |
136 | {"long-double-64", -MASK_LONG_DOUBLE_128, N_("Use 64 bit long doubles") }, \ | |
137 | {"long-double-128", MASK_LONG_DOUBLE_128, N_("Use 128 bit long doubles") }, | |
4710d3eb | 138 | |
bfe87013 | 139 | #undef WCHAR_TYPE |
247cfc5c JJ |
140 | #define WCHAR_TYPE "int" |
141 | ||
bfe87013 | 142 | #undef WCHAR_TYPE_SIZE |
247cfc5c JJ |
143 | #define WCHAR_TYPE_SIZE 32 |
144 | ||
145 | #undef MAX_WCHAR_TYPE_SIZE | |
a0a301fc | 146 | |
4710d3eb JJ |
147 | /* Define for support of TFmode long double and REAL_ARITHMETIC. |
148 | Sparc ABI says that long double is 4 words. */ | |
a0a301fc | 149 | #undef LONG_DOUBLE_TYPE_SIZE |
4710d3eb JJ |
150 | #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) |
151 | ||
152 | /* Constant which presents upper bound of the above value. */ | |
153 | #undef MAX_LONG_DOUBLE_TYPE_SIZE | |
154 | #define MAX_LONG_DOUBLE_TYPE_SIZE 128 | |
155 | ||
156 | /* Define this to set long double type size to use in libgcc2.c, which can | |
157 | not depend on target_flags. */ | |
158 | #if defined(__arch64__) || defined(__LONG_DOUBLE_128__) | |
159 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 | |
160 | #else | |
161 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 | |
162 | #endif | |
345a6161 | 163 | |
bfe87013 | 164 | #undef CPP_PREDEFINES |
2b57e919 | 165 | #define CPP_PREDEFINES "-D__ELF__ -Dunix -D_LONGLONG -D__sparc__ -Dlinux -Asystem=unix -Asystem=posix" |
bfe87013 | 166 | |
a0a301fc DE |
167 | #undef CPP_SUBTARGET_SPEC |
168 | #define CPP_SUBTARGET_SPEC "\ | |
bfe87013 DE |
169 | %{fPIC:-D__PIC__ -D__pic__} \ |
170 | %{fpic:-D__PIC__ -D__pic__} \ | |
bfe87013 | 171 | %{posix:-D_POSIX_SOURCE} \ |
afc96791 | 172 | %{pthread:-D_REENTRANT} \ |
bfe87013 | 173 | " |
afc96791 | 174 | |
bfe87013 DE |
175 | #undef LIB_SPEC |
176 | #define LIB_SPEC \ | |
1398405b L |
177 | "%{shared: -lc} \ |
178 | %{!shared: %{mieee-fp:-lieee} %{pthread:-lpthread} \ | |
afc96791 | 179 | %{profile:-lc_p} %{!profile: -lc}}" |
bfe87013 | 180 | |
956d6950 | 181 | /* Provide a LINK_SPEC appropriate for GNU/Linux. Here we provide support |
bfe87013 DE |
182 | for the special GCC options -static and -shared, which allow us to |
183 | link things in one of these three modes by applying the appropriate | |
184 | combinations of options at link-time. We like to support here for | |
185 | as many of the other GNU linker options as possible. But I don't | |
186 | have the time to search for those flags. I am sure how to add | |
187 | support for -soname shared_object_name. H.J. | |
188 | ||
189 | I took out %{v:%{!V:-V}}. It is too much :-(. They can use | |
190 | -Wl,-V. | |
191 | ||
192 | When the -shared link option is used a final link is not being | |
193 | done. */ | |
194 | ||
195 | /* If ELF is the default format, we should not use /lib/elf. */ | |
196 | ||
345a6161 DM |
197 | #ifdef SPARC_BI_ARCH |
198 | ||
199 | #undef SUBTARGET_EXTRA_SPECS | |
200 | #define SUBTARGET_EXTRA_SPECS \ | |
201 | { "link_arch32", LINK_ARCH32_SPEC }, \ | |
202 | { "link_arch64", LINK_ARCH64_SPEC }, \ | |
203 | { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ | |
204 | { "link_arch", LINK_ARCH_SPEC }, | |
205 | ||
206 | #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ | |
207 | %{!shared: \ | |
208 | %{!ibcs: \ | |
209 | %{!static: \ | |
210 | %{rdynamic:-export-dynamic} \ | |
211 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | |
212 | %{static:-static}}} \ | |
213 | " | |
214 | ||
215 | #define LINK_ARCH64_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ | |
216 | %{!shared: \ | |
217 | %{!ibcs: \ | |
218 | %{!static: \ | |
219 | %{rdynamic:-export-dynamic} \ | |
220 | %{!dynamic-linker:-dynamic-linker /lib64/ld-linux.so.2}} \ | |
221 | %{static:-static}}} \ | |
222 | " | |
223 | ||
224 | #define LINK_ARCH_SPEC "\ | |
225 | %{m32:%(link_arch32)} \ | |
226 | %{m64:%(link_arch64)} \ | |
227 | %{!m32:%{!m64:%(link_arch_default)}} \ | |
228 | " | |
229 | ||
230 | #define LINK_ARCH_DEFAULT_SPEC \ | |
231 | (DEFAULT_ARCH32_P ? LINK_ARCH32_SPEC : LINK_ARCH64_SPEC) | |
232 | ||
bfe87013 | 233 | #undef LINK_SPEC |
345a6161 DM |
234 | #define LINK_SPEC "\ |
235 | %(link_arch) \ | |
236 | %{mlittle-endian:-EL} \ | |
e95b1e6a | 237 | %{!mno-relax:%{!r:-relax}} \ |
345a6161 DM |
238 | " |
239 | ||
240 | #undef CC1_SPEC | |
241 | #if DEFAULT_ARCH32_P | |
242 | #define CC1_SPEC "\ | |
243 | %{sun4:} %{target:} \ | |
244 | %{mcypress:-mcpu=cypress} \ | |
245 | %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ | |
246 | %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ | |
4710d3eb | 247 | %{m64:-mptr64 -mstack-bias -mlong-double-128 \ |
247cfc5c JJ |
248 | %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=ultrasparc}}}}}}} \ |
249 | %{!mno-vis:%{!mcpu=v9:-mvis}}} \ | |
31cedf89 | 250 | %{!m64:%{g*:%{!gs*:%{!gd*:%{!gx*:%{!gc*:-gstabs+}}}}}} \ |
345a6161 DM |
251 | " |
252 | #else | |
253 | #define CC1_SPEC "\ | |
254 | %{sun4:} %{target:} \ | |
255 | %{mcypress:-mcpu=cypress} \ | |
256 | %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ | |
257 | %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ | |
4710d3eb | 258 | %{m32:-mptr32 -mno-stack-bias %{!mlong-double-128:-mlong-double-64} \ |
31cedf89 JJ |
259 | %{!mcpu*:%{!mcypress:%{!msparclite:%{!mf930:%{!mf934:%{!mv8:%{!msupersparc:-mcpu=cypress}}}}}}} \ |
260 | %{g*:%{!gs*:%{!gd*:%{!gx*:%{!gc*:-gstabs+}}}}}} \ | |
9ce13279 | 261 | %{!m32:%{!mcpu*:-mcpu=ultrasparc}} \ |
247cfc5c | 262 | %{!mno-vis:%{!m32:%{!mcpu=v9:-mvis}}} \ |
345a6161 DM |
263 | " |
264 | #endif | |
265 | ||
266 | #if DEFAULT_ARCH32_P | |
267 | #define MULTILIB_DEFAULTS { "m32" } | |
268 | #else | |
269 | #define MULTILIB_DEFAULTS { "m64" } | |
270 | #endif | |
271 | ||
272 | #else /* !SPARC_BI_ARCH */ | |
273 | ||
274 | #undef LINK_SPEC | |
e95b1e6a | 275 | #define LINK_SPEC "-m elf64_sparc -Y P,/usr/lib64 %{shared:-shared} \ |
bfe87013 DE |
276 | %{!shared: \ |
277 | %{!ibcs: \ | |
278 | %{!static: \ | |
279 | %{rdynamic:-export-dynamic} \ | |
345a6161 | 280 | %{!dynamic-linker:-dynamic-linker /lib64/ld-linux.so.2}} \ |
bfe87013 DE |
281 | %{static:-static}}} \ |
282 | %{mlittle-endian:-EL} \ | |
e95b1e6a | 283 | %{!mno-relax:%{!r:-relax}} \ |
bfe87013 DE |
284 | " |
285 | ||
345a6161 DM |
286 | #endif /* !SPARC_BI_ARCH */ |
287 | ||
bfe87013 DE |
288 | /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). |
289 | It's safe to pass -s always, even if -g is not used. */ | |
290 | #undef ASM_SPEC | |
291 | #define ASM_SPEC "\ | |
292 | %{V} \ | |
293 | %{v:%{!V:-V}} \ | |
294 | %{!Qn:-Qy} \ | |
295 | %{n} \ | |
296 | %{T} \ | |
297 | %{Ym,*} \ | |
298 | %{Wa,*:%*} \ | |
299 | -s %{fpic:-K PIC} %{fPIC:-K PIC} \ | |
300 | %{mlittle-endian:-EL} \ | |
e95b1e6a | 301 | %(asm_cpu) %(asm_arch) %(asm_relax)" |
bfe87013 DE |
302 | |
303 | /* Same as sparc.h */ | |
304 | #undef DBX_REGISTER_NUMBER | |
305 | #define DBX_REGISTER_NUMBER(REGNO) (REGNO) | |
306 | ||
307 | /* System V Release 4 uses DWARF debugging info. Buf DWARF1 doesn't do | |
308 | 64-bit anything, so we use DWARF2. */ | |
309 | ||
310 | #undef DWARF2_DEBUGGING_INFO | |
311 | #undef DWARF_DEBUGGING_INFO | |
312 | #undef DBX_DEBUGGING_INFO | |
313 | #define DWARF2_DEBUGGING_INFO | |
314 | #define DBX_DEBUGGING_INFO | |
315 | ||
316 | #undef PREFERRED_DEBUGGING_TYPE | |
317 | #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG | |
318 | ||
319 | #undef ASM_OUTPUT_ALIGNED_LOCAL | |
320 | #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ | |
321 | do { \ | |
322 | fputs ("\t.local\t", (FILE)); \ | |
323 | assemble_name ((FILE), (NAME)); \ | |
324 | putc ('\n', (FILE)); \ | |
325 | ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN); \ | |
326 | } while (0) | |
327 | ||
328 | #undef COMMON_ASM_OP | |
471b6f1b | 329 | #define COMMON_ASM_OP "\t.common\t" |
bfe87013 DE |
330 | |
331 | /* This is how to output a definition of an internal numbered label where | |
332 | PREFIX is the class of label and NUM is the number within the class. */ | |
333 | ||
334 | #undef ASM_OUTPUT_INTERNAL_LABEL | |
335 | #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ | |
336 | fprintf (FILE, ".L%s%d:\n", PREFIX, NUM) | |
337 | ||
338 | /* This is how to output a reference to an internal numbered label where | |
339 | PREFIX is the class of label and NUM is the number within the class. */ | |
340 | ||
341 | #undef ASM_OUTPUT_INTERNAL_LABELREF | |
342 | #define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \ | |
343 | fprintf (FILE, ".L%s%d", PREFIX, NUM) | |
344 | ||
345 | /* This is how to store into the string LABEL | |
346 | the symbol_ref name of an internal numbered label where | |
347 | PREFIX is the class of label and NUM is the number within the class. | |
348 | This is suitable for output with `assemble_name'. */ | |
349 | ||
350 | #undef ASM_GENERATE_INTERNAL_LABEL | |
351 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ | |
352 | sprintf (LABEL, "*.L%s%d", PREFIX, NUM) | |
353 | ||
bfe87013 DE |
354 | /* Define the names of various pseudo-ops used by the Sparc/svr4 assembler. |
355 | ??? If ints are 64 bits then UNALIGNED_INT_ASM_OP (defined elsewhere) is | |
356 | misnamed. These should all refer to explicit sizes (half/word/xword?), | |
357 | anything other than short/int/long/etc. */ | |
358 | ||
471b6f1b | 359 | #define UNALIGNED_DOUBLE_INT_ASM_OP "\t.uaxword\t" |
bfe87013 DE |
360 | |
361 | /* DWARF bits. */ | |
362 | ||
363 | /* Follow Irix 6 and not the Dwarf2 draft in using 64-bit offsets. | |
364 | Obviously the Dwarf2 folks havn't tried to actually build systems | |
365 | with their spec. On a 64-bit system, only 64-bit relocs become | |
366 | RELATIVE relocations. */ | |
367 | ||
368 | /* #define DWARF_OFFSET_SIZE PTR_SIZE */ | |
f7e0e539 | 369 | \f |
a330e73b | 370 | #if TARGET_ARCH32 |
f7e0e539 DM |
371 | /* Override MACHINE_STATE_{SAVE,RESTORE} because we have special |
372 | traps available which can get and set the condition codes | |
373 | reliably. */ | |
374 | #undef MACHINE_STATE_SAVE | |
375 | #define MACHINE_STATE_SAVE(ID) \ | |
376 | unsigned long int ms_flags, ms_saveret; \ | |
377 | asm volatile("ta 0x20\n\t" \ | |
378 | "mov %%g1, %0\n\t" \ | |
379 | "mov %%g2, %1\n\t" \ | |
380 | : "=r" (ms_flags), "=r" (ms_saveret)); | |
381 | ||
382 | #undef MACHINE_STATE_RESTORE | |
383 | #define MACHINE_STATE_RESTORE(ID) \ | |
384 | asm volatile("mov %0, %%g1\n\t" \ | |
385 | "mov %1, %%g2\n\t" \ | |
386 | "ta 0x21\n\t" \ | |
387 | : /* no outputs */ \ | |
388 | : "r" (ms_flags), "r" (ms_saveret)); | |
a330e73b | 389 | #endif /* sparc32 */ |