]>
Commit | Line | Data |
---|---|---|
4cb7482c MG |
1 | /* Definitions of target machine for GNU compiler, for ELF on NetBSD/sparc |
2 | and NetBSD/sparc64. | |
3 | Copyright (C) 2002 Free Software Foundation, Inc. | |
4 | Contributed by Matthew Green (mrg@eterna.com.au). | |
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, 59 Temple Place - Suite 330, | |
21 | Boston, MA 02111-1307, USA. */ | |
22 | ||
23 | /* Make sure these are undefined. */ | |
24 | #undef MD_EXEC_PREFIX | |
25 | #undef MD_STARTFILE_PREFIX | |
26 | ||
27 | #undef CPP_PREDEFINES | |
28 | #define CPP_PREDEFINES "-D__sparc__ -D__NetBSD__ -D__ELF__ \ | |
29 | -Asystem=unix -Asystem=NetBSD" | |
30 | ||
31 | /* CPP defines used for 64 bit code. */ | |
32 | #undef CPP_SUBTARGET_SPEC64 | |
33 | #define CPP_SUBTARGET_SPEC64 \ | |
34 | "-D__sparc64__ -D__arch64__ -D__sparc_v9__ %{posix:-D_POSIX_SOURCE}" | |
35 | ||
36 | /* CPP defines used for 32 bit code. */ | |
37 | #undef CPP_SUBTARGET_SPEC32 | |
38 | #define CPP_SUBTARGET_SPEC32 "-D__sparc %{posix:-D_POSIX_SOURCE}" | |
39 | ||
40 | /* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h. */ | |
41 | #undef SIZE_TYPE | |
42 | #define SIZE_TYPE "long unsigned int" | |
43 | ||
44 | #undef PTRDIFF_TYPE | |
45 | #define PTRDIFF_TYPE "long int" | |
46 | ||
47 | #undef PREFERRED_DEBUGGING_TYPE | |
48 | #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG | |
49 | ||
50 | /* This is the char to use for continuation (in case we need to turn | |
51 | continuation back on). */ | |
52 | #undef DBX_CONTIN_CHAR | |
53 | #define DBX_CONTIN_CHAR '?' | |
54 | ||
55 | #undef DBX_REGISTER_NUMBER | |
56 | #define DBX_REGISTER_NUMBER(REGNO) \ | |
57 | (TARGET_FLAT && REGNO == HARD_FRAME_POINTER_REGNUM ? 31 : REGNO) | |
58 | ||
59f96879 RH |
59 | #undef LOCAL_LABEL_PREFIX |
60 | #define LOCAL_LABEL_PREFIX "." | |
61 | ||
4cb7482c MG |
62 | /* This is how to output a definition of an internal numbered label where |
63 | PREFIX is the class of label and NUM is the number within the class. */ | |
64 | ||
65 | #undef ASM_OUTPUT_INTERNAL_LABEL | |
66 | #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ | |
67 | fprintf (FILE, ".L%s%d:\n", PREFIX, NUM) | |
68 | ||
69 | /* This is how to output a reference to an internal numbered label where | |
70 | PREFIX is the class of label and NUM is the number within the class. */ | |
71 | ||
72 | #undef ASM_OUTPUT_INTERNAL_LABELREF | |
73 | #define ASM_OUTPUT_INTERNAL_LABELREF(FILE,PREFIX,NUM) \ | |
74 | fprintf (FILE, ".L%s%d", PREFIX, NUM) | |
75 | ||
76 | /* This is how to store into the string LABEL | |
77 | the symbol_ref name of an internal numbered label where | |
78 | PREFIX is the class of label and NUM is the number within the class. | |
79 | This is suitable for output with `assemble_name'. */ | |
80 | ||
81 | #undef ASM_GENERATE_INTERNAL_LABEL | |
82 | #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ | |
83 | sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM)) | |
84 | ||
85 | #undef USER_LABEL_PREFIX | |
86 | #define USER_LABEL_PREFIX "" | |
87 | ||
88 | #undef ASM_SPEC | |
89 | #define ASM_SPEC "%{fpic:-K PIC} %{fPIC:-K PIC} %{V} %{v:%{!V:-V}} \ | |
90 | %{mlittle-endian:-EL} \ | |
91 | %(asm_cpu) %(asm_arch) %(asm_relax)" | |
92 | ||
93 | #undef STDC_0_IN_SYSTEM_HEADERS | |
94 | ||
95 | #undef TARGET_VERSION | |
96 | #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); | |
97 | ||
98 | /* | |
99 | * Clean up afterwards generic SPARC ELF configuration. | |
100 | */ | |
101 | ||
102 | #undef TRANSFER_FROM_TRAMPOLINE | |
103 | #define TRANSFER_FROM_TRAMPOLINE | |
104 | ||
105 | /* FIXME: Aren't these supposed to be available for SPARC ELF? */ | |
106 | #undef MULDI3_LIBCALL | |
107 | #undef DIVDI3_LIBCALL | |
108 | #undef UDIVDI3_LIBCALL | |
109 | #undef MODDI3_LIBCALL | |
110 | #undef UMODDI3_LIBCALL | |
111 | #undef INIT_SUBTARGET_OPTABS | |
112 | #define INIT_SUBTARGET_OPTABS | |
113 | ||
114 | /* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler | |
115 | description, allowing one to build 32 bit or 64 bit applications | |
116 | on either. We define the sparc & sparc64 versions of things, | |
117 | occasionally a neutral version (should be the same as "netbsd-elf.h") | |
118 | and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT, | |
119 | we choose the correct version. */ | |
120 | ||
121 | /* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC | |
122 | definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does | |
123 | not have a default place to find these libraries.. */ | |
124 | ||
125 | /* Name the port(s). */ | |
126 | #define TARGET_NAME64 "NetBSD/sparc64 ELF" | |
127 | #define TARGET_NAME32 "NetBSD/sparc ELF" | |
128 | ||
129 | /* TARGET_CPU_DEFAULT is set in Makefile.in. We test for 64-bit default | |
130 | platform here. */ | |
131 | ||
132 | #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ | |
133 | || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc | |
134 | /* A 64 bit v9 compiler with stack-bias, | |
135 | in a Medium/Low code model environment. */ | |
136 | ||
137 | #undef TARGET_DEFAULT | |
138 | #define TARGET_DEFAULT \ | |
139 | (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \ | |
140 | + MASK_STACK_BIAS + MASK_APP_REGS + MASK_EPILOGUE + MASK_FPU \ | |
141 | + MASK_LONG_DOUBLE_128) | |
142 | ||
143 | #undef SPARC_DEFAULT_CMODEL | |
144 | #define SPARC_DEFAULT_CMODEL CM_MEDANY | |
145 | ||
146 | #endif | |
147 | ||
148 | /* CC1_SPEC for NetBSD/sparc. */ | |
149 | #define CC1_SPEC32 \ | |
150 | "%{sun4:} %{target:} \ | |
151 | %{mcypress:-mcpu=cypress} \ | |
152 | %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ | |
153 | %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ | |
154 | %{m64: \ | |
155 | -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \ | |
156 | %{!mcpu*: \ | |
157 | %{!mcypress: \ | |
158 | %{!msparclite: \ | |
159 | %{!mf930: \ | |
160 | %{!mf934: \ | |
161 | %{!mv8*: \ | |
162 | %{!msupersparc:-mcpu=ultrasparc}}}}}}} \ | |
163 | %{!mno-vis:%{!mcpu=v9:-mvis}} \ | |
164 | %{p:-mcmodel=medlow} \ | |
165 | %{pg:-mcmodel=medlow}}" | |
166 | ||
167 | #define CC1_SPEC64 \ | |
168 | "%{sun4:} %{target:} \ | |
169 | %{mcypress:-mcpu=cypress} \ | |
170 | %{msparclite:-mcpu=sparclite} %{mf930:-mcpu=f930} %{mf934:-mcpu=f934} \ | |
171 | %{mv8:-mcpu=v8} %{msupersparc:-mcpu=supersparc} \ | |
172 | %{m32: \ | |
173 | -mptr32 -mno-stack-bias \ | |
174 | %{!mlong-double-128:-mlong-double-64} \ | |
175 | %{!mcpu*: \ | |
176 | %{!mcypress: \ | |
177 | %{!msparclite: \ | |
178 | %{!mf930: \ | |
179 | %{!mf934: \ | |
180 | %{!mv8*: \ | |
181 | %{!msupersparc:-mcpu=cypress}}}}}}}} \ | |
182 | %{!m32: \ | |
183 | %{p:-mcmodel=medlow} \ | |
184 | %{pg:-mcmodel=medlow}}" | |
185 | ||
186 | /* Make sure we use the right output format. Pick a default and then | |
187 | make sure -m32/-m64 switch to the right one. */ | |
188 | ||
189 | #define LINK_ARCH32_SPEC \ | |
190 | "%-m elf32_sparc \ | |
191 | %{assert*} %{R*} %{V} %{v:%{!V:-V}} \ | |
192 | %{shared:-shared} \ | |
193 | %{!shared: \ | |
194 | -dp \ | |
195 | %{!nostdlib:%{!r*:%{!e*:-e __start}}} \ | |
196 | %{!static: \ | |
197 | -dy %{rdynamic:-export-dynamic} \ | |
198 | %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \ | |
199 | %{static:-static}}" | |
200 | ||
201 | #define LINK_ARCH64_SPEC \ | |
202 | "%-m elf64_sparc \ | |
203 | %{assert*} %{R*} %{V} %{v:%{!V:-V}} \ | |
204 | %{shared:-shared} \ | |
205 | %{!shared: \ | |
206 | -dp \ | |
207 | %{!nostdlib:%{!r*:%{!e*:-e __start}}} \ | |
208 | %{!static: \ | |
209 | -dy %{rdynamic:-export-dynamic} \ | |
210 | %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}} \ | |
211 | %{static:-static}}" | |
212 | ||
213 | #define LINK_ARCH_SPEC "\ | |
214 | %{m32:%(link_arch32)} \ | |
215 | %{m64:%(link_arch64)} \ | |
216 | %{!m32:%{!m64:%(link_arch_default)}} \ | |
217 | " | |
218 | ||
219 | #if DEFAULT_ARCH32_P | |
220 | #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC | |
221 | #else | |
222 | #define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC | |
223 | #endif | |
224 | ||
225 | /* What extra spec entries do we need? */ | |
226 | #undef SUBTARGET_EXTRA_SPECS | |
227 | #define SUBTARGET_EXTRA_SPECS \ | |
228 | { "link_arch32", LINK_ARCH32_SPEC }, \ | |
229 | { "link_arch64", LINK_ARCH64_SPEC }, \ | |
230 | { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ | |
231 | { "link_arch", LINK_ARCH_SPEC }, \ | |
232 | { "cpp_subtarget_spec32", CPP_SUBTARGET_SPEC32 }, \ | |
233 | { "cpp_subtarget_spec64", CPP_SUBTARGET_SPEC64 }, | |
234 | ||
235 | ||
236 | /* What extra switches do we need? */ | |
237 | #undef SUBTARGET_SWITCHES | |
238 | #define SUBTARGET_SWITCHES \ | |
239 | {"long-double-64", -MASK_LONG_DOUBLE_128, N_("Use 64 bit long doubles") }, \ | |
240 | {"long-double-128", MASK_LONG_DOUBLE_128, N_("Use 128 bit long doubles") }, | |
241 | ||
242 | ||
243 | /* Build a compiler that supports -m32 and -m64? */ | |
244 | ||
245 | #ifdef SPARC_BI_ARCH | |
246 | ||
247 | #undef LONG_DOUBLE_TYPE_SIZE | |
248 | #define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64) | |
249 | ||
250 | #undef MAX_LONG_DOUBLE_TYPE_SIZE | |
251 | #define MAX_LONG_DOUBLE_TYPE_SIZE 128 | |
252 | ||
253 | #if defined(__arch64__) || defined(__LONG_DOUBLE_128__) | |
254 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 | |
255 | #else | |
256 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 | |
257 | #endif | |
258 | ||
259 | #undef CC1_SPEC | |
260 | #if DEFAULT_ARCH32_P | |
261 | #define CC1_SPEC CC1_SPEC32 | |
262 | #else | |
263 | #define CC1_SPEC CC1_SPEC64 | |
264 | #endif | |
265 | ||
266 | #if DEFAULT_ARCH32_P | |
267 | #define MULTILIB_DEFAULTS { "m32" } | |
268 | #else | |
269 | #define MULTILIB_DEFAULTS { "m64" } | |
270 | #endif | |
271 | ||
272 | #undef CPP_SUBTARGET_SPEC | |
273 | #if DEFAULT_ARCH32_P | |
274 | #define CPP_SUBTARGET_SPEC \ | |
275 | "%{m64:%(cpp_subtarget_spec64)}%{!m64:%(cpp_subtarget_spec32)}" | |
276 | #else | |
277 | #define CPP_SUBTARGET_SPEC \ | |
278 | "%{!m32:%(cpp_subtarget_spec64)}%{m32:%(cpp_subtarget_spec32)}" | |
279 | #endif | |
280 | ||
281 | /* Restore this from sparc/sparc.h, netbsd.h changes it. */ | |
282 | #undef CPP_SPEC | |
283 | #define CPP_SPEC "%(cpp_cpu) %(cpp_arch) %(cpp_endian) %(cpp_subtarget)" | |
284 | ||
285 | /* Name the port. */ | |
286 | #undef TARGET_NAME | |
287 | #define TARGET_NAME (DEFAULT_ARCH32_P ? TARGET_NAME32 : TARGET_NAME64) | |
288 | ||
289 | #else /* SPARC_BI_ARCH */ | |
290 | ||
291 | #if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ | |
292 | || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc | |
293 | ||
294 | #undef LONG_DOUBLE_TYPE_SIZE | |
295 | #define LONG_DOUBLE_TYPE_SIZE 128 | |
296 | ||
297 | #undef MAX_LONG_DOUBLE_TYPE_SIZE | |
298 | #define MAX_LONG_DOUBLE_TYPE_SIZE 128 | |
299 | ||
300 | #undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE | |
301 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 | |
302 | ||
303 | #undef CC1_SPEC | |
304 | #define CC1_SPEC CC1_SPEC64 | |
305 | ||
306 | #undef CPP_SUBTARGET_SPEC | |
307 | #define CPP_SUBTARGET_SPEC CPP_SUBTARGET_SPEC64 | |
308 | ||
309 | #undef TARGET_NAME | |
310 | #define TARGET_NAME TARGET_NAME64 | |
311 | ||
312 | #else /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ | |
313 | || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ | |
314 | ||
315 | /* A 32-bit only compiler. NetBSD don't support 128 bit `long double' | |
316 | for 32-bit code, unlike Solaris. */ | |
317 | ||
318 | #undef LONG_DOUBLE_TYPE_SIZE | |
319 | #define LONG_DOUBLE_TYPE_SIZE 64 | |
320 | ||
321 | #undef MAX_LONG_DOUBLE_TYPE_SIZE | |
322 | #define MAX_LONG_DOUBLE_TYPE_SIZE 64 | |
323 | ||
324 | #undef LIBGCC2_LONG_DOUBLE_TYPE_SIZE | |
325 | #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 64 | |
326 | ||
327 | #undef CPP_SUBTARGET_SPEC | |
328 | #define CPP_SUBTARGET_SPEC CPP_SUBTARGET_SPEC32 | |
329 | ||
330 | #undef CC1_SPEC | |
331 | #define CC1_SPEC CC1_SPEC32 | |
332 | ||
333 | #undef TARGET_NAME | |
334 | #define TARGET_NAME TARGET_NAME32 | |
335 | ||
336 | #endif /* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ | |
337 | || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */ | |
338 | ||
339 | #endif /* SPARC_BI_ARCH */ |