blob: ac48e23f759ee3b82ac883b127e4b01a645c714f [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" },
552 { { "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