1/* Definitions of target machine for GCC, for ELF on NetBSD/sparc
2   and NetBSD/sparc64.
3   Copyright (C) 2002-2020 Free Software Foundation, Inc.
4   Contributed by Matthew Green (mrg@eterna.com.au).
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 3, or (at your option)
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3.  If not see
20<http://www.gnu.org/licenses/>.  */
21
22#define TARGET_OS_CPP_BUILTINS()			\
23  do							\
24    {							\
25      NETBSD_OS_CPP_BUILTINS_ELF();			\
26      if (TARGET_ARCH64)				\
27	{						\
28	  builtin_define ("__sparc64__");		\
29	  builtin_define ("__sparc_v9__");		\
30	  builtin_define ("__sparcv9");			\
31	}						\
32      else						\
33	builtin_define ("__sparc");			\
34      builtin_define ("__sparc__");			\
35    }							\
36  while (0)
37
38/* CPP defines used by all NetBSD targets.  */
39#undef CPP_SUBTARGET_SPEC
40#define CPP_SUBTARGET_SPEC "%(netbsd_cpp_spec)"
41
42/* SIZE_TYPE and PTRDIFF_TYPE are wrong from sparc/sparc.h.  */
43#undef SIZE_TYPE
44#define SIZE_TYPE "long unsigned int"
45
46#undef PTRDIFF_TYPE
47#define PTRDIFF_TYPE "long int"
48
49/* we keep these "long" on both 32bit and 64bit targets */
50#undef INTPTR_TYPE
51#define INTPTR_TYPE PTRDIFF_TYPE
52
53#undef UINTPTR_TYPE
54#define UINTPTR_TYPE SIZE_TYPE
55
56#undef INT_FAST8_TYPE
57#define INT_FAST8_TYPE   (LONG_TYPE_SIZE == 64 ? "long int" : "int")
58
59#undef UINT_FAST8_TYPE
60#define UINT_FAST8_TYPE  (LONG_TYPE_SIZE == 64 ? "unsigned char" : "unsigned int")
61
62#undef INT_FAST16_TYPE
63#define INT_FAST16_TYPE  (LONG_TYPE_SIZE == 64 ? "long int" : "int")
64
65#undef UINT_FAST16_TYPE
66#define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "short unsigned int" : "unsigned int")
67
68#undef INT_FAST32_TYPE
69#define INT_FAST32_TYPE  (LONG_TYPE_SIZE == 64 ? "long int" : "int")
70
71#undef UINT_FAST32_TYPE
72#define UINT_FAST32_TYPE "unsigned int"
73
74#undef INT_FAST64_TYPE
75#define INT_FAST64_TYPE  (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
76
77#undef UINT_FAST64_TYPE
78#define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
79
80/* This is the char to use for continuation (in case we need to turn
81   continuation back on).  */
82#undef DBX_CONTIN_CHAR
83#define DBX_CONTIN_CHAR '?'
84
85#undef  LOCAL_LABEL_PREFIX
86#define LOCAL_LABEL_PREFIX  "."
87
88/* This is how to store into the string LABEL
89   the symbol_ref name of an internal numbered label where
90   PREFIX is the class of label and NUM is the number within the class.
91   This is suitable for output with `assemble_name'.  */
92
93#undef  ASM_GENERATE_INTERNAL_LABEL
94#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)	\
95  sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))
96
97#undef USER_LABEL_PREFIX
98#define USER_LABEL_PREFIX ""
99
100#undef ASM_SPEC
101#define ASM_SPEC "%{" FPIE_OR_FPIC_SPEC ":-K PIC} \
102%(asm_cpu) %(asm_arch) %(asm_relax)"
103
104#undef STDC_0_IN_SYSTEM_HEADERS
105
106#define HAVE_ENABLE_EXECUTE_STACK
107
108/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler
109   description, allowing one to build 32-bit or 64-bit applications
110   on either.  We define the sparc & sparc64 versions of things,
111   occasionally a neutral version (should be the same as "netbsd-elf.h")
112   and then based on SPARC_BI_ARCH, DEFAULT_ARCH32_P, and TARGET_CPU_DEFAULT,
113   we choose the correct version.  */
114
115/* We use the default NetBSD ELF STARTFILE_SPEC and ENDFILE_SPEC
116   definitions, even for the SPARC_BI_ARCH compiler, because NetBSD does
117   not have a default place to find these libraries..  */
118
119/* TARGET_CPU_DEFAULT is set in Makefile.in.  We test for 64-bit default
120   platform here.  */
121
122#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
123 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
124/* A 64 bit v9 compiler with stack-bias,
125   in a Medium/Low code model environment.  */
126
127#undef TARGET_DEFAULT
128#define TARGET_DEFAULT \
129  (MASK_V9 + MASK_PTR64 + MASK_64BIT /* + MASK_HARD_QUAD */ \
130   + MASK_STACK_BIAS + MASK_APP_REGS + MASK_FPU + MASK_LONG_DOUBLE_128)
131
132#undef SPARC_DEFAULT_CMODEL
133#define SPARC_DEFAULT_CMODEL CM_MEDMID
134
135#endif
136
137/* CC1_SPEC for NetBSD/sparc.  */
138#define CC1_SPEC32 \
139 "%{m32:%{m64:%emay not use both -m32 and -m64}} \
140  %{m64: \
141    -mptr64 -mstack-bias -mno-v8plus -mlong-double-128 \
142    %{!mcpu*:%{!mv8plus:-mcpu=ultrasparc}} \
143    %{!mno-vis:%{!mcpu=v9:-mvis}} \
144    %{p:-mcmodel=medlow} \
145    %{pg:-mcmodel=medlow}} " \
146  NETBSD_CC1_AND_CC1PLUS_SPEC
147
148#define CC1_SPEC64 \
149 "%{m32:%{m64:%emay not use both -m32 and -m64}} \
150  %{m32: \
151    -mptr32 -mno-stack-bias \
152    %{!mlong-double-128:-mlong-double-64} \
153    %{!mcpu*:%{!mv8plus:-mcpu=cypress}}} \
154  %{!m32: \
155      %{p:-mcmodel=medlow} \
156      %{pg:-mcmodel=medlow}} " \
157  NETBSD_CC1_AND_CC1PLUS_SPEC
158
159#if defined(SPARC_BI_ARCH) || defined(__arch64__)
160/* add code model specific object to the link line for 64bit */
161#define	LINK_SPEC_CODE_MODEL64	\
162	"%{!shared:"	\
163	    "%{!mcmodel=*:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}"	\
164	    "%{mcmodel=medlow:%:if-exists(%R/usr/lib/sparc_mcmedlow.o)}" \
165	    "%{mcmodel=medmid:%:if-exists(%R/usr/lib/sparc_mcmedmid.o)}" \
166	    "%{mcmodel=medany:%:if-exists(%R/usr/lib/sparc_mcmedany.o)}" \
167	"}"
168
169#ifdef SPARC_BI_ARCH
170#define LINK_SPEC_CODE_MODEL	"%{!m32:" LINK_SPEC_CODE_MODEL64 "}"
171#else
172#define	LINK_SPEC_CODE_MODEL	LINK_SPEC_CODE_MODEL64
173#endif
174#else
175#define	LINK_SPEC_CODE_MODEL	""
176#endif
177
178/* Make sure we use the right output format.  Pick a default and then
179   make sure -m32/-m64 switch to the right one.  */
180
181#define LINK_ARCH32_SPEC "-m elf32_sparc"
182
183#define LINK_ARCH64_SPEC "-m elf64_sparc"
184
185#define LINK_ARCH_SPEC \
186 "%{m32:%(link_arch32)} \
187  %{m64:%(link_arch64)} \
188  %{!m32:%{!m64:%(link_arch_default)}}"
189
190#undef LINK_SPEC
191#define LINK_SPEC \
192 "%(link_arch) \
193  %{!mno-relax:%{!r:-relax}} \
194  %(netbsd_link_spec) " \
195  LINK_SPEC_CODE_MODEL
196
197#define NETBSD_ENTRY_POINT "__start"
198
199#if DEFAULT_ARCH32_P
200#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH32_SPEC
201#else
202#define LINK_ARCH_DEFAULT_SPEC LINK_ARCH64_SPEC
203#endif
204
205/* What extra spec entries do we need?  */
206#undef SUBTARGET_EXTRA_SPECS
207#define SUBTARGET_EXTRA_SPECS \
208  { "link_arch32",		LINK_ARCH32_SPEC }, \
209  { "link_arch64",		LINK_ARCH64_SPEC }, \
210  { "link_arch_default",	LINK_ARCH_DEFAULT_SPEC }, \
211  { "link_arch",		LINK_ARCH_SPEC }, \
212  NETBSD_SUBTARGET_EXTRA_SPECS
213
214
215/* Build a compiler that supports -m32 and -m64?  */
216
217#ifdef SPARC_BI_ARCH
218
219#undef LONG_DOUBLE_TYPE_SIZE
220#define LONG_DOUBLE_TYPE_SIZE (TARGET_LONG_DOUBLE_128 ? 128 : 64)
221
222#undef  CC1_SPEC
223#if DEFAULT_ARCH32_P
224#define CC1_SPEC CC1_SPEC32
225#else
226#define CC1_SPEC CC1_SPEC64
227#endif
228
229#if DEFAULT_ARCH32_P
230#define MULTILIB_DEFAULTS { "m32" }
231#else
232#define MULTILIB_DEFAULTS { "m64" }
233#endif
234
235#else	/* SPARC_BI_ARCH */
236
237#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
238 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc
239
240#undef LONG_DOUBLE_TYPE_SIZE
241#define LONG_DOUBLE_TYPE_SIZE 128
242
243#undef  CC1_SPEC
244#define CC1_SPEC CC1_SPEC64
245
246#else	/* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
247	|| TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */
248
249/* A 32-bit only compiler.  NetBSD don't support 128 bit `long double'
250   for 32-bit code, unlike Solaris.  */
251
252#undef LONG_DOUBLE_TYPE_SIZE
253#define LONG_DOUBLE_TYPE_SIZE 64
254
255#undef  CC1_SPEC
256#define CC1_SPEC CC1_SPEC32
257
258#endif	/* TARGET_CPU_DEFAULT == TARGET_CPU_v9 \
259	|| TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc */
260
261#endif	/* SPARC_BI_ARCH */
262
263#ifdef HAVE_AS_TLS
264#undef TARGET_SUN_TLS
265#undef TARGET_GNU_TLS
266#define TARGET_SUN_TLS 0
267#define TARGET_GNU_TLS 1
268#endif
269
270/* We use GNU ld so undefine this so that attribute((init_priority)) works.  */
271#undef CTORS_SECTION_ASM_OP
272#undef DTORS_SECTION_ASM_OP
273