blob: 7ed6dbd100894235d09b6e17da9eece0462d40b6 [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 Lattner9fd73612008-04-21 18:56:49 +0000366static const char* getARMVAListDeclaration() {
367 return "typedef char* __builtin_va_list;";
368}
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000369
Chris Lattner4b009652007-07-25 00:24:17 +0000370/// PPC builtin info.
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000371namespace clang {
Chris Lattner4b009652007-07-25 00:24:17 +0000372namespace PPC {
Chris Lattner4b009652007-07-25 00:24:17 +0000373
374 static const Builtin::Info BuiltinInfo[] = {
375#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000376#include "clang/AST/PPCBuiltins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000377 };
378
379 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
380 Records = BuiltinInfo;
381 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
382 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000383
384 static const char * const GCCRegNames[] = {
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 "0", "1", "2", "3", "4", "5", "6", "7",
390 "8", "9", "10", "11", "12", "13", "14", "15",
391 "16", "17", "18", "19", "20", "21", "22", "23",
392 "24", "25", "26", "27", "28", "29", "30", "31",
393 "mq", "lr", "ctr", "ap",
394 "0", "1", "2", "3", "4", "5", "6", "7",
395 "xer",
396 "0", "1", "2", "3", "4", "5", "6", "7",
397 "8", "9", "10", "11", "12", "13", "14", "15",
398 "16", "17", "18", "19", "20", "21", "22", "23",
399 "24", "25", "26", "27", "28", "29", "30", "31",
400 "vrsave", "vscr",
401 "spe_acc", "spefscr",
402 "sfp"
403 };
404
405 static void getGCCRegNames(const char * const *&Names,
406 unsigned &NumNames) {
407 Names = GCCRegNames;
408 NumNames = llvm::array_lengthof(GCCRegNames);
409 }
410
Chris Lattner0fb8d852008-03-08 08:24:01 +0000411 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000412 // While some of these aliases do map to different registers
413 // they still share the same register name.
414 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
415 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
416 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
417 { { "cr3", "fr3", "r3", "v3"}, "3" },
418 { { "cr4", "fr4", "r4", "v4"}, "4" },
419 { { "cr5", "fr5", "r5", "v5"}, "5" },
420 { { "cr6", "fr6", "r6", "v6"}, "6" },
421 { { "cr7", "fr7", "r7", "v7"}, "7" },
422 { { "fr8", "r8", "v8"}, "8" },
423 { { "fr9", "r9", "v9"}, "9" },
424 { { "fr10", "r10", "v10"}, "10" },
425 { { "fr11", "r11", "v11"}, "11" },
426 { { "fr12", "r12", "v12"}, "12" },
427 { { "fr13", "r13", "v13"}, "13" },
428 { { "fr14", "r14", "v14"}, "14" },
429 { { "fr15", "r15", "v15"}, "15" },
430 { { "fr16", "r16", "v16"}, "16" },
431 { { "fr17", "r17", "v17"}, "17" },
432 { { "fr18", "r18", "v18"}, "18" },
433 { { "fr19", "r19", "v19"}, "19" },
434 { { "fr20", "r20", "v20"}, "20" },
435 { { "fr21", "r21", "v21"}, "21" },
436 { { "fr22", "r22", "v22"}, "22" },
437 { { "fr23", "r23", "v23"}, "23" },
438 { { "fr24", "r24", "v24"}, "24" },
439 { { "fr25", "r25", "v25"}, "25" },
440 { { "fr26", "r26", "v26"}, "26" },
441 { { "fr27", "r27", "v27"}, "27" },
442 { { "fr28", "r28", "v28"}, "28" },
443 { { "fr29", "r29", "v29"}, "29" },
444 { { "fr30", "r30", "v30"}, "30" },
445 { { "fr31", "r31", "v31"}, "31" },
446 };
447
Chris Lattner0fb8d852008-03-08 08:24:01 +0000448 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000449 unsigned &NumAliases) {
450 Aliases = GCCRegAliases;
451 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000452 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000453
Anders Carlsson4ce42302007-11-27 04:11:28 +0000454 static bool validateAsmConstraint(char c,
455 TargetInfo::ConstraintInfo &info) {
456 switch (c) {
457 default: return false;
458 case 'O': // Zero
459 return true;
460 case 'b': // Base register
461 case 'f': // Floating point register
462 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
463 return true;
464 }
465 }
466
467 const char *getClobbers() {
468 return 0;
469 }
470
Anders Carlsson333052c2007-12-08 19:32:57 +0000471 const char *getTargetPrefix() {
472 return "ppc";
473 }
474
Chris Lattner4b009652007-07-25 00:24:17 +0000475} // End namespace PPC
Chris Lattner9fd73612008-04-21 18:56:49 +0000476
477
478/// ARM builtin info.
479namespace ARM {
480 const char *getTargetPrefix() {
481 return "arm";
482 }
483} // End namespace ARM
484
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000485} // end namespace clang.
Chris Lattner4b009652007-07-25 00:24:17 +0000486
487//===----------------------------------------------------------------------===//
488// Specific target implementations.
489//===----------------------------------------------------------------------===//
490
491
492namespace {
493class DarwinPPCTargetInfo : public DarwinTargetInfo {
494public:
Eli Friedman2fde2a52008-05-20 14:25:01 +0000495 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
496 CharIsSigned = false;
497 }
Ted Kremenek40499482007-12-03 22:06:55 +0000498
Chris Lattner0db667a2007-10-06 06:57:34 +0000499 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000500 DarwinTargetInfo::getTargetDefines(Defines);
501 getPowerPCDefines(Defines, false);
502 }
503 virtual void getTargetBuiltins(const Builtin::Info *&Records,
504 unsigned &NumRecords) const {
505 PPC::getBuiltins(Records, NumRecords);
506 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000507 virtual const char *getVAListDeclaration() const {
508 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000509 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000510 virtual const char *getTargetPrefix() const {
511 return PPC::getTargetPrefix();
512 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000513 virtual void getGCCRegNames(const char * const *&Names,
514 unsigned &NumNames) const {
515 PPC::getGCCRegNames(Names, NumNames);
516 }
517 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
518 unsigned &NumAliases) const {
519 PPC::getGCCRegAliases(Aliases, NumAliases);
520 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000521 virtual bool validateAsmConstraint(char c,
522 TargetInfo::ConstraintInfo &info) const {
523 return PPC::validateAsmConstraint(c, info);
524 }
525 virtual const char *getClobbers() const {
526 return PPC::getClobbers();
527 }
Chris Lattner4b009652007-07-25 00:24:17 +0000528};
529} // end anonymous namespace.
530
531namespace {
532class DarwinPPC64TargetInfo : public DarwinTargetInfo {
533public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000534 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman2fde2a52008-05-20 14:25:01 +0000535 CharIsSigned = false;
Chris Lattnere5fde952008-05-09 06:17:04 +0000536 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
537 }
Ted Kremenek40499482007-12-03 22:06:55 +0000538
Chris Lattner0db667a2007-10-06 06:57:34 +0000539 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000540 DarwinTargetInfo::getTargetDefines(Defines);
541 getPowerPCDefines(Defines, true);
542 }
543 virtual void getTargetBuiltins(const Builtin::Info *&Records,
544 unsigned &NumRecords) const {
545 PPC::getBuiltins(Records, NumRecords);
546 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000547 virtual const char *getVAListDeclaration() const {
548 return getPPCVAListDeclaration();
549 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000550 virtual const char *getTargetPrefix() const {
551 return PPC::getTargetPrefix();
552 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000553 virtual void getGCCRegNames(const char * const *&Names,
554 unsigned &NumNames) const {
555 PPC::getGCCRegNames(Names, NumNames);
556 }
557 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
558 unsigned &NumAliases) const {
559 PPC::getGCCRegAliases(Aliases, NumAliases);
560 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000561 virtual bool validateAsmConstraint(char c,
562 TargetInfo::ConstraintInfo &info) const {
563 return PPC::validateAsmConstraint(c, info);
564 }
565 virtual const char *getClobbers() const {
566 return PPC::getClobbers();
567 }
Chris Lattner4b009652007-07-25 00:24:17 +0000568};
569} // end anonymous namespace.
570
571namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000572// Namespace for x86 abstract base class
573const Builtin::Info BuiltinInfo[] = {
574#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
575#include "clang/AST/X86Builtins.def"
576};
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000577
Eli Friedman872996c2008-08-20 02:34:37 +0000578const char *GCCRegNames[] = {
579 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
580 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
581 "argp", "flags", "fspr", "dirflag", "frame",
582 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
583 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
584 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
585 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
586};
587
588const TargetInfo::GCCRegAlias GCCRegAliases[] = {
589 { { "al", "ah", "eax", "rax" }, "ax" },
590 { { "bl", "bh", "ebx", "rbx" }, "bx" },
591 { { "cl", "ch", "ecx", "rcx" }, "cx" },
592 { { "dl", "dh", "edx", "rdx" }, "dx" },
593 { { "esi", "rsi" }, "si" },
594 { { "edi", "rdi" }, "di" },
595 { { "esp", "rsp" }, "sp" },
596 { { "ebp", "rbp" }, "bp" },
597};
598
599// X86 target abstract base class; x86-32 and x86-64 are very close, so
600// most of the implementation can be shared.
601class X86TargetInfo : public TargetInfo {
602public:
603 X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
604 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner4b009652007-07-25 00:24:17 +0000605 }
606 virtual void getTargetBuiltins(const Builtin::Info *&Records,
607 unsigned &NumRecords) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000608 Records = BuiltinInfo;
609 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner4b009652007-07-25 00:24:17 +0000610 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000611 virtual const char *getTargetPrefix() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000612 return "x86";
Anders Carlsson333052c2007-12-08 19:32:57 +0000613 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000614 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman872996c2008-08-20 02:34:37 +0000615 unsigned &NumNames) const {
616 Names = GCCRegNames;
617 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000618 }
619 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
620 unsigned &NumAliases) const {
Eli Friedman872996c2008-08-20 02:34:37 +0000621 Aliases = GCCRegAliases;
622 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000623 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000624 virtual bool validateAsmConstraint(char c,
Eli Friedman872996c2008-08-20 02:34:37 +0000625 TargetInfo::ConstraintInfo &info) const;
626 virtual std::string convertConstraint(const char Constraint) const;
Anders Carlsson4ce42302007-11-27 04:11:28 +0000627 virtual const char *getClobbers() const {
Eli Friedman872996c2008-08-20 02:34:37 +0000628 return "~{dirflag},~{fpsr},~{flags}";
629 }
Chris Lattner4b009652007-07-25 00:24:17 +0000630};
Eli Friedman872996c2008-08-20 02:34:37 +0000631
632bool
633X86TargetInfo::validateAsmConstraint(char c,
634 TargetInfo::ConstraintInfo &info) const {
635 switch (c) {
636 default: return false;
637 case 'a': // eax.
638 case 'b': // ebx.
639 case 'c': // ecx.
640 case 'd': // edx.
641 case 'S': // esi.
642 case 'D': // edi.
643 case 'A': // edx:eax.
644 case 't': // top of floating point stack.
645 case 'u': // second from top of floating point stack.
646 case 'q': // Any register accessible as [r]l: a, b, c, and d.
647 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
648 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
649 // instructions.
650 case 'N': // unsigned 8-bit integer constant for use with in and out
651 // instructions.
652 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
653 return true;
654 }
655}
656
657std::string
658X86TargetInfo::convertConstraint(const char Constraint) const {
659 switch (Constraint) {
660 case 'a': return std::string("{ax}");
661 case 'b': return std::string("{bx}");
662 case 'c': return std::string("{cx}");
663 case 'd': return std::string("{dx}");
664 case 'S': return std::string("{si}");
665 case 'D': return std::string("{di}");
666 case 't': // top of floating point stack.
667 return std::string("{st}");
668 case 'u': // second from top of floating point stack.
669 return std::string("{st(1)}"); // second from top of floating point stack.
670 default:
671 return std::string(1, Constraint);
672 }
673}
Eli Friedman872996c2008-08-20 02:34:37 +0000674} // end anonymous namespace
Chris Lattner4b009652007-07-25 00:24:17 +0000675
676namespace {
Eli Friedman872996c2008-08-20 02:34:37 +0000677// X86-32 generic target
678class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +0000679public:
Eli Friedman872996c2008-08-20 02:34:37 +0000680 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
681 DoubleAlign = LongLongAlign = 32;
682 LongDoubleWidth = 96;
683 LongDoubleAlign = 32;
684 }
685 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000686 return "typedef char* __builtin_va_list;";
Eli Friedman872996c2008-08-20 02:34:37 +0000687 }
688 virtual void getTargetDefines(std::vector<char> &Defines) const {
689 getX86Defines(Defines, false);
690 }
691};
692} // end anonymous namespace
693
694namespace {
695// x86-32 Darwin (OS X) target
696class DarwinI386TargetInfo : public X86_32TargetInfo {
697public:
698 DarwinI386TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
699 LongDoubleWidth = 128;
700 LongDoubleAlign = 128;
701 }
702 virtual void getTargetDefines(std::vector<char> &Defines) const {
703 X86_32TargetInfo::getTargetDefines(Defines);
704 getDarwinDefines(Defines);
705 }
706};
707} // end anonymous namespace
708
709namespace {
710// x86-64 generic target
711class X86_64TargetInfo : public X86TargetInfo {
712public:
713 X86_64TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
Chris Lattnere5fde952008-05-09 06:17:04 +0000714 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000715 LongDoubleWidth = 128;
716 LongDoubleAlign = 128;
Chris Lattner4b009652007-07-25 00:24:17 +0000717 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000718 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000719 return "typedef struct __va_list_tag {"
720 " unsigned gp_offset;"
721 " unsigned fp_offset;"
722 " void* overflow_arg_area;"
723 " void* reg_save_area;"
724 "} __builtin_va_list[1];";
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000725 }
Eli Friedman872996c2008-08-20 02:34:37 +0000726 virtual void getTargetDefines(std::vector<char> &Defines) const {
727 getX86Defines(Defines, true);
Anders Carlsson333052c2007-12-08 19:32:57 +0000728 }
Eli Friedman872996c2008-08-20 02:34:37 +0000729};
730} // end anonymous namespace
731
732namespace {
733// x86-64 Darwin (OS X) target
734class DarwinX86_64TargetInfo : public X86_64TargetInfo {
735public:
736 DarwinX86_64TargetInfo(const std::string& triple) :
737 X86_64TargetInfo(triple) {}
738
739 virtual void getTargetDefines(std::vector<char> &Defines) const {
740 X86_64TargetInfo::getTargetDefines(Defines);
741 getDarwinDefines(Defines);
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000742 }
Chris Lattner4b009652007-07-25 00:24:17 +0000743};
744} // end anonymous namespace.
745
Chris Lattner9fd73612008-04-21 18:56:49 +0000746
747namespace {
748class DarwinARMTargetInfo : public DarwinTargetInfo {
749public:
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000750 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
751 // FIXME: Are the defaults corrent for ARM?
752 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000753
754 virtual void getTargetDefines(std::vector<char> &Defines) const {
755 DarwinTargetInfo::getTargetDefines(Defines);
756 getARMDefines(Defines);
757 }
758 virtual void getTargetBuiltins(const Builtin::Info *&Records,
759 unsigned &NumRecords) const {
760 NumRecords = 0;
761 }
762 virtual const char *getVAListDeclaration() const {
763 return getARMVAListDeclaration();
764 }
765 virtual const char *getTargetPrefix() const {
766 return ARM::getTargetPrefix();
767 }
768
769 virtual void getGCCRegNames(const char * const *&Names,
770 unsigned &NumNames) const {
771 NumNames = 0;
772 }
773 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
774 unsigned &NumAliases) const {
775 NumAliases = 0;
776 }
777 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000778 TargetInfo::ConstraintInfo &info) const {
779 switch (c) {
780 default:
781 case 'l': // r0-r7
782 case 'h': // r8-r15
783 case 'w': // VFP Floating point register single precision
784 case 'P': // VFP Floating point register double precision
785 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
786 return true;
787 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000788 return false;
789 }
790 virtual const char *getClobbers() const {
791 return "";
792 }
793};
794} // end anonymous namespace.
795
Chris Lattner4b009652007-07-25 00:24:17 +0000796namespace {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000797class SparcV8TargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000798public:
Eli Friedmanff158dd2008-08-20 07:28:14 +0000799 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
800 // FIXME: Support Sparc quad-precision long double?
801 }
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000802 virtual void getTargetDefines(std::vector<char> &Defines) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000803 // FIXME: This is missing a lot of important defines; some of the
804 // missing stuff is likely to break system headers.
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000805 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000806 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000807 Define(Defines, "__sparcv8");
808 }
809 virtual void getTargetBuiltins(const Builtin::Info *&Records,
810 unsigned &NumRecords) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000811 // FIXME: Implement!
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000812 }
813 virtual const char *getVAListDeclaration() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000814 return "typedef void* __builtin_va_list;";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000815 }
816 virtual const char *getTargetPrefix() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000817 return "sparc";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000818 }
819 virtual void getGCCRegNames(const char * const *&Names,
820 unsigned &NumNames) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000821 // FIXME: Implement!
822 Names = 0;
823 NumNames = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000824 }
825 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
826 unsigned &NumAliases) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000827 // FIXME: Implement!
828 Aliases = 0;
829 NumAliases = 0;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000830 }
831 virtual bool validateAsmConstraint(char c,
832 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000833 // FIXME: Implement!
834 return false;
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000835 }
836 virtual const char *getClobbers() const {
Eli Friedmanff158dd2008-08-20 07:28:14 +0000837 // FIXME: Implement!
838 return "";
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000839 }
840};
841
842} // end anonymous namespace.
843
Eli Friedmanff158dd2008-08-20 07:28:14 +0000844namespace {
845class SolarisSparcV8TargetInfo : public SparcV8TargetInfo {
846public:
847 SolarisSparcV8TargetInfo(const std::string& triple) :
848 SparcV8TargetInfo(triple) {}
849
850 virtual void getTargetDefines(std::vector<char> &Defines) const {
851 SparcV8TargetInfo::getTargetDefines(Defines);
852 getSolarisDefines(Defines);
853 }
854};
855} // end anonymous namespace.
Chris Lattner4b009652007-07-25 00:24:17 +0000856
Chris Lattner85970f32008-05-08 05:58:21 +0000857namespace {
858 class PIC16TargetInfo : public TargetInfo{
859 public:
860 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000861 // FIXME: Is IntAlign really supposed to be 16? There seems
862 // little point on a platform with 8-bit loads.
863 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
864 PointerAlign = 8;
Sanjiv Guptaebd8f0f2008-08-18 10:05:22 +0000865 DescriptionString = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8";
Chris Lattner85970f32008-05-08 05:58:21 +0000866 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000867 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
868 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000869 virtual void getTargetDefines(std::vector<char> &Defines) const {
870 Define(Defines, "__pic16");
871 }
872 virtual void getTargetBuiltins(const Builtin::Info *&Records,
873 unsigned &NumRecords) const {}
874 virtual const char *getVAListDeclaration() const { return "";}
875 virtual const char *getClobbers() const {return "";}
876 virtual const char *getTargetPrefix() const {return "";}
877 virtual void getGCCRegNames(const char * const *&Names,
878 unsigned &NumNames) const {}
879 virtual bool validateAsmConstraint(char c,
880 TargetInfo::ConstraintInfo &info) const {
881 return true;
882 }
883 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
884 unsigned &NumAliases) const {}
885 virtual bool useGlobalsForAutomaticVariables() const {return true;}
886 };
887}
888
Chris Lattner4b009652007-07-25 00:24:17 +0000889//===----------------------------------------------------------------------===//
890// Driver code
891//===----------------------------------------------------------------------===//
892
Ted Kremenekb97d7672007-12-04 17:07:35 +0000893static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000894 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
895 TT[4] == '-' && TT[1] - '3' < 6);
896}
897
Chris Lattnerfc457002008-03-05 01:18:20 +0000898/// CreateTargetInfo - Return the target info object for the specified target
899/// triple.
900TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner2c63b9f2007-12-05 18:41:05 +0000901 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000902 return new DarwinPPCTargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000903
Chris Lattnerfc457002008-03-05 01:18:20 +0000904 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000905 return new DarwinPPC64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000906
Chris Lattner9fd73612008-04-21 18:56:49 +0000907 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
908 return new DarwinARMTargetInfo(T);
909
Chris Lattnerfc457002008-03-05 01:18:20 +0000910 if (T.find("sparc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000911 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000912
Chris Lattnerfc457002008-03-05 01:18:20 +0000913 if (T.find("x86_64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000914 return new DarwinX86_64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000915
Chris Lattner85970f32008-05-08 05:58:21 +0000916 if (T.find("pic16-") == 0)
917 return new PIC16TargetInfo(T);
918
Chris Lattnerfc457002008-03-05 01:18:20 +0000919 if (IsX86(T))
Chris Lattner0fb8d852008-03-08 08:24:01 +0000920 return new DarwinI386TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000921
Chris Lattnerfc457002008-03-05 01:18:20 +0000922 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000923}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000924