blob: ac48e23f759ee3b82ac883b127e4b01a645c714f [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek6f6ff372007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner10a5b382007-01-29 05:24:35 +000015#include "clang/AST/Builtins.h"
Anders Carlsson895af082007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner5ba61f02006-10-14 07:39:34 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson5fa3f342007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000020#include "llvm/ADT/APFloat.h"
Ted Kremenekb0615542007-12-03 22:06:55 +000021
Chris Lattner5ba61f02006-10-14 07:39:34 +000022using namespace clang;
23
Chris Lattner5ba61f02006-10-14 07:39:34 +000024//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000025// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000026//===----------------------------------------------------------------------===//
27
Chris Lattnerb2d486a2007-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
Chris Lattner5ba61f02006-10-14 07:39:34 +000039namespace {
Chris Lattnerc3a669b2008-03-08 08:24:01 +000040class DarwinTargetInfo : public TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +000041public:
Chris Lattnerc3a669b2008-03-08 08:24:01 +000042 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenekb0615542007-12-03 22:06:55 +000043
Chris Lattnerb2d486a2007-10-06 06:57:34 +000044 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner253023b2007-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 Lattnerb2d486a2007-10-06 06:57:34 +000048 Define(Defs, "__APPLE__");
49 Define(Defs, "__MACH__");
Chris Lattner253023b2007-10-17 06:04:46 +000050#endif
Nuno Lopes3da38fd2008-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
Chris Lattner9c837532006-10-15 01:05:46 +000056
57 if (1) {// -fobjc-gc controls this.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000058 Define(Defs, "__weak", "");
59 Define(Defs, "__strong", "");
Chris Lattner9c837532006-10-15 01:05:46 +000060 } else {
Chris Lattnerb2d486a2007-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__");
Chris Lattner9c837532006-10-15 01:05:46 +000064 }
65
66 // darwin_constant_cfstrings controls this.
Chris Lattnerb2d486a2007-10-06 06:57:34 +000067 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner9c837532006-10-15 01:05:46 +000068
69 if (0) // darwin_pascal_strings
Chris Lattnerb2d486a2007-10-06 06:57:34 +000070 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner1f5ad112006-10-14 18:32:12 +000071 }
72
Chris Lattner5ba61f02006-10-14 07:39:34 +000073};
Gabor Greif49991682008-02-21 16:29:08 +000074
75
Chris Lattnerc3a669b2008-03-08 08:24:01 +000076class SolarisTargetInfo : public TargetInfo {
Gabor Greif49991682008-02-21 16:29:08 +000077public:
Chris Lattnerc3a669b2008-03-08 08:24:01 +000078 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif49991682008-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};
Chris Lattner5ba61f02006-10-14 07:39:34 +000099} // end anonymous namespace.
100
101
Chris Lattner1f5ad112006-10-14 18:32:12 +0000102/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
103/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000104static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000105 // Target identification.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000106 Define(Defs, "__ppc__");
107 Define(Defs, "_ARCH_PPC");
108 Define(Defs, "__POWERPC__");
Chris Lattner9c837532006-10-15 01:05:46 +0000109 if (is64Bit) {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000110 Define(Defs, "_ARCH_PPC64");
111 Define(Defs, "_LP64");
112 Define(Defs, "__LP64__");
113 Define(Defs, "__ppc64__");
Chris Lattner9c837532006-10-15 01:05:46 +0000114 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000115 Define(Defs, "__ppc__");
Chris Lattner9c837532006-10-15 01:05:46 +0000116 }
Chris Lattner1f5ad112006-10-14 18:32:12 +0000117
Chris Lattner9c837532006-10-15 01:05:46 +0000118 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000119 Define(Defs, "_BIG_ENDIAN");
120 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000121
122 if (is64Bit) {
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000128 } else {
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000134 }
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000141
142 // Subtarget options.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000143 Define(Defs, "__USER_LABEL_PREFIX__", "_");
144 Define(Defs, "__NATURAL_ALIGNMENT__");
145 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000146
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000147 Define(Defs, "__WCHAR_MAX__", "2147483647");
148 Define(Defs, "__WCHAR_TYPE__", "int");
149 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000150
151 // Float macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000166
167 // double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000181
182 // 128-bit long double macros.
Chris Lattnerb2d486a2007-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__");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000200}
201
202/// getX86Defines - Return a set of the X86-specific #defines that are
203/// not tied to a specific subtarget.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000204static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner9c837532006-10-15 01:05:46 +0000205 // Target identification.
206 if (is64Bit) {
Chris Lattnerb2d486a2007-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__");
Chris Lattner9c837532006-10-15 01:05:46 +0000213 } else {
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000214 Define(Defs, "__i386__");
215 Define(Defs, "__i386");
216 Define(Defs, "i386");
Chris Lattner9c837532006-10-15 01:05:46 +0000217 }
218
219 // Target properties.
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000220 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner9c837532006-10-15 01:05:46 +0000221
222 if (is64Bit) {
Chris Lattnerb2d486a2007-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 Venancio71a9bb22008-01-20 04:02:16 +0000228 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000229 } else {
Chris Lattnerb2d486a2007-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 Venancio71a9bb22008-01-20 04:02:16 +0000235 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Chris Lattner9c837532006-10-15 01:05:46 +0000236 }
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000242
243 // Subtarget options.
Chris Lattnerb2d486a2007-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__", "");
Chris Lattner9c837532006-10-15 01:05:46 +0000253
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000254 Define(Defs, "__WCHAR_MAX__", "2147483647");
255 Define(Defs, "__WCHAR_TYPE__", "int");
256 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner9c837532006-10-15 01:05:46 +0000257
258 // Float macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000273
274 // Double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner9c837532006-10-15 01:05:46 +0000288
289 // 80-bit Long double macros.
Chris Lattnerb2d486a2007-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");
Chris Lattner1f5ad112006-10-14 18:32:12 +0000302}
303
Chris Lattner0dcd9aa2008-04-21 20:19:54 +0000304/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner17df24e2008-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 Carlssona7408e72007-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 Lattner17df24e2008-04-21 18:56:49 +0000407static const char* getARMVAListDeclaration() {
408 return "typedef char* __builtin_va_list;";
409}
Anders Carlssona7408e72007-10-13 00:45:48 +0000410
Chris Lattner10a5b382007-01-29 05:24:35 +0000411/// PPC builtin info.
Chris Lattner29a16af2007-12-11 04:36:28 +0000412namespace clang {
Chris Lattner10a5b382007-01-29 05:24:35 +0000413namespace PPC {
Chris Lattner10a5b382007-01-29 05:24:35 +0000414
415 static const Builtin::Info BuiltinInfo[] = {
416#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson895af082007-12-09 23:17:02 +0000417#include "clang/AST/PPCBuiltins.def"
Chris Lattner10a5b382007-01-29 05:24:35 +0000418 };
419
420 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
421 Records = BuiltinInfo;
422 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
423 }
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000452 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000489 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000490 unsigned &NumAliases) {
491 Aliases = GCCRegAliases;
492 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssonf511f642007-11-27 04:11:28 +0000493 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000494
Anders Carlssonf511f642007-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 Carlsson050f4942007-12-08 19:32:57 +0000512 const char *getTargetPrefix() {
513 return "ppc";
514 }
515
Chris Lattner10a5b382007-01-29 05:24:35 +0000516} // End namespace PPC
517
Chris Lattner10a5b382007-01-29 05:24:35 +0000518/// X86 builtin info.
519namespace X86 {
Chris Lattner10a5b382007-01-29 05:24:35 +0000520 static const Builtin::Info BuiltinInfo[] = {
521#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson895af082007-12-09 23:17:02 +0000522#include "clang/AST/X86Builtins.def"
Chris Lattner10a5b382007-01-29 05:24:35 +0000523 };
524
525 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
526 Records = BuiltinInfo;
527 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
528 }
Anders Carlsson5fa3f342007-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 Carlssonc1636572007-11-25 00:23:10 +0000533 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000546 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson5fa3f342007-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 Lattnerc3a669b2008-03-08 08:24:01 +0000556 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000557 unsigned &NumAliases) {
558 Aliases = GCCRegAliases;
559 NumAliases = llvm::array_lengthof(GCCRegAliases);
560 }
561
Anders Carlssonf511f642007-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 Carlsson0be81632008-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 Carlsson196aa532008-02-18 17:00:25 +0000579 // instructions.
Anders Carlssonf511f642007-11-27 04:11:28 +0000580 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
581 return true;
582 }
583 }
584
Lauro Ramos Venancioc9fbd732008-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 Venancioc9fbd732008-02-26 18:33:46 +0000597 default:
598 return std::string(1, Constraint);
599 }
600 }
601
Anders Carlssonf511f642007-11-27 04:11:28 +0000602 const char *getClobbers() {
603 return "~{dirflag},~{fpsr},~{flags}";
604 }
605
Anders Carlsson050f4942007-12-08 19:32:57 +0000606 const char *getTargetPrefix() {
607 return "x86";
608 }
609
Chris Lattner10a5b382007-01-29 05:24:35 +0000610} // End namespace X86
Chris Lattner17df24e2008-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 Lattner29a16af2007-12-11 04:36:28 +0000620} // end namespace clang.
Chris Lattner10a5b382007-01-29 05:24:35 +0000621
Chris Lattner5ba61f02006-10-14 07:39:34 +0000622//===----------------------------------------------------------------------===//
623// Specific target implementations.
624//===----------------------------------------------------------------------===//
625
Chris Lattner02dffbd2006-10-14 07:50:21 +0000626
Chris Lattner5ba61f02006-10-14 07:39:34 +0000627namespace {
628class DarwinPPCTargetInfo : public DarwinTargetInfo {
629public:
Eli Friedman1ca64762008-05-20 14:25:01 +0000630 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
631 CharIsSigned = false;
632 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000633
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000634 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000635 DarwinTargetInfo::getTargetDefines(Defines);
636 getPowerPCDefines(Defines, false);
637 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000638 virtual void getTargetBuiltins(const Builtin::Info *&Records,
639 unsigned &NumRecords) const {
640 PPC::getBuiltins(Records, NumRecords);
641 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000642 virtual const char *getVAListDeclaration() const {
643 return getPPCVAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000644 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000645 virtual const char *getTargetPrefix() const {
646 return PPC::getTargetPrefix();
647 }
Anders Carlsson5fa3f342007-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 Carlssonf511f642007-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 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000663};
664} // end anonymous namespace.
665
666namespace {
667class DarwinPPC64TargetInfo : public DarwinTargetInfo {
668public:
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000669 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman1ca64762008-05-20 14:25:01 +0000670 CharIsSigned = false;
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000671 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
672 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000673
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000674 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000675 DarwinTargetInfo::getTargetDefines(Defines);
676 getPowerPCDefines(Defines, true);
677 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000678 virtual void getTargetBuiltins(const Builtin::Info *&Records,
679 unsigned &NumRecords) const {
680 PPC::getBuiltins(Records, NumRecords);
681 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000682 virtual const char *getVAListDeclaration() const {
683 return getPPCVAListDeclaration();
684 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000685 virtual const char *getTargetPrefix() const {
686 return PPC::getTargetPrefix();
687 }
Anders Carlsson5fa3f342007-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 Carlssonf511f642007-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 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000703};
704} // end anonymous namespace.
705
706namespace {
707class DarwinI386TargetInfo : public DarwinTargetInfo {
708public:
Eli Friedmanb5366062008-05-20 14:21:01 +0000709 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
710 DoubleAlign = LongLongAlign = 32;
Eli Friedman67b82792008-06-04 17:01:45 +0000711 LongDoubleWidth = 128;
712 LongDoubleAlign = 128;
Eli Friedmanb5366062008-05-20 14:21:01 +0000713 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
714 }
715
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000716 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000717 DarwinTargetInfo::getTargetDefines(Defines);
718 getX86Defines(Defines, false);
719 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000720 virtual void getTargetBuiltins(const Builtin::Info *&Records,
721 unsigned &NumRecords) const {
722 X86::getBuiltins(Records, NumRecords);
723 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000724 virtual const char *getVAListDeclaration() const {
725 return getI386VAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000726 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000727 virtual const char *getTargetPrefix() const {
728 return X86::getTargetPrefix();
729 }
Anders Carlsson5fa3f342007-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 Carlssona7408e72007-10-13 00:45:48 +0000737 }
Anders Carlssonf511f642007-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 Venancioc9fbd732008-02-26 18:33:46 +0000742
743 virtual std::string convertConstraint(const char Constraint) const {
744 return X86::convertConstraint(Constraint);
745 }
746
Anders Carlssonf511f642007-11-27 04:11:28 +0000747 virtual const char *getClobbers() const {
748 return X86::getClobbers();
749 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000750};
751} // end anonymous namespace.
752
753namespace {
754class DarwinX86_64TargetInfo : public DarwinTargetInfo {
755public:
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000756 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
757 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +0000758 LongDoubleWidth = 128;
759 LongDoubleAlign = 128;
760 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnerba7a6c12008-05-09 06:17:04 +0000761 }
Ted Kremenekb0615542007-12-03 22:06:55 +0000762
Chris Lattnerb2d486a2007-10-06 06:57:34 +0000763 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner1f5ad112006-10-14 18:32:12 +0000764 DarwinTargetInfo::getTargetDefines(Defines);
765 getX86Defines(Defines, true);
766 }
Chris Lattner10a5b382007-01-29 05:24:35 +0000767 virtual void getTargetBuiltins(const Builtin::Info *&Records,
768 unsigned &NumRecords) const {
769 X86::getBuiltins(Records, NumRecords);
770 }
Anders Carlssona7408e72007-10-13 00:45:48 +0000771 virtual const char *getVAListDeclaration() const {
772 return getX86_64VAListDeclaration();
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000773 }
Anders Carlsson050f4942007-12-08 19:32:57 +0000774 virtual const char *getTargetPrefix() const {
775 return X86::getTargetPrefix();
776 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000777 virtual void getGCCRegNames(const char * const *&Names,
778 unsigned &NumNames) const {
779 X86::getGCCRegNames(Names, NumNames);
Anders Carlssona7408e72007-10-13 00:45:48 +0000780 }
Anders Carlsson5fa3f342007-11-24 23:38:12 +0000781 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
782 unsigned &NumAliases) const {
783 X86::getGCCRegAliases(Aliases, NumAliases);
784 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000785 virtual bool validateAsmConstraint(char c,
786 TargetInfo::ConstraintInfo &info) const {
787 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venancioc9fbd732008-02-26 18:33:46 +0000788 }
789 virtual std::string convertConstraint(const char Constraint) const {
790 return X86::convertConstraint(Constraint);
791 }
Anders Carlssonf511f642007-11-27 04:11:28 +0000792 virtual const char *getClobbers() const {
793 return X86::getClobbers();
794 }
Chris Lattner5ba61f02006-10-14 07:39:34 +0000795};
796} // end anonymous namespace.
797
Chris Lattner17df24e2008-04-21 18:56:49 +0000798
799namespace {
800class DarwinARMTargetInfo : public DarwinTargetInfo {
801public:
Eli Friedmanb5366062008-05-20 14:21:01 +0000802 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
803 // FIXME: Are the defaults corrent for ARM?
804 }
Chris Lattner17df24e2008-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 Begeman2908fa02008-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 Lattner17df24e2008-04-21 18:56:49 +0000840 return false;
841 }
842 virtual const char *getClobbers() const {
843 return "";
844 }
845};
846} // end anonymous namespace.
847
Chris Lattner5ba61f02006-10-14 07:39:34 +0000848namespace {
Gabor Greif49991682008-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 Friedmanb2bef7c2008-05-25 05:26:09 +0000857 Define(Defines, "__sparc__");
Gabor Greif49991682008-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
Chris Lattner5ba61f02006-10-14 07:39:34 +0000889
Chris Lattnerb781dc792008-05-08 05:58:21 +0000890namespace {
891 class PIC16TargetInfo : public TargetInfo{
892 public:
893 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedmanb5366062008-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 Lattnerb781dc792008-05-08 05:58:21 +0000898 }
Chris Lattner5e2ef0c2008-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 Lattnerb781dc792008-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
Chris Lattner5ba61f02006-10-14 07:39:34 +0000921//===----------------------------------------------------------------------===//
922// Driver code
923//===----------------------------------------------------------------------===//
924
Ted Kremenek0c2bea22007-12-04 17:07:35 +0000925static inline bool IsX86(const std::string& TT) {
Ted Kremenekb0615542007-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 Lattner855d0242008-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 Lattner36021a92007-12-05 18:41:05 +0000933 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000934 return new DarwinPPCTargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000935
Chris Lattner855d0242008-03-05 01:18:20 +0000936 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000937 return new DarwinPPC64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000938
Chris Lattner17df24e2008-04-21 18:56:49 +0000939 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
940 return new DarwinARMTargetInfo(T);
941
Chris Lattner855d0242008-03-05 01:18:20 +0000942 if (T.find("sparc-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000943 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedmanb5366062008-05-20 14:21:01 +0000944
Chris Lattner855d0242008-03-05 01:18:20 +0000945 if (T.find("x86_64-") == 0)
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000946 return new DarwinX86_64TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000947
Chris Lattnerb781dc792008-05-08 05:58:21 +0000948 if (T.find("pic16-") == 0)
949 return new PIC16TargetInfo(T);
950
Chris Lattner855d0242008-03-05 01:18:20 +0000951 if (IsX86(T))
Chris Lattnerc3a669b2008-03-08 08:24:01 +0000952 return new DarwinI386TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +0000953
Chris Lattner855d0242008-03-05 01:18:20 +0000954 return NULL;
Chris Lattner5ba61f02006-10-14 07:39:34 +0000955}
Ted Kremenekc490bdb2008-03-04 17:47:18 +0000956