blob: f0cd2269ff28bf172554d957afce24499774d1ac [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Ted Kremenek40499482007-12-03 22:06:55 +000020
Chris Lattner4b009652007-07-25 00:24:17 +000021using namespace clang;
22
Chris Lattner4b009652007-07-25 00:24:17 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattner0db667a2007-10-06 06:57:34 +000027static void Define(std::vector<char> &Buf, const char *Macro,
28 const char *Val = "1") {
29 const char *Def = "#define ";
30 Buf.insert(Buf.end(), Def, Def+strlen(Def));
31 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
32 Buf.push_back(' ');
33 Buf.insert(Buf.end(), Val, Val+strlen(Val));
34 Buf.push_back('\n');
35}
36
37
Chris Lattner4b009652007-07-25 00:24:17 +000038namespace {
Chris Lattner0fb8d852008-03-08 08:24:01 +000039class DarwinTargetInfo : public TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +000040public:
Chris Lattner0fb8d852008-03-08 08:24:01 +000041 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenek40499482007-12-03 22:06:55 +000042
Chris Lattner0db667a2007-10-06 06:57:34 +000043 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner1ed172d2007-10-17 06:04:46 +000044// FIXME: we need a real target configuration system. For now, only define
45// __APPLE__ if the host has it.
46#ifdef __APPLE__
Chris Lattner0db667a2007-10-06 06:57:34 +000047 Define(Defs, "__APPLE__");
48 Define(Defs, "__MACH__");
Chris Lattner1ed172d2007-10-17 06:04:46 +000049#endif
Nuno Lopese531db82008-07-05 19:32:25 +000050
51/* FIXME. we may also need to distinguish between darwin and linux targets */
52#ifdef linux
53 Define(Defs, "linux");
54#endif
Chris Lattner4b009652007-07-25 00:24:17 +000055
Chris Lattner4b009652007-07-25 00:24:17 +000056 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000057 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000058 }
59
60};
Eli Friedmanff158dd2008-08-20 07:28:14 +000061}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000062
Eli Friedmanff158dd2008-08-20 07:28:14 +000063static void getSolarisDefines(std::vector<char> &Defs) {
64 Define(Defs, "__SUN__");
65 Define(Defs, "__SOLARIS__");
66}
Chris Lattner4b009652007-07-25 00:24:17 +000067
Eli Friedman872996c2008-08-20 02:34:37 +000068static void getDarwinDefines(std::vector<char> &Defs) {
69 Define(Defs, "__APPLE__");
70 Define(Defs, "__MACH__");
71
72 if (0) // darwin_pascal_strings
73 Define(Defs, "__PASCAL_STRINGS__");
74}
Chris Lattner4b009652007-07-25 00:24:17 +000075
76/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
77/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +000078static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000079 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +000080 Define(Defs, "__ppc__");
81 Define(Defs, "_ARCH_PPC");
82 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +000083 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000084 Define(Defs, "_ARCH_PPC64");
85 Define(Defs, "_LP64");
86 Define(Defs, "__LP64__");
87 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +000088 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000089 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +000090 }
91
92 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +000093 Define(Defs, "_BIG_ENDIAN");
94 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +000095
96 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000097 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
98 Define(Defs, "__INTMAX_TYPE__", "long int");
99 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
100 Define(Defs, "__PTRDIFF_TYPE__", "long int");
101 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000102 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000103 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
104 Define(Defs, "__INTMAX_TYPE__", "long long int");
105 Define(Defs, "__LONG_MAX__", "2147483647L");
106 Define(Defs, "__PTRDIFF_TYPE__", "int");
107 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000108 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000109 Define(Defs, "__INT_MAX__", "2147483647");
110 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
111 Define(Defs, "__CHAR_BIT__", "8");
112 Define(Defs, "__SCHAR_MAX__", "127");
113 Define(Defs, "__SHRT_MAX__", "32767");
114 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000115
116 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000117 Define(Defs, "__USER_LABEL_PREFIX__", "_");
118 Define(Defs, "__NATURAL_ALIGNMENT__");
119 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000120
Chris Lattner0db667a2007-10-06 06:57:34 +0000121 Define(Defs, "__WCHAR_MAX__", "2147483647");
122 Define(Defs, "__WCHAR_TYPE__", "int");
123 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000124
125 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000126 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
127 Define(Defs, "__FLT_DIG__", "6");
128 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
129 Define(Defs, "__FLT_EVAL_METHOD__", "0");
130 Define(Defs, "__FLT_HAS_INFINITY__");
131 Define(Defs, "__FLT_HAS_QUIET_NAN__");
132 Define(Defs, "__FLT_MANT_DIG__", "24");
133 Define(Defs, "__FLT_MAX_10_EXP__", "38");
134 Define(Defs, "__FLT_MAX_EXP__", "128");
135 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
136 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
137 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
138 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
139 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000140
141 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000142 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
143 Define(Defs, "__DBL_DIG__", "15");
144 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
145 Define(Defs, "__DBL_HAS_INFINITY__");
146 Define(Defs, "__DBL_HAS_QUIET_NAN__");
147 Define(Defs, "__DBL_MANT_DIG__", "53");
148 Define(Defs, "__DBL_MAX_10_EXP__", "308");
149 Define(Defs, "__DBL_MAX_EXP__", "1024");
150 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
151 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
152 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
153 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
154 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000155
156 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000157 Define(Defs, "__LDBL_DENORM_MIN__",
158 "4.94065645841246544176568792868221e-324L");
159 Define(Defs, "__LDBL_DIG__", "31");
160 Define(Defs, "__LDBL_EPSILON__",
161 "4.94065645841246544176568792868221e-324L");
162 Define(Defs, "__LDBL_HAS_INFINITY__");
163 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
164 Define(Defs, "__LDBL_MANT_DIG__", "106");
165 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
166 Define(Defs, "__LDBL_MAX_EXP__", "1024");
167 Define(Defs, "__LDBL_MAX__",
168 "1.79769313486231580793728971405301e+308L");
169 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
170 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
171 Define(Defs, "__LDBL_MIN__",
172 "2.00416836000897277799610805135016e-292L");
173 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000174}
175
176/// getX86Defines - Return a set of the X86-specific #defines that are
177/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000178static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000179 // Target identification.
180 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000181 Define(Defs, "_LP64");
182 Define(Defs, "__LP64__");
183 Define(Defs, "__amd64__");
184 Define(Defs, "__amd64");
185 Define(Defs, "__x86_64");
186 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000187 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000188 Define(Defs, "__i386__");
189 Define(Defs, "__i386");
190 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000191 }
192
193 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000194 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000195
196 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000197 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
198 Define(Defs, "__INTMAX_TYPE__", "long int");
199 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
200 Define(Defs, "__PTRDIFF_TYPE__", "long int");
201 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000202 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000203 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
204 Define(Defs, "__INTMAX_TYPE__", "long long int");
205 Define(Defs, "__LONG_MAX__", "2147483647L");
206 Define(Defs, "__PTRDIFF_TYPE__", "int");
207 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000208 }
Anders Carlsson82b26282008-07-22 17:16:13 +0000209 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner0db667a2007-10-06 06:57:34 +0000210 Define(Defs, "__CHAR_BIT__", "8");
211 Define(Defs, "__INT_MAX__", "2147483647");
212 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
213 Define(Defs, "__SCHAR_MAX__", "127");
214 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner4b009652007-07-25 00:24:17 +0000215
216 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000217 Define(Defs, "__nocona");
218 Define(Defs, "__nocona__");
219 Define(Defs, "__tune_nocona__");
220 Define(Defs, "__SSE2_MATH__");
221 Define(Defs, "__SSE2__");
222 Define(Defs, "__SSE_MATH__");
223 Define(Defs, "__SSE__");
224 Define(Defs, "__MMX__");
225 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000226
Chris Lattner0db667a2007-10-06 06:57:34 +0000227 Define(Defs, "__WCHAR_MAX__", "2147483647");
228 Define(Defs, "__WCHAR_TYPE__", "int");
229 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000230
231 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000232 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
233 Define(Defs, "__FLT_DIG__", "6");
234 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
235 Define(Defs, "__FLT_EVAL_METHOD__", "0");
236 Define(Defs, "__FLT_HAS_INFINITY__");
237 Define(Defs, "__FLT_HAS_QUIET_NAN__");
238 Define(Defs, "__FLT_MANT_DIG__", "24");
239 Define(Defs, "__FLT_MAX_10_EXP__", "38");
240 Define(Defs, "__FLT_MAX_EXP__", "128");
241 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
242 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
243 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
244 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
245 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000246
247 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000248 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
249 Define(Defs, "__DBL_DIG__", "15");
250 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
251 Define(Defs, "__DBL_HAS_INFINITY__");
252 Define(Defs, "__DBL_HAS_QUIET_NAN__");
253 Define(Defs, "__DBL_MANT_DIG__", "53");
254 Define(Defs, "__DBL_MAX_10_EXP__", "308");
255 Define(Defs, "__DBL_MAX_EXP__", "1024");
256 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
257 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
258 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
259 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
260 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000261
262 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000263 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
264 Define(Defs, "__LDBL_DIG__", "18");
265 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
266 Define(Defs, "__LDBL_HAS_INFINITY__");
267 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
268 Define(Defs, "__LDBL_MANT_DIG__", "64");
269 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
270 Define(Defs, "__LDBL_MAX_EXP__", "16384");
271 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
272 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
273 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
274 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000275}
276
Chris Lattnerb6444052008-04-21 20:19:54 +0000277/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000278/// not tied to a specific subtarget.
279static void getARMDefines(std::vector<char> &Defs) {
280 // Target identification.
281 Define(Defs, "__arm");
282 Define(Defs, "__arm__");
283
284 // Target properties.
285 Define(Defs, "__LITTLE_ENDIAN__");
286
287 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
288 Define(Defs, "__INTMAX_TYPE__", "long long int");
289 Define(Defs, "__LONG_MAX__", "2147483647L");
290 Define(Defs, "__PTRDIFF_TYPE__", "int");
291 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
292 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
293
294 Define(Defs, "__CHAR_BIT__", "8");
295 Define(Defs, "__INT_MAX__", "2147483647");
296 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
297 Define(Defs, "__SCHAR_MAX__", "127");
298 Define(Defs, "__SHRT_MAX__", "32767");
299
300 // Subtarget options. [hard coded to v6 for now]
301 Define(Defs, "__ARM_ARCH_6K__");
302 Define(Defs, "__ARMEL__");
303 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
304
305 Define(Defs, "__WCHAR_MAX__", "2147483647");
306 Define(Defs, "__WCHAR_TYPE__", "int");
307 Define(Defs, "__WINT_TYPE__", "int");
308 Define(Defs, "__DECIMAL_DIG__", "17");
309 Define(Defs, "__FLT_RADIX__", "2");
310
311 // Float macros.
312 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
313 Define(Defs, "__FLT_DIG__", "6");
314 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
315 Define(Defs, "__FLT_EVAL_METHOD__", "0");
316 Define(Defs, "__FLT_HAS_INFINITY__");
317 Define(Defs, "__FLT_HAS_QUIET_NAN__");
318 Define(Defs, "__FLT_MANT_DIG__", "24");
319 Define(Defs, "__FLT_MAX_10_EXP__", "38");
320 Define(Defs, "__FLT_MAX_EXP__", "128");
321 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
322 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
323 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
324 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
325
326 // Double macros.
327 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
328 Define(Defs, "__DBL_DIG__", "15");
329 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
330 Define(Defs, "__DBL_HAS_INFINITY__");
331 Define(Defs, "__DBL_HAS_QUIET_NAN__");
332 Define(Defs, "__DBL_MANT_DIG__", "53");
333 Define(Defs, "__DBL_MAX_10_EXP__", "308");
334 Define(Defs, "__DBL_MAX_EXP__", "1024");
335 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
336 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
337 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
338 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
339
340 // 64-bit Long double macros (same as double).
341 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
342 Define(Defs, "__LDBL_DIG__", "15");
343 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
344 Define(Defs, "__LDBL_HAS_INFINITY__");
345 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
346 Define(Defs, "__LDBL_MANT_DIG__", "53");
347 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
348 Define(Defs, "__LDBL_MAX_EXP__", "1024");
349 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
350 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
351 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
352 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
353}
354
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000355static const char* getPPCVAListDeclaration() {
356 return
357 "typedef struct __va_list_tag {"
358 " unsigned char gpr;"
359 " unsigned char fpr;"
360 " unsigned short reserved;"
361 " void* overflow_arg_area;"
362 " void* reg_save_area;"
363 "} __builtin_va_list[1];";
364}
365
Chris Lattner4b009652007-07-25 00:24:17 +0000366/// PPC builtin info.
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000367namespace clang {
Chris Lattner4b009652007-07-25 00:24:17 +0000368namespace PPC {
Chris Lattner4b009652007-07-25 00:24:17 +0000369
370 static const Builtin::Info BuiltinInfo[] = {
371#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000372#include "clang/AST/PPCBuiltins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000373 };
374
375 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
376 Records = BuiltinInfo;
377 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
378 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000379
380 static const char * const GCCRegNames[] = {
381 "0", "1", "2", "3", "4", "5", "6", "7",
382 "8", "9", "10", "11", "12", "13", "14", "15",
383 "16", "17", "18", "19", "20", "21", "22", "23",
384 "24", "25", "26", "27", "28", "29", "30", "31",
385 "0", "1", "2", "3", "4", "5", "6", "7",
386 "8", "9", "10", "11", "12", "13", "14", "15",
387 "16", "17", "18", "19", "20", "21", "22", "23",
388 "24", "25", "26", "27", "28", "29", "30", "31",
389 "mq", "lr", "ctr", "ap",
390 "0", "1", "2", "3", "4", "5", "6", "7",
391 "xer",
392 "0", "1", "2", "3", "4", "5", "6", "7",
393 "8", "9", "10", "11", "12", "13", "14", "15",
394 "16", "17", "18", "19", "20", "21", "22", "23",
395 "24", "25", "26", "27", "28", "29", "30", "31",
396 "vrsave", "vscr",
397 "spe_acc", "spefscr",
398 "sfp"
399 };
400
401 static void getGCCRegNames(const char * const *&Names,
402 unsigned &NumNames) {
403 Names = GCCRegNames;
404 NumNames = llvm::array_lengthof(GCCRegNames);
405 }
406
Chris Lattner0fb8d852008-03-08 08:24:01 +0000407 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000408 // While some of these aliases do map to different registers
409 // they still share the same register name.
410 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
411 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
412 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
413 { { "cr3", "fr3", "r3", "v3"}, "3" },
414 { { "cr4", "fr4", "r4", "v4"}, "4" },
415 { { "cr5", "fr5", "r5", "v5"}, "5" },
416 { { "cr6", "fr6", "r6", "v6"}, "6" },
417 { { "cr7", "fr7", "r7", "v7"}, "7" },
418 { { "fr8", "r8", "v8"}, "8" },
419 { { "fr9", "r9", "v9"}, "9" },
420 { { "fr10", "r10", "v10"}, "10" },
421 { { "fr11", "r11", "v11"}, "11" },
422 { { "fr12", "r12", "v12"}, "12" },
423 { { "fr13", "r13", "v13"}, "13" },
424 { { "fr14", "r14", "v14"}, "14" },
425 { { "fr15", "r15", "v15"}, "15" },
426 { { "fr16", "r16", "v16"}, "16" },
427 { { "fr17", "r17", "v17"}, "17" },
428 { { "fr18", "r18", "v18"}, "18" },
429 { { "fr19", "r19", "v19"}, "19" },
430 { { "fr20", "r20", "v20"}, "20" },
431 { { "fr21", "r21", "v21"}, "21" },
432 { { "fr22", "r22", "v22"}, "22" },
433 { { "fr23", "r23", "v23"}, "23" },
434 { { "fr24", "r24", "v24"}, "24" },
435 { { "fr25", "r25", "v25"}, "25" },
436 { { "fr26", "r26", "v26"}, "26" },
437 { { "fr27", "r27", "v27"}, "27" },
438 { { "fr28", "r28", "v28"}, "28" },
439 { { "fr29", "r29", "v29"}, "29" },
440 { { "fr30", "r30", "v30"}, "30" },
441 { { "fr31", "r31", "v31"}, "31" },
442 };
443
Chris Lattner0fb8d852008-03-08 08:24:01 +0000444 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000445 unsigned &NumAliases) {
446 Aliases = GCCRegAliases;
447 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000448 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000449
Anders Carlsson4ce42302007-11-27 04:11:28 +0000450 static bool validateAsmConstraint(char c,
451 TargetInfo::ConstraintInfo &info) {
452 switch (c) {
453 default: return false;
454 case 'O': // Zero
455 return true;
456 case 'b': // Base register
457 case 'f': // Floating point register
458 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
459 return true;
460 }
461 }
462
463 const char *getClobbers() {
464 return 0;
465 }
466
Anders Carlsson333052c2007-12-08 19:32:57 +0000467 const char *getTargetPrefix() {
468 return "ppc";
469 }
470
Chris Lattner4b009652007-07-25 00:24:17 +0000471} // End namespace PPC
Chris Lattner9fd73612008-04-21 18:56:49 +0000472
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000473} // end namespace clang.
Chris Lattner4b009652007-07-25 00:24:17 +0000474
475//===----------------------------------------------------------------------===//
476// Specific target implementations.
477//===----------------------------------------------------------------------===//
478
479
480namespace {
481class DarwinPPCTargetInfo : public DarwinTargetInfo {
482public:
Eli Friedman2fde2a52008-05-20 14:25:01 +0000483 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
484 CharIsSigned = false;
485 }
Ted Kremenek40499482007-12-03 22:06:55 +0000486
Chris Lattner0db667a2007-10-06 06:57:34 +0000487 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000488 DarwinTargetInfo::getTargetDefines(Defines);
489 getPowerPCDefines(Defines, false);
490 }
491 virtual void getTargetBuiltins(const Builtin::Info *&Records,
492 unsigned &NumRecords) const {
493 PPC::getBuiltins(Records, NumRecords);
494 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000495 virtual const char *getVAListDeclaration() const {
496 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000497 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000498 virtual const char *getTargetPrefix() const {
499 return PPC::getTargetPrefix();
500 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000501 virtual void getGCCRegNames(const char * const *&Names,
502 unsigned &NumNames) const {
503 PPC::getGCCRegNames(Names, NumNames);
504 }
505 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
506 unsigned &NumAliases) const {
507 PPC::getGCCRegAliases(Aliases, NumAliases);
508 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000509 virtual bool validateAsmConstraint(char c,
510 TargetInfo::ConstraintInfo &info) const {
511 return PPC::validateAsmConstraint(c, info);
512 }
513 virtual const char *getClobbers() const {
514 return PPC::getClobbers();
515 }
Chris Lattner4b009652007-07-25 00:24:17 +0000516};
517} // end anonymous namespace.
518
519namespace {
520class DarwinPPC64TargetInfo : public DarwinTargetInfo {
521public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000522 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman2fde2a52008-05-20 14:25:01 +0000523 CharIsSigned = false;
Chris Lattnere5fde952008-05-09 06:17:04 +0000524 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
525 }
Ted Kremenek40499482007-12-03 22:06:55 +0000526
Chris Lattner0db667a2007-10-06 06:57:34 +0000527 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000528 DarwinTargetInfo::getTargetDefines(Defines);
529 getPowerPCDefines(Defines, true);
530 }
531 virtual void getTargetBuiltins(const Builtin::Info *&Records,
532 unsigned &NumRecords) const {
533 PPC::getBuiltins(Records, NumRecords);
534 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000535 virtual const char *getVAListDeclaration() const {
536 return getPPCVAListDeclaration();
537 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000538 virtual const char *getTargetPrefix() const {
539 return PPC::getTargetPrefix();
540 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000541 virtual void getGCCRegNames(const char * const *&Names,
542 unsigned &NumNames) const {
543 PPC::getGCCRegNames(Names, NumNames);
544 }
545 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
546 unsigned &NumAliases) const {
547 PPC::getGCCRegAliases(Aliases, NumAliases);
548 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000549 virtual bool validateAsmConstraint(char c,
550 TargetInfo::ConstraintInfo &info) const {
551 return PPC::validateAsmConstraint(c, info);
552 }
553 virtual const char *getClobbers() const {
554 return PPC::getClobbers();
555 }
Chris Lattner4b009652007-07-25 00:24:17 +0000556};
557} // end anonymous namespace.
558
559namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000560// Namespace for x86 abstract base class
561const Builtin::Info BuiltinInfo[] = {
562#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
563#include "clang/AST/X86Builtins.def"
564};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000565
Eli Friedman872996c2008-08-20 02:34:37 +0000566const char *GCCRegNames[] = {
567 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
568 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
569 "argp", "flags", "fspr", "dirflag", "frame",
570 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
571 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
572 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
573 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
574};
575
576const TargetInfo::GCCRegAlias GCCRegAliases[] = {
577 { { "al", "ah", "eax", "rax" }, "ax" },
578 { { "bl", "bh", "ebx", "rbx" }, "bx" },
579 { { "cl", "ch", "ecx", "rcx" }, "cx" },
580 { { "dl", "dh", "edx", "rdx" }, "dx" },
581 { { "esi", "rsi" }, "si" },
582 { { "edi", "rdi" }, "di" },
583 { { "esp", "rsp" }, "sp" },
584 { { "ebp", "rbp" }, "bp" },
585};
586
587// X86 target abstract base class; x86-32 and x86-64 are very close, so
588// most of the implementation can be shared.
589class X86TargetInfo : public TargetInfo {
590public:
591 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
592 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000593 }
594 virtual void getTargetBuiltins(const Builtin::Info *&Records,
595 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000596 Records = BuiltinInfo;
597 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000598 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000599 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000600 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000601 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000602 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000603 unsigned &NumNames) const {
604 Names = GCCRegNames;
605 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000606 }
607 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
608 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000609 Aliases = GCCRegAliases;
610 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000611 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000612 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000613 TargetInfo::ConstraintInfo &info) const;
614 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000615 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000616 return "~{dirflag},~{fpsr},~{flags}";
617 }
Chris Lattner4b009652007-07-25 00:24:17 +0000618};
Eli Friedman872996c2008-08-20 02:34:37 +0000619
620bool
621X86TargetInfo::validateAsmConstraint(char c,
622 TargetInfo::ConstraintInfo &info) const {
623 switch (c) {
624 default: return false;
625 case 'a': // eax.
626 case 'b': // ebx.
627 case 'c': // ecx.
628 case 'd': // edx.
629 case 'S': // esi.
630 case 'D': // edi.
631 case 'A': // edx:eax.
632 case 't': // top of floating point stack.
633 case 'u': // second from top of floating point stack.
634 case 'q': // Any register accessible as [r]l: a, b, c, and d.
635 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
636 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
637 // instructions.
638 case 'N': // unsigned 8-bit integer constant for use with in and out
639 // instructions.
640 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
641 return true;
642 }
643}
644
645std::string
646X86TargetInfo::convertConstraint(const char Constraint) const {
647 switch (Constraint) {
648 case 'a': return std::string("{ax}");
649 case 'b': return std::string("{bx}");
650 case 'c': return std::string("{cx}");
651 case 'd': return std::string("{dx}");
652 case 'S': return std::string("{si}");
653 case 'D': return std::string("{di}");
654 case 't': // top of floating point stack.
655 return std::string("{st}");
656 case 'u': // second from top of floating point stack.
657 return std::string("{st(1)}"); // second from top of floating point stack.
658 default:
659 return std::string(1, Constraint);
660 }
661}
Eli Friedman872996c2008-08-20 02:34:37 +0000662} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000663
664namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000665// X86-32 generic target
666class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000667public:
Eli Friedman872996c2008-08-20 02:34:37 +0000668 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
669 DoubleAlign = LongLongAlign = 32;
670 LongDoubleWidth = 96;
671 LongDoubleAlign = 32;
672 }
673 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000674 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000675 }
676 virtual void getTargetDefines(std::vector<char> &Defines) const {
677 getX86Defines(Defines, false);
678 }
679};
680} // end anonymous namespace
681
682namespace {
683// x86-32 Darwin (OS X) target
684class DarwinI386TargetInfo : public X86_32TargetInfo {
685public:
686 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
687 LongDoubleWidth = 128;
688 LongDoubleAlign = 128;
689 }
690 virtual void getTargetDefines(std::vector<char> &Defines) const {
691 X86_32TargetInfo::getTargetDefines(Defines);
692 getDarwinDefines(Defines);
693 }
694};
695} // end anonymous namespace
696
697namespace {
698// x86-64 generic target
699class X86_64TargetInfo : public X86TargetInfo {
700public:
701 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000702 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000703 LongDoubleWidth = 128;
704 LongDoubleAlign = 128;
Chris Lattner4b009652007-07-25 00:24:17 +0000705 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000706 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000707 return "typedef struct __va_list_tag {"
708 " unsigned gp_offset;"
709 " unsigned fp_offset;"
710 " void* overflow_arg_area;"
711 " void* reg_save_area;"
712 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000713 }
Eli Friedman872996c2008-08-20 02:34:37 +0000714 virtual void getTargetDefines(std::vector<char> &Defines) const {
715 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000716 }
Eli Friedman872996c2008-08-20 02:34:37 +0000717};
718} // end anonymous namespace
719
720namespace {
721// x86-64 Darwin (OS X) target
722class DarwinX86_64TargetInfo : public X86_64TargetInfo {
723public:
724 DarwinX86_64TargetInfo(const std::string& triple) :
725 X86_64TargetInfo(triple) {}
726
727 virtual void getTargetDefines(std::vector<char> &Defines) const {
728 X86_64TargetInfo::getTargetDefines(Defines);
729 getDarwinDefines(Defines);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000730 }
Chris Lattner4b009652007-07-25 00:24:17 +0000731};
732} // end anonymous namespace.
733
Chris Lattner9fd73612008-04-21 18:56:49 +0000734namespace {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000735class ARMTargetInfo : public TargetInfo {
Chris Lattner9fd73612008-04-21 18:56:49 +0000736public:
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000737 ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
738 // FIXME: Are the defaults correct for ARM?
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000739 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000740 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner9fd73612008-04-21 18:56:49 +0000741 getARMDefines(Defines);
742 }
743 virtual void getTargetBuiltins(const Builtin::Info *&Records,
744 unsigned &NumRecords) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000745 // FIXME: Implement.
746 Records = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000747 NumRecords = 0;
748 }
749 virtual const char *getVAListDeclaration() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000750 return "typedef char* __builtin_va_list;";
Chris Lattner9fd73612008-04-21 18:56:49 +0000751 }
752 virtual const char *getTargetPrefix() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000753 return "arm";
Chris Lattner9fd73612008-04-21 18:56:49 +0000754 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000755 virtual void getGCCRegNames(const char * const *&Names,
756 unsigned &NumNames) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000757 // FIXME: Implement.
758 Names = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000759 NumNames = 0;
760 }
761 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
762 unsigned &NumAliases) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000763 // FIXME: Implement.
764 Aliases = 0;
Chris Lattner9fd73612008-04-21 18:56:49 +0000765 NumAliases = 0;
766 }
767 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000768 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000769 // FIXME: Check if this is complete
Nate Begeman222823a2008-04-22 05:03:19 +0000770 switch (c) {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000771 default:
Nate Begeman222823a2008-04-22 05:03:19 +0000772 case 'l': // r0-r7
773 case 'h': // r8-r15
774 case 'w': // VFP Floating point register single precision
775 case 'P': // VFP Floating point register double precision
776 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
777 return true;
778 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000779 return false;
780 }
781 virtual const char *getClobbers() const {
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000782 // FIXME: Is this really right?
Chris Lattner9fd73612008-04-21 18:56:49 +0000783 return "";
784 }
785};
786} // end anonymous namespace.
787
Eli Friedmanbe727fe2008-08-20 07:44:10 +0000788
789namespace {
790class DarwinARMTargetInfo : public ARMTargetInfo {
791public:
792 DarwinARMTargetInfo(const std::string& triple) : ARMTargetInfo(triple) {}
793
794 virtual void getTargetDefines(std::vector<char> &Defines) const {
795 ARMTargetInfo::getTargetDefines(Defines);
796 getDarwinDefines(Defines);
797 }
798};
799} // end anonymous namespace.
800
Chris Lattner4b009652007-07-25 00:24:17 +0000801namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000802class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000803public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000804 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
805 // FIXME: Support Sparc quad-precision long double?
806 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000807 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000808 // FIXME: This is missing a lot of important defines; some of the
809 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000810 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000811 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000812 Define(Defines, "__sparcv8");
813 }
814 virtual void getTargetBuiltins(const Builtin::Info *&Records,
815 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000816 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000817 }
818 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000819 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000820 }
821 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000822 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000823 }
824 virtual void getGCCRegNames(const char * const *&Names,
825 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000826 // FIXME: Implement!
827 Names = 0;
828 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000829 }
830 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
831 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000832 // FIXME: Implement!
833 Aliases = 0;
834 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000835 }
836 virtual bool validateAsmConstraint(char c,
837 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000838 // FIXME: Implement!
839 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000840 }
841 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000842 // FIXME: Implement!
843 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000844 }
845};
846
847} // end anonymous namespace.
848
Eli Friedmanff158dd2008-08-20 07:28:14 +0000849namespace {
850class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
851public:
852 SolarisSparcV8TargetInfo(const std::string& triple) :
853 SparcV8TargetInfo(triple) {}
854
855 virtual void getTargetDefines(std::vector<char> &Defines) const {
856 SparcV8TargetInfo::getTargetDefines(Defines);
857 getSolarisDefines(Defines);
858 }
859};
860} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000861
Chris Lattner85970f32008-05-08 05:58:21 +0000862namespace {
863 class PIC16TargetInfo : public TargetInfo{
864 public:
865 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000866 // FIXME: Is IntAlign really supposed to be 16? There seems
867 // little point on a platform with 8-bit loads.
868 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
869 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000870 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000871 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000872 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
873 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000874 virtual void getTargetDefines(std::vector<char> &Defines) const {
875 Define(Defines, "__pic16");
876 }
877 virtual void getTargetBuiltins(const Builtin::Info *&Records,
878 unsigned &NumRecords) const {}
879 virtual const char *getVAListDeclaration() const { return "";}
880 virtual const char *getClobbers() const {return "";}
881 virtual const char *getTargetPrefix() const {return "";}
882 virtual void getGCCRegNames(const char * const *&Names,
883 unsigned &NumNames) const {}
884 virtual bool validateAsmConstraint(char c,
885 TargetInfo::ConstraintInfo &info) const {
886 return true;
887 }
888 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
889 unsigned &NumAliases) const {}
890 virtual bool useGlobalsForAutomaticVariables() const {return true;}
891 };
892}
893
Chris Lattner4b009652007-07-25 00:24:17 +0000894//===----------------------------------------------------------------------===//
895// Driver code
896//===----------------------------------------------------------------------===//
897
Ted Kremenekb97d7672007-12-04 17:07:35 +0000898static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000899 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
900 TT[4] == '-' && TT[1] - '3' < 6);
901}
902
Chris Lattnerfc457002008-03-05 01:18:20 +0000903/// CreateTargetInfo - Return the target info object for the specified target
904/// triple.
905TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner2c63b9f2007-12-05 18:41:05 +0000906 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000907 return new DarwinPPCTargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000908
Chris Lattnerfc457002008-03-05 01:18:20 +0000909 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000910 return new DarwinPPC64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000911
Chris Lattner9fd73612008-04-21 18:56:49 +0000912 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
913 return new DarwinARMTargetInfo(T);
914
Chris Lattnerfc457002008-03-05 01:18:20 +0000915 if (T.find("sparc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000916 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000917
Chris Lattnerfc457002008-03-05 01:18:20 +0000918 if (T.find("x86_64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000919 return new DarwinX86_64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000920
Chris Lattner85970f32008-05-08 05:58:21 +0000921 if (T.find("pic16-") == 0)
922 return new PIC16TargetInfo(T);
923
Chris Lattnerfc457002008-03-05 01:18:20 +0000924 if (IsX86(T))
Chris Lattner0fb8d852008-03-08 08:24:01 +0000925 return new DarwinI386TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000926
Chris Lattnerfc457002008-03-05 01:18:20 +0000927 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000928}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000929