blob: acfd44c95753a4295b2e5a4826687b836ca5b730 [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"
Eli Friedman25531262008-05-20 14:27:34 +000020#include "llvm/ADT/APFloat.h"
Ted Kremenekae360762007-12-03 22:06:55 +000021
Reid Spencer5f016e22007-07-11 17:01:13 +000022using namespace clang;
23
Reid Spencer5f016e22007-07-11 17:01:13 +000024//===----------------------------------------------------------------------===//
25// Common code shared among targets.
26//===----------------------------------------------------------------------===//
27
Chris Lattnerd15fa822007-10-06 06:57:34 +000028static void Define(std::vector<char> &Buf, const char *Macro,
29 const char *Val = "1") {
30 const char *Def = "#define ";
31 Buf.insert(Buf.end(), Def, Def+strlen(Def));
32 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
33 Buf.push_back(' ');
34 Buf.insert(Buf.end(), Val, Val+strlen(Val));
35 Buf.push_back('\n');
36}
37
38
Reid Spencer5f016e22007-07-11 17:01:13 +000039namespace {
Chris Lattner0eaed122008-03-08 08:24:01 +000040class DarwinTargetInfo : public TargetInfo {
Reid Spencer5f016e22007-07-11 17:01:13 +000041public:
Chris Lattner0eaed122008-03-08 08:24:01 +000042 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenekae360762007-12-03 22:06:55 +000043
Chris Lattnerd15fa822007-10-06 06:57:34 +000044 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner338128b2007-10-17 06:04:46 +000045// FIXME: we need a real target configuration system. For now, only define
46// __APPLE__ if the host has it.
47#ifdef __APPLE__
Chris Lattnerd15fa822007-10-06 06:57:34 +000048 Define(Defs, "__APPLE__");
49 Define(Defs, "__MACH__");
Chris Lattner338128b2007-10-17 06:04:46 +000050#endif
Nuno Lopes551d5e92008-07-05 19:32:25 +000051
52/* FIXME. we may also need to distinguish between darwin and linux targets */
53#ifdef linux
54 Define(Defs, "linux");
55#endif
Reid Spencer5f016e22007-07-11 17:01:13 +000056
57 if (1) {// -fobjc-gc controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000058 Define(Defs, "__weak", "");
59 Define(Defs, "__strong", "");
Reid Spencer5f016e22007-07-11 17:01:13 +000060 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +000061 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
62 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
63 Define(Defs, "__OBJC_GC__");
Reid Spencer5f016e22007-07-11 17:01:13 +000064 }
65
66 // darwin_constant_cfstrings controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000067 Define(Defs, "__CONSTANT_CFSTRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000068
69 if (0) // darwin_pascal_strings
Chris Lattnerd15fa822007-10-06 06:57:34 +000070 Define(Defs, "__PASCAL_STRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000071 }
72
73};
Gabor Greif26658672008-02-21 16:29:08 +000074
75
Chris Lattner0eaed122008-03-08 08:24:01 +000076class SolarisTargetInfo : public TargetInfo {
Gabor Greif26658672008-02-21 16:29:08 +000077public:
Chris Lattner0eaed122008-03-08 08:24:01 +000078 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif26658672008-02-21 16:29:08 +000079
80 virtual void getTargetDefines(std::vector<char> &Defs) const {
81// FIXME: we need a real target configuration system. For now, only define
82// __SUN__ if the host has it.
83#ifdef __SUN__
84 Define(Defs, "__SUN__");
85 Define(Defs, "__SOLARIS__");
86#endif
87
88 if (1) {// -fobjc-gc controls this.
89 Define(Defs, "__weak", "");
90 Define(Defs, "__strong", "");
91 } else {
92 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
93 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
94 Define(Defs, "__OBJC_GC__");
95 }
96 }
97
98};
Reid Spencer5f016e22007-07-11 17:01:13 +000099} // end anonymous namespace.
100
101
102/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
103/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000104static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000105 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000106 Define(Defs, "__ppc__");
107 Define(Defs, "_ARCH_PPC");
108 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000109 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000110 Define(Defs, "_ARCH_PPC64");
111 Define(Defs, "_LP64");
112 Define(Defs, "__LP64__");
113 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000114 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000115 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000116 }
117
118 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000119 Define(Defs, "_BIG_ENDIAN");
120 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000121
122 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000123 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
124 Define(Defs, "__INTMAX_TYPE__", "long int");
125 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
126 Define(Defs, "__PTRDIFF_TYPE__", "long int");
127 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000128 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000129 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
130 Define(Defs, "__INTMAX_TYPE__", "long long int");
131 Define(Defs, "__LONG_MAX__", "2147483647L");
132 Define(Defs, "__PTRDIFF_TYPE__", "int");
133 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000134 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000135 Define(Defs, "__INT_MAX__", "2147483647");
136 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
137 Define(Defs, "__CHAR_BIT__", "8");
138 Define(Defs, "__SCHAR_MAX__", "127");
139 Define(Defs, "__SHRT_MAX__", "32767");
140 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000141
142 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000143 Define(Defs, "__USER_LABEL_PREFIX__", "_");
144 Define(Defs, "__NATURAL_ALIGNMENT__");
145 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000146
Chris Lattnerd15fa822007-10-06 06:57:34 +0000147 Define(Defs, "__WCHAR_MAX__", "2147483647");
148 Define(Defs, "__WCHAR_TYPE__", "int");
149 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000150
151 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000152 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
153 Define(Defs, "__FLT_DIG__", "6");
154 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
155 Define(Defs, "__FLT_EVAL_METHOD__", "0");
156 Define(Defs, "__FLT_HAS_INFINITY__");
157 Define(Defs, "__FLT_HAS_QUIET_NAN__");
158 Define(Defs, "__FLT_MANT_DIG__", "24");
159 Define(Defs, "__FLT_MAX_10_EXP__", "38");
160 Define(Defs, "__FLT_MAX_EXP__", "128");
161 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
162 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
163 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
164 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
165 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000166
167 // double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000168 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
169 Define(Defs, "__DBL_DIG__", "15");
170 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
171 Define(Defs, "__DBL_HAS_INFINITY__");
172 Define(Defs, "__DBL_HAS_QUIET_NAN__");
173 Define(Defs, "__DBL_MANT_DIG__", "53");
174 Define(Defs, "__DBL_MAX_10_EXP__", "308");
175 Define(Defs, "__DBL_MAX_EXP__", "1024");
176 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
177 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
178 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
179 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
180 Define(Defs, "__DECIMAL_DIG__", "33");
Reid Spencer5f016e22007-07-11 17:01:13 +0000181
182 // 128-bit long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000183 Define(Defs, "__LDBL_DENORM_MIN__",
184 "4.94065645841246544176568792868221e-324L");
185 Define(Defs, "__LDBL_DIG__", "31");
186 Define(Defs, "__LDBL_EPSILON__",
187 "4.94065645841246544176568792868221e-324L");
188 Define(Defs, "__LDBL_HAS_INFINITY__");
189 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
190 Define(Defs, "__LDBL_MANT_DIG__", "106");
191 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
192 Define(Defs, "__LDBL_MAX_EXP__", "1024");
193 Define(Defs, "__LDBL_MAX__",
194 "1.79769313486231580793728971405301e+308L");
195 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
196 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
197 Define(Defs, "__LDBL_MIN__",
198 "2.00416836000897277799610805135016e-292L");
199 Define(Defs, "__LONG_DOUBLE_128__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000200}
201
202/// getX86Defines - Return a set of the X86-specific #defines that are
203/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000204static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000205 // Target identification.
206 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000207 Define(Defs, "_LP64");
208 Define(Defs, "__LP64__");
209 Define(Defs, "__amd64__");
210 Define(Defs, "__amd64");
211 Define(Defs, "__x86_64");
212 Define(Defs, "__x86_64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000213 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000214 Define(Defs, "__i386__");
215 Define(Defs, "__i386");
216 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000217 }
218
219 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000220 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000221
222 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000223 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
224 Define(Defs, "__INTMAX_TYPE__", "long int");
225 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
226 Define(Defs, "__PTRDIFF_TYPE__", "long int");
227 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000228 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000229 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
230 Define(Defs, "__INTMAX_TYPE__", "long long int");
231 Define(Defs, "__LONG_MAX__", "2147483647L");
232 Define(Defs, "__PTRDIFF_TYPE__", "int");
233 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000234 }
Anders Carlsson8b7c9fb2008-07-22 17:16:13 +0000235 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattnerd15fa822007-10-06 06:57:34 +0000236 Define(Defs, "__CHAR_BIT__", "8");
237 Define(Defs, "__INT_MAX__", "2147483647");
238 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
239 Define(Defs, "__SCHAR_MAX__", "127");
240 Define(Defs, "__SHRT_MAX__", "32767");
Reid Spencer5f016e22007-07-11 17:01:13 +0000241
242 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000243 Define(Defs, "__nocona");
244 Define(Defs, "__nocona__");
245 Define(Defs, "__tune_nocona__");
246 Define(Defs, "__SSE2_MATH__");
247 Define(Defs, "__SSE2__");
248 Define(Defs, "__SSE_MATH__");
249 Define(Defs, "__SSE__");
250 Define(Defs, "__MMX__");
251 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000252
Chris Lattnerd15fa822007-10-06 06:57:34 +0000253 Define(Defs, "__WCHAR_MAX__", "2147483647");
254 Define(Defs, "__WCHAR_TYPE__", "int");
255 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000256
257 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000258 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
259 Define(Defs, "__FLT_DIG__", "6");
260 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
261 Define(Defs, "__FLT_EVAL_METHOD__", "0");
262 Define(Defs, "__FLT_HAS_INFINITY__");
263 Define(Defs, "__FLT_HAS_QUIET_NAN__");
264 Define(Defs, "__FLT_MANT_DIG__", "24");
265 Define(Defs, "__FLT_MAX_10_EXP__", "38");
266 Define(Defs, "__FLT_MAX_EXP__", "128");
267 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
268 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
269 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
270 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
271 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000272
273 // Double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000274 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
275 Define(Defs, "__DBL_DIG__", "15");
276 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
277 Define(Defs, "__DBL_HAS_INFINITY__");
278 Define(Defs, "__DBL_HAS_QUIET_NAN__");
279 Define(Defs, "__DBL_MANT_DIG__", "53");
280 Define(Defs, "__DBL_MAX_10_EXP__", "308");
281 Define(Defs, "__DBL_MAX_EXP__", "1024");
282 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
283 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
284 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
285 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
286 Define(Defs, "__DECIMAL_DIG__", "21");
Reid Spencer5f016e22007-07-11 17:01:13 +0000287
288 // 80-bit Long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000289 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
290 Define(Defs, "__LDBL_DIG__", "18");
291 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
292 Define(Defs, "__LDBL_HAS_INFINITY__");
293 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
294 Define(Defs, "__LDBL_MANT_DIG__", "64");
295 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
296 Define(Defs, "__LDBL_MAX_EXP__", "16384");
297 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
298 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
299 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
300 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Reid Spencer5f016e22007-07-11 17:01:13 +0000301}
302
Chris Lattnerd0c33d32008-04-21 20:19:54 +0000303/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner393ff042008-04-21 18:56:49 +0000304/// not tied to a specific subtarget.
305static void getARMDefines(std::vector<char> &Defs) {
306 // Target identification.
307 Define(Defs, "__arm");
308 Define(Defs, "__arm__");
309
310 // Target properties.
311 Define(Defs, "__LITTLE_ENDIAN__");
312
313 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
314 Define(Defs, "__INTMAX_TYPE__", "long long int");
315 Define(Defs, "__LONG_MAX__", "2147483647L");
316 Define(Defs, "__PTRDIFF_TYPE__", "int");
317 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
318 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
319
320 Define(Defs, "__CHAR_BIT__", "8");
321 Define(Defs, "__INT_MAX__", "2147483647");
322 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
323 Define(Defs, "__SCHAR_MAX__", "127");
324 Define(Defs, "__SHRT_MAX__", "32767");
325
326 // Subtarget options. [hard coded to v6 for now]
327 Define(Defs, "__ARM_ARCH_6K__");
328 Define(Defs, "__ARMEL__");
329 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
330
331 Define(Defs, "__WCHAR_MAX__", "2147483647");
332 Define(Defs, "__WCHAR_TYPE__", "int");
333 Define(Defs, "__WINT_TYPE__", "int");
334 Define(Defs, "__DECIMAL_DIG__", "17");
335 Define(Defs, "__FLT_RADIX__", "2");
336
337 // Float macros.
338 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
339 Define(Defs, "__FLT_DIG__", "6");
340 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
341 Define(Defs, "__FLT_EVAL_METHOD__", "0");
342 Define(Defs, "__FLT_HAS_INFINITY__");
343 Define(Defs, "__FLT_HAS_QUIET_NAN__");
344 Define(Defs, "__FLT_MANT_DIG__", "24");
345 Define(Defs, "__FLT_MAX_10_EXP__", "38");
346 Define(Defs, "__FLT_MAX_EXP__", "128");
347 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
348 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
349 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
350 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
351
352 // Double macros.
353 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
354 Define(Defs, "__DBL_DIG__", "15");
355 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
356 Define(Defs, "__DBL_HAS_INFINITY__");
357 Define(Defs, "__DBL_HAS_QUIET_NAN__");
358 Define(Defs, "__DBL_MANT_DIG__", "53");
359 Define(Defs, "__DBL_MAX_10_EXP__", "308");
360 Define(Defs, "__DBL_MAX_EXP__", "1024");
361 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
362 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
363 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
364 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
365
366 // 64-bit Long double macros (same as double).
367 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
368 Define(Defs, "__LDBL_DIG__", "15");
369 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
370 Define(Defs, "__LDBL_HAS_INFINITY__");
371 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
372 Define(Defs, "__LDBL_MANT_DIG__", "53");
373 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
374 Define(Defs, "__LDBL_MAX_EXP__", "1024");
375 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
376 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
377 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
378 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
379}
380
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000381static const char* getI386VAListDeclaration() {
382 return "typedef char* __builtin_va_list;";
383}
384
385static const char* getX86_64VAListDeclaration() {
386 return
387 "typedef struct __va_list_tag {"
388 " unsigned gp_offset;"
389 " unsigned fp_offset;"
390 " void* overflow_arg_area;"
391 " void* reg_save_area;"
392 "} __builtin_va_list[1];";
393}
394
395static const char* getPPCVAListDeclaration() {
396 return
397 "typedef struct __va_list_tag {"
398 " unsigned char gpr;"
399 " unsigned char fpr;"
400 " unsigned short reserved;"
401 " void* overflow_arg_area;"
402 " void* reg_save_area;"
403 "} __builtin_va_list[1];";
404}
405
Chris Lattner393ff042008-04-21 18:56:49 +0000406static const char* getARMVAListDeclaration() {
407 return "typedef char* __builtin_va_list;";
408}
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000409
Reid Spencer5f016e22007-07-11 17:01:13 +0000410/// PPC builtin info.
Chris Lattnerfb344d32007-12-11 04:36:28 +0000411namespace clang {
Reid Spencer5f016e22007-07-11 17:01:13 +0000412namespace PPC {
Reid Spencer5f016e22007-07-11 17:01:13 +0000413
414 static const Builtin::Info BuiltinInfo[] = {
415#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000416#include "clang/AST/PPCBuiltins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000417 };
418
419 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
420 Records = BuiltinInfo;
421 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
422 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000423
424 static const char * const GCCRegNames[] = {
425 "0", "1", "2", "3", "4", "5", "6", "7",
426 "8", "9", "10", "11", "12", "13", "14", "15",
427 "16", "17", "18", "19", "20", "21", "22", "23",
428 "24", "25", "26", "27", "28", "29", "30", "31",
429 "0", "1", "2", "3", "4", "5", "6", "7",
430 "8", "9", "10", "11", "12", "13", "14", "15",
431 "16", "17", "18", "19", "20", "21", "22", "23",
432 "24", "25", "26", "27", "28", "29", "30", "31",
433 "mq", "lr", "ctr", "ap",
434 "0", "1", "2", "3", "4", "5", "6", "7",
435 "xer",
436 "0", "1", "2", "3", "4", "5", "6", "7",
437 "8", "9", "10", "11", "12", "13", "14", "15",
438 "16", "17", "18", "19", "20", "21", "22", "23",
439 "24", "25", "26", "27", "28", "29", "30", "31",
440 "vrsave", "vscr",
441 "spe_acc", "spefscr",
442 "sfp"
443 };
444
445 static void getGCCRegNames(const char * const *&Names,
446 unsigned &NumNames) {
447 Names = GCCRegNames;
448 NumNames = llvm::array_lengthof(GCCRegNames);
449 }
450
Chris Lattner0eaed122008-03-08 08:24:01 +0000451 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000452 // While some of these aliases do map to different registers
453 // they still share the same register name.
454 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
455 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
456 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
457 { { "cr3", "fr3", "r3", "v3"}, "3" },
458 { { "cr4", "fr4", "r4", "v4"}, "4" },
459 { { "cr5", "fr5", "r5", "v5"}, "5" },
460 { { "cr6", "fr6", "r6", "v6"}, "6" },
461 { { "cr7", "fr7", "r7", "v7"}, "7" },
462 { { "fr8", "r8", "v8"}, "8" },
463 { { "fr9", "r9", "v9"}, "9" },
464 { { "fr10", "r10", "v10"}, "10" },
465 { { "fr11", "r11", "v11"}, "11" },
466 { { "fr12", "r12", "v12"}, "12" },
467 { { "fr13", "r13", "v13"}, "13" },
468 { { "fr14", "r14", "v14"}, "14" },
469 { { "fr15", "r15", "v15"}, "15" },
470 { { "fr16", "r16", "v16"}, "16" },
471 { { "fr17", "r17", "v17"}, "17" },
472 { { "fr18", "r18", "v18"}, "18" },
473 { { "fr19", "r19", "v19"}, "19" },
474 { { "fr20", "r20", "v20"}, "20" },
475 { { "fr21", "r21", "v21"}, "21" },
476 { { "fr22", "r22", "v22"}, "22" },
477 { { "fr23", "r23", "v23"}, "23" },
478 { { "fr24", "r24", "v24"}, "24" },
479 { { "fr25", "r25", "v25"}, "25" },
480 { { "fr26", "r26", "v26"}, "26" },
481 { { "fr27", "r27", "v27"}, "27" },
482 { { "fr28", "r28", "v28"}, "28" },
483 { { "fr29", "r29", "v29"}, "29" },
484 { { "fr30", "r30", "v30"}, "30" },
485 { { "fr31", "r31", "v31"}, "31" },
486 };
487
Chris Lattner0eaed122008-03-08 08:24:01 +0000488 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000489 unsigned &NumAliases) {
490 Aliases = GCCRegAliases;
491 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssond04c6e22007-11-27 04:11:28 +0000492 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000493
Anders Carlssond04c6e22007-11-27 04:11:28 +0000494 static bool validateAsmConstraint(char c,
495 TargetInfo::ConstraintInfo &info) {
496 switch (c) {
497 default: return false;
498 case 'O': // Zero
499 return true;
500 case 'b': // Base register
501 case 'f': // Floating point register
502 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
503 return true;
504 }
505 }
506
507 const char *getClobbers() {
508 return 0;
509 }
510
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000511 const char *getTargetPrefix() {
512 return "ppc";
513 }
514
Reid Spencer5f016e22007-07-11 17:01:13 +0000515} // End namespace PPC
516
Reid Spencer5f016e22007-07-11 17:01:13 +0000517/// X86 builtin info.
518namespace X86 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000519 static const Builtin::Info BuiltinInfo[] = {
520#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000521#include "clang/AST/X86Builtins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000522 };
523
524 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
525 Records = BuiltinInfo;
526 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
527 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000528
529 static const char *GCCRegNames[] = {
530 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
531 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlsson646b2612007-11-25 00:23:10 +0000532 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson3346ae62007-11-24 23:38:12 +0000533 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
534 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
535 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
536 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
537 };
538
539 static void getGCCRegNames(const char * const *&Names,
540 unsigned &NumNames) {
541 Names = GCCRegNames;
542 NumNames = llvm::array_lengthof(GCCRegNames);
543 }
544
Chris Lattner0eaed122008-03-08 08:24:01 +0000545 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000546 { { "al", "ah", "eax", "rax" }, "ax" },
547 { { "bl", "bh", "ebx", "rbx" }, "bx" },
548 { { "cl", "ch", "ecx", "rcx" }, "cx" },
549 { { "dl", "dh", "edx", "rdx" }, "dx" },
550 { { "esi", "rsi" }, "si" },
Nuno Lopes9d294802008-07-07 12:18:07 +0000551 { { "edi", "rdi" }, "di" },
Anders Carlsson3346ae62007-11-24 23:38:12 +0000552 { { "esp", "rsp" }, "sp" },
553 { { "ebp", "rbp" }, "bp" },
554 };
555
Chris Lattner0eaed122008-03-08 08:24:01 +0000556 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000557 unsigned &NumAliases) {
558 Aliases = GCCRegAliases;
559 NumAliases = llvm::array_lengthof(GCCRegAliases);
560 }
561
Anders Carlssond04c6e22007-11-27 04:11:28 +0000562 static bool validateAsmConstraint(char c,
563 TargetInfo::ConstraintInfo &info) {
564 switch (c) {
565 default: return false;
566 case 'a': // eax.
567 case 'b': // ebx.
568 case 'c': // ecx.
569 case 'd': // edx.
570 case 'S': // esi.
571 case 'D': // edi.
572 case 'A': // edx:eax.
573 case 't': // top of floating point stack.
574 case 'u': // second from top of floating point stack.
575 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlsson456e79d2008-03-10 22:37:16 +0000576 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
577 // instructions.
578 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonb41edf92008-02-18 17:00:25 +0000579 // instructions.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000580 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
581 return true;
582 }
583 }
584
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000585 static std::string convertConstraint(const char Constraint) {
586 switch (Constraint) {
587 case 'a': return std::string("{ax}");
588 case 'b': return std::string("{bx}");
589 case 'c': return std::string("{cx}");
590 case 'd': return std::string("{dx}");
591 case 'S': return std::string("{si}");
592 case 'D': return std::string("{di}");
593 case 't': // top of floating point stack.
594 return std::string("{st}");
595 case 'u': // second from top of floating point stack.
596 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000597 default:
598 return std::string(1, Constraint);
599 }
600 }
601
Anders Carlssond04c6e22007-11-27 04:11:28 +0000602 const char *getClobbers() {
603 return "~{dirflag},~{fpsr},~{flags}";
604 }
605
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000606 const char *getTargetPrefix() {
607 return "x86";
608 }
609
Reid Spencer5f016e22007-07-11 17:01:13 +0000610} // End namespace X86
Chris Lattner393ff042008-04-21 18:56:49 +0000611
612
613/// ARM builtin info.
614namespace ARM {
615 const char *getTargetPrefix() {
616 return "arm";
617 }
618} // End namespace ARM
619
Chris Lattnerfb344d32007-12-11 04:36:28 +0000620} // end namespace clang.
Reid Spencer5f016e22007-07-11 17:01:13 +0000621
622//===----------------------------------------------------------------------===//
623// Specific target implementations.
624//===----------------------------------------------------------------------===//
625
626
627namespace {
628class DarwinPPCTargetInfo : public DarwinTargetInfo {
629public:
Eli Friedmand37f0b82008-05-20 14:25:01 +0000630 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
631 CharIsSigned = false;
632 }
Ted Kremenekae360762007-12-03 22:06:55 +0000633
Chris Lattnerd15fa822007-10-06 06:57:34 +0000634 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000635 DarwinTargetInfo::getTargetDefines(Defines);
636 getPowerPCDefines(Defines, false);
637 }
638 virtual void getTargetBuiltins(const Builtin::Info *&Records,
639 unsigned &NumRecords) const {
640 PPC::getBuiltins(Records, NumRecords);
641 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000642 virtual const char *getVAListDeclaration() const {
643 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000644 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000645 virtual const char *getTargetPrefix() const {
646 return PPC::getTargetPrefix();
647 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000648 virtual void getGCCRegNames(const char * const *&Names,
649 unsigned &NumNames) const {
650 PPC::getGCCRegNames(Names, NumNames);
651 }
652 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
653 unsigned &NumAliases) const {
654 PPC::getGCCRegAliases(Aliases, NumAliases);
655 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000656 virtual bool validateAsmConstraint(char c,
657 TargetInfo::ConstraintInfo &info) const {
658 return PPC::validateAsmConstraint(c, info);
659 }
660 virtual const char *getClobbers() const {
661 return PPC::getClobbers();
662 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000663};
664} // end anonymous namespace.
665
666namespace {
667class DarwinPPC64TargetInfo : public DarwinTargetInfo {
668public:
Chris Lattnerf291b102008-05-09 06:17:04 +0000669 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedmand37f0b82008-05-20 14:25:01 +0000670 CharIsSigned = false;
Chris Lattnerf291b102008-05-09 06:17:04 +0000671 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
672 }
Ted Kremenekae360762007-12-03 22:06:55 +0000673
Chris Lattnerd15fa822007-10-06 06:57:34 +0000674 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000675 DarwinTargetInfo::getTargetDefines(Defines);
676 getPowerPCDefines(Defines, true);
677 }
678 virtual void getTargetBuiltins(const Builtin::Info *&Records,
679 unsigned &NumRecords) const {
680 PPC::getBuiltins(Records, NumRecords);
681 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000682 virtual const char *getVAListDeclaration() const {
683 return getPPCVAListDeclaration();
684 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000685 virtual const char *getTargetPrefix() const {
686 return PPC::getTargetPrefix();
687 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000688 virtual void getGCCRegNames(const char * const *&Names,
689 unsigned &NumNames) const {
690 PPC::getGCCRegNames(Names, NumNames);
691 }
692 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
693 unsigned &NumAliases) const {
694 PPC::getGCCRegAliases(Aliases, NumAliases);
695 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000696 virtual bool validateAsmConstraint(char c,
697 TargetInfo::ConstraintInfo &info) const {
698 return PPC::validateAsmConstraint(c, info);
699 }
700 virtual const char *getClobbers() const {
701 return PPC::getClobbers();
702 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000703};
704} // end anonymous namespace.
705
706namespace {
707class DarwinI386TargetInfo : public DarwinTargetInfo {
708public:
Eli Friedman61538a72008-05-20 14:21:01 +0000709 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
710 DoubleAlign = LongLongAlign = 32;
Eli Friedman5aa4fd62008-06-04 17:01:45 +0000711 LongDoubleWidth = 128;
712 LongDoubleAlign = 128;
Eli Friedman61538a72008-05-20 14:21:01 +0000713 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
714 }
715
Chris Lattnerd15fa822007-10-06 06:57:34 +0000716 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000717 DarwinTargetInfo::getTargetDefines(Defines);
718 getX86Defines(Defines, false);
719 }
720 virtual void getTargetBuiltins(const Builtin::Info *&Records,
721 unsigned &NumRecords) const {
722 X86::getBuiltins(Records, NumRecords);
723 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000724 virtual const char *getVAListDeclaration() const {
725 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000726 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000727 virtual const char *getTargetPrefix() const {
728 return X86::getTargetPrefix();
729 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000730 virtual void getGCCRegNames(const char * const *&Names,
731 unsigned &NumNames) const {
732 X86::getGCCRegNames(Names, NumNames);
733 }
734 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
735 unsigned &NumAliases) const {
736 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000737 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000738 virtual bool validateAsmConstraint(char c,
739 TargetInfo::ConstraintInfo &info) const {
740 return X86::validateAsmConstraint(c, info);
741 }
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000742
743 virtual std::string convertConstraint(const char Constraint) const {
744 return X86::convertConstraint(Constraint);
745 }
746
Anders Carlssond04c6e22007-11-27 04:11:28 +0000747 virtual const char *getClobbers() const {
748 return X86::getClobbers();
749 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000750};
751} // end anonymous namespace.
752
753namespace {
754class DarwinX86_64TargetInfo : public DarwinTargetInfo {
755public:
Chris Lattnerf291b102008-05-09 06:17:04 +0000756 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
757 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000758 LongDoubleWidth = 128;
759 LongDoubleAlign = 128;
760 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnerf291b102008-05-09 06:17:04 +0000761 }
Ted Kremenekae360762007-12-03 22:06:55 +0000762
Chris Lattnerd15fa822007-10-06 06:57:34 +0000763 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000764 DarwinTargetInfo::getTargetDefines(Defines);
765 getX86Defines(Defines, true);
766 }
767 virtual void getTargetBuiltins(const Builtin::Info *&Records,
768 unsigned &NumRecords) const {
769 X86::getBuiltins(Records, NumRecords);
770 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000771 virtual const char *getVAListDeclaration() const {
772 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000773 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000774 virtual const char *getTargetPrefix() const {
775 return X86::getTargetPrefix();
776 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000777 virtual void getGCCRegNames(const char * const *&Names,
778 unsigned &NumNames) const {
779 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000780 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000781 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
782 unsigned &NumAliases) const {
783 X86::getGCCRegAliases(Aliases, NumAliases);
784 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000785 virtual bool validateAsmConstraint(char c,
786 TargetInfo::ConstraintInfo &info) const {
787 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000788 }
789 virtual std::string convertConstraint(const char Constraint) const {
790 return X86::convertConstraint(Constraint);
791 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000792 virtual const char *getClobbers() const {
793 return X86::getClobbers();
794 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000795};
796} // end anonymous namespace.
797
Chris Lattner393ff042008-04-21 18:56:49 +0000798
799namespace {
800class DarwinARMTargetInfo : public DarwinTargetInfo {
801public:
Eli Friedman61538a72008-05-20 14:21:01 +0000802 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
803 // FIXME: Are the defaults corrent for ARM?
804 }
Chris Lattner393ff042008-04-21 18:56:49 +0000805
806 virtual void getTargetDefines(std::vector<char> &Defines) const {
807 DarwinTargetInfo::getTargetDefines(Defines);
808 getARMDefines(Defines);
809 }
810 virtual void getTargetBuiltins(const Builtin::Info *&Records,
811 unsigned &NumRecords) const {
812 NumRecords = 0;
813 }
814 virtual const char *getVAListDeclaration() const {
815 return getARMVAListDeclaration();
816 }
817 virtual const char *getTargetPrefix() const {
818 return ARM::getTargetPrefix();
819 }
820
821 virtual void getGCCRegNames(const char * const *&Names,
822 unsigned &NumNames) const {
823 NumNames = 0;
824 }
825 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
826 unsigned &NumAliases) const {
827 NumAliases = 0;
828 }
829 virtual bool validateAsmConstraint(char c,
Nate Begemanad487f42008-04-22 05:03:19 +0000830 TargetInfo::ConstraintInfo &info) const {
831 switch (c) {
832 default:
833 case 'l': // r0-r7
834 case 'h': // r8-r15
835 case 'w': // VFP Floating point register single precision
836 case 'P': // VFP Floating point register double precision
837 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
838 return true;
839 }
Chris Lattner393ff042008-04-21 18:56:49 +0000840 return false;
841 }
842 virtual const char *getClobbers() const {
843 return "";
844 }
845};
846} // end anonymous namespace.
847
Reid Spencer5f016e22007-07-11 17:01:13 +0000848namespace {
Gabor Greif26658672008-02-21 16:29:08 +0000849class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
850public:
851 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
852
853 virtual void getTargetDefines(std::vector<char> &Defines) const {
854 SolarisTargetInfo::getTargetDefines(Defines);
855// getSparcDefines(Defines, false);
856 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +0000857 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +0000858 Define(Defines, "__sparcv8");
859 }
860 virtual void getTargetBuiltins(const Builtin::Info *&Records,
861 unsigned &NumRecords) const {
862 PPC::getBuiltins(Records, NumRecords);
863 }
864 virtual const char *getVAListDeclaration() const {
865 return getPPCVAListDeclaration();
866 }
867 virtual const char *getTargetPrefix() const {
868 return PPC::getTargetPrefix();
869 }
870 virtual void getGCCRegNames(const char * const *&Names,
871 unsigned &NumNames) const {
872 PPC::getGCCRegNames(Names, NumNames);
873 }
874 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
875 unsigned &NumAliases) const {
876 PPC::getGCCRegAliases(Aliases, NumAliases);
877 }
878 virtual bool validateAsmConstraint(char c,
879 TargetInfo::ConstraintInfo &info) const {
880 return PPC::validateAsmConstraint(c, info);
881 }
882 virtual const char *getClobbers() const {
883 return PPC::getClobbers();
884 }
885};
886
887} // end anonymous namespace.
888
Reid Spencer5f016e22007-07-11 17:01:13 +0000889
Chris Lattner2621fd12008-05-08 05:58:21 +0000890namespace {
891 class PIC16TargetInfo : public TargetInfo{
892 public:
893 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman61538a72008-05-20 14:21:01 +0000894 // FIXME: Is IntAlign really supposed to be 16? There seems
895 // little point on a platform with 8-bit loads.
896 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
897 PointerAlign = 8;
Chris Lattner2621fd12008-05-08 05:58:21 +0000898 }
Chris Lattner927686f2008-05-09 06:08:39 +0000899 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
900 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner2621fd12008-05-08 05:58:21 +0000901 virtual void getTargetDefines(std::vector<char> &Defines) const {
902 Define(Defines, "__pic16");
903 }
904 virtual void getTargetBuiltins(const Builtin::Info *&Records,
905 unsigned &NumRecords) const {}
906 virtual const char *getVAListDeclaration() const { return "";}
907 virtual const char *getClobbers() const {return "";}
908 virtual const char *getTargetPrefix() const {return "";}
909 virtual void getGCCRegNames(const char * const *&Names,
910 unsigned &NumNames) const {}
911 virtual bool validateAsmConstraint(char c,
912 TargetInfo::ConstraintInfo &info) const {
913 return true;
914 }
915 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
916 unsigned &NumAliases) const {}
917 virtual bool useGlobalsForAutomaticVariables() const {return true;}
918 };
919}
920
Reid Spencer5f016e22007-07-11 17:01:13 +0000921//===----------------------------------------------------------------------===//
922// Driver code
923//===----------------------------------------------------------------------===//
924
Ted Kremenek8448d382007-12-04 17:07:35 +0000925static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000926 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
927 TT[4] == '-' && TT[1] - '3' < 6);
928}
929
Chris Lattner42e67372008-03-05 01:18:20 +0000930/// CreateTargetInfo - Return the target info object for the specified target
931/// triple.
932TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner82817ba2007-12-05 18:41:05 +0000933 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000934 return new DarwinPPCTargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000935
Chris Lattner42e67372008-03-05 01:18:20 +0000936 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000937 return new DarwinPPC64TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000938
Chris Lattner393ff042008-04-21 18:56:49 +0000939 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
940 return new DarwinARMTargetInfo(T);
941
Chris Lattner42e67372008-03-05 01:18:20 +0000942 if (T.find("sparc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000943 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman61538a72008-05-20 14:21:01 +0000944
Chris Lattner42e67372008-03-05 01:18:20 +0000945 if (T.find("x86_64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000946 return new DarwinX86_64TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000947
Chris Lattner2621fd12008-05-08 05:58:21 +0000948 if (T.find("pic16-") == 0)
949 return new PIC16TargetInfo(T);
950
Chris Lattner42e67372008-03-05 01:18:20 +0000951 if (IsX86(T))
Chris Lattner0eaed122008-03-08 08:24:01 +0000952 return new DarwinI386TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000953
Chris Lattner42e67372008-03-05 01:18:20 +0000954 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +0000955}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +0000956