blob: 214dfb16de8d39d25e76982b2c69befeef733e1d [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-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 Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek38591a22007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Chris Lattner4b009652007-07-25 00:24:17 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Builtins.h"
Anders Carlssone1449c12007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Chris Lattner4b009652007-07-25 00:24:17 +000017#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000018#include "llvm/ADT/STLExtras.h"
Eli Friedmand4011892008-05-20 14:27:34 +000019#include "llvm/ADT/APFloat.h"
Ted Kremenek40499482007-12-03 22:06:55 +000020
Chris Lattner4b009652007-07-25 00:24:17 +000021using namespace clang;
22
Chris Lattner4b009652007-07-25 00:24:17 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattner0db667a2007-10-06 06:57:34 +000027static void Define(std::vector<char> &Buf, const char *Macro,
28 const char *Val = "1") {
29 const char *Def = "#define ";
30 Buf.insert(Buf.end(), Def, Def+strlen(Def));
31 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
32 Buf.push_back(' ');
33 Buf.insert(Buf.end(), Val, Val+strlen(Val));
34 Buf.push_back('\n');
35}
36
37
Chris Lattner4b009652007-07-25 00:24:17 +000038namespace {
Chris Lattner0fb8d852008-03-08 08:24:01 +000039class DarwinTargetInfo : public TargetInfo {
Chris Lattner4b009652007-07-25 00:24:17 +000040public:
Chris Lattner0fb8d852008-03-08 08:24:01 +000041 DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Ted Kremenek40499482007-12-03 22:06:55 +000042
Chris Lattner0db667a2007-10-06 06:57:34 +000043 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner1ed172d2007-10-17 06:04:46 +000044// FIXME: we need a real target configuration system. For now, only define
45// __APPLE__ if the host has it.
46#ifdef __APPLE__
Chris Lattner0db667a2007-10-06 06:57:34 +000047 Define(Defs, "__APPLE__");
48 Define(Defs, "__MACH__");
Chris Lattner1ed172d2007-10-17 06:04:46 +000049#endif
Nuno Lopese531db82008-07-05 19:32:25 +000050
51/* FIXME. we may also need to distinguish between darwin and linux targets */
52#ifdef linux
53 Define(Defs, "linux");
54#endif
Chris Lattner4b009652007-07-25 00:24:17 +000055
56 if (1) {// -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000057 Define(Defs, "__weak", "");
58 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000059 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000060 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
61 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
62 Define(Defs, "__OBJC_GC__");
Chris Lattner4b009652007-07-25 00:24:17 +000063 }
64
65 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000066 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000067
68 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000069 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000070 }
71
72};
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000073
74
Chris Lattner0fb8d852008-03-08 08:24:01 +000075class SolarisTargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000076public:
Chris Lattner0fb8d852008-03-08 08:24:01 +000077 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000078
79 virtual void getTargetDefines(std::vector<char> &Defs) const {
80// FIXME: we need a real target configuration system. For now, only define
81// __SUN__ if the host has it.
82#ifdef __SUN__
83 Define(Defs, "__SUN__");
84 Define(Defs, "__SOLARIS__");
85#endif
86
87 if (1) {// -fobjc-gc controls this.
88 Define(Defs, "__weak", "");
89 Define(Defs, "__strong", "");
90 } else {
91 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
92 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
93 Define(Defs, "__OBJC_GC__");
94 }
95 }
96
97};
Chris Lattner4b009652007-07-25 00:24:17 +000098} // end anonymous namespace.
99
100
101/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
102/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000103static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000104 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000105 Define(Defs, "__ppc__");
106 Define(Defs, "_ARCH_PPC");
107 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000108 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000109 Define(Defs, "_ARCH_PPC64");
110 Define(Defs, "_LP64");
111 Define(Defs, "__LP64__");
112 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000113 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000114 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000115 }
116
117 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000118 Define(Defs, "_BIG_ENDIAN");
119 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000120
121 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000122 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
123 Define(Defs, "__INTMAX_TYPE__", "long int");
124 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
125 Define(Defs, "__PTRDIFF_TYPE__", "long int");
126 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000127 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000128 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
129 Define(Defs, "__INTMAX_TYPE__", "long long int");
130 Define(Defs, "__LONG_MAX__", "2147483647L");
131 Define(Defs, "__PTRDIFF_TYPE__", "int");
132 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000133 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000134 Define(Defs, "__INT_MAX__", "2147483647");
135 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
136 Define(Defs, "__CHAR_BIT__", "8");
137 Define(Defs, "__SCHAR_MAX__", "127");
138 Define(Defs, "__SHRT_MAX__", "32767");
139 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000140
141 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000142 Define(Defs, "__USER_LABEL_PREFIX__", "_");
143 Define(Defs, "__NATURAL_ALIGNMENT__");
144 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000145
Chris Lattner0db667a2007-10-06 06:57:34 +0000146 Define(Defs, "__WCHAR_MAX__", "2147483647");
147 Define(Defs, "__WCHAR_TYPE__", "int");
148 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000149
150 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000151 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
152 Define(Defs, "__FLT_DIG__", "6");
153 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
154 Define(Defs, "__FLT_EVAL_METHOD__", "0");
155 Define(Defs, "__FLT_HAS_INFINITY__");
156 Define(Defs, "__FLT_HAS_QUIET_NAN__");
157 Define(Defs, "__FLT_MANT_DIG__", "24");
158 Define(Defs, "__FLT_MAX_10_EXP__", "38");
159 Define(Defs, "__FLT_MAX_EXP__", "128");
160 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
161 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
162 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
163 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
164 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000165
166 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000167 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
168 Define(Defs, "__DBL_DIG__", "15");
169 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
170 Define(Defs, "__DBL_HAS_INFINITY__");
171 Define(Defs, "__DBL_HAS_QUIET_NAN__");
172 Define(Defs, "__DBL_MANT_DIG__", "53");
173 Define(Defs, "__DBL_MAX_10_EXP__", "308");
174 Define(Defs, "__DBL_MAX_EXP__", "1024");
175 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
176 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
177 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
178 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
179 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000180
181 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000182 Define(Defs, "__LDBL_DENORM_MIN__",
183 "4.94065645841246544176568792868221e-324L");
184 Define(Defs, "__LDBL_DIG__", "31");
185 Define(Defs, "__LDBL_EPSILON__",
186 "4.94065645841246544176568792868221e-324L");
187 Define(Defs, "__LDBL_HAS_INFINITY__");
188 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
189 Define(Defs, "__LDBL_MANT_DIG__", "106");
190 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
191 Define(Defs, "__LDBL_MAX_EXP__", "1024");
192 Define(Defs, "__LDBL_MAX__",
193 "1.79769313486231580793728971405301e+308L");
194 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
195 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
196 Define(Defs, "__LDBL_MIN__",
197 "2.00416836000897277799610805135016e-292L");
198 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000199}
200
201/// getX86Defines - Return a set of the X86-specific #defines that are
202/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000203static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000204 // Target identification.
205 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000206 Define(Defs, "_LP64");
207 Define(Defs, "__LP64__");
208 Define(Defs, "__amd64__");
209 Define(Defs, "__amd64");
210 Define(Defs, "__x86_64");
211 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000212 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000213 Define(Defs, "__i386__");
214 Define(Defs, "__i386");
215 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000216 }
217
218 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000219 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000220
221 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000222 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
223 Define(Defs, "__INTMAX_TYPE__", "long int");
224 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
225 Define(Defs, "__PTRDIFF_TYPE__", "long int");
226 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000227 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000228 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
229 Define(Defs, "__INTMAX_TYPE__", "long long int");
230 Define(Defs, "__LONG_MAX__", "2147483647L");
231 Define(Defs, "__PTRDIFF_TYPE__", "int");
232 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000233 }
Anders Carlsson82b26282008-07-22 17:16:13 +0000234 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner0db667a2007-10-06 06:57:34 +0000235 Define(Defs, "__CHAR_BIT__", "8");
236 Define(Defs, "__INT_MAX__", "2147483647");
237 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
238 Define(Defs, "__SCHAR_MAX__", "127");
239 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner4b009652007-07-25 00:24:17 +0000240
241 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000242 Define(Defs, "__nocona");
243 Define(Defs, "__nocona__");
244 Define(Defs, "__tune_nocona__");
245 Define(Defs, "__SSE2_MATH__");
246 Define(Defs, "__SSE2__");
247 Define(Defs, "__SSE_MATH__");
248 Define(Defs, "__SSE__");
249 Define(Defs, "__MMX__");
250 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000251
Chris Lattner0db667a2007-10-06 06:57:34 +0000252 Define(Defs, "__WCHAR_MAX__", "2147483647");
253 Define(Defs, "__WCHAR_TYPE__", "int");
254 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000255
256 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000257 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
258 Define(Defs, "__FLT_DIG__", "6");
259 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
260 Define(Defs, "__FLT_EVAL_METHOD__", "0");
261 Define(Defs, "__FLT_HAS_INFINITY__");
262 Define(Defs, "__FLT_HAS_QUIET_NAN__");
263 Define(Defs, "__FLT_MANT_DIG__", "24");
264 Define(Defs, "__FLT_MAX_10_EXP__", "38");
265 Define(Defs, "__FLT_MAX_EXP__", "128");
266 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
267 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
268 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
269 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
270 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000271
272 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000273 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
274 Define(Defs, "__DBL_DIG__", "15");
275 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
276 Define(Defs, "__DBL_HAS_INFINITY__");
277 Define(Defs, "__DBL_HAS_QUIET_NAN__");
278 Define(Defs, "__DBL_MANT_DIG__", "53");
279 Define(Defs, "__DBL_MAX_10_EXP__", "308");
280 Define(Defs, "__DBL_MAX_EXP__", "1024");
281 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
282 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
283 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
284 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
285 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000286
287 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000288 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
289 Define(Defs, "__LDBL_DIG__", "18");
290 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
291 Define(Defs, "__LDBL_HAS_INFINITY__");
292 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
293 Define(Defs, "__LDBL_MANT_DIG__", "64");
294 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
295 Define(Defs, "__LDBL_MAX_EXP__", "16384");
296 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
297 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
298 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
299 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000300}
301
Chris Lattnerb6444052008-04-21 20:19:54 +0000302/// getARMDefines - Return a set of the ARM-specific #defines that are
Chris Lattner9fd73612008-04-21 18:56:49 +0000303/// not tied to a specific subtarget.
304static void getARMDefines(std::vector<char> &Defs) {
305 // Target identification.
306 Define(Defs, "__arm");
307 Define(Defs, "__arm__");
308
309 // Target properties.
310 Define(Defs, "__LITTLE_ENDIAN__");
311
312 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
313 Define(Defs, "__INTMAX_TYPE__", "long long int");
314 Define(Defs, "__LONG_MAX__", "2147483647L");
315 Define(Defs, "__PTRDIFF_TYPE__", "int");
316 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
317 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
318
319 Define(Defs, "__CHAR_BIT__", "8");
320 Define(Defs, "__INT_MAX__", "2147483647");
321 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
322 Define(Defs, "__SCHAR_MAX__", "127");
323 Define(Defs, "__SHRT_MAX__", "32767");
324
325 // Subtarget options. [hard coded to v6 for now]
326 Define(Defs, "__ARM_ARCH_6K__");
327 Define(Defs, "__ARMEL__");
328 Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
329
330 Define(Defs, "__WCHAR_MAX__", "2147483647");
331 Define(Defs, "__WCHAR_TYPE__", "int");
332 Define(Defs, "__WINT_TYPE__", "int");
333 Define(Defs, "__DECIMAL_DIG__", "17");
334 Define(Defs, "__FLT_RADIX__", "2");
335
336 // Float macros.
337 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
338 Define(Defs, "__FLT_DIG__", "6");
339 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
340 Define(Defs, "__FLT_EVAL_METHOD__", "0");
341 Define(Defs, "__FLT_HAS_INFINITY__");
342 Define(Defs, "__FLT_HAS_QUIET_NAN__");
343 Define(Defs, "__FLT_MANT_DIG__", "24");
344 Define(Defs, "__FLT_MAX_10_EXP__", "38");
345 Define(Defs, "__FLT_MAX_EXP__", "128");
346 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
347 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
348 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
349 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
350
351 // Double macros.
352 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
353 Define(Defs, "__DBL_DIG__", "15");
354 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
355 Define(Defs, "__DBL_HAS_INFINITY__");
356 Define(Defs, "__DBL_HAS_QUIET_NAN__");
357 Define(Defs, "__DBL_MANT_DIG__", "53");
358 Define(Defs, "__DBL_MAX_10_EXP__", "308");
359 Define(Defs, "__DBL_MAX_EXP__", "1024");
360 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
361 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
362 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
363 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
364
365 // 64-bit Long double macros (same as double).
366 Define(Defs, "__LDBL_DENORM_MIN__", "4.9406564584124654e-324");
367 Define(Defs, "__LDBL_DIG__", "15");
368 Define(Defs, "__LDBL_EPSILON__", "2.2204460492503131e-16");
369 Define(Defs, "__LDBL_HAS_INFINITY__");
370 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
371 Define(Defs, "__LDBL_MANT_DIG__", "53");
372 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
373 Define(Defs, "__LDBL_MAX_EXP__", "1024");
374 Define(Defs, "__LDBL_MAX__", "1.7976931348623157e+308");
375 Define(Defs, "__LDBL_MIN_10_EXP__", "(-307)");
376 Define(Defs, "__LDBL_MIN_EXP__", "(-1021)");
377 Define(Defs, "__LDBL_MIN__", "2.2250738585072014e-308");
378}
379
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000380static const char* getI386VAListDeclaration() {
381 return "typedef char* __builtin_va_list;";
382}
383
384static const char* getX86_64VAListDeclaration() {
385 return
386 "typedef struct __va_list_tag {"
387 " unsigned gp_offset;"
388 " unsigned fp_offset;"
389 " void* overflow_arg_area;"
390 " void* reg_save_area;"
391 "} __builtin_va_list[1];";
392}
393
394static const char* getPPCVAListDeclaration() {
395 return
396 "typedef struct __va_list_tag {"
397 " unsigned char gpr;"
398 " unsigned char fpr;"
399 " unsigned short reserved;"
400 " void* overflow_arg_area;"
401 " void* reg_save_area;"
402 "} __builtin_va_list[1];";
403}
404
Chris Lattner9fd73612008-04-21 18:56:49 +0000405static const char* getARMVAListDeclaration() {
406 return "typedef char* __builtin_va_list;";
407}
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000408
Chris Lattner4b009652007-07-25 00:24:17 +0000409/// PPC builtin info.
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000410namespace clang {
Chris Lattner4b009652007-07-25 00:24:17 +0000411namespace PPC {
Chris Lattner4b009652007-07-25 00:24:17 +0000412
413 static const Builtin::Info BuiltinInfo[] = {
414#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000415#include "clang/AST/PPCBuiltins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000416 };
417
418 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
419 Records = BuiltinInfo;
420 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
421 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000422
423 static const char * const GCCRegNames[] = {
424 "0", "1", "2", "3", "4", "5", "6", "7",
425 "8", "9", "10", "11", "12", "13", "14", "15",
426 "16", "17", "18", "19", "20", "21", "22", "23",
427 "24", "25", "26", "27", "28", "29", "30", "31",
428 "0", "1", "2", "3", "4", "5", "6", "7",
429 "8", "9", "10", "11", "12", "13", "14", "15",
430 "16", "17", "18", "19", "20", "21", "22", "23",
431 "24", "25", "26", "27", "28", "29", "30", "31",
432 "mq", "lr", "ctr", "ap",
433 "0", "1", "2", "3", "4", "5", "6", "7",
434 "xer",
435 "0", "1", "2", "3", "4", "5", "6", "7",
436 "8", "9", "10", "11", "12", "13", "14", "15",
437 "16", "17", "18", "19", "20", "21", "22", "23",
438 "24", "25", "26", "27", "28", "29", "30", "31",
439 "vrsave", "vscr",
440 "spe_acc", "spefscr",
441 "sfp"
442 };
443
444 static void getGCCRegNames(const char * const *&Names,
445 unsigned &NumNames) {
446 Names = GCCRegNames;
447 NumNames = llvm::array_lengthof(GCCRegNames);
448 }
449
Chris Lattner0fb8d852008-03-08 08:24:01 +0000450 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000451 // While some of these aliases do map to different registers
452 // they still share the same register name.
453 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
454 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
455 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
456 { { "cr3", "fr3", "r3", "v3"}, "3" },
457 { { "cr4", "fr4", "r4", "v4"}, "4" },
458 { { "cr5", "fr5", "r5", "v5"}, "5" },
459 { { "cr6", "fr6", "r6", "v6"}, "6" },
460 { { "cr7", "fr7", "r7", "v7"}, "7" },
461 { { "fr8", "r8", "v8"}, "8" },
462 { { "fr9", "r9", "v9"}, "9" },
463 { { "fr10", "r10", "v10"}, "10" },
464 { { "fr11", "r11", "v11"}, "11" },
465 { { "fr12", "r12", "v12"}, "12" },
466 { { "fr13", "r13", "v13"}, "13" },
467 { { "fr14", "r14", "v14"}, "14" },
468 { { "fr15", "r15", "v15"}, "15" },
469 { { "fr16", "r16", "v16"}, "16" },
470 { { "fr17", "r17", "v17"}, "17" },
471 { { "fr18", "r18", "v18"}, "18" },
472 { { "fr19", "r19", "v19"}, "19" },
473 { { "fr20", "r20", "v20"}, "20" },
474 { { "fr21", "r21", "v21"}, "21" },
475 { { "fr22", "r22", "v22"}, "22" },
476 { { "fr23", "r23", "v23"}, "23" },
477 { { "fr24", "r24", "v24"}, "24" },
478 { { "fr25", "r25", "v25"}, "25" },
479 { { "fr26", "r26", "v26"}, "26" },
480 { { "fr27", "r27", "v27"}, "27" },
481 { { "fr28", "r28", "v28"}, "28" },
482 { { "fr29", "r29", "v29"}, "29" },
483 { { "fr30", "r30", "v30"}, "30" },
484 { { "fr31", "r31", "v31"}, "31" },
485 };
486
Chris Lattner0fb8d852008-03-08 08:24:01 +0000487 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000488 unsigned &NumAliases) {
489 Aliases = GCCRegAliases;
490 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000491 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000492
Anders Carlsson4ce42302007-11-27 04:11:28 +0000493 static bool validateAsmConstraint(char c,
494 TargetInfo::ConstraintInfo &info) {
495 switch (c) {
496 default: return false;
497 case 'O': // Zero
498 return true;
499 case 'b': // Base register
500 case 'f': // Floating point register
501 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
502 return true;
503 }
504 }
505
506 const char *getClobbers() {
507 return 0;
508 }
509
Anders Carlsson333052c2007-12-08 19:32:57 +0000510 const char *getTargetPrefix() {
511 return "ppc";
512 }
513
Chris Lattner4b009652007-07-25 00:24:17 +0000514} // End namespace PPC
515
Chris Lattner4b009652007-07-25 00:24:17 +0000516/// X86 builtin info.
517namespace X86 {
Chris Lattner4b009652007-07-25 00:24:17 +0000518 static const Builtin::Info BuiltinInfo[] = {
519#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000520#include "clang/AST/X86Builtins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000521 };
522
523 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
524 Records = BuiltinInfo;
525 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
526 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000527
528 static const char *GCCRegNames[] = {
529 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
530 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlssonc411b492007-11-25 00:23:10 +0000531 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000532 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
533 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
535 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
536 };
537
538 static void getGCCRegNames(const char * const *&Names,
539 unsigned &NumNames) {
540 Names = GCCRegNames;
541 NumNames = llvm::array_lengthof(GCCRegNames);
542 }
543
Chris Lattner0fb8d852008-03-08 08:24:01 +0000544 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000545 { { "al", "ah", "eax", "rax" }, "ax" },
546 { { "bl", "bh", "ebx", "rbx" }, "bx" },
547 { { "cl", "ch", "ecx", "rcx" }, "cx" },
548 { { "dl", "dh", "edx", "rdx" }, "dx" },
549 { { "esi", "rsi" }, "si" },
Nuno Lopesfd7bf3a2008-07-07 12:18:07 +0000550 { { "edi", "rdi" }, "di" },
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000551 { { "esp", "rsp" }, "sp" },
552 { { "ebp", "rbp" }, "bp" },
553 };
554
Chris Lattner0fb8d852008-03-08 08:24:01 +0000555 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000556 unsigned &NumAliases) {
557 Aliases = GCCRegAliases;
558 NumAliases = llvm::array_lengthof(GCCRegAliases);
559 }
560
Anders Carlsson4ce42302007-11-27 04:11:28 +0000561 static bool validateAsmConstraint(char c,
562 TargetInfo::ConstraintInfo &info) {
563 switch (c) {
564 default: return false;
565 case 'a': // eax.
566 case 'b': // ebx.
567 case 'c': // ecx.
568 case 'd': // edx.
569 case 'S': // esi.
570 case 'D': // edi.
571 case 'A': // edx:eax.
572 case 't': // top of floating point stack.
573 case 'u': // second from top of floating point stack.
574 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlssonae77fa02008-03-10 22:37:16 +0000575 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
576 // instructions.
577 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonf8e50d92008-02-18 17:00:25 +0000578 // instructions.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000579 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
580 return true;
581 }
582 }
583
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000584 static std::string convertConstraint(const char Constraint) {
585 switch (Constraint) {
586 case 'a': return std::string("{ax}");
587 case 'b': return std::string("{bx}");
588 case 'c': return std::string("{cx}");
589 case 'd': return std::string("{dx}");
590 case 'S': return std::string("{si}");
591 case 'D': return std::string("{di}");
592 case 't': // top of floating point stack.
593 return std::string("{st}");
594 case 'u': // second from top of floating point stack.
595 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000596 default:
597 return std::string(1, Constraint);
598 }
599 }
600
Anders Carlsson4ce42302007-11-27 04:11:28 +0000601 const char *getClobbers() {
602 return "~{dirflag},~{fpsr},~{flags}";
603 }
604
Anders Carlsson333052c2007-12-08 19:32:57 +0000605 const char *getTargetPrefix() {
606 return "x86";
607 }
608
Chris Lattner4b009652007-07-25 00:24:17 +0000609} // End namespace X86
Chris Lattner9fd73612008-04-21 18:56:49 +0000610
611
612/// ARM builtin info.
613namespace ARM {
614 const char *getTargetPrefix() {
615 return "arm";
616 }
617} // End namespace ARM
618
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000619} // end namespace clang.
Chris Lattner4b009652007-07-25 00:24:17 +0000620
621//===----------------------------------------------------------------------===//
622// Specific target implementations.
623//===----------------------------------------------------------------------===//
624
625
626namespace {
627class DarwinPPCTargetInfo : public DarwinTargetInfo {
628public:
Eli Friedman2fde2a52008-05-20 14:25:01 +0000629 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
630 CharIsSigned = false;
631 }
Ted Kremenek40499482007-12-03 22:06:55 +0000632
Chris Lattner0db667a2007-10-06 06:57:34 +0000633 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000634 DarwinTargetInfo::getTargetDefines(Defines);
635 getPowerPCDefines(Defines, false);
636 }
637 virtual void getTargetBuiltins(const Builtin::Info *&Records,
638 unsigned &NumRecords) const {
639 PPC::getBuiltins(Records, NumRecords);
640 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000641 virtual const char *getVAListDeclaration() const {
642 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000643 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000644 virtual const char *getTargetPrefix() const {
645 return PPC::getTargetPrefix();
646 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000647 virtual void getGCCRegNames(const char * const *&Names,
648 unsigned &NumNames) const {
649 PPC::getGCCRegNames(Names, NumNames);
650 }
651 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
652 unsigned &NumAliases) const {
653 PPC::getGCCRegAliases(Aliases, NumAliases);
654 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000655 virtual bool validateAsmConstraint(char c,
656 TargetInfo::ConstraintInfo &info) const {
657 return PPC::validateAsmConstraint(c, info);
658 }
659 virtual const char *getClobbers() const {
660 return PPC::getClobbers();
661 }
Chris Lattner4b009652007-07-25 00:24:17 +0000662};
663} // end anonymous namespace.
664
665namespace {
666class DarwinPPC64TargetInfo : public DarwinTargetInfo {
667public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000668 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Eli Friedman2fde2a52008-05-20 14:25:01 +0000669 CharIsSigned = false;
Chris Lattnere5fde952008-05-09 06:17:04 +0000670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
671 }
Ted Kremenek40499482007-12-03 22:06:55 +0000672
Chris Lattner0db667a2007-10-06 06:57:34 +0000673 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000674 DarwinTargetInfo::getTargetDefines(Defines);
675 getPowerPCDefines(Defines, true);
676 }
677 virtual void getTargetBuiltins(const Builtin::Info *&Records,
678 unsigned &NumRecords) const {
679 PPC::getBuiltins(Records, NumRecords);
680 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000681 virtual const char *getVAListDeclaration() const {
682 return getPPCVAListDeclaration();
683 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000684 virtual const char *getTargetPrefix() const {
685 return PPC::getTargetPrefix();
686 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000687 virtual void getGCCRegNames(const char * const *&Names,
688 unsigned &NumNames) const {
689 PPC::getGCCRegNames(Names, NumNames);
690 }
691 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
692 unsigned &NumAliases) const {
693 PPC::getGCCRegAliases(Aliases, NumAliases);
694 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000695 virtual bool validateAsmConstraint(char c,
696 TargetInfo::ConstraintInfo &info) const {
697 return PPC::validateAsmConstraint(c, info);
698 }
699 virtual const char *getClobbers() const {
700 return PPC::getClobbers();
701 }
Chris Lattner4b009652007-07-25 00:24:17 +0000702};
703} // end anonymous namespace.
704
705namespace {
706class DarwinI386TargetInfo : public DarwinTargetInfo {
707public:
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000708 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
709 DoubleAlign = LongLongAlign = 32;
Eli Friedman4a712852008-06-04 17:01:45 +0000710 LongDoubleWidth = 128;
711 LongDoubleAlign = 128;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000712 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
713 }
714
Chris Lattner0db667a2007-10-06 06:57:34 +0000715 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000716 DarwinTargetInfo::getTargetDefines(Defines);
717 getX86Defines(Defines, false);
718 }
719 virtual void getTargetBuiltins(const Builtin::Info *&Records,
720 unsigned &NumRecords) const {
721 X86::getBuiltins(Records, NumRecords);
722 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000723 virtual const char *getVAListDeclaration() const {
724 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000725 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000726 virtual const char *getTargetPrefix() const {
727 return X86::getTargetPrefix();
728 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000729 virtual void getGCCRegNames(const char * const *&Names,
730 unsigned &NumNames) const {
731 X86::getGCCRegNames(Names, NumNames);
732 }
733 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
734 unsigned &NumAliases) const {
735 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000736 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000737 virtual bool validateAsmConstraint(char c,
738 TargetInfo::ConstraintInfo &info) const {
739 return X86::validateAsmConstraint(c, info);
740 }
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000741
742 virtual std::string convertConstraint(const char Constraint) const {
743 return X86::convertConstraint(Constraint);
744 }
745
Anders Carlsson4ce42302007-11-27 04:11:28 +0000746 virtual const char *getClobbers() const {
747 return X86::getClobbers();
748 }
Chris Lattner4b009652007-07-25 00:24:17 +0000749};
750} // end anonymous namespace.
751
752namespace {
753class DarwinX86_64TargetInfo : public DarwinTargetInfo {
754public:
Chris Lattnere5fde952008-05-09 06:17:04 +0000755 DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
756 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000757 LongDoubleWidth = 128;
758 LongDoubleAlign = 128;
759 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattnere5fde952008-05-09 06:17:04 +0000760 }
Ted Kremenek40499482007-12-03 22:06:55 +0000761
Chris Lattner0db667a2007-10-06 06:57:34 +0000762 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000763 DarwinTargetInfo::getTargetDefines(Defines);
764 getX86Defines(Defines, true);
765 }
766 virtual void getTargetBuiltins(const Builtin::Info *&Records,
767 unsigned &NumRecords) const {
768 X86::getBuiltins(Records, NumRecords);
769 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000770 virtual const char *getVAListDeclaration() const {
771 return getX86_64VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000772 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000773 virtual const char *getTargetPrefix() const {
774 return X86::getTargetPrefix();
775 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000776 virtual void getGCCRegNames(const char * const *&Names,
777 unsigned &NumNames) const {
778 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000779 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000780 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
781 unsigned &NumAliases) const {
782 X86::getGCCRegAliases(Aliases, NumAliases);
783 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000784 virtual bool validateAsmConstraint(char c,
785 TargetInfo::ConstraintInfo &info) const {
786 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000787 }
788 virtual std::string convertConstraint(const char Constraint) const {
789 return X86::convertConstraint(Constraint);
790 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000791 virtual const char *getClobbers() const {
792 return X86::getClobbers();
793 }
Chris Lattner4b009652007-07-25 00:24:17 +0000794};
795} // end anonymous namespace.
796
Chris Lattner9fd73612008-04-21 18:56:49 +0000797
798namespace {
799class DarwinARMTargetInfo : public DarwinTargetInfo {
800public:
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000801 DarwinARMTargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {
802 // FIXME: Are the defaults corrent for ARM?
803 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000804
805 virtual void getTargetDefines(std::vector<char> &Defines) const {
806 DarwinTargetInfo::getTargetDefines(Defines);
807 getARMDefines(Defines);
808 }
809 virtual void getTargetBuiltins(const Builtin::Info *&Records,
810 unsigned &NumRecords) const {
811 NumRecords = 0;
812 }
813 virtual const char *getVAListDeclaration() const {
814 return getARMVAListDeclaration();
815 }
816 virtual const char *getTargetPrefix() const {
817 return ARM::getTargetPrefix();
818 }
819
820 virtual void getGCCRegNames(const char * const *&Names,
821 unsigned &NumNames) const {
822 NumNames = 0;
823 }
824 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
825 unsigned &NumAliases) const {
826 NumAliases = 0;
827 }
828 virtual bool validateAsmConstraint(char c,
Nate Begeman222823a2008-04-22 05:03:19 +0000829 TargetInfo::ConstraintInfo &info) const {
830 switch (c) {
831 default:
832 case 'l': // r0-r7
833 case 'h': // r8-r15
834 case 'w': // VFP Floating point register single precision
835 case 'P': // VFP Floating point register double precision
836 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
837 return true;
838 }
Chris Lattner9fd73612008-04-21 18:56:49 +0000839 return false;
840 }
841 virtual const char *getClobbers() const {
842 return "";
843 }
844};
845} // end anonymous namespace.
846
Chris Lattner4b009652007-07-25 00:24:17 +0000847namespace {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000848class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
849public:
850 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
851
852 virtual void getTargetDefines(std::vector<char> &Defines) const {
853 SolarisTargetInfo::getTargetDefines(Defines);
854// getSparcDefines(Defines, false);
855 Define(Defines, "__sparc");
Eli Friedman1dee5c52008-05-25 05:26:09 +0000856 Define(Defines, "__sparc__");
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000857 Define(Defines, "__sparcv8");
858 }
859 virtual void getTargetBuiltins(const Builtin::Info *&Records,
860 unsigned &NumRecords) const {
861 PPC::getBuiltins(Records, NumRecords);
862 }
863 virtual const char *getVAListDeclaration() const {
864 return getPPCVAListDeclaration();
865 }
866 virtual const char *getTargetPrefix() const {
867 return PPC::getTargetPrefix();
868 }
869 virtual void getGCCRegNames(const char * const *&Names,
870 unsigned &NumNames) const {
871 PPC::getGCCRegNames(Names, NumNames);
872 }
873 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
874 unsigned &NumAliases) const {
875 PPC::getGCCRegAliases(Aliases, NumAliases);
876 }
877 virtual bool validateAsmConstraint(char c,
878 TargetInfo::ConstraintInfo &info) const {
879 return PPC::validateAsmConstraint(c, info);
880 }
881 virtual const char *getClobbers() const {
882 return PPC::getClobbers();
883 }
884};
885
886} // end anonymous namespace.
887
Chris Lattner4b009652007-07-25 00:24:17 +0000888
Chris Lattner85970f32008-05-08 05:58:21 +0000889namespace {
890 class PIC16TargetInfo : public TargetInfo{
891 public:
892 PIC16TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000893 // FIXME: Is IntAlign really supposed to be 16? There seems
894 // little point on a platform with 8-bit loads.
895 IntWidth = IntAlign = LongAlign = LongLongAlign = PointerWidth = 16;
896 PointerAlign = 8;
Chris Lattner85970f32008-05-08 05:58:21 +0000897 }
Chris Lattner727b3c42008-05-09 06:08:39 +0000898 virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return 16; }
899 virtual uint64_t getPointerAlignV(unsigned AddrSpace) const { return 8; }
Chris Lattner85970f32008-05-08 05:58:21 +0000900 virtual void getTargetDefines(std::vector<char> &Defines) const {
901 Define(Defines, "__pic16");
902 }
903 virtual void getTargetBuiltins(const Builtin::Info *&Records,
904 unsigned &NumRecords) const {}
905 virtual const char *getVAListDeclaration() const { return "";}
906 virtual const char *getClobbers() const {return "";}
907 virtual const char *getTargetPrefix() const {return "";}
908 virtual void getGCCRegNames(const char * const *&Names,
909 unsigned &NumNames) const {}
910 virtual bool validateAsmConstraint(char c,
911 TargetInfo::ConstraintInfo &info) const {
912 return true;
913 }
914 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
915 unsigned &NumAliases) const {}
916 virtual bool useGlobalsForAutomaticVariables() const {return true;}
917 };
918}
919
Chris Lattner4b009652007-07-25 00:24:17 +0000920//===----------------------------------------------------------------------===//
921// Driver code
922//===----------------------------------------------------------------------===//
923
Ted Kremenekb97d7672007-12-04 17:07:35 +0000924static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000925 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
926 TT[4] == '-' && TT[1] - '3' < 6);
927}
928
Chris Lattnerfc457002008-03-05 01:18:20 +0000929/// CreateTargetInfo - Return the target info object for the specified target
930/// triple.
931TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner2c63b9f2007-12-05 18:41:05 +0000932 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000933 return new DarwinPPCTargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000934
Chris Lattnerfc457002008-03-05 01:18:20 +0000935 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000936 return new DarwinPPC64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000937
Chris Lattner9fd73612008-04-21 18:56:49 +0000938 if (T.find("armv6-") == 0 || T.find("arm-") == 0)
939 return new DarwinARMTargetInfo(T);
940
Chris Lattnerfc457002008-03-05 01:18:20 +0000941 if (T.find("sparc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000942 return new SolarisSparcV8TargetInfo(T); // ugly hack
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000943
Chris Lattnerfc457002008-03-05 01:18:20 +0000944 if (T.find("x86_64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000945 return new DarwinX86_64TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000946
Chris Lattner85970f32008-05-08 05:58:21 +0000947 if (T.find("pic16-") == 0)
948 return new PIC16TargetInfo(T);
949
Chris Lattnerfc457002008-03-05 01:18:20 +0000950 if (IsX86(T))
Chris Lattner0fb8d852008-03-08 08:24:01 +0000951 return new DarwinI386TargetInfo(T);
Eli Friedman0b7b1cb2008-05-20 14:21:01 +0000952
Chris Lattnerfc457002008-03-05 01:18:20 +0000953 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000954}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000955