blob: bc35d7fe8e77204460938b85d1227401f97612ab [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
Daniel Dunbar1be1df32008-08-11 21:35:06 +000056 if (1) { // FIXME: -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000057 Define(Defs, "__weak", "");
58 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000059 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000060 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
61 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
62 Define(Defs, "__OBJC_GC__");
Chris Lattner4b009652007-07-25 00:24:17 +000063 }
64
65 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000066 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000067
68 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000069 Define(Defs, "__PASCAL_STRINGS__");
Daniel Dunbar1be1df32008-08-11 21:35:06 +000070
71 if (0) // FIXME: -fnext-runtime controls this
72 Define(Defs, "__NEXT_RUNTIME__");
Chris Lattner4b009652007-07-25 00:24:17 +000073 }
74
75};
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000076
77
Chris Lattner0fb8d852008-03-08 08:24:01 +000078class SolarisTargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000079public:
Chris Lattner0fb8d852008-03-08 08:24:01 +000080 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000081
82 virtual void getTargetDefines(std::vector<char> &Defs) const {
83// FIXME: we need a real target configuration system. For now, only define
84// __SUN__ if the host has it.
85#ifdef __SUN__
86 Define(Defs, "__SUN__");
87 Define(Defs, "__SOLARIS__");
88#endif
89
90 if (1) {// -fobjc-gc controls this.
91 Define(Defs, "__weak", "");
92 Define(Defs, "__strong", "");
93 } else {
94 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
95 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
96 Define(Defs, "__OBJC_GC__");
97 }
98 }
99
100};
Chris Lattner4b009652007-07-25 00:24:17 +0000101} // end anonymous namespace.
102
103
104/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
105/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000106static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000107 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000108 Define(Defs, "__ppc__");
109 Define(Defs, "_ARCH_PPC");
110 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000111 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000112 Define(Defs, "_ARCH_PPC64");
113 Define(Defs, "_LP64");
114 Define(Defs, "__LP64__");
115 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000116 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000117 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000118 }
119
120 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000121 Define(Defs, "_BIG_ENDIAN");
122 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000123
124 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000125 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
126 Define(Defs, "__INTMAX_TYPE__", "long int");
127 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
128 Define(Defs, "__PTRDIFF_TYPE__", "long int");
129 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000130 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000131 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
132 Define(Defs, "__INTMAX_TYPE__", "long long int");
133 Define(Defs, "__LONG_MAX__", "2147483647L");
134 Define(Defs, "__PTRDIFF_TYPE__", "int");
135 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000136 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000137 Define(Defs, "__INT_MAX__", "2147483647");
138 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
139 Define(Defs, "__CHAR_BIT__", "8");
140 Define(Defs, "__SCHAR_MAX__", "127");
141 Define(Defs, "__SHRT_MAX__", "32767");
142 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000143
144 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000145 Define(Defs, "__USER_LABEL_PREFIX__", "_");
146 Define(Defs, "__NATURAL_ALIGNMENT__");
147 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000148
Chris Lattner0db667a2007-10-06 06:57:34 +0000149 Define(Defs, "__WCHAR_MAX__", "2147483647");
150 Define(Defs, "__WCHAR_TYPE__", "int");
151 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000152
153 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000154 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
155 Define(Defs, "__FLT_DIG__", "6");
156 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
157 Define(Defs, "__FLT_EVAL_METHOD__", "0");
158 Define(Defs, "__FLT_HAS_INFINITY__");
159 Define(Defs, "__FLT_HAS_QUIET_NAN__");
160 Define(Defs, "__FLT_MANT_DIG__", "24");
161 Define(Defs, "__FLT_MAX_10_EXP__", "38");
162 Define(Defs, "__FLT_MAX_EXP__", "128");
163 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
164 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
165 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
166 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
167 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000168
169 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000170 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
171 Define(Defs, "__DBL_DIG__", "15");
172 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
173 Define(Defs, "__DBL_HAS_INFINITY__");
174 Define(Defs, "__DBL_HAS_QUIET_NAN__");
175 Define(Defs, "__DBL_MANT_DIG__", "53");
176 Define(Defs, "__DBL_MAX_10_EXP__", "308");
177 Define(Defs, "__DBL_MAX_EXP__", "1024");
178 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
179 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
180 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
181 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
182 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000183
184 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000185 Define(Defs, "__LDBL_DENORM_MIN__",
186 "4.94065645841246544176568792868221e-324L");
187 Define(Defs, "__LDBL_DIG__", "31");
188 Define(Defs, "__LDBL_EPSILON__",
189 "4.94065645841246544176568792868221e-324L");
190 Define(Defs, "__LDBL_HAS_INFINITY__");
191 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
192 Define(Defs, "__LDBL_MANT_DIG__", "106");
193 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
194 Define(Defs, "__LDBL_MAX_EXP__", "1024");
195 Define(Defs, "__LDBL_MAX__",
196 "1.79769313486231580793728971405301e+308L");
197 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
198 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
199 Define(Defs, "__LDBL_MIN__",
200 "2.00416836000897277799610805135016e-292L");
201 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000202}
203
204/// getX86Defines - Return a set of the X86-specific #defines that are
205/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000206static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000207 // Target identification.
208 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000209 Define(Defs, "_LP64");
210 Define(Defs, "__LP64__");
211 Define(Defs, "__amd64__");
212 Define(Defs, "__amd64");
213 Define(Defs, "__x86_64");
214 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000215 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000216 Define(Defs, "__i386__");
217 Define(Defs, "__i386");
218 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000219 }
220
221 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000222 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000223
224 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000225 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
226 Define(Defs, "__INTMAX_TYPE__", "long int");
227 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
228 Define(Defs, "__PTRDIFF_TYPE__", "long int");
229 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000230 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000231 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
232 Define(Defs, "__INTMAX_TYPE__", "long long int");
233 Define(Defs, "__LONG_MAX__", "2147483647L");
234 Define(Defs, "__PTRDIFF_TYPE__", "int");
235 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000236 }
Anders Carlsson82b26282008-07-22 17:16:13 +0000237 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner0db667a2007-10-06 06:57:34 +0000238 Define(Defs, "__CHAR_BIT__", "8");
239 Define(Defs, "__INT_MAX__", "2147483647");
240 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
241 Define(Defs, "__SCHAR_MAX__", "127");
242 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner4b009652007-07-25 00:24:17 +0000243
244 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000245 Define(Defs, "__nocona");
246 Define(Defs, "__nocona__");
247 Define(Defs, "__tune_nocona__");
248 Define(Defs, "__SSE2_MATH__");
249 Define(Defs, "__SSE2__");
250 Define(Defs, "__SSE_MATH__");
251 Define(Defs, "__SSE__");
252 Define(Defs, "__MMX__");
253 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000254
Chris Lattner0db667a2007-10-06 06:57:34 +0000255 Define(Defs, "__WCHAR_MAX__", "2147483647");
256 Define(Defs, "__WCHAR_TYPE__", "int");
257 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000258
259 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000260 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
261 Define(Defs, "__FLT_DIG__", "6");
262 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
263 Define(Defs, "__FLT_EVAL_METHOD__", "0");
264 Define(Defs, "__FLT_HAS_INFINITY__");
265 Define(Defs, "__FLT_HAS_QUIET_NAN__");
266 Define(Defs, "__FLT_MANT_DIG__", "24");
267 Define(Defs, "__FLT_MAX_10_EXP__", "38");
268 Define(Defs, "__FLT_MAX_EXP__", "128");
269 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
270 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
271 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
272 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
273 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000274
275 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000276 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
277 Define(Defs, "__DBL_DIG__", "15");
278 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
279 Define(Defs, "__DBL_HAS_INFINITY__");
280 Define(Defs, "__DBL_HAS_QUIET_NAN__");
281 Define(Defs, "__DBL_MANT_DIG__", "53");
282 Define(Defs, "__DBL_MAX_10_EXP__", "308");
283 Define(Defs, "__DBL_MAX_EXP__", "1024");
284 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
285 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
286 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
287 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
288 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000289
290 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000291 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
292 Define(Defs, "__LDBL_DIG__", "18");
293 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
294 Define(Defs, "__LDBL_HAS_INFINITY__");
295 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
296 Define(Defs, "__LDBL_MANT_DIG__", "64");
297 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
298 Define(Defs, "__LDBL_MAX_EXP__", "16384");
299 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
300 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
301 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
302 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000303}
304
Chris Lattnerb6444052008-04-21 20:19:54 +0000305/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000306/// not tied to a specific subtarget.
307static void getARMDefines(std::vector<char> &Defs) {
308 // Target identification.
309 Define(Defs, "__arm");
310 Define(Defs, "__arm__");
311
312 // Target properties.
313 Define(Defs, "__LITTLE_ENDIAN__");
314
315 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
316 Define(Defs, "__INTMAX_TYPE__", "long long int");
317 Define(Defs, "__LONG_MAX__", "2147483647L");
318 Define(Defs, "__PTRDIFF_TYPE__", "int");
319 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
320 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
321
322 Define(Defs, "__CHAR_BIT__", "8");
323 Define(Defs, "__INT_MAX__", "2147483647");
324 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
325 Define(Defs, "__SCHAR_MAX__", "127");
326 Define(Defs, "__SHRT_MAX__", "32767");
327
328 // Subtarget options. [hard coded to v6 for now]
329 Define(Defs, "__ARM_ARCH_6K__");
330 Define(Defs, "__ARMEL__");
331 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
332
333 Define(Defs, "__WCHAR_MAX__", "2147483647");
334 Define(Defs, "__WCHAR_TYPE__", "int");
335 Define(Defs, "__WINT_TYPE__", "int");
336 Define(Defs, "__DECIMAL_DIG__", "17");
337 Define(Defs, "__FLT_RADIX__", "2");
338
339 // Float macros.
340 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
341 Define(Defs, "__FLT_DIG__", "6");
342 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
343 Define(Defs, "__FLT_EVAL_METHOD__", "0");
344 Define(Defs, "__FLT_HAS_INFINITY__");
345 Define(Defs, "__FLT_HAS_QUIET_NAN__");
346 Define(Defs, "__FLT_MANT_DIG__", "24");
347 Define(Defs, "__FLT_MAX_10_EXP__", "38");
348 Define(Defs, "__FLT_MAX_EXP__", "128");
349 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
350 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
351 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
352 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
353
354 // Double macros.
355 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
356 Define(Defs, "__DBL_DIG__", "15");
357 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
358 Define(Defs, "__DBL_HAS_INFINITY__");
359 Define(Defs, "__DBL_HAS_QUIET_NAN__");
360 Define(Defs, "__DBL_MANT_DIG__", "53");
361 Define(Defs, "__DBL_MAX_10_EXP__", "308");
362 Define(Defs, "__DBL_MAX_EXP__", "1024");
363 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
364 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
365 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
366 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
367
368 // 64-bit Long double macros (same as double).
369 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
370 Define(Defs, "__LDBL_DIG__", "15");
371 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
372 Define(Defs, "__LDBL_HAS_INFINITY__");
373 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
374 Define(Defs, "__LDBL_MANT_DIG__", "53");
375 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
376 Define(Defs, "__LDBL_MAX_EXP__", "1024");
377 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
378 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
379 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
380 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
381}
382
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000383static const char* getI386VAListDeclaration() {
384 return "typedef char* __builtin_va_list;";
385}
386
387static const char* getX86_64VAListDeclaration() {
388 return
389 "typedef struct __va_list_tag {"
390 " unsigned gp_offset;"
391 " unsigned fp_offset;"
392 " void* overflow_arg_area;"
393 " void* reg_save_area;"
394 "} __builtin_va_list[1];";
395}
396
397static const char* getPPCVAListDeclaration() {
398 return
399 "typedef struct __va_list_tag {"
400 " unsigned char gpr;"
401 " unsigned char fpr;"
402 " unsigned short reserved;"
403 " void* overflow_arg_area;"
404 " void* reg_save_area;"
405 "} __builtin_va_list[1];";
406}
407
Chris Lattner9fd73612008-04-21 18:56:49 +0000408static const char* getARMVAListDeclaration() {
409 return "typedef char* __builtin_va_list;";
410}
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000411
Chris Lattner4b009652007-07-25 00:24:17 +0000412/// PPC builtin info.
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000413namespace clang {
Chris Lattner4b009652007-07-25 00:24:17 +0000414namespace PPC {
Chris Lattner4b009652007-07-25 00:24:17 +0000415
416 static const Builtin::Info BuiltinInfo[] = {
417#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000418#include "clang/AST/PPCBuiltins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000419 };
420
421 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
422 Records = BuiltinInfo;
423 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
424 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000425
426 static const char * const GCCRegNames[] = {
427 "0", "1", "2", "3", "4", "5", "6", "7",
428 "8", "9", "10", "11", "12", "13", "14", "15",
429 "16", "17", "18", "19", "20", "21", "22", "23",
430 "24", "25", "26", "27", "28", "29", "30", "31",
431 "0", "1", "2", "3", "4", "5", "6", "7",
432 "8", "9", "10", "11", "12", "13", "14", "15",
433 "16", "17", "18", "19", "20", "21", "22", "23",
434 "24", "25", "26", "27", "28", "29", "30", "31",
435 "mq", "lr", "ctr", "ap",
436 "0", "1", "2", "3", "4", "5", "6", "7",
437 "xer",
438 "0", "1", "2", "3", "4", "5", "6", "7",
439 "8", "9", "10", "11", "12", "13", "14", "15",
440 "16", "17", "18", "19", "20", "21", "22", "23",
441 "24", "25", "26", "27", "28", "29", "30", "31",
442 "vrsave", "vscr",
443 "spe_acc", "spefscr",
444 "sfp"
445 };
446
447 static void getGCCRegNames(const char * const *&Names,
448 unsigned &NumNames) {
449 Names = GCCRegNames;
450 NumNames = llvm::array_lengthof(GCCRegNames);
451 }
452
Chris Lattner0fb8d852008-03-08 08:24:01 +0000453 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000454 // While some of these aliases do map to different registers
455 // they still share the same register name.
456 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
457 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
458 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
459 { { "cr3", "fr3", "r3", "v3"}, "3" },
460 { { "cr4", "fr4", "r4", "v4"}, "4" },
461 { { "cr5", "fr5", "r5", "v5"}, "5" },
462 { { "cr6", "fr6", "r6", "v6"}, "6" },
463 { { "cr7", "fr7", "r7", "v7"}, "7" },
464 { { "fr8", "r8", "v8"}, "8" },
465 { { "fr9", "r9", "v9"}, "9" },
466 { { "fr10", "r10", "v10"}, "10" },
467 { { "fr11", "r11", "v11"}, "11" },
468 { { "fr12", "r12", "v12"}, "12" },
469 { { "fr13", "r13", "v13"}, "13" },
470 { { "fr14", "r14", "v14"}, "14" },
471 { { "fr15", "r15", "v15"}, "15" },
472 { { "fr16", "r16", "v16"}, "16" },
473 { { "fr17", "r17", "v17"}, "17" },
474 { { "fr18", "r18", "v18"}, "18" },
475 { { "fr19", "r19", "v19"}, "19" },
476 { { "fr20", "r20", "v20"}, "20" },
477 { { "fr21", "r21", "v21"}, "21" },
478 { { "fr22", "r22", "v22"}, "22" },
479 { { "fr23", "r23", "v23"}, "23" },
480 { { "fr24", "r24", "v24"}, "24" },
481 { { "fr25", "r25", "v25"}, "25" },
482 { { "fr26", "r26", "v26"}, "26" },
483 { { "fr27", "r27", "v27"}, "27" },
484 { { "fr28", "r28", "v28"}, "28" },
485 { { "fr29", "r29", "v29"}, "29" },
486 { { "fr30", "r30", "v30"}, "30" },
487 { { "fr31", "r31", "v31"}, "31" },
488 };
489
Chris Lattner0fb8d852008-03-08 08:24:01 +0000490 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000491 unsigned &NumAliases) {
492 Aliases = GCCRegAliases;
493 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000494 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000495
Anders Carlsson4ce42302007-11-27 04:11:28 +0000496 static bool validateAsmConstraint(char c,
497 TargetInfo::ConstraintInfo &info) {
498 switch (c) {
499 default: return false;
500 case 'O': // Zero
501 return true;
502 case 'b': // Base register
503 case 'f': // Floating point register
504 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
505 return true;
506 }
507 }
508
509 const char *getClobbers() {
510 return 0;
511 }
512
Anders Carlsson333052c2007-12-08 19:32:57 +0000513 const char *getTargetPrefix() {
514 return "ppc";
515 }
516
Chris Lattner4b009652007-07-25 00:24:17 +0000517} // End namespace PPC
518
Chris Lattner4b009652007-07-25 00:24:17 +0000519/// X86 builtin info.
520namespace X86 {
Chris Lattner4b009652007-07-25 00:24:17 +0000521 static const Builtin::Info BuiltinInfo[] = {
522#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000523#include "clang/AST/X86Builtins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000524 };
525
526 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
527 Records = BuiltinInfo;
528 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
529 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000530
531 static const char *GCCRegNames[] = {
532 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
533 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlssonc411b492007-11-25 00:23:10 +0000534 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000535 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
536 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
537 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
538 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
539 };
540
541 static void getGCCRegNames(const char * const *&Names,
542 unsigned &NumNames) {
543 Names = GCCRegNames;
544 NumNames = llvm::array_lengthof(GCCRegNames);
545 }
546
Chris Lattner0fb8d852008-03-08 08:24:01 +0000547 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000548 { { "al", "ah", "eax", "rax" }, "ax" },
549 { { "bl", "bh", "ebx", "rbx" }, "bx" },
550 { { "cl", "ch", "ecx", "rcx" }, "cx" },
551 { { "dl", "dh", "edx", "rdx" }, "dx" },
552 { { "esi", "rsi" }, "si" },
Nuno Lopesfd7bf3a2008-07-07 12:18:07 +0000553 { { "edi", "rdi" }, "di" },
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000554 { { "esp", "rsp" }, "sp" },
555 { { "ebp", "rbp" }, "bp" },
556 };
557
Chris Lattner0fb8d852008-03-08 08:24:01 +0000558 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000559 unsigned &NumAliases) {
560 Aliases = GCCRegAliases;
561 NumAliases = llvm::array_lengthof(GCCRegAliases);
562 }
563
Anders Carlsson4ce42302007-11-27 04:11:28 +0000564 static bool validateAsmConstraint(char c,
565 TargetInfo::ConstraintInfo &info) {
566 switch (c) {
567 default: return false;
568 case 'a': // eax.
569 case 'b': // ebx.
570 case 'c': // ecx.
571 case 'd': // edx.
572 case 'S': // esi.
573 case 'D': // edi.
574 case 'A': // edx:eax.
575 case 't': // top of floating point stack.
576 case 'u': // second from top of floating point stack.
577 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlssonae77fa02008-03-10 22:37:16 +0000578 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
579 // instructions.
580 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonf8e50d92008-02-18 17:00:25 +0000581 // instructions.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000582 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
583 return true;
584 }
585 }
586
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000587 static std::string convertConstraint(const char Constraint) {
588 switch (Constraint) {
589 case 'a': return std::string("{ax}");
590 case 'b': return std::string("{bx}");
591 case 'c': return std::string("{cx}");
592 case 'd': return std::string("{dx}");
593 case 'S': return std::string("{si}");
594 case 'D': return std::string("{di}");
595 case 't': // top of floating point stack.
596 return std::string("{st}");
597 case 'u': // second from top of floating point stack.
598 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000599 default:
600 return std::string(1, Constraint);
601 }
602 }
603
Anders Carlsson4ce42302007-11-27 04:11:28 +0000604 const char *getClobbers() {
605 return "~{dirflag},~{fpsr},~{flags}";
606 }
607
Anders Carlsson333052c2007-12-08 19:32:57 +0000608 const char *getTargetPrefix() {
609 return "x86";
610 }
611
Chris Lattner4b009652007-07-25 00:24:17 +0000612} // End namespace X86
Chris Lattner9fd73612008-04-21 18:56:49 +0000613
614
615/// ARM builtin info.
616namespace ARM {
617 const char *getTargetPrefix() {
618 return "arm";
619 }
620} // End namespace ARM
621
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000622} // end namespace clang.
Chris Lattner4b009652007-07-25 00:24:17 +0000623
624//===----------------------------------------------------------------------===//
625// Specific target implementations.
626//===----------------------------------------------------------------------===//
627
628
629namespace {
630class DarwinPPCTargetInfo : public DarwinTargetInfo {
631public:
Eli Friedman2fde2a52008-05-20 14:25:01 +0000632 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
633 CharIsSigned = false;
634 }
Ted Kremenek40499482007-12-03 22:06:55 +0000635
Chris Lattner0db667a2007-10-06 06:57:34 +0000636 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000637 DarwinTargetInfo::getTargetDefines(Defines);
638 getPowerPCDefines(Defines, false);
639 }
640 virtual void getTargetBuiltins(const Builtin::Info *&Records,
641 unsigned &NumRecords) const {
642 PPC::getBuiltins(Records, NumRecords);
643 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000644 virtual const char *getVAListDeclaration() const {
645 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000646 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000647 virtual const char *getTargetPrefix() const {
648 return PPC::getTargetPrefix();
649 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000650 virtual void getGCCRegNames(const char * const *&Names,
651 unsigned &NumNames) const {
652 PPC::getGCCRegNames(Names, NumNames);
653 }
654 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
655 unsigned &NumAliases) const {
656 PPC::getGCCRegAliases(Aliases, NumAliases);
657 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000658 virtual bool validateAsmConstraint(char c,
659 TargetInfo::ConstraintInfo &info) const {
660 return PPC::validateAsmConstraint(c, info);
661 }
662 virtual const char *getClobbers() const {
663 return PPC::getClobbers();
664 }
Chris Lattner4b009652007-07-25 00:24:17 +0000665};
666} // end anonymous namespace.
667
668namespace {
669class DarwinPPC64TargetInfo : public DarwinTargetInfo {
670public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000671 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman2fde2a52008-05-20 14:25:01 +0000672 CharIsSigned = false;
Chris Lattnere5fde952008-05-09 06:17:04 +0000673 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
674 }
Ted Kremenek40499482007-12-03 22:06:55 +0000675
Chris Lattner0db667a2007-10-06 06:57:34 +0000676 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000677 DarwinTargetInfo::getTargetDefines(Defines);
678 getPowerPCDefines(Defines, true);
679 }
680 virtual void getTargetBuiltins(const Builtin::Info *&Records,
681 unsigned &NumRecords) const {
682 PPC::getBuiltins(Records, NumRecords);
683 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000684 virtual const char *getVAListDeclaration() const {
685 return getPPCVAListDeclaration();
686 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000687 virtual const char *getTargetPrefix() const {
688 return PPC::getTargetPrefix();
689 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000690 virtual void getGCCRegNames(const char * const *&Names,
691 unsigned &NumNames) const {
692 PPC::getGCCRegNames(Names, NumNames);
693 }
694 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
695 unsigned &NumAliases) const {
696 PPC::getGCCRegAliases(Aliases, NumAliases);
697 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000698 virtual bool validateAsmConstraint(char c,
699 TargetInfo::ConstraintInfo &info) const {
700 return PPC::validateAsmConstraint(c, info);
701 }
702 virtual const char *getClobbers() const {
703 return PPC::getClobbers();
704 }
Chris Lattner4b009652007-07-25 00:24:17 +0000705};
706} // end anonymous namespace.
707
708namespace {
709class DarwinI386TargetInfo : public DarwinTargetInfo {
710public:
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000711 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
712 DoubleAlign = LongLongAlign = 32;
Eli Friedman4a712852008-06-04 17:01:45 +0000713 LongDoubleWidth = 128;
714 LongDoubleAlign = 128;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000715 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
716 }
717
Chris Lattner0db667a2007-10-06 06:57:34 +0000718 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000719 DarwinTargetInfo::getTargetDefines(Defines);
720 getX86Defines(Defines, false);
721 }
722 virtual void getTargetBuiltins(const Builtin::Info *&Records,
723 unsigned &NumRecords) const {
724 X86::getBuiltins(Records, NumRecords);
725 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000726 virtual const char *getVAListDeclaration() const {
727 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000728 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000729 virtual const char *getTargetPrefix() const {
730 return X86::getTargetPrefix();
731 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000732 virtual void getGCCRegNames(const char * const *&Names,
733 unsigned &NumNames) const {
734 X86::getGCCRegNames(Names, NumNames);
735 }
736 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
737 unsigned &NumAliases) const {
738 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000739 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000740 virtual bool validateAsmConstraint(char c,
741 TargetInfo::ConstraintInfo &info) const {
742 return X86::validateAsmConstraint(c, info);
743 }
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000744
745 virtual std::string convertConstraint(const char Constraint) const {
746 return X86::convertConstraint(Constraint);
747 }
748
Anders Carlsson4ce42302007-11-27 04:11:28 +0000749 virtual const char *getClobbers() const {
750 return X86::getClobbers();
751 }
Chris Lattner4b009652007-07-25 00:24:17 +0000752};
753} // end anonymous namespace.
754
755namespace {
756class DarwinX86_64TargetInfo : public DarwinTargetInfo {
757public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000758 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
759 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000760 LongDoubleWidth = 128;
761 LongDoubleAlign = 128;
762 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnere5fde952008-05-09 06:17:04 +0000763 }
Ted Kremenek40499482007-12-03 22:06:55 +0000764
Chris Lattner0db667a2007-10-06 06:57:34 +0000765 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000766 DarwinTargetInfo::getTargetDefines(Defines);
767 getX86Defines(Defines, true);
768 }
769 virtual void getTargetBuiltins(const Builtin::Info *&Records,
770 unsigned &NumRecords) const {
771 X86::getBuiltins(Records, NumRecords);
772 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000773 virtual const char *getVAListDeclaration() const {
774 return getX86_64VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000775 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000776 virtual const char *getTargetPrefix() const {
777 return X86::getTargetPrefix();
778 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000779 virtual void getGCCRegNames(const char * const *&Names,
780 unsigned &NumNames) const {
781 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000782 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000783 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
784 unsigned &NumAliases) const {
785 X86::getGCCRegAliases(Aliases, NumAliases);
786 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000787 virtual bool validateAsmConstraint(char c,
788 TargetInfo::ConstraintInfo &info) const {
789 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000790 }
791 virtual std::string convertConstraint(const char Constraint) const {
792 return X86::convertConstraint(Constraint);
793 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000794 virtual const char *getClobbers() const {
795 return X86::getClobbers();
796 }
Chris Lattner4b009652007-07-25 00:24:17 +0000797};
798} // end anonymous namespace.
799
Chris Lattner9fd73612008-04-21 18:56:49 +0000800
801namespace {
802class DarwinARMTargetInfo : public DarwinTargetInfo {
803public:
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000804 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
805 // FIXME: Are the defaults corrent for ARM?
806 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000807
808 virtual void getTargetDefines(std::vector<char> &Defines) const {
809 DarwinTargetInfo::getTargetDefines(Defines);
810 getARMDefines(Defines);
811 }
812 virtual void getTargetBuiltins(const Builtin::Info *&Records,
813 unsigned &NumRecords) const {
814 NumRecords = 0;
815 }
816 virtual const char *getVAListDeclaration() const {
817 return getARMVAListDeclaration();
818 }
819 virtual const char *getTargetPrefix() const {
820 return ARM::getTargetPrefix();
821 }
822
823 virtual void getGCCRegNames(const char * const *&Names,
824 unsigned &NumNames) const {
825 NumNames = 0;
826 }
827 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
828 unsigned &NumAliases) const {
829 NumAliases = 0;
830 }
831 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000832 TargetInfo::ConstraintInfo &info) const {
833 switch (c) {
834 default:
835 case 'l': // r0-r7
836 case 'h': // r8-r15
837 case 'w': // VFP Floating point register single precision
838 case 'P': // VFP Floating point register double precision
839 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
840 return true;
841 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000842 return false;
843 }
844 virtual const char *getClobbers() const {
845 return "";
846 }
847};
848} // end anonymous namespace.
849
Chris Lattner4b009652007-07-25 00:24:17 +0000850namespace {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000851class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
852public:
853 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
854
855 virtual void getTargetDefines(std::vector<char> &Defines) const {
856 SolarisTargetInfo::getTargetDefines(Defines);
857// getSparcDefines(Defines, false);
858 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000859 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000860 Define(Defines, "__sparcv8");
861 }
862 virtual void getTargetBuiltins(const Builtin::Info *&Records,
863 unsigned &NumRecords) const {
864 PPC::getBuiltins(Records, NumRecords);
865 }
866 virtual const char *getVAListDeclaration() const {
867 return getPPCVAListDeclaration();
868 }
869 virtual const char *getTargetPrefix() const {
870 return PPC::getTargetPrefix();
871 }
872 virtual void getGCCRegNames(const char * const *&Names,
873 unsigned &NumNames) const {
874 PPC::getGCCRegNames(Names, NumNames);
875 }
876 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
877 unsigned &NumAliases) const {
878 PPC::getGCCRegAliases(Aliases, NumAliases);
879 }
880 virtual bool validateAsmConstraint(char c,
881 TargetInfo::ConstraintInfo &info) const {
882 return PPC::validateAsmConstraint(c, info);
883 }
884 virtual const char *getClobbers() const {
885 return PPC::getClobbers();
886 }
887};
888
889} // end anonymous namespace.
890
Chris Lattner4b009652007-07-25 00:24:17 +0000891
Chris Lattner85970f32008-05-08 05:58:21 +0000892namespace {
893 class PIC16TargetInfo : public TargetInfo{
894 public:
895 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000896 // FIXME: Is IntAlign really supposed to be 16? There seems
897 // little point on a platform with 8-bit loads.
898 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
899 PointerAlign = 8;
Chris Lattner85970f32008-05-08 05:58:21 +0000900 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000901 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
902 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000903 virtual void getTargetDefines(std::vector<char> &Defines) const {
904 Define(Defines, "__pic16");
905 }
906 virtual void getTargetBuiltins(const Builtin::Info *&Records,
907 unsigned &NumRecords) const {}
908 virtual const char *getVAListDeclaration() const { return "";}
909 virtual const char *getClobbers() const {return "";}
910 virtual const char *getTargetPrefix() const {return "";}
911 virtual void getGCCRegNames(const char * const *&Names,
912 unsigned &NumNames) const {}
913 virtual bool validateAsmConstraint(char c,
914 TargetInfo::ConstraintInfo &info) const {
915 return true;
916 }
917 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
918 unsigned &NumAliases) const {}
919 virtual bool useGlobalsForAutomaticVariables() const {return true;}
920 };
921}
922
Chris Lattner4b009652007-07-25 00:24:17 +0000923//===----------------------------------------------------------------------===//
924// Driver code
925//===----------------------------------------------------------------------===//
926
Ted Kremenekb97d7672007-12-04 17:07:35 +0000927static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000928 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
929 TT[4] == '-' && TT[1] - '3' < 6);
930}
931
Chris Lattnerfc457002008-03-05 01:18:20 +0000932/// CreateTargetInfo - Return the target info object for the specified target
933/// triple.
934TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner2c63b9f2007-12-05 18:41:05 +0000935 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000936 return new DarwinPPCTargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000937
Chris Lattnerfc457002008-03-05 01:18:20 +0000938 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000939 return new DarwinPPC64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000940
Chris Lattner9fd73612008-04-21 18:56:49 +0000941 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
942 return new DarwinARMTargetInfo(T);
943
Chris Lattnerfc457002008-03-05 01:18:20 +0000944 if (T.find("sparc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000945 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000946
Chris Lattnerfc457002008-03-05 01:18:20 +0000947 if (T.find("x86_64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000948 return new DarwinX86_64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000949
Chris Lattner85970f32008-05-08 05:58:21 +0000950 if (T.find("pic16-") == 0)
951 return new PIC16TargetInfo(T);
952
Chris Lattnerfc457002008-03-05 01:18:20 +0000953 if (IsX86(T))
Chris Lattner0fb8d852008-03-08 08:24:01 +0000954 return new DarwinI386TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000955
Chris Lattnerfc457002008-03-05 01:18:20 +0000956 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000957}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000958