blob: ee5875a7817d5609370cd1a3add6138af0a15ce9 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-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 Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Ted Kremenekb0615542007-12-03 22:06:55 +000020
Chris Lattner5ba61f02006-10-14 07:39:34 +000021using namespace clang;
22
Chris Lattner5ba61f02006-10-14 07:39:34 +000023//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000024// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000025//===----------------------------------------------------------------------===//
26
Chris Lattnerb2d486a2007-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 Lattner5ba61f02006-10-14 07:39:34 +000038namespace {
Chris Lattnerc3a669b2008-03-08 08:24:01 +000039class DarwinTargetInfo : public TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +000040public:
Chris Lattnerc3a669b2008-03-08 08:24:01 +000041 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenekb0615542007-12-03 22:06:55 +000042
Chris Lattnerb2d486a2007-10-06 06:57:34 +000043 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner253023b2007-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 Lattnerb2d486a2007-10-06 06:57:34 +000047 Define(Defs, "__APPLE__");
48 Define(Defs, "__MACH__");
Chris Lattner253023b2007-10-17 06:04:46 +000049#endif
Chris Lattner9c837532006-10-15 01:05:46 +000050
51 if (1) {// -fobjc-gc controls this.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000052 Define(Defs, "__weak", "");
53 Define(Defs, "__strong", "");
Chris Lattner9c837532006-10-15 01:05:46 +000054 } else {
Chris Lattnerb2d486a2007-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__");
Chris Lattner9c837532006-10-15 01:05:46 +000058 }
59
60 // darwin_constant_cfstrings controls this.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000061 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner9c837532006-10-15 01:05:46 +000062
63 if (0) // darwin_pascal_strings
Chris Lattnerb2d486a2007-10-06 06:57:34 +000064 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner1f5ad112006-10-14 18:32:12 +000065 }
66
Chris Lattner5ba61f02006-10-14 07:39:34 +000067};
Gabor Greif49991682008-02-21 16:29:08 +000068
69
Chris Lattnerc3a669b2008-03-08 08:24:01 +000070class SolarisTargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +000071public:
Chris Lattnerc3a669b2008-03-08 08:24:01 +000072 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif49991682008-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};
Chris Lattner5ba61f02006-10-14 07:39:34 +000093} // end anonymous namespace.
94
95
Chris Lattner1f5ad112006-10-14 18:32:12 +000096/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
97/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000098static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +000099 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000100 Define(Defs, "__ppc__");
101 Define(Defs, "_ARCH_PPC");
102 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000103 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000104 Define(Defs, "_ARCH_PPC64");
105 Define(Defs, "_LP64");
106 Define(Defs, "__LP64__");
107 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000108 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000109 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000110 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000111
Chris Lattner9c837532006-10-15 01:05:46 +0000112 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000113 Define(Defs, "_BIG_ENDIAN");
114 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000115
116 if (is64Bit) {
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000122 } else {
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000128 }
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000135
136 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000137 Define(Defs, "__USER_LABEL_PREFIX__", "_");
138 Define(Defs, "__NATURAL_ALIGNMENT__");
139 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000140
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000141 Define(Defs, "__WCHAR_MAX__", "2147483647");
142 Define(Defs, "__WCHAR_TYPE__", "int");
143 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000144
145 // Float macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000160
161 // double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000175
176 // 128-bit long double macros.
Chris Lattnerb2d486a2007-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__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000194}
195
196/// getX86Defines - Return a set of the X86-specific #defines that are
197/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000198static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000199 // Target identification.
200 if (is64Bit) {
Chris Lattnerb2d486a2007-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__");
Chris Lattner9c837532006-10-15 01:05:46 +0000207 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000208 Define(Defs, "__i386__");
209 Define(Defs, "__i386");
210 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000211 }
212
213 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000214 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000215
216 if (is64Bit) {
Chris Lattnerb2d486a2007-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 Venancio71a9bb22008-01-20 04:02:16 +0000222 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000223 } else {
Chris Lattnerb2d486a2007-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 Venancio71a9bb22008-01-20 04:02:16 +0000229 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000230 }
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000236
237 // Subtarget options.
Chris Lattnerb2d486a2007-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__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000247
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000248 Define(Defs, "__WCHAR_MAX__", "2147483647");
249 Define(Defs, "__WCHAR_TYPE__", "int");
250 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000251
252 // Float macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000267
268 // Double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000282
283 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000296}
297
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000298/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-04-21 18:56:49 +0000299/// 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 Carlssona7408e72007-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 Lattner17df24e2008-04-21 18:56:49 +0000401static const char* getARMVAListDeclaration() {
402 return "typedef char* __builtin_va_list;";
403}
Anders Carlssona7408e72007-10-13 00:45:48 +0000404
Chris Lattner10a5b382007-01-29 05:24:35 +0000405/// PPC builtin info.
Chris Lattner29a16af2007-12-11 04:36:28 +0000406namespace clang {
Chris Lattner10a5b382007-01-29 05:24:35 +0000407namespace PPC {
Chris Lattner10a5b382007-01-29 05:24:35 +0000408
409 static const Builtin::Info BuiltinInfo[] = {
410#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson895af082007-12-09 23:17:02 +0000411#include "clang/AST/PPCBuiltins.def"
Chris Lattner10a5b382007-01-29 05:24:35 +0000412 };
413
414 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
415 Records = BuiltinInfo;
416 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
417 }
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000446 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000483 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000484 unsigned &NumAliases) {
485 Aliases = GCCRegAliases;
486 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonf511f642007-11-27 04:11:28 +0000487 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000488
Anders Carlssonf511f642007-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 Carlsson050f4942007-12-08 19:32:57 +0000506 const char *getTargetPrefix() {
507 return "ppc";
508 }
509
Chris Lattner10a5b382007-01-29 05:24:35 +0000510} // End namespace PPC
511
Chris Lattner10a5b382007-01-29 05:24:35 +0000512/// X86 builtin info.
513namespace X86 {
Chris Lattner10a5b382007-01-29 05:24:35 +0000514 static const Builtin::Info BuiltinInfo[] = {
515#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson895af082007-12-09 23:17:02 +0000516#include "clang/AST/X86Builtins.def"
Chris Lattner10a5b382007-01-29 05:24:35 +0000517 };
518
519 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
520 Records = BuiltinInfo;
521 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
522 }
Anders Carlsson5fa3f342007-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 Carlssonc1636572007-11-25 00:23:10 +0000527 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000540 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000550 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000551 unsigned &NumAliases) {
552 Aliases = GCCRegAliases;
553 NumAliases = llvm::array_lengthof(GCCRegAliases);
554 }
555
Anders Carlssonf511f642007-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 Carlsson0be81632008-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 Carlsson196aa532008-02-18 17:00:25 +0000573 // instructions.
Anders Carlssonf511f642007-11-27 04:11:28 +0000574 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
575 return true;
576 }
577 }
578
Lauro Ramos Venancioc9fbd732008-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 Venancioc9fbd732008-02-26 18:33:46 +0000591 default:
592 return std::string(1, Constraint);
593 }
594 }
595
Anders Carlssonf511f642007-11-27 04:11:28 +0000596 const char *getClobbers() {
597 return "~{dirflag},~{fpsr},~{flags}";
598 }
599
Anders Carlsson050f4942007-12-08 19:32:57 +0000600 const char *getTargetPrefix() {
601 return "x86";
602 }
603
Chris Lattner10a5b382007-01-29 05:24:35 +0000604} // End namespace X86
Chris Lattner17df24e2008-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 Lattner29a16af2007-12-11 04:36:28 +0000614} // end namespace clang.
Chris Lattner10a5b382007-01-29 05:24:35 +0000615
Chris Lattner5ba61f02006-10-14 07:39:34 +0000616//===----------------------------------------------------------------------===//
617// Specific target implementations.
618//===----------------------------------------------------------------------===//
619
Chris Lattner02dffbd2006-10-14 07:50:21 +0000620
Chris Lattner5ba61f02006-10-14 07:39:34 +0000621namespace {
622class DarwinPPCTargetInfo : public DarwinTargetInfo {
623public:
Eli Friedman1ca64762008-05-20 14:25:01 +0000624 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
625 CharIsSigned = false;
626 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000627
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000628 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000629 DarwinTargetInfo::getTargetDefines(Defines);
630 getPowerPCDefines(Defines, false);
631 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000632 virtual void getTargetBuiltins(const Builtin::Info *&Records,
633 unsigned &NumRecords) const {
634 PPC::getBuiltins(Records, NumRecords);
635 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000636 virtual const char *getVAListDeclaration() const {
637 return getPPCVAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000638 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000639 virtual const char *getTargetPrefix() const {
640 return PPC::getTargetPrefix();
641 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000642 virtual void getGCCRegNames(const char * const *&Names,
643 unsigned &NumNames) const {
644 PPC::getGCCRegNames(Names, NumNames);
645 }
646 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
647 unsigned &NumAliases) const {
648 PPC::getGCCRegAliases(Aliases, NumAliases);
649 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000650 virtual bool validateAsmConstraint(char c,
651 TargetInfo::ConstraintInfo &info) const {
652 return PPC::validateAsmConstraint(c, info);
653 }
654 virtual const char *getClobbers() const {
655 return PPC::getClobbers();
656 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000657};
658} // end anonymous namespace.
659
660namespace {
661class DarwinPPC64TargetInfo : public DarwinTargetInfo {
662public:
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000663 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman1ca64762008-05-20 14:25:01 +0000664 CharIsSigned = false;
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000665 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
666 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000667
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000668 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000669 DarwinTargetInfo::getTargetDefines(Defines);
670 getPowerPCDefines(Defines, true);
671 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000672 virtual void getTargetBuiltins(const Builtin::Info *&Records,
673 unsigned &NumRecords) const {
674 PPC::getBuiltins(Records, NumRecords);
675 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000676 virtual const char *getVAListDeclaration() const {
677 return getPPCVAListDeclaration();
678 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000679 virtual const char *getTargetPrefix() const {
680 return PPC::getTargetPrefix();
681 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000682 virtual void getGCCRegNames(const char * const *&Names,
683 unsigned &NumNames) const {
684 PPC::getGCCRegNames(Names, NumNames);
685 }
686 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
687 unsigned &NumAliases) const {
688 PPC::getGCCRegAliases(Aliases, NumAliases);
689 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000690 virtual bool validateAsmConstraint(char c,
691 TargetInfo::ConstraintInfo &info) const {
692 return PPC::validateAsmConstraint(c, info);
693 }
694 virtual const char *getClobbers() const {
695 return PPC::getClobbers();
696 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000697};
698} // end anonymous namespace.
699
700namespace {
701class DarwinI386TargetInfo : public DarwinTargetInfo {
702public:
Eli Friedmanb5366062008-05-20 14:21:01 +0000703 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
704 DoubleAlign = LongLongAlign = 32;
705 LongDoubleWidth = 96;
706 LongDoubleAlign = 32;
707 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
708 }
709
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000710 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000711 DarwinTargetInfo::getTargetDefines(Defines);
712 getX86Defines(Defines, false);
713 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000714 virtual void getTargetBuiltins(const Builtin::Info *&Records,
715 unsigned &NumRecords) const {
716 X86::getBuiltins(Records, NumRecords);
717 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000718 virtual const char *getVAListDeclaration() const {
719 return getI386VAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000720 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000721 virtual const char *getTargetPrefix() const {
722 return X86::getTargetPrefix();
723 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000724 virtual void getGCCRegNames(const char * const *&Names,
725 unsigned &NumNames) const {
726 X86::getGCCRegNames(Names, NumNames);
727 }
728 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
729 unsigned &NumAliases) const {
730 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssona7408e72007-10-13 00:45:48 +0000731 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000732 virtual bool validateAsmConstraint(char c,
733 TargetInfo::ConstraintInfo &info) const {
734 return X86::validateAsmConstraint(c, info);
735 }
Lauro Ramos Venancioc9fbd732008-02-26 18:33:46 +0000736
737 virtual std::string convertConstraint(const char Constraint) const {
738 return X86::convertConstraint(Constraint);
739 }
740
Anders Carlssonf511f642007-11-27 04:11:28 +0000741 virtual const char *getClobbers() const {
742 return X86::getClobbers();
743 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000744};
745} // end anonymous namespace.
746
747namespace {
748class DarwinX86_64TargetInfo : public DarwinTargetInfo {
749public:
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000750 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
751 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000752 LongDoubleWidth = 128;
753 LongDoubleAlign = 128;
754 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000755 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000756
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000757 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000758 DarwinTargetInfo::getTargetDefines(Defines);
759 getX86Defines(Defines, true);
760 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000761 virtual void getTargetBuiltins(const Builtin::Info *&Records,
762 unsigned &NumRecords) const {
763 X86::getBuiltins(Records, NumRecords);
764 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000765 virtual const char *getVAListDeclaration() const {
766 return getX86_64VAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000767 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000768 virtual const char *getTargetPrefix() const {
769 return X86::getTargetPrefix();
770 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000771 virtual void getGCCRegNames(const char * const *&Names,
772 unsigned &NumNames) const {
773 X86::getGCCRegNames(Names, NumNames);
Anders Carlssona7408e72007-10-13 00:45:48 +0000774 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000775 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
776 unsigned &NumAliases) const {
777 X86::getGCCRegAliases(Aliases, NumAliases);
778 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000779 virtual bool validateAsmConstraint(char c,
780 TargetInfo::ConstraintInfo &info) const {
781 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venancioc9fbd732008-02-26 18:33:46 +0000782 }
783 virtual std::string convertConstraint(const char Constraint) const {
784 return X86::convertConstraint(Constraint);
785 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000786 virtual const char *getClobbers() const {
787 return X86::getClobbers();
788 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000789};
790} // end anonymous namespace.
791
Chris Lattner17df24e2008-04-21 18:56:49 +0000792
793namespace {
794class DarwinARMTargetInfo : public DarwinTargetInfo {
795public:
Eli Friedmanb5366062008-05-20 14:21:01 +0000796 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
797 // FIXME: Are the defaults corrent for ARM?
798 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000799
800 virtual void getTargetDefines(std::vector<char> &Defines) const {
801 DarwinTargetInfo::getTargetDefines(Defines);
802 getARMDefines(Defines);
803 }
804 virtual void getTargetBuiltins(const Builtin::Info *&Records,
805 unsigned &NumRecords) const {
806 NumRecords = 0;
807 }
808 virtual const char *getVAListDeclaration() const {
809 return getARMVAListDeclaration();
810 }
811 virtual const char *getTargetPrefix() const {
812 return ARM::getTargetPrefix();
813 }
814
815 virtual void getGCCRegNames(const char * const *&Names,
816 unsigned &NumNames) const {
817 NumNames = 0;
818 }
819 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
820 unsigned &NumAliases) const {
821 NumAliases = 0;
822 }
823 virtual bool validateAsmConstraint(char c,
Nate Begeman2908fa02008-04-22 05:03:19 +0000824 TargetInfo::ConstraintInfo &info) const {
825 switch (c) {
826 default:
827 case 'l': // r0-r7
828 case 'h': // r8-r15
829 case 'w': // VFP Floating point register single precision
830 case 'P': // VFP Floating point register double precision
831 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
832 return true;
833 }
Chris Lattner17df24e2008-04-21 18:56:49 +0000834 return false;
835 }
836 virtual const char *getClobbers() const {
837 return "";
838 }
839};
840} // end anonymous namespace.
841
Chris Lattner5ba61f02006-10-14 07:39:34 +0000842namespace {
Gabor Greif49991682008-02-21 16:29:08 +0000843class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
844public:
845 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
846
847 virtual void getTargetDefines(std::vector<char> &Defines) const {
848 SolarisTargetInfo::getTargetDefines(Defines);
849// getSparcDefines(Defines, false);
850 Define(Defines, "__sparc");
851 Define(Defines, "__sparcv8");
852 }
853 virtual void getTargetBuiltins(const Builtin::Info *&Records,
854 unsigned &NumRecords) const {
855 PPC::getBuiltins(Records, NumRecords);
856 }
857 virtual const char *getVAListDeclaration() const {
858 return getPPCVAListDeclaration();
859 }
860 virtual const char *getTargetPrefix() const {
861 return PPC::getTargetPrefix();
862 }
863 virtual void getGCCRegNames(const char * const *&Names,
864 unsigned &NumNames) const {
865 PPC::getGCCRegNames(Names, NumNames);
866 }
867 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
868 unsigned &NumAliases) const {
869 PPC::getGCCRegAliases(Aliases, NumAliases);
870 }
871 virtual bool validateAsmConstraint(char c,
872 TargetInfo::ConstraintInfo &info) const {
873 return PPC::validateAsmConstraint(c, info);
874 }
875 virtual const char *getClobbers() const {
876 return PPC::getClobbers();
877 }
878};
879
880} // end anonymous namespace.
881
Chris Lattner5ba61f02006-10-14 07:39:34 +0000882
Chris Lattnerb781dc792008-05-08 05:58:21 +0000883namespace {
884 class PIC16TargetInfo : public TargetInfo{
885 public:
886 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-05-20 14:21:01 +0000887 // FIXME: Is IntAlign really supposed to be 16? There seems
888 // little point on a platform with 8-bit loads.
889 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
890 PointerAlign = 8;
Chris Lattnerb781dc792008-05-08 05:58:21 +0000891 }
Chris Lattner5e2ef0c2008-05-09 06:08:39 +0000892 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
893 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattnerb781dc792008-05-08 05:58:21 +0000894 virtual void getTargetDefines(std::vector<char> &Defines) const {
895 Define(Defines, "__pic16");
896 }
897 virtual void getTargetBuiltins(const Builtin::Info *&Records,
898 unsigned &NumRecords) const {}
899 virtual const char *getVAListDeclaration() const { return "";}
900 virtual const char *getClobbers() const {return "";}
901 virtual const char *getTargetPrefix() const {return "";}
902 virtual void getGCCRegNames(const char * const *&Names,
903 unsigned &NumNames) const {}
904 virtual bool validateAsmConstraint(char c,
905 TargetInfo::ConstraintInfo &info) const {
906 return true;
907 }
908 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
909 unsigned &NumAliases) const {}
910 virtual bool useGlobalsForAutomaticVariables() const {return true;}
911 };
912}
913
Chris Lattner5ba61f02006-10-14 07:39:34 +0000914//===----------------------------------------------------------------------===//
915// Driver code
916//===----------------------------------------------------------------------===//
917
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000918static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-12-03 22:06:55 +0000919 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
920 TT[4] == '-' && TT[1] - '3' < 6);
921}
922
Chris Lattner855d0242008-03-05 01:18:20 +0000923/// CreateTargetInfo - Return the target info object for the specified target
924/// triple.
925TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner36021a92007-12-05 18:41:05 +0000926 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000927 return new DarwinPPCTargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000928
Chris Lattner855d0242008-03-05 01:18:20 +0000929 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000930 return new DarwinPPC64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000931
Chris Lattner17df24e2008-04-21 18:56:49 +0000932 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
933 return new DarwinARMTargetInfo(T);
934
Chris Lattner855d0242008-03-05 01:18:20 +0000935 if (T.find("sparc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000936 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedmanb5366062008-05-20 14:21:01 +0000937
Chris Lattner855d0242008-03-05 01:18:20 +0000938 if (T.find("x86_64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000939 return new DarwinX86_64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000940
Chris Lattnerb781dc792008-05-08 05:58:21 +0000941 if (T.find("pic16-") == 0)
942 return new PIC16TargetInfo(T);
943
Chris Lattner855d0242008-03-05 01:18:20 +0000944 if (IsX86(T))
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000945 return new DarwinI386TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000946
Chris Lattner855d0242008-03-05 01:18:20 +0000947 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000948}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000949