1 /* Definitions of target machine for GNU compiler, for MIPS NetBSD systems.
2    Copyright (C) 1993-2018 Free Software Foundation, Inc.
3 
4 This file is part of GCC.
5 
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10 
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 
21 /* Define default target values.  */
22 
23 #define TARGET_OS_CPP_BUILTINS()			\
24   do							\
25     {							\
26       NETBSD_OS_CPP_BUILTINS_ELF();			\
27       builtin_define ("__NO_LEADING_UNDERSCORES__");	\
28       builtin_define ("__GP_SUPPORT__");		\
29       if (TARGET_LONG64)				\
30 	builtin_define ("__LONG64");			\
31 							\
32       if (TARGET_ABICALLS)				\
33 	builtin_define ("__ABICALLS__");		\
34 							\
35       if (mips_abi == ABI_32)				\
36 	builtin_define ("__mips_o32");			\
37       else if (mips_abi == ABI_EABI)			\
38 	builtin_define ("__mips_eabi");			\
39       else if (mips_abi == ABI_N32)			\
40 	builtin_define ("__mips_n32");			\
41       else if (mips_abi == ABI_64)			\
42 	builtin_define ("__mips_n64");			\
43       else if (mips_abi == ABI_O64)			\
44 	builtin_define ("__mips_o64");			\
45     }							\
46   while (0)
47 
48 /* The generic MIPS TARGET_CPU_CPP_BUILTINS are incorrect for NetBSD.
49    Specifically, they define too many namespace-invasive macros.  Override
50    them here.  Note this is structured for easy comparison to the version
51    in mips.h.
52 
53    FIXME: This probably isn't the best solution.  But in the absence
54    of something better, it will have to do, for now.  */
55 
56 #undef TARGET_CPU_CPP_BUILTINS
57 #define TARGET_CPU_CPP_BUILTINS()				\
58   do								\
59     {								\
60       builtin_assert ("cpu=mips");				\
61       builtin_define ("__mips__");				\
62       builtin_define ("_mips");					\
63 								\
64       /* No _R3000 or _R4000.  */				\
65       if (TARGET_64BIT)						\
66 	builtin_define ("__mips64");				\
67 								\
68       if (TARGET_FLOAT64)					\
69 	builtin_define ("__mips_fpr=64");			\
70       else							\
71 	builtin_define ("__mips_fpr=32");			\
72 								\
73       if (TARGET_MIPS16)					\
74 	builtin_define ("__mips16");				\
75 								\
76       MIPS_CPP_SET_PROCESSOR ("_MIPS_ARCH", mips_arch_info);	\
77       MIPS_CPP_SET_PROCESSOR ("_MIPS_TUNE", mips_tune_info);	\
78 								\
79       if (ISA_MIPS1)						\
80 	builtin_define ("__mips=1");				\
81       else if (ISA_MIPS2)					\
82 	builtin_define ("__mips=2");				\
83       else if (ISA_MIPS3)					\
84 	builtin_define ("__mips=3");				\
85       else if (ISA_MIPS4)					\
86 	builtin_define ("__mips=4");				\
87       else if (mips_isa >= 32 && mips_isa < 64)			\
88 	builtin_define ("__mips=32");				\
89       else if (mips_isa >= 64)					\
90 	builtin_define ("__mips=64");				\
91       if (mips_isa_rev > 0)					\
92         builtin_define_with_int_value ("__mips_isa_rev",	\
93                                        mips_isa_rev);		\
94 								\
95       if (TARGET_HARD_FLOAT)					\
96 	builtin_define ("__mips_hard_float");			\
97       else if (TARGET_SOFT_FLOAT)				\
98 	builtin_define ("__mips_soft_float");			\
99 								\
100       if (TARGET_SINGLE_FLOAT)					\
101 	builtin_define ("__mips_single_float");			\
102 								\
103       if (TARGET_BIG_ENDIAN)					\
104 	builtin_define ("__MIPSEB__");				\
105       else							\
106 	builtin_define ("__MIPSEL__");				\
107 								\
108       /* No language dialect defines.  */			\
109 								\
110       /* ABIs handled in TARGET_OS_CPP_BUILTINS.  */		\
111     }								\
112   while (0)
113 
114 
115 /* Extra specs we need.  */
116 #undef SUBTARGET_EXTRA_SPECS
117 #define SUBTARGET_EXTRA_SPECS						\
118   { "netbsd_cpp_spec",		NETBSD_CPP_SPEC },			\
119   { "netbsd_link_spec",		NETBSD_LINK_SPEC_ELF },			\
120   { "netbsd_entry_point",	NETBSD_ENTRY_POINT },
121 
122 /* Provide a SUBTARGET_CPP_SPEC appropriate for NetBSD.  */
123 
124 #undef SUBTARGET_CPP_SPEC
125 #define SUBTARGET_CPP_SPEC "%(netbsd_cpp_spec)"
126 
127 /* Provide a LINK_SPEC appropriate for a NetBSD/mips target.
128    This is a copy of LINK_SPEC from <netbsd-elf.h> tweaked for
129    the MIPS target.  */
130 
131 #undef LINK_SPEC
132 #define LINK_SPEC \
133   "%{EL:-m elf32lmip} \
134    %{EB:-m elf32bmip} \
135    %(endian_spec) \
136    %{G*} %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips32r2} \
137    %{mips32r6} %{mips64} %{mips64r6} \
138    %(netbsd_link_spec)"
139 
140 #define NETBSD_ENTRY_POINT "__start"
141 
142 #undef SUBTARGET_ASM_SPEC
143 #define SUBTARGET_ASM_SPEC \
144   "%{!mno-abicalls: \
145      %{!fno-PIC:%{!fno-pic:-KPIC}}}"
146 
147 
148 /* -G is incompatible with -KPIC which is the default, so only allow objects
149    in the small data section if the user explicitly asks for it.  */
150 
151 #undef MIPS_DEFAULT_GVALUE
152 #define MIPS_DEFAULT_GVALUE 0
153 
154 
155 #undef ASM_FINAL_SPEC
156 #undef SET_ASM_OP
157 
158 
159 /* NetBSD hasn't historically provided _flush_cache(), but rather
160    _cacheflush(), which takes the same arguments as the former.  */
161 #undef CACHE_FLUSH_FUNC
162 #define CACHE_FLUSH_FUNC "_cacheflush"
163 
164 
165 /* Make gcc agree with <machine/ansi.h> */
166 
167 #undef WCHAR_TYPE
168 #define WCHAR_TYPE "int"
169 
170 #undef WCHAR_TYPE_SIZE
171 #define WCHAR_TYPE_SIZE 32
172 
173 #undef WINT_TYPE
174 #define WINT_TYPE "int"
175