1 /* Definitions of target machine for GNU compiler, for MIPS NetBSD systems.
2    Copyright (C) 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004
3    Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC 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 GCC 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 GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.  */
21 
22 
23 /* Define default target values.  */
24 
25 #undef MACHINE_TYPE
26 #if TARGET_ENDIAN_DEFAULT != 0
27 #define MACHINE_TYPE "NetBSD/mipseb ELF"
28 #else
29 #define MACHINE_TYPE "NetBSD/mipsel ELF"
30 #endif
31 
32 #define TARGET_OS_CPP_BUILTINS()			\
33   do							\
34     {							\
35       NETBSD_OS_CPP_BUILTINS_ELF();			\
36       builtin_define ("__NO_LEADING_UNDERSCORES__");	\
37       builtin_define ("__GP_SUPPORT__");		\
38       if (TARGET_LONG64)				\
39 	builtin_define ("__LONG64");			\
40 							\
41       if (TARGET_ABICALLS)				\
42 	builtin_define ("__ABICALLS__");		\
43 							\
44       if (mips_abi == ABI_EABI)				\
45 	builtin_define ("__mips_eabi");			\
46       else if (mips_abi == ABI_N32)			\
47 	builtin_define ("__mips_n32");			\
48       else if (mips_abi == ABI_64)			\
49 	builtin_define ("__mips_n64");			\
50       else if (mips_abi == ABI_O64)			\
51 	builtin_define ("__mips_o64");			\
52     }							\
53   while (0)
54 
55 /* The generic MIPS TARGET_CPU_CPP_BUILTINS are incorrect for NetBSD.
56    Specifically, they define too many namespace-invasive macros.  Override
57    them here.  Note this is structured for easy comparison to the version
58    in mips.h.
59 
60    FIXME: This probably isn't the best solution.  But in the absence
61    of something better, it will have to do, for now.  */
62 
63 #undef TARGET_CPU_CPP_BUILTINS
64 #define TARGET_CPU_CPP_BUILTINS()				\
65   do								\
66     {								\
67       builtin_assert ("cpu=mips");				\
68       builtin_define ("__mips__");				\
69       builtin_define ("_mips");					\
70 								\
71       /* No _R3000 or _R4000.  */				\
72       if (TARGET_64BIT)						\
73 	builtin_define ("__mips64");				\
74 								\
75       if (TARGET_FLOAT64)					\
76 	builtin_define ("__mips_fpr=64");			\
77       else							\
78 	builtin_define ("__mips_fpr=32");			\
79 								\
80       if (TARGET_MIPS16)					\
81 	builtin_define ("__mips16");				\
82 								\
83       MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info);	\
84       MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info);	\
85 								\
86       if (ISA_MIPS1)						\
87 	builtin_define ("__mips=1");				\
88       else if (ISA_MIPS2)					\
89 	builtin_define ("__mips=2");				\
90       else if (ISA_MIPS3)					\
91 	builtin_define ("__mips=3");				\
92       else if (ISA_MIPS4)					\
93 	builtin_define ("__mips=4");				\
94       else if (ISA_MIPS32)					\
95 	{							\
96 	  builtin_define ("__mips=32");				\
97 	  builtin_define ("__mips_isa_rev=1");			\
98 	}							\
99       else if (ISA_MIPS32R2)					\
100 	{							\
101 	  builtin_define ("__mips=32");				\
102 	  builtin_define ("__mips_isa_rev=2");			\
103 	}							\
104       else if (ISA_MIPS64)					\
105 	{							\
106 	  builtin_define ("__mips=64");				\
107 	  builtin_define ("__mips_isa_rev=1");			\
108 	}							\
109 								\
110       if (TARGET_HARD_FLOAT)					\
111 	builtin_define ("__mips_hard_float");			\
112       else if (TARGET_SOFT_FLOAT)				\
113 	builtin_define ("__mips_soft_float");			\
114 								\
115       if (TARGET_SINGLE_FLOAT)					\
116 	builtin_define ("__mips_single_float");			\
117 								\
118       if (TARGET_BIG_ENDIAN)					\
119 	builtin_define ("__MIPSEB__");				\
120       else							\
121 	builtin_define ("__MIPSEL__");				\
122 								\
123       /* No language dialect defines.  */			\
124 								\
125       /* ABIs handled in TARGET_OS_CPP_BUILTINS.  */		\
126     }								\
127   while (0)
128 
129 
130 /* Clean up after the generic MIPS/ELF configuration.  */
131 #undef MD_EXEC_PREFIX
132 #undef MD_STARTFILE_PREFIX
133 
134 /* Extra specs we need.  */
135 #undef SUBTARGET_EXTRA_SPECS
136 #define SUBTARGET_EXTRA_SPECS						\
137   { "netbsd_cpp_spec",		NETBSD_CPP_SPEC },			\
138   { "netbsd_link_spec",		NETBSD_LINK_SPEC_ELF },			\
139   { "netbsd_entry_point",	NETBSD_ENTRY_POINT },
140 
141 /* Provide a SUBTARGET_CPP_SPEC appropriate for NetBSD.  */
142 
143 #undef SUBTARGET_CPP_SPEC
144 #define SUBTARGET_CPP_SPEC "%(netbsd_cpp_spec)"
145 
146 /* Provide a LINK_SPEC appropriate for a NetBSD/mips target.
147    This is a copy of LINK_SPEC from <netbsd-elf.h> tweaked for
148    the MIPS target.  */
149 
150 #undef LINK_SPEC
151 #define LINK_SPEC \
152   "%{EL:-m elf32lmip} \
153    %{EB:-m elf32bmip} \
154    %(endian_spec) \
155    %{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips32r2} %{mips64} \
156    %{bestGnum} %{call_shared} %{no_archive} %{exact_version} \
157    %(netbsd_link_spec)"
158 
159 #define NETBSD_ENTRY_POINT "__start"
160 
161 #undef SUBTARGET_ASM_SPEC
162 #define SUBTARGET_ASM_SPEC \
163   "%{!mno-abicalls: \
164      %{!fno-PIC:%{!fno-pic:-KPIC}}}"
165 
166 
167 /* -G is incompatible with -KPIC which is the default, so only allow objects
168    in the small data section if the user explicitly asks for it.  */
169 
170 #undef MIPS_DEFAULT_GVALUE
171 #define MIPS_DEFAULT_GVALUE 0
172 
173 
174 /* This defines which switch letters take arguments.  -G is a MIPS
175    special.  */
176 
177 #undef SWITCH_TAKES_ARG
178 #define SWITCH_TAKES_ARG(CHAR)						\
179   (DEFAULT_SWITCH_TAKES_ARG (CHAR)					\
180    || (CHAR) == 'R'							\
181    || (CHAR) == 'G')
182 
183 
184 #undef ASM_FINAL_SPEC
185 #undef SET_ASM_OP
186 
187 
188 /* NetBSD hasn't historically provided _flush_cache(), but rather
189    _cacheflush(), which takes the same arguments as the former.  */
190 #undef CACHE_FLUSH_FUNC
191 #define CACHE_FLUSH_FUNC "_cacheflush"
192 
193 
194 /* Make gcc agree with <machine/ansi.h> */
195 
196 #undef WCHAR_TYPE
197 #define WCHAR_TYPE "int"
198 
199 #undef WCHAR_TYPE_SIZE
200 #define WCHAR_TYPE_SIZE 32
201 
202 #undef WINT_TYPE
203 #define WINT_TYPE "int"
204