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
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING.  If not, write to
19the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20Boston, 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