blob: 14bbcd86339b3e8b87d73940024e27e8b9163275 [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");
Lauro Ramos Venancioe0e3abc2008-01-20 04:02:16 +0000228 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000229 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000230 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
231 Define(Defs, "__INTMAX_TYPE__", "long long int");
232 Define(Defs, "__LONG_MAX__", "2147483647L");
233 Define(Defs, "__PTRDIFF_TYPE__", "int");
234 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Lauro Ramos Venancioe0e3abc2008-01-20 04:02:16 +0000235 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000236 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000237 Define(Defs, "__CHAR_BIT__", "8");
238 Define(Defs, "__INT_MAX__", "2147483647");
239 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
240 Define(Defs, "__SCHAR_MAX__", "127");
241 Define(Defs, "__SHRT_MAX__", "32767");
Reid Spencer5f016e22007-07-11 17:01:13 +0000242
243 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000244 Define(Defs, "__nocona");
245 Define(Defs, "__nocona__");
246 Define(Defs, "__tune_nocona__");
247 Define(Defs, "__SSE2_MATH__");
248 Define(Defs, "__SSE2__");
249 Define(Defs, "__SSE_MATH__");
250 Define(Defs, "__SSE__");
251 Define(Defs, "__MMX__");
252 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000253
Chris Lattnerd15fa822007-10-06 06:57:34 +0000254 Define(Defs, "__WCHAR_MAX__", "2147483647");
255 Define(Defs, "__WCHAR_TYPE__", "int");
256 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000257
258 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000259 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
260 Define(Defs, "__FLT_DIG__", "6");
261 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
262 Define(Defs, "__FLT_EVAL_METHOD__", "0");
263 Define(Defs, "__FLT_HAS_INFINITY__");
264 Define(Defs, "__FLT_HAS_QUIET_NAN__");
265 Define(Defs, "__FLT_MANT_DIG__", "24");
266 Define(Defs, "__FLT_MAX_10_EXP__", "38");
267 Define(Defs, "__FLT_MAX_EXP__", "128");
268 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
269 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
270 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
271 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
272 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000273
274 // Double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000275 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
276 Define(Defs, "__DBL_DIG__", "15");
277 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
278 Define(Defs, "__DBL_HAS_INFINITY__");
279 Define(Defs, "__DBL_HAS_QUIET_NAN__");
280 Define(Defs, "__DBL_MANT_DIG__", "53");
281 Define(Defs, "__DBL_MAX_10_EXP__", "308");
282 Define(Defs, "__DBL_MAX_EXP__", "1024");
283 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
284 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
285 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
286 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
287 Define(Defs, "__DECIMAL_DIG__", "21");
Reid Spencer5f016e22007-07-11 17:01:13 +0000288
289 // 80-bit Long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000290 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
291 Define(Defs, "__LDBL_DIG__", "18");
292 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
293 Define(Defs, "__LDBL_HAS_INFINITY__");
294 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
295 Define(Defs, "__LDBL_MANT_DIG__", "64");
296 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
297 Define(Defs, "__LDBL_MAX_EXP__", "16384");
298 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
299 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
300 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
301 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Reid Spencer5f016e22007-07-11 17:01:13 +0000302}
303
Chris Lattnerd0c33d32008-04-21 20:19:54 +0000304/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner393ff042008-04-21 18:56:49 +0000305/// not tied to a specific subtarget.
306static void getARMDefines(std::vector<char> &Defs) {
307 // Target identification.
308 Define(Defs, "__arm");
309 Define(Defs, "__arm__");
310
311 // Target properties.
312 Define(Defs, "__LITTLE_ENDIAN__");
313
314 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
315 Define(Defs, "__INTMAX_TYPE__", "long long int");
316 Define(Defs, "__LONG_MAX__", "2147483647L");
317 Define(Defs, "__PTRDIFF_TYPE__", "int");
318 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
319 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
320
321 Define(Defs, "__CHAR_BIT__", "8");
322 Define(Defs, "__INT_MAX__", "2147483647");
323 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
324 Define(Defs, "__SCHAR_MAX__", "127");
325 Define(Defs, "__SHRT_MAX__", "32767");
326
327 // Subtarget options. [hard coded to v6 for now]
328 Define(Defs, "__ARM_ARCH_6K__");
329 Define(Defs, "__ARMEL__");
330 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
331
332 Define(Defs, "__WCHAR_MAX__", "2147483647");
333 Define(Defs, "__WCHAR_TYPE__", "int");
334 Define(Defs, "__WINT_TYPE__", "int");
335 Define(Defs, "__DECIMAL_DIG__", "17");
336 Define(Defs, "__FLT_RADIX__", "2");
337
338 // Float macros.
339 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
340 Define(Defs, "__FLT_DIG__", "6");
341 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
342 Define(Defs, "__FLT_EVAL_METHOD__", "0");
343 Define(Defs, "__FLT_HAS_INFINITY__");
344 Define(Defs, "__FLT_HAS_QUIET_NAN__");
345 Define(Defs, "__FLT_MANT_DIG__", "24");
346 Define(Defs, "__FLT_MAX_10_EXP__", "38");
347 Define(Defs, "__FLT_MAX_EXP__", "128");
348 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
349 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
350 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
351 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
352
353 // Double macros.
354 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
355 Define(Defs, "__DBL_DIG__", "15");
356 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
357 Define(Defs, "__DBL_HAS_INFINITY__");
358 Define(Defs, "__DBL_HAS_QUIET_NAN__");
359 Define(Defs, "__DBL_MANT_DIG__", "53");
360 Define(Defs, "__DBL_MAX_10_EXP__", "308");
361 Define(Defs, "__DBL_MAX_EXP__", "1024");
362 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
363 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
364 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
365 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
366
367 // 64-bit Long double macros (same as double).
368 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
369 Define(Defs, "__LDBL_DIG__", "15");
370 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
371 Define(Defs, "__LDBL_HAS_INFINITY__");
372 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
373 Define(Defs, "__LDBL_MANT_DIG__", "53");
374 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
375 Define(Defs, "__LDBL_MAX_EXP__", "1024");
376 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
377 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
378 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
379 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
380}
381
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000382static const char* getI386VAListDeclaration() {
383 return "typedef char* __builtin_va_list;";
384}
385
386static const char* getX86_64VAListDeclaration() {
387 return
388 "typedef struct __va_list_tag {"
389 " unsigned gp_offset;"
390 " unsigned fp_offset;"
391 " void* overflow_arg_area;"
392 " void* reg_save_area;"
393 "} __builtin_va_list[1];";
394}
395
396static const char* getPPCVAListDeclaration() {
397 return
398 "typedef struct __va_list_tag {"
399 " unsigned char gpr;"
400 " unsigned char fpr;"
401 " unsigned short reserved;"
402 " void* overflow_arg_area;"
403 " void* reg_save_area;"
404 "} __builtin_va_list[1];";
405}
406
Chris Lattner393ff042008-04-21 18:56:49 +0000407static const char* getARMVAListDeclaration() {
408 return "typedef char* __builtin_va_list;";
409}
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000410
Reid Spencer5f016e22007-07-11 17:01:13 +0000411/// PPC builtin info.
Chris Lattnerfb344d32007-12-11 04:36:28 +0000412namespace clang {
Reid Spencer5f016e22007-07-11 17:01:13 +0000413namespace PPC {
Reid Spencer5f016e22007-07-11 17:01:13 +0000414
415 static const Builtin::Info BuiltinInfo[] = {
416#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000417#include "clang/AST/PPCBuiltins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000418 };
419
420 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
421 Records = BuiltinInfo;
422 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
423 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000424
425 static const char * const GCCRegNames[] = {
426 "0", "1", "2", "3", "4", "5", "6", "7",
427 "8", "9", "10", "11", "12", "13", "14", "15",
428 "16", "17", "18", "19", "20", "21", "22", "23",
429 "24", "25", "26", "27", "28", "29", "30", "31",
430 "0", "1", "2", "3", "4", "5", "6", "7",
431 "8", "9", "10", "11", "12", "13", "14", "15",
432 "16", "17", "18", "19", "20", "21", "22", "23",
433 "24", "25", "26", "27", "28", "29", "30", "31",
434 "mq", "lr", "ctr", "ap",
435 "0", "1", "2", "3", "4", "5", "6", "7",
436 "xer",
437 "0", "1", "2", "3", "4", "5", "6", "7",
438 "8", "9", "10", "11", "12", "13", "14", "15",
439 "16", "17", "18", "19", "20", "21", "22", "23",
440 "24", "25", "26", "27", "28", "29", "30", "31",
441 "vrsave", "vscr",
442 "spe_acc", "spefscr",
443 "sfp"
444 };
445
446 static void getGCCRegNames(const char * const *&Names,
447 unsigned &NumNames) {
448 Names = GCCRegNames;
449 NumNames = llvm::array_lengthof(GCCRegNames);
450 }
451
Chris Lattner0eaed122008-03-08 08:24:01 +0000452 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000453 // While some of these aliases do map to different registers
454 // they still share the same register name.
455 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
456 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
457 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
458 { { "cr3", "fr3", "r3", "v3"}, "3" },
459 { { "cr4", "fr4", "r4", "v4"}, "4" },
460 { { "cr5", "fr5", "r5", "v5"}, "5" },
461 { { "cr6", "fr6", "r6", "v6"}, "6" },
462 { { "cr7", "fr7", "r7", "v7"}, "7" },
463 { { "fr8", "r8", "v8"}, "8" },
464 { { "fr9", "r9", "v9"}, "9" },
465 { { "fr10", "r10", "v10"}, "10" },
466 { { "fr11", "r11", "v11"}, "11" },
467 { { "fr12", "r12", "v12"}, "12" },
468 { { "fr13", "r13", "v13"}, "13" },
469 { { "fr14", "r14", "v14"}, "14" },
470 { { "fr15", "r15", "v15"}, "15" },
471 { { "fr16", "r16", "v16"}, "16" },
472 { { "fr17", "r17", "v17"}, "17" },
473 { { "fr18", "r18", "v18"}, "18" },
474 { { "fr19", "r19", "v19"}, "19" },
475 { { "fr20", "r20", "v20"}, "20" },
476 { { "fr21", "r21", "v21"}, "21" },
477 { { "fr22", "r22", "v22"}, "22" },
478 { { "fr23", "r23", "v23"}, "23" },
479 { { "fr24", "r24", "v24"}, "24" },
480 { { "fr25", "r25", "v25"}, "25" },
481 { { "fr26", "r26", "v26"}, "26" },
482 { { "fr27", "r27", "v27"}, "27" },
483 { { "fr28", "r28", "v28"}, "28" },
484 { { "fr29", "r29", "v29"}, "29" },
485 { { "fr30", "r30", "v30"}, "30" },
486 { { "fr31", "r31", "v31"}, "31" },
487 };
488
Chris Lattner0eaed122008-03-08 08:24:01 +0000489 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000490 unsigned &NumAliases) {
491 Aliases = GCCRegAliases;
492 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssond04c6e22007-11-27 04:11:28 +0000493 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000494
Anders Carlssond04c6e22007-11-27 04:11:28 +0000495 static bool validateAsmConstraint(char c,
496 TargetInfo::ConstraintInfo &info) {
497 switch (c) {
498 default: return false;
499 case 'O': // Zero
500 return true;
501 case 'b': // Base register
502 case 'f': // Floating point register
503 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
504 return true;
505 }
506 }
507
508 const char *getClobbers() {
509 return 0;
510 }
511
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000512 const char *getTargetPrefix() {
513 return "ppc";
514 }
515
Reid Spencer5f016e22007-07-11 17:01:13 +0000516} // End namespace PPC
517
Reid Spencer5f016e22007-07-11 17:01:13 +0000518/// X86 builtin info.
519namespace X86 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000520 static const Builtin::Info BuiltinInfo[] = {
521#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000522#include "clang/AST/X86Builtins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000523 };
524
525 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
526 Records = BuiltinInfo;
527 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
528 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000529
530 static const char *GCCRegNames[] = {
531 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
532 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlsson646b2612007-11-25 00:23:10 +0000533 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson3346ae62007-11-24 23:38:12 +0000534 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
535 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
537 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
538 };
539
540 static void getGCCRegNames(const char * const *&Names,
541 unsigned &NumNames) {
542 Names = GCCRegNames;
543 NumNames = llvm::array_lengthof(GCCRegNames);
544 }
545
Chris Lattner0eaed122008-03-08 08:24:01 +0000546 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson3346ae62007-11-24 23:38:12 +0000547 { { "al", "ah", "eax", "rax" }, "ax" },
548 { { "bl", "bh", "ebx", "rbx" }, "bx" },
549 { { "cl", "ch", "ecx", "rcx" }, "cx" },
550 { { "dl", "dh", "edx", "rdx" }, "dx" },
551 { { "esi", "rsi" }, "si" },
Nuno Lopes9d294802008-07-07 12:18:07 +0000552 { { "edi", "rdi" }, "di" },
Anders Carlsson3346ae62007-11-24 23:38:12 +0000553 { { "esp", "rsp" }, "sp" },
554 { { "ebp", "rbp" }, "bp" },
555 };
556
Chris Lattner0eaed122008-03-08 08:24:01 +0000557 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson3346ae62007-11-24 23:38:12 +0000558 unsigned &NumAliases) {
559 Aliases = GCCRegAliases;
560 NumAliases = llvm::array_lengthof(GCCRegAliases);
561 }
562
Anders Carlssond04c6e22007-11-27 04:11:28 +0000563 static bool validateAsmConstraint(char c,
564 TargetInfo::ConstraintInfo &info) {
565 switch (c) {
566 default: return false;
567 case 'a': // eax.
568 case 'b': // ebx.
569 case 'c': // ecx.
570 case 'd': // edx.
571 case 'S': // esi.
572 case 'D': // edi.
573 case 'A': // edx:eax.
574 case 't': // top of floating point stack.
575 case 'u': // second from top of floating point stack.
576 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlsson456e79d2008-03-10 22:37:16 +0000577 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
578 // instructions.
579 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonb41edf92008-02-18 17:00:25 +0000580 // instructions.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000581 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
582 return true;
583 }
584 }
585
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000586 static std::string convertConstraint(const char Constraint) {
587 switch (Constraint) {
588 case 'a': return std::string("{ax}");
589 case 'b': return std::string("{bx}");
590 case 'c': return std::string("{cx}");
591 case 'd': return std::string("{dx}");
592 case 'S': return std::string("{si}");
593 case 'D': return std::string("{di}");
594 case 't': // top of floating point stack.
595 return std::string("{st}");
596 case 'u': // second from top of floating point stack.
597 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000598 default:
599 return std::string(1, Constraint);
600 }
601 }
602
Anders Carlssond04c6e22007-11-27 04:11:28 +0000603 const char *getClobbers() {
604 return "~{dirflag},~{fpsr},~{flags}";
605 }
606
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000607 const char *getTargetPrefix() {
608 return "x86";
609 }
610
Reid Spencer5f016e22007-07-11 17:01:13 +0000611} // End namespace X86
Chris Lattner393ff042008-04-21 18:56:49 +0000612
613
614/// ARM builtin info.
615namespace ARM {
616 const char *getTargetPrefix() {
617 return "arm";
618 }
619} // End namespace ARM
620
Chris Lattnerfb344d32007-12-11 04:36:28 +0000621} // end namespace clang.
Reid Spencer5f016e22007-07-11 17:01:13 +0000622
623//===----------------------------------------------------------------------===//
624// Specific target implementations.
625//===----------------------------------------------------------------------===//
626
627
628namespace {
629class DarwinPPCTargetInfo : public DarwinTargetInfo {
630public:
Eli Friedmand37f0b82008-05-20 14:25:01 +0000631 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
632 CharIsSigned = false;
633 }
Ted Kremenekae360762007-12-03 22:06:55 +0000634
Chris Lattnerd15fa822007-10-06 06:57:34 +0000635 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000636 DarwinTargetInfo::getTargetDefines(Defines);
637 getPowerPCDefines(Defines, false);
638 }
639 virtual void getTargetBuiltins(const Builtin::Info *&Records,
640 unsigned &NumRecords) const {
641 PPC::getBuiltins(Records, NumRecords);
642 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000643 virtual const char *getVAListDeclaration() const {
644 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000645 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000646 virtual const char *getTargetPrefix() const {
647 return PPC::getTargetPrefix();
648 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000649 virtual void getGCCRegNames(const char * const *&Names,
650 unsigned &NumNames) const {
651 PPC::getGCCRegNames(Names, NumNames);
652 }
653 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
654 unsigned &NumAliases) const {
655 PPC::getGCCRegAliases(Aliases, NumAliases);
656 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000657 virtual bool validateAsmConstraint(char c,
658 TargetInfo::ConstraintInfo &info) const {
659 return PPC::validateAsmConstraint(c, info);
660 }
661 virtual const char *getClobbers() const {
662 return PPC::getClobbers();
663 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000664};
665} // end anonymous namespace.
666
667namespace {
668class DarwinPPC64TargetInfo : public DarwinTargetInfo {
669public:
Chris Lattnerf291b102008-05-09 06:17:04 +0000670 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedmand37f0b82008-05-20 14:25:01 +0000671 CharIsSigned = false;
Chris Lattnerf291b102008-05-09 06:17:04 +0000672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
673 }
Ted Kremenekae360762007-12-03 22:06:55 +0000674
Chris Lattnerd15fa822007-10-06 06:57:34 +0000675 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000676 DarwinTargetInfo::getTargetDefines(Defines);
677 getPowerPCDefines(Defines, true);
678 }
679 virtual void getTargetBuiltins(const Builtin::Info *&Records,
680 unsigned &NumRecords) const {
681 PPC::getBuiltins(Records, NumRecords);
682 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000683 virtual const char *getVAListDeclaration() const {
684 return getPPCVAListDeclaration();
685 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000686 virtual const char *getTargetPrefix() const {
687 return PPC::getTargetPrefix();
688 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000689 virtual void getGCCRegNames(const char * const *&Names,
690 unsigned &NumNames) const {
691 PPC::getGCCRegNames(Names, NumNames);
692 }
693 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
694 unsigned &NumAliases) const {
695 PPC::getGCCRegAliases(Aliases, NumAliases);
696 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000697 virtual bool validateAsmConstraint(char c,
698 TargetInfo::ConstraintInfo &info) const {
699 return PPC::validateAsmConstraint(c, info);
700 }
701 virtual const char *getClobbers() const {
702 return PPC::getClobbers();
703 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000704};
705} // end anonymous namespace.
706
707namespace {
708class DarwinI386TargetInfo : public DarwinTargetInfo {
709public:
Eli Friedman61538a72008-05-20 14:21:01 +0000710 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
711 DoubleAlign = LongLongAlign = 32;
Eli Friedman5aa4fd62008-06-04 17:01:45 +0000712 LongDoubleWidth = 128;
713 LongDoubleAlign = 128;
Eli Friedman61538a72008-05-20 14:21:01 +0000714 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
715 }
716
Chris Lattnerd15fa822007-10-06 06:57:34 +0000717 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000718 DarwinTargetInfo::getTargetDefines(Defines);
719 getX86Defines(Defines, false);
720 }
721 virtual void getTargetBuiltins(const Builtin::Info *&Records,
722 unsigned &NumRecords) const {
723 X86::getBuiltins(Records, NumRecords);
724 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000725 virtual const char *getVAListDeclaration() const {
726 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000727 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000728 virtual const char *getTargetPrefix() const {
729 return X86::getTargetPrefix();
730 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000731 virtual void getGCCRegNames(const char * const *&Names,
732 unsigned &NumNames) const {
733 X86::getGCCRegNames(Names, NumNames);
734 }
735 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
736 unsigned &NumAliases) const {
737 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000738 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000739 virtual bool validateAsmConstraint(char c,
740 TargetInfo::ConstraintInfo &info) const {
741 return X86::validateAsmConstraint(c, info);
742 }
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000743
744 virtual std::string convertConstraint(const char Constraint) const {
745 return X86::convertConstraint(Constraint);
746 }
747
Anders Carlssond04c6e22007-11-27 04:11:28 +0000748 virtual const char *getClobbers() const {
749 return X86::getClobbers();
750 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000751};
752} // end anonymous namespace.
753
754namespace {
755class DarwinX86_64TargetInfo : public DarwinTargetInfo {
756public:
Chris Lattnerf291b102008-05-09 06:17:04 +0000757 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
758 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman61538a72008-05-20 14:21:01 +0000759 LongDoubleWidth = 128;
760 LongDoubleAlign = 128;
761 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnerf291b102008-05-09 06:17:04 +0000762 }
Ted Kremenekae360762007-12-03 22:06:55 +0000763
Chris Lattnerd15fa822007-10-06 06:57:34 +0000764 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000765 DarwinTargetInfo::getTargetDefines(Defines);
766 getX86Defines(Defines, true);
767 }
768 virtual void getTargetBuiltins(const Builtin::Info *&Records,
769 unsigned &NumRecords) const {
770 X86::getBuiltins(Records, NumRecords);
771 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000772 virtual const char *getVAListDeclaration() const {
773 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000774 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000775 virtual const char *getTargetPrefix() const {
776 return X86::getTargetPrefix();
777 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000778 virtual void getGCCRegNames(const char * const *&Names,
779 unsigned &NumNames) const {
780 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000781 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000782 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
783 unsigned &NumAliases) const {
784 X86::getGCCRegAliases(Aliases, NumAliases);
785 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000786 virtual bool validateAsmConstraint(char c,
787 TargetInfo::ConstraintInfo &info) const {
788 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venancioa5694b82008-02-26 18:33:46 +0000789 }
790 virtual std::string convertConstraint(const char Constraint) const {
791 return X86::convertConstraint(Constraint);
792 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000793 virtual const char *getClobbers() const {
794 return X86::getClobbers();
795 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000796};
797} // end anonymous namespace.
798
Chris Lattner393ff042008-04-21 18:56:49 +0000799
800namespace {
801class DarwinARMTargetInfo : public DarwinTargetInfo {
802public:
Eli Friedman61538a72008-05-20 14:21:01 +0000803 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
804 // FIXME: Are the defaults corrent for ARM?
805 }
Chris Lattner393ff042008-04-21 18:56:49 +0000806
807 virtual void getTargetDefines(std::vector<char> &Defines) const {
808 DarwinTargetInfo::getTargetDefines(Defines);
809 getARMDefines(Defines);
810 }
811 virtual void getTargetBuiltins(const Builtin::Info *&Records,
812 unsigned &NumRecords) const {
813 NumRecords = 0;
814 }
815 virtual const char *getVAListDeclaration() const {
816 return getARMVAListDeclaration();
817 }
818 virtual const char *getTargetPrefix() const {
819 return ARM::getTargetPrefix();
820 }
821
822 virtual void getGCCRegNames(const char * const *&Names,
823 unsigned &NumNames) const {
824 NumNames = 0;
825 }
826 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
827 unsigned &NumAliases) const {
828 NumAliases = 0;
829 }
830 virtual bool validateAsmConstraint(char c,
Nate Begemanad487f42008-04-22 05:03:19 +0000831 TargetInfo::ConstraintInfo &info) const {
832 switch (c) {
833 default:
834 case 'l': // r0-r7
835 case 'h': // r8-r15
836 case 'w': // VFP Floating point register single precision
837 case 'P': // VFP Floating point register double precision
838 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
839 return true;
840 }
Chris Lattner393ff042008-04-21 18:56:49 +0000841 return false;
842 }
843 virtual const char *getClobbers() const {
844 return "";
845 }
846};
847} // end anonymous namespace.
848
Reid Spencer5f016e22007-07-11 17:01:13 +0000849namespace {
Gabor Greif26658672008-02-21 16:29:08 +0000850class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
851public:
852 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
853
854 virtual void getTargetDefines(std::vector<char> &Defines) const {
855 SolarisTargetInfo::getTargetDefines(Defines);
856// getSparcDefines(Defines, false);
857 Define(Defines, "__sparc");
Eli Friedmanbf0c9bd2008-05-25 05:26:09 +0000858 Define(Defines, "__sparc__");
Gabor Greif26658672008-02-21 16:29:08 +0000859 Define(Defines, "__sparcv8");
860 }
861 virtual void getTargetBuiltins(const Builtin::Info *&Records,
862 unsigned &NumRecords) const {
863 PPC::getBuiltins(Records, NumRecords);
864 }
865 virtual const char *getVAListDeclaration() const {
866 return getPPCVAListDeclaration();
867 }
868 virtual const char *getTargetPrefix() const {
869 return PPC::getTargetPrefix();
870 }
871 virtual void getGCCRegNames(const char * const *&Names,
872 unsigned &NumNames) const {
873 PPC::getGCCRegNames(Names, NumNames);
874 }
875 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
876 unsigned &NumAliases) const {
877 PPC::getGCCRegAliases(Aliases, NumAliases);
878 }
879 virtual bool validateAsmConstraint(char c,
880 TargetInfo::ConstraintInfo &info) const {
881 return PPC::validateAsmConstraint(c, info);
882 }
883 virtual const char *getClobbers() const {
884 return PPC::getClobbers();
885 }
886};
887
888} // end anonymous namespace.
889
Reid Spencer5f016e22007-07-11 17:01:13 +0000890
Chris Lattner2621fd12008-05-08 05:58:21 +0000891namespace {
892 class PIC16TargetInfo : public TargetInfo{
893 public:
894 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman61538a72008-05-20 14:21:01 +0000895 // FIXME: Is IntAlign really supposed to be 16? There seems
896 // little point on a platform with 8-bit loads.
897 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
898 PointerAlign = 8;
Chris Lattner2621fd12008-05-08 05:58:21 +0000899 }
Chris Lattner927686f2008-05-09 06:08:39 +0000900 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
901 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner2621fd12008-05-08 05:58:21 +0000902 virtual void getTargetDefines(std::vector<char> &Defines) const {
903 Define(Defines, "__pic16");
904 }
905 virtual void getTargetBuiltins(const Builtin::Info *&Records,
906 unsigned &NumRecords) const {}
907 virtual const char *getVAListDeclaration() const { return "";}
908 virtual const char *getClobbers() const {return "";}
909 virtual const char *getTargetPrefix() const {return "";}
910 virtual void getGCCRegNames(const char * const *&Names,
911 unsigned &NumNames) const {}
912 virtual bool validateAsmConstraint(char c,
913 TargetInfo::ConstraintInfo &info) const {
914 return true;
915 }
916 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
917 unsigned &NumAliases) const {}
918 virtual bool useGlobalsForAutomaticVariables() const {return true;}
919 };
920}
921
Reid Spencer5f016e22007-07-11 17:01:13 +0000922//===----------------------------------------------------------------------===//
923// Driver code
924//===----------------------------------------------------------------------===//
925
Ted Kremenek8448d382007-12-04 17:07:35 +0000926static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000927 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
928 TT[4] == '-' && TT[1] - '3' < 6);
929}
930
Chris Lattner42e67372008-03-05 01:18:20 +0000931/// CreateTargetInfo - Return the target info object for the specified target
932/// triple.
933TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner82817ba2007-12-05 18:41:05 +0000934 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000935 return new DarwinPPCTargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000936
Chris Lattner42e67372008-03-05 01:18:20 +0000937 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000938 return new DarwinPPC64TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000939
Chris Lattner393ff042008-04-21 18:56:49 +0000940 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
941 return new DarwinARMTargetInfo(T);
942
Chris Lattner42e67372008-03-05 01:18:20 +0000943 if (T.find("sparc-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000944 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman61538a72008-05-20 14:21:01 +0000945
Chris Lattner42e67372008-03-05 01:18:20 +0000946 if (T.find("x86_64-") == 0)
Chris Lattner0eaed122008-03-08 08:24:01 +0000947 return new DarwinX86_64TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000948
Chris Lattner2621fd12008-05-08 05:58:21 +0000949 if (T.find("pic16-") == 0)
950 return new PIC16TargetInfo(T);
951
Chris Lattner42e67372008-03-05 01:18:20 +0000952 if (IsX86(T))
Chris Lattner0eaed122008-03-08 08:24:01 +0000953 return new DarwinI386TargetInfo(T);
Eli Friedman61538a72008-05-20 14:21:01 +0000954
Chris Lattner42e67372008-03-05 01:18:20 +0000955 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +0000956}
Ted Kremenekfb79f7c2008-03-04 17:47:18 +0000957