blob: 84220b6f831577629d3121e2331c11c0dee163e7 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekbbced582007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Ted Kremenekae360762007-12-03 22:06:55 +000020
Reid Spencer5f016e22007-07-11 17:01:13 +000021using namespace clang;
22
Reid Spencer5f016e22007-07-11 17:01:13 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattnerd15fa822007-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
Reid Spencer5f016e22007-07-11 17:01:13 +000038namespace {
Chris Lattner0eaed122008-03-08 08:24:01 +000039class DarwinTargetInfo : public TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +000040public:
Chris Lattner0eaed122008-03-08 08:24:01 +000041 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenekae360762007-12-03 22:06:55 +000042
Chris Lattnerd15fa822007-10-06 06:57:34 +000043 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner338128b2007-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 Lattnerd15fa822007-10-06 06:57:34 +000047 Define(Defs, "__APPLE__");
48 Define(Defs, "__MACH__");
Chris Lattner338128b2007-10-17 06:04:46 +000049#endif
Reid Spencer5f016e22007-07-11 17:01:13 +000050
51 if (1) {// -fobjc-gc controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000052 Define(Defs, "__weak", "");
53 Define(Defs, "__strong", "");
Reid Spencer5f016e22007-07-11 17:01:13 +000054 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +000055 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
56 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
57 Define(Defs, "__OBJC_GC__");
Reid Spencer5f016e22007-07-11 17:01:13 +000058 }
59
60 // darwin_constant_cfstrings controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000061 Define(Defs, "__CONSTANT_CFSTRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000062
63 if (0) // darwin_pascal_strings
Chris Lattnerd15fa822007-10-06 06:57:34 +000064 Define(Defs, "__PASCAL_STRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000065 }
66
67};
Gabor Greif26658672008-02-21 16:29:08 +000068
69
Chris Lattner0eaed122008-03-08 08:24:01 +000070class SolarisTargetInfo : public TargetInfo {
Gabor Greif26658672008-02-21 16:29:08 +000071public:
Chris Lattner0eaed122008-03-08 08:24:01 +000072 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif26658672008-02-21 16:29:08 +000073
74 virtual void getTargetDefines(std::vector<char> &Defs) const {
75// FIXME: we need a real target configuration system. For now, only define
76// __SUN__ if the host has it.
77#ifdef __SUN__
78 Define(Defs, "__SUN__");
79 Define(Defs, "__SOLARIS__");
80#endif
81
82 if (1) {// -fobjc-gc controls this.
83 Define(Defs, "__weak", "");
84 Define(Defs, "__strong", "");
85 } else {
86 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
87 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
88 Define(Defs, "__OBJC_GC__");
89 }
90 }
91
92};
Reid Spencer5f016e22007-07-11 17:01:13 +000093} // end anonymous namespace.
94
95
96/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
97/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +000098static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +000099 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000100 Define(Defs, "__ppc__");
101 Define(Defs, "_ARCH_PPC");
102 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000103 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000104 Define(Defs, "_ARCH_PPC64");
105 Define(Defs, "_LP64");
106 Define(Defs, "__LP64__");
107 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000108 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000109 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000110 }
111
112 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000113 Define(Defs, "_BIG_ENDIAN");
114 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000115
116 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000117 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
118 Define(Defs, "__INTMAX_TYPE__", "long int");
119 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
120 Define(Defs, "__PTRDIFF_TYPE__", "long int");
121 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000122 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000123 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
124 Define(Defs, "__INTMAX_TYPE__", "long long int");
125 Define(Defs, "__LONG_MAX__", "2147483647L");
126 Define(Defs, "__PTRDIFF_TYPE__", "int");
127 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000128 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000129 Define(Defs, "__INT_MAX__", "2147483647");
130 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
131 Define(Defs, "__CHAR_BIT__", "8");
132 Define(Defs, "__SCHAR_MAX__", "127");
133 Define(Defs, "__SHRT_MAX__", "32767");
134 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000135
136 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000137 Define(Defs, "__USER_LABEL_PREFIX__", "_");
138 Define(Defs, "__NATURAL_ALIGNMENT__");
139 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000140
Chris Lattnerd15fa822007-10-06 06:57:34 +0000141 Define(Defs, "__WCHAR_MAX__", "2147483647");
142 Define(Defs, "__WCHAR_TYPE__", "int");
143 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000144
145 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000146 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
147 Define(Defs, "__FLT_DIG__", "6");
148 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
149 Define(Defs, "__FLT_EVAL_METHOD__", "0");
150 Define(Defs, "__FLT_HAS_INFINITY__");
151 Define(Defs, "__FLT_HAS_QUIET_NAN__");
152 Define(Defs, "__FLT_MANT_DIG__", "24");
153 Define(Defs, "__FLT_MAX_10_EXP__", "38");
154 Define(Defs, "__FLT_MAX_EXP__", "128");
155 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
156 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
157 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
158 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
159 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000160
161 // double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000162 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
163 Define(Defs, "__DBL_DIG__", "15");
164 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
165 Define(Defs, "__DBL_HAS_INFINITY__");
166 Define(Defs, "__DBL_HAS_QUIET_NAN__");
167 Define(Defs, "__DBL_MANT_DIG__", "53");
168 Define(Defs, "__DBL_MAX_10_EXP__", "308");
169 Define(Defs, "__DBL_MAX_EXP__", "1024");
170 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
171 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
172 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
173 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
174 Define(Defs, "__DECIMAL_DIG__", "33");
Reid Spencer5f016e22007-07-11 17:01:13 +0000175
176 // 128-bit long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000177 Define(Defs, "__LDBL_DENORM_MIN__",
178 "4.94065645841246544176568792868221e-324L");
179 Define(Defs, "__LDBL_DIG__", "31");
180 Define(Defs, "__LDBL_EPSILON__",
181 "4.94065645841246544176568792868221e-324L");
182 Define(Defs, "__LDBL_HAS_INFINITY__");
183 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
184 Define(Defs, "__LDBL_MANT_DIG__", "106");
185 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
186 Define(Defs, "__LDBL_MAX_EXP__", "1024");
187 Define(Defs, "__LDBL_MAX__",
188 "1.79769313486231580793728971405301e+308L");
189 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
190 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
191 Define(Defs, "__LDBL_MIN__",
192 "2.00416836000897277799610805135016e-292L");
193 Define(Defs, "__LONG_DOUBLE_128__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000194}
195
196/// getX86Defines - Return a set of the X86-specific #defines that are
197/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000198static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000199 // Target identification.
200 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000201 Define(Defs, "_LP64");
202 Define(Defs, "__LP64__");
203 Define(Defs, "__amd64__");
204 Define(Defs, "__amd64");
205 Define(Defs, "__x86_64");
206 Define(Defs, "__x86_64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000207 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000208 Define(Defs, "__i386__");
209 Define(Defs, "__i386");
210 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000211 }
212
213 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000214 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000215
216 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000217 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
218 Define(Defs, "__INTMAX_TYPE__", "long int");
219 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
220 Define(Defs, "__PTRDIFF_TYPE__", "long int");
221 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Lauro Ramos Venancioe0e3abc2008-01-20 04:02:16 +0000222 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000223 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000224 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
225 Define(Defs, "__INTMAX_TYPE__", "long long int");
226 Define(Defs, "__LONG_MAX__", "2147483647L");
227 Define(Defs, "__PTRDIFF_TYPE__", "int");
228 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Lauro Ramos Venancioe0e3abc2008-01-20 04:02:16 +0000229 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000230 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000231 Define(Defs, "__CHAR_BIT__", "8");
232 Define(Defs, "__INT_MAX__", "2147483647");
233 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
234 Define(Defs, "__SCHAR_MAX__", "127");
235 Define(Defs, "__SHRT_MAX__", "32767");
Reid Spencer5f016e22007-07-11 17:01:13 +0000236
237 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000238 Define(Defs, "__nocona");
239 Define(Defs, "__nocona__");
240 Define(Defs, "__tune_nocona__");
241 Define(Defs, "__SSE2_MATH__");
242 Define(Defs, "__SSE2__");
243 Define(Defs, "__SSE_MATH__");
244 Define(Defs, "__SSE__");
245 Define(Defs, "__MMX__");
246 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000247
Chris Lattnerd15fa822007-10-06 06:57:34 +0000248 Define(Defs, "__WCHAR_MAX__", "2147483647");
249 Define(Defs, "__WCHAR_TYPE__", "int");
250 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000251
252 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000253 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
254 Define(Defs, "__FLT_DIG__", "6");
255 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
256 Define(Defs, "__FLT_EVAL_METHOD__", "0");
257 Define(Defs, "__FLT_HAS_INFINITY__");
258 Define(Defs, "__FLT_HAS_QUIET_NAN__");
259 Define(Defs, "__FLT_MANT_DIG__", "24");
260 Define(Defs, "__FLT_MAX_10_EXP__", "38");
261 Define(Defs, "__FLT_MAX_EXP__", "128");
262 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
263 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
264 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
265 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
266 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000267
268 // Double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000269 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
270 Define(Defs, "__DBL_DIG__", "15");
271 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
272 Define(Defs, "__DBL_HAS_INFINITY__");
273 Define(Defs, "__DBL_HAS_QUIET_NAN__");
274 Define(Defs, "__DBL_MANT_DIG__", "53");
275 Define(Defs, "__DBL_MAX_10_EXP__", "308");
276 Define(Defs, "__DBL_MAX_EXP__", "1024");
277 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
278 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
279 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
280 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
281 Define(Defs, "__DECIMAL_DIG__", "21");
Reid Spencer5f016e22007-07-11 17:01:13 +0000282
283 // 80-bit Long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000284 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
285 Define(Defs, "__LDBL_DIG__", "18");
286 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
287 Define(Defs, "__LDBL_HAS_INFINITY__");
288 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
289 Define(Defs, "__LDBL_MANT_DIG__", "64");
290 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
291 Define(Defs, "__LDBL_MAX_EXP__", "16384");
292 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
293 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
294 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
295 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Reid Spencer5f016e22007-07-11 17:01:13 +0000296}
297
Chris Lattner393ff042008-04-21 18:56:49 +0000298/// getX86Defines - Return a set of the X86-specific #defines that are
299/// not tied to a specific subtarget.
300static void getARMDefines(std::vector<char> &Defs) {
301 // Target identification.
302 Define(Defs, "__arm");
303 Define(Defs, "__arm__");
304
305 // Target properties.
306 Define(Defs, "__LITTLE_ENDIAN__");
307
308 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
309 Define(Defs, "__INTMAX_TYPE__", "long long int");
310 Define(Defs, "__LONG_MAX__", "2147483647L");
311 Define(Defs, "__PTRDIFF_TYPE__", "int");
312 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
313 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
314
315 Define(Defs, "__CHAR_BIT__", "8");
316 Define(Defs, "__INT_MAX__", "2147483647");
317 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
318 Define(Defs, "__SCHAR_MAX__", "127");
319 Define(Defs, "__SHRT_MAX__", "32767");
320
321 // Subtarget options. [hard coded to v6 for now]
322 Define(Defs, "__ARM_ARCH_6K__");
323 Define(Defs, "__ARMEL__");
324 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
325
326 Define(Defs, "__WCHAR_MAX__", "2147483647");
327 Define(Defs, "__WCHAR_TYPE__", "int");
328 Define(Defs, "__WINT_TYPE__", "int");
329 Define(Defs, "__DECIMAL_DIG__", "17");
330 Define(Defs, "__FLT_RADIX__", "2");
331
332 // Float macros.
333 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
334 Define(Defs, "__FLT_DIG__", "6");
335 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
336 Define(Defs, "__FLT_EVAL_METHOD__", "0");
337 Define(Defs, "__FLT_HAS_INFINITY__");
338 Define(Defs, "__FLT_HAS_QUIET_NAN__");
339 Define(Defs, "__FLT_MANT_DIG__", "24");
340 Define(Defs, "__FLT_MAX_10_EXP__", "38");
341 Define(Defs, "__FLT_MAX_EXP__", "128");
342 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
343 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
344 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
345 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
346
347 // Double macros.
348 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
349 Define(Defs, "__DBL_DIG__", "15");
350 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
351 Define(Defs, "__DBL_HAS_INFINITY__");
352 Define(Defs, "__DBL_HAS_QUIET_NAN__");
353 Define(Defs, "__DBL_MANT_DIG__", "53");
354 Define(Defs, "__DBL_MAX_10_EXP__", "308");
355 Define(Defs, "__DBL_MAX_EXP__", "1024");
356 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
357 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
358 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
359 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
360
361 // 64-bit Long double macros (same as double).
362 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
363 Define(Defs, "__LDBL_DIG__", "15");
364 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
365 Define(Defs, "__LDBL_HAS_INFINITY__");
366 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
367 Define(Defs, "__LDBL_MANT_DIG__", "53");
368 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
369 Define(Defs, "__LDBL_MAX_EXP__", "1024");
370 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
371 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
372 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
373 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
374}
375
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000376static const char* getI386VAListDeclaration() {
377 return "typedef char* __builtin_va_list;";
378}
379
380static const char* getX86_64VAListDeclaration() {
381 return
382 "typedef struct __va_list_tag {"
383 " unsigned gp_offset;"
384 " unsigned fp_offset;"
385 " void* overflow_arg_area;"
386 " void* reg_save_area;"
387 "} __builtin_va_list[1];";
388}
389
390static const char* getPPCVAListDeclaration() {
391 return
392 "typedef struct __va_list_tag {"
393 " unsigned char gpr;"
394 " unsigned char fpr;"
395 " unsigned short reserved;"
396 " void* overflow_arg_area;"
397 " void* reg_save_area;"
398 "} __builtin_va_list[1];";
399}
400
Chris Lattner393ff042008-04-21 18:56:49 +0000401static const char* getARMVAListDeclaration() {
402 return "typedef char* __builtin_va_list;";
403}
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000404
Reid Spencer5f016e22007-07-11 17:01:13 +0000405/// PPC builtin info.
Chris Lattnerfb344d32007-12-11 04:36:28 +0000406namespace clang {
Reid Spencer5f016e22007-07-11 17:01:13 +0000407namespace PPC {
Reid Spencer5f016e22007-07-11 17:01:13 +0000408
409 static const Builtin::Info BuiltinInfo[] = {
410#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000411#include "clang/AST/PPCBuiltins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000412 };
413
414 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
415 Records = BuiltinInfo;
416 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
417 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000418
419 static const char * const GCCRegNames[] = {
420 "0", "1", "2", "3", "4", "5", "6", "7",
421 "8", "9", "10", "11", "12", "13", "14", "15",
422 "16", "17", "18", "19", "20", "21", "22", "23",
423 "24", "25", "26", "27", "28", "29", "30", "31",
424 "0", "1", "2", "3", "4", "5", "6", "7",
425 "8", "9", "10", "11", "12", "13", "14", "15",
426 "16", "17", "18", "19", "20", "21", "22", "23",
427 "24", "25", "26", "27", "28", "29", "30", "31",
428 "mq", "lr", "ctr", "ap",
429 "0", "1", "2", "3", "4", "5", "6", "7",
430 "xer",
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 "vrsave", "vscr",
436 "spe_acc", "spefscr",
437 "sfp"
438 };
439
440 static void getGCCRegNames(const char * const *&Names,
441 unsigned &NumNames) {
442 Names = GCCRegNames;
443 NumNames = llvm::array_lengthof(GCCRegNames);
444 }
445
Chris Lattner0eaed122008-03-08 08:24:01 +0000446 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000447 // While some of these aliases do map to different registers
448 // they still share the same register name.
449 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
450 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
451 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
452 { { "cr3", "fr3", "r3", "v3"}, "3" },
453 { { "cr4", "fr4", "r4", "v4"}, "4" },
454 { { "cr5", "fr5", "r5", "v5"}, "5" },
455 { { "cr6", "fr6", "r6", "v6"}, "6" },
456 { { "cr7", "fr7", "r7", "v7"}, "7" },
457 { { "fr8", "r8", "v8"}, "8" },
458 { { "fr9", "r9", "v9"}, "9" },
459 { { "fr10", "r10", "v10"}, "10" },
460 { { "fr11", "r11", "v11"}, "11" },
461 { { "fr12", "r12", "v12"}, "12" },
462 { { "fr13", "r13", "v13"}, "13" },
463 { { "fr14", "r14", "v14"}, "14" },
464 { { "fr15", "r15", "v15"}, "15" },
465 { { "fr16", "r16", "v16"}, "16" },
466 { { "fr17", "r17", "v17"}, "17" },
467 { { "fr18", "r18", "v18"}, "18" },
468 { { "fr19", "r19", "v19"}, "19" },
469 { { "fr20", "r20", "v20"}, "20" },
470 { { "fr21", "r21", "v21"}, "21" },
471 { { "fr22", "r22", "v22"}, "22" },
472 { { "fr23", "r23", "v23"}, "23" },
473 { { "fr24", "r24", "v24"}, "24" },
474 { { "fr25", "r25", "v25"}, "25" },
475 { { "fr26", "r26", "v26"}, "26" },
476 { { "fr27", "r27", "v27"}, "27" },
477 { { "fr28", "r28", "v28"}, "28" },
478 { { "fr29", "r29", "v29"}, "29" },
479 { { "fr30", "r30", "v30"}, "30" },
480 { { "fr31", "r31", "v31"}, "31" },
481 };
482
Chris Lattner0eaed122008-03-08 08:24:01 +0000483 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000484 unsigned &NumAliases) {
485 Aliases = GCCRegAliases;
486 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssond04c6e22007-11-27 04:11:28 +0000487 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000488
Anders Carlssond04c6e22007-11-27 04:11:28 +0000489 static bool validateAsmConstraint(char c,
490 TargetInfo::ConstraintInfo &info) {
491 switch (c) {
492 default: return false;
493 case 'O': // Zero
494 return true;
495 case 'b': // Base register
496 case 'f': // Floating point register
497 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
498 return true;
499 }
500 }
501
502 const char *getClobbers() {
503 return 0;
504 }
505
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000506 const char *getTargetPrefix() {
507 return "ppc";
508 }
509
Reid Spencer5f016e22007-07-11 17:01:13 +0000510} // End namespace PPC
511
Reid Spencer5f016e22007-07-11 17:01:13 +0000512/// X86 builtin info.
513namespace X86 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000514 static const Builtin::Info BuiltinInfo[] = {
515#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000516#include "clang/AST/X86Builtins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000517 };
518
519 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
520 Records = BuiltinInfo;
521 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
522 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000523
524 static const char *GCCRegNames[] = {
525 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
526 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlsson646b2612007-11-25 00:23:10 +0000527 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson3346ae62007-11-24 23:38:12 +0000528 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
529 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
530 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
531 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
532 };
533
534 static void getGCCRegNames(const char * const *&Names,
535 unsigned &NumNames) {
536 Names = GCCRegNames;
537 NumNames = llvm::array_lengthof(GCCRegNames);
538 }
539
Chris Lattner0eaed122008-03-08 08:24:01 +0000540 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000541 { { "al", "ah", "eax", "rax" }, "ax" },
542 { { "bl", "bh", "ebx", "rbx" }, "bx" },
543 { { "cl", "ch", "ecx", "rcx" }, "cx" },
544 { { "dl", "dh", "edx", "rdx" }, "dx" },
545 { { "esi", "rsi" }, "si" },
546 { { "esp", "rsp" }, "sp" },
547 { { "ebp", "rbp" }, "bp" },
548 };
549
Chris Lattner0eaed122008-03-08 08:24:01 +0000550 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000551 unsigned &NumAliases) {
552 Aliases = GCCRegAliases;
553 NumAliases = llvm::array_lengthof(GCCRegAliases);
554 }
555
Anders Carlssond04c6e22007-11-27 04:11:28 +0000556 static bool validateAsmConstraint(char c,
557 TargetInfo::ConstraintInfo &info) {
558 switch (c) {
559 default: return false;
560 case 'a': // eax.
561 case 'b': // ebx.
562 case 'c': // ecx.
563 case 'd': // edx.
564 case 'S': // esi.
565 case 'D': // edi.
566 case 'A': // edx:eax.
567 case 't': // top of floating point stack.
568 case 'u': // second from top of floating point stack.
569 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlsson456e79d2008-03-10 22:37:16 +0000570 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
571 // instructions.
572 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonb41edf92008-02-18 17:00:25 +0000573 // instructions.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000574 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
575 return true;
576 }
577 }
578
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000579 static std::string convertConstraint(const char Constraint) {
580 switch (Constraint) {
581 case 'a': return std::string("{ax}");
582 case 'b': return std::string("{bx}");
583 case 'c': return std::string("{cx}");
584 case 'd': return std::string("{dx}");
585 case 'S': return std::string("{si}");
586 case 'D': return std::string("{di}");
587 case 't': // top of floating point stack.
588 return std::string("{st}");
589 case 'u': // second from top of floating point stack.
590 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000591 default:
592 return std::string(1, Constraint);
593 }
594 }
595
Anders Carlssond04c6e22007-11-27 04:11:28 +0000596 const char *getClobbers() {
597 return "~{dirflag},~{fpsr},~{flags}";
598 }
599
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000600 const char *getTargetPrefix() {
601 return "x86";
602 }
603
Reid Spencer5f016e22007-07-11 17:01:13 +0000604} // End namespace X86
Chris Lattner393ff042008-04-21 18:56:49 +0000605
606
607/// ARM builtin info.
608namespace ARM {
609 const char *getTargetPrefix() {
610 return "arm";
611 }
612} // End namespace ARM
613
Chris Lattnerfb344d32007-12-11 04:36:28 +0000614} // end namespace clang.
Reid Spencer5f016e22007-07-11 17:01:13 +0000615
616//===----------------------------------------------------------------------===//
617// Specific target implementations.
618//===----------------------------------------------------------------------===//
619
620
621namespace {
622class DarwinPPCTargetInfo : public DarwinTargetInfo {
623public:
Ted Kremenekae360762007-12-03 22:06:55 +0000624 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
625
Chris Lattnerd15fa822007-10-06 06:57:34 +0000626 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000627 DarwinTargetInfo::getTargetDefines(Defines);
628 getPowerPCDefines(Defines, false);
629 }
630 virtual void getTargetBuiltins(const Builtin::Info *&Records,
631 unsigned &NumRecords) const {
632 PPC::getBuiltins(Records, NumRecords);
633 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000634 virtual const char *getVAListDeclaration() const {
635 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000636 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000637 virtual const char *getTargetPrefix() const {
638 return PPC::getTargetPrefix();
639 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000640 virtual void getGCCRegNames(const char * const *&Names,
641 unsigned &NumNames) const {
642 PPC::getGCCRegNames(Names, NumNames);
643 }
644 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
645 unsigned &NumAliases) const {
646 PPC::getGCCRegAliases(Aliases, NumAliases);
647 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000648 virtual bool validateAsmConstraint(char c,
649 TargetInfo::ConstraintInfo &info) const {
650 return PPC::validateAsmConstraint(c, info);
651 }
652 virtual const char *getClobbers() const {
653 return PPC::getClobbers();
654 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000655};
656} // end anonymous namespace.
657
658namespace {
659class DarwinPPC64TargetInfo : public DarwinTargetInfo {
660public:
Ted Kremenekae360762007-12-03 22:06:55 +0000661 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
662
Chris Lattnerd15fa822007-10-06 06:57:34 +0000663 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000664 DarwinTargetInfo::getTargetDefines(Defines);
665 getPowerPCDefines(Defines, true);
666 }
667 virtual void getTargetBuiltins(const Builtin::Info *&Records,
668 unsigned &NumRecords) const {
669 PPC::getBuiltins(Records, NumRecords);
670 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000671 virtual const char *getVAListDeclaration() const {
672 return getPPCVAListDeclaration();
673 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000674 virtual const char *getTargetPrefix() const {
675 return PPC::getTargetPrefix();
676 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000677 virtual void getGCCRegNames(const char * const *&Names,
678 unsigned &NumNames) const {
679 PPC::getGCCRegNames(Names, NumNames);
680 }
681 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
682 unsigned &NumAliases) const {
683 PPC::getGCCRegAliases(Aliases, NumAliases);
684 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000685 virtual bool validateAsmConstraint(char c,
686 TargetInfo::ConstraintInfo &info) const {
687 return PPC::validateAsmConstraint(c, info);
688 }
689 virtual const char *getClobbers() const {
690 return PPC::getClobbers();
691 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000692};
693} // end anonymous namespace.
694
695namespace {
696class DarwinI386TargetInfo : public DarwinTargetInfo {
697public:
Ted Kremenekae360762007-12-03 22:06:55 +0000698 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
699
Chris Lattnerd15fa822007-10-06 06:57:34 +0000700 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000701 DarwinTargetInfo::getTargetDefines(Defines);
702 getX86Defines(Defines, false);
703 }
704 virtual void getTargetBuiltins(const Builtin::Info *&Records,
705 unsigned &NumRecords) const {
706 X86::getBuiltins(Records, NumRecords);
707 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000708 virtual const char *getVAListDeclaration() const {
709 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000710 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000711 virtual const char *getTargetPrefix() const {
712 return X86::getTargetPrefix();
713 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000714 virtual void getGCCRegNames(const char * const *&Names,
715 unsigned &NumNames) const {
716 X86::getGCCRegNames(Names, NumNames);
717 }
718 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
719 unsigned &NumAliases) const {
720 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000721 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000722 virtual bool validateAsmConstraint(char c,
723 TargetInfo::ConstraintInfo &info) const {
724 return X86::validateAsmConstraint(c, info);
725 }
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000726
727 virtual std::string convertConstraint(const char Constraint) const {
728 return X86::convertConstraint(Constraint);
729 }
730
Anders Carlssond04c6e22007-11-27 04:11:28 +0000731 virtual const char *getClobbers() const {
732 return X86::getClobbers();
733 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000734};
735} // end anonymous namespace.
736
737namespace {
738class DarwinX86_64TargetInfo : public DarwinTargetInfo {
739public:
Ted Kremenekae360762007-12-03 22:06:55 +0000740 DarwinX86_64TargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {}
741
Chris Lattnerd15fa822007-10-06 06:57:34 +0000742 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000743 DarwinTargetInfo::getTargetDefines(Defines);
744 getX86Defines(Defines, true);
745 }
746 virtual void getTargetBuiltins(const Builtin::Info *&Records,
747 unsigned &NumRecords) const {
748 X86::getBuiltins(Records, NumRecords);
749 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000750 virtual const char *getVAListDeclaration() const {
751 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000752 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000753 virtual const char *getTargetPrefix() const {
754 return X86::getTargetPrefix();
755 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000756 virtual void getGCCRegNames(const char * const *&Names,
757 unsigned &NumNames) const {
758 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000759 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000760 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
761 unsigned &NumAliases) const {
762 X86::getGCCRegAliases(Aliases, NumAliases);
763 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000764 virtual bool validateAsmConstraint(char c,
765 TargetInfo::ConstraintInfo &info) const {
766 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000767 }
768 virtual std::string convertConstraint(const char Constraint) const {
769 return X86::convertConstraint(Constraint);
770 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000771 virtual const char *getClobbers() const {
772 return X86::getClobbers();
773 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000774};
775} // end anonymous namespace.
776
Chris Lattner393ff042008-04-21 18:56:49 +0000777
778namespace {
779class DarwinARMTargetInfo : public DarwinTargetInfo {
780public:
781 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {}
782
783 virtual void getTargetDefines(std::vector<char> &Defines) const {
784 DarwinTargetInfo::getTargetDefines(Defines);
785 getARMDefines(Defines);
786 }
787 virtual void getTargetBuiltins(const Builtin::Info *&Records,
788 unsigned &NumRecords) const {
789 NumRecords = 0;
790 }
791 virtual const char *getVAListDeclaration() const {
792 return getARMVAListDeclaration();
793 }
794 virtual const char *getTargetPrefix() const {
795 return ARM::getTargetPrefix();
796 }
797
798 virtual void getGCCRegNames(const char * const *&Names,
799 unsigned &NumNames) const {
800 NumNames = 0;
801 }
802 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
803 unsigned &NumAliases) const {
804 NumAliases = 0;
805 }
806 virtual bool validateAsmConstraint(char c,
807 TargetInfo::ConstraintInfo &Info) const {
808 return false;
809 }
810 virtual const char *getClobbers() const {
811 return "";
812 }
813};
814} // end anonymous namespace.
815
Reid Spencer5f016e22007-07-11 17:01:13 +0000816namespace {
Gabor Greif26658672008-02-21 16:29:08 +0000817class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
818public:
819 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
820
821 virtual void getTargetDefines(std::vector<char> &Defines) const {
822 SolarisTargetInfo::getTargetDefines(Defines);
823// getSparcDefines(Defines, false);
824 Define(Defines, "__sparc");
825 Define(Defines, "__sparcv8");
826 }
827 virtual void getTargetBuiltins(const Builtin::Info *&Records,
828 unsigned &NumRecords) const {
829 PPC::getBuiltins(Records, NumRecords);
830 }
831 virtual const char *getVAListDeclaration() const {
832 return getPPCVAListDeclaration();
833 }
834 virtual const char *getTargetPrefix() const {
835 return PPC::getTargetPrefix();
836 }
837 virtual void getGCCRegNames(const char * const *&Names,
838 unsigned &NumNames) const {
839 PPC::getGCCRegNames(Names, NumNames);
840 }
841 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
842 unsigned &NumAliases) const {
843 PPC::getGCCRegAliases(Aliases, NumAliases);
844 }
845 virtual bool validateAsmConstraint(char c,
846 TargetInfo::ConstraintInfo &info) const {
847 return PPC::validateAsmConstraint(c, info);
848 }
849 virtual const char *getClobbers() const {
850 return PPC::getClobbers();
851 }
852};
853
854} // end anonymous namespace.
855
Reid Spencer5f016e22007-07-11 17:01:13 +0000856
857//===----------------------------------------------------------------------===//
858// Driver code
859//===----------------------------------------------------------------------===//
860
Ted Kremenek8448d382007-12-04 17:07:35 +0000861static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000862 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
863 TT[4] == '-' && TT[1] - '3' < 6);
864}
865
Chris Lattner42e67372008-03-05 01:18:20 +0000866/// CreateTargetInfo - Return the target info object for the specified target
867/// triple.
868TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner82817ba2007-12-05 18:41:05 +0000869 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000870 return new DarwinPPCTargetInfo(T);
Ted Kremenekaead4722007-12-03 23:23:21 +0000871
Chris Lattner42e67372008-03-05 01:18:20 +0000872 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000873 return new DarwinPPC64TargetInfo(T);
Reid Spencer5f016e22007-07-11 17:01:13 +0000874
Chris Lattner393ff042008-04-21 18:56:49 +0000875 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
876 return new DarwinARMTargetInfo(T);
877
Chris Lattner42e67372008-03-05 01:18:20 +0000878 if (T.find("sparc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000879 return new SolarisSparcV8TargetInfo(T); // ugly hack
Ted Kremenekae360762007-12-03 22:06:55 +0000880
Chris Lattner42e67372008-03-05 01:18:20 +0000881 if (T.find("x86_64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000882 return new DarwinX86_64TargetInfo(T);
Chris Lattner42e67372008-03-05 01:18:20 +0000883
884 if (IsX86(T))
Chris Lattner0eaed122008-03-08 08:24:01 +0000885 return new DarwinI386TargetInfo(T);
Chris Lattner42e67372008-03-05 01:18:20 +0000886
Chris Lattner42e67372008-03-05 01:18:20 +0000887 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +0000888}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +0000889