blob: e8238daeae3942f1e37ea19f4fec883addde2c2f [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/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.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
Chris Lattner4b009652007-07-25 00:24:17 +000050
51 if (1) {// -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000052 Define(Defs, "__weak", "");
53 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000054 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000055 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
56 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
57 Define(Defs, "__OBJC_GC__");
Chris Lattner4b009652007-07-25 00:24:17 +000058 }
59
60 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000061 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000062
63 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000064 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000065 }
66
67};
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000068
69
Chris Lattner0fb8d852008-03-08 08:24:01 +000070class SolarisTargetInfo : public TargetInfo {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000071public:
Chris Lattner0fb8d852008-03-08 08:24:01 +000072 SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {}
Gabor Greif8a3ff0d2008-02-21 16:29:08 +000073
74 virtual void getTargetDefines(std::vector<char> &Defs) const {
75// FIXME: we need a real target configuration system. For now, only define
76// __SUN__ if the host has it.
77#ifdef __SUN__
78 Define(Defs, "__SUN__");
79 Define(Defs, "__SOLARIS__");
80#endif
81
82 if (1) {// -fobjc-gc controls this.
83 Define(Defs, "__weak", "");
84 Define(Defs, "__strong", "");
85 } else {
86 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
87 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
88 Define(Defs, "__OBJC_GC__");
89 }
90 }
91
92};
Chris Lattner4b009652007-07-25 00:24:17 +000093} // end anonymous namespace.
94
95
96/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
97/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +000098static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000099 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +0000100 Define(Defs, "__ppc__");
101 Define(Defs, "_ARCH_PPC");
102 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +0000103 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000104 Define(Defs, "_ARCH_PPC64");
105 Define(Defs, "_LP64");
106 Define(Defs, "__LP64__");
107 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000108 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000109 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000110 }
111
112 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000113 Define(Defs, "_BIG_ENDIAN");
114 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000115
116 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000117 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
118 Define(Defs, "__INTMAX_TYPE__", "long int");
119 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
120 Define(Defs, "__PTRDIFF_TYPE__", "long int");
121 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000122 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000123 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
124 Define(Defs, "__INTMAX_TYPE__", "long long int");
125 Define(Defs, "__LONG_MAX__", "2147483647L");
126 Define(Defs, "__PTRDIFF_TYPE__", "int");
127 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000128 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000129 Define(Defs, "__INT_MAX__", "2147483647");
130 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
131 Define(Defs, "__CHAR_BIT__", "8");
132 Define(Defs, "__SCHAR_MAX__", "127");
133 Define(Defs, "__SHRT_MAX__", "32767");
134 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000135
136 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000137 Define(Defs, "__USER_LABEL_PREFIX__", "_");
138 Define(Defs, "__NATURAL_ALIGNMENT__");
139 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000140
Chris Lattner0db667a2007-10-06 06:57:34 +0000141 Define(Defs, "__WCHAR_MAX__", "2147483647");
142 Define(Defs, "__WCHAR_TYPE__", "int");
143 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000144
145 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000146 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
147 Define(Defs, "__FLT_DIG__", "6");
148 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
149 Define(Defs, "__FLT_EVAL_METHOD__", "0");
150 Define(Defs, "__FLT_HAS_INFINITY__");
151 Define(Defs, "__FLT_HAS_QUIET_NAN__");
152 Define(Defs, "__FLT_MANT_DIG__", "24");
153 Define(Defs, "__FLT_MAX_10_EXP__", "38");
154 Define(Defs, "__FLT_MAX_EXP__", "128");
155 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
156 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
157 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
158 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
159 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000160
161 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000162 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
163 Define(Defs, "__DBL_DIG__", "15");
164 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
165 Define(Defs, "__DBL_HAS_INFINITY__");
166 Define(Defs, "__DBL_HAS_QUIET_NAN__");
167 Define(Defs, "__DBL_MANT_DIG__", "53");
168 Define(Defs, "__DBL_MAX_10_EXP__", "308");
169 Define(Defs, "__DBL_MAX_EXP__", "1024");
170 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
171 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
172 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
173 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
174 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000175
176 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000177 Define(Defs, "__LDBL_DENORM_MIN__",
178 "4.94065645841246544176568792868221e-324L");
179 Define(Defs, "__LDBL_DIG__", "31");
180 Define(Defs, "__LDBL_EPSILON__",
181 "4.94065645841246544176568792868221e-324L");
182 Define(Defs, "__LDBL_HAS_INFINITY__");
183 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
184 Define(Defs, "__LDBL_MANT_DIG__", "106");
185 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
186 Define(Defs, "__LDBL_MAX_EXP__", "1024");
187 Define(Defs, "__LDBL_MAX__",
188 "1.79769313486231580793728971405301e+308L");
189 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
190 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
191 Define(Defs, "__LDBL_MIN__",
192 "2.00416836000897277799610805135016e-292L");
193 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000194}
195
196/// getX86Defines - Return a set of the X86-specific #defines that are
197/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000198static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000199 // Target identification.
200 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000201 Define(Defs, "_LP64");
202 Define(Defs, "__LP64__");
203 Define(Defs, "__amd64__");
204 Define(Defs, "__amd64");
205 Define(Defs, "__x86_64");
206 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000207 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000208 Define(Defs, "__i386__");
209 Define(Defs, "__i386");
210 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000211 }
212
213 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000214 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000215
216 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000217 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
218 Define(Defs, "__INTMAX_TYPE__", "long int");
219 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
220 Define(Defs, "__PTRDIFF_TYPE__", "long int");
221 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Lauro Ramos Venanciodcf0a4a2008-01-20 04:02:16 +0000222 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000223 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000224 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
225 Define(Defs, "__INTMAX_TYPE__", "long long int");
226 Define(Defs, "__LONG_MAX__", "2147483647L");
227 Define(Defs, "__PTRDIFF_TYPE__", "int");
228 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Lauro Ramos Venanciodcf0a4a2008-01-20 04:02:16 +0000229 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000230 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000231 Define(Defs, "__CHAR_BIT__", "8");
232 Define(Defs, "__INT_MAX__", "2147483647");
233 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
234 Define(Defs, "__SCHAR_MAX__", "127");
235 Define(Defs, "__SHRT_MAX__", "32767");
Chris Lattner4b009652007-07-25 00:24:17 +0000236
237 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000238 Define(Defs, "__nocona");
239 Define(Defs, "__nocona__");
240 Define(Defs, "__tune_nocona__");
241 Define(Defs, "__SSE2_MATH__");
242 Define(Defs, "__SSE2__");
243 Define(Defs, "__SSE_MATH__");
244 Define(Defs, "__SSE__");
245 Define(Defs, "__MMX__");
246 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000247
Chris Lattner0db667a2007-10-06 06:57:34 +0000248 Define(Defs, "__WCHAR_MAX__", "2147483647");
249 Define(Defs, "__WCHAR_TYPE__", "int");
250 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000251
252 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000253 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
254 Define(Defs, "__FLT_DIG__", "6");
255 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
256 Define(Defs, "__FLT_EVAL_METHOD__", "0");
257 Define(Defs, "__FLT_HAS_INFINITY__");
258 Define(Defs, "__FLT_HAS_QUIET_NAN__");
259 Define(Defs, "__FLT_MANT_DIG__", "24");
260 Define(Defs, "__FLT_MAX_10_EXP__", "38");
261 Define(Defs, "__FLT_MAX_EXP__", "128");
262 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
263 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
264 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
265 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
266 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000267
268 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000269 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
270 Define(Defs, "__DBL_DIG__", "15");
271 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
272 Define(Defs, "__DBL_HAS_INFINITY__");
273 Define(Defs, "__DBL_HAS_QUIET_NAN__");
274 Define(Defs, "__DBL_MANT_DIG__", "53");
275 Define(Defs, "__DBL_MAX_10_EXP__", "308");
276 Define(Defs, "__DBL_MAX_EXP__", "1024");
277 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
278 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
279 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
280 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
281 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000282
283 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000284 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
285 Define(Defs, "__LDBL_DIG__", "18");
286 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
287 Define(Defs, "__LDBL_HAS_INFINITY__");
288 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
289 Define(Defs, "__LDBL_MANT_DIG__", "64");
290 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
291 Define(Defs, "__LDBL_MAX_EXP__", "16384");
292 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
293 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
294 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
295 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000296}
297
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000298static const char* getI386VAListDeclaration() {
299 return "typedef char* __builtin_va_list;";
300}
301
302static const char* getX86_64VAListDeclaration() {
303 return
304 "typedef struct __va_list_tag {"
305 " unsigned gp_offset;"
306 " unsigned fp_offset;"
307 " void* overflow_arg_area;"
308 " void* reg_save_area;"
309 "} __builtin_va_list[1];";
310}
311
312static const char* getPPCVAListDeclaration() {
313 return
314 "typedef struct __va_list_tag {"
315 " unsigned char gpr;"
316 " unsigned char fpr;"
317 " unsigned short reserved;"
318 " void* overflow_arg_area;"
319 " void* reg_save_area;"
320 "} __builtin_va_list[1];";
321}
322
323
Chris Lattner4b009652007-07-25 00:24:17 +0000324/// PPC builtin info.
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000325namespace clang {
Chris Lattner4b009652007-07-25 00:24:17 +0000326namespace PPC {
Chris Lattner4b009652007-07-25 00:24:17 +0000327
328 static const Builtin::Info BuiltinInfo[] = {
329#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000330#include "clang/AST/PPCBuiltins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000331 };
332
333 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
334 Records = BuiltinInfo;
335 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
336 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000337
338 static const char * const GCCRegNames[] = {
339 "0", "1", "2", "3", "4", "5", "6", "7",
340 "8", "9", "10", "11", "12", "13", "14", "15",
341 "16", "17", "18", "19", "20", "21", "22", "23",
342 "24", "25", "26", "27", "28", "29", "30", "31",
343 "0", "1", "2", "3", "4", "5", "6", "7",
344 "8", "9", "10", "11", "12", "13", "14", "15",
345 "16", "17", "18", "19", "20", "21", "22", "23",
346 "24", "25", "26", "27", "28", "29", "30", "31",
347 "mq", "lr", "ctr", "ap",
348 "0", "1", "2", "3", "4", "5", "6", "7",
349 "xer",
350 "0", "1", "2", "3", "4", "5", "6", "7",
351 "8", "9", "10", "11", "12", "13", "14", "15",
352 "16", "17", "18", "19", "20", "21", "22", "23",
353 "24", "25", "26", "27", "28", "29", "30", "31",
354 "vrsave", "vscr",
355 "spe_acc", "spefscr",
356 "sfp"
357 };
358
359 static void getGCCRegNames(const char * const *&Names,
360 unsigned &NumNames) {
361 Names = GCCRegNames;
362 NumNames = llvm::array_lengthof(GCCRegNames);
363 }
364
Chris Lattner0fb8d852008-03-08 08:24:01 +0000365 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000366 // While some of these aliases do map to different registers
367 // they still share the same register name.
368 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
369 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
370 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
371 { { "cr3", "fr3", "r3", "v3"}, "3" },
372 { { "cr4", "fr4", "r4", "v4"}, "4" },
373 { { "cr5", "fr5", "r5", "v5"}, "5" },
374 { { "cr6", "fr6", "r6", "v6"}, "6" },
375 { { "cr7", "fr7", "r7", "v7"}, "7" },
376 { { "fr8", "r8", "v8"}, "8" },
377 { { "fr9", "r9", "v9"}, "9" },
378 { { "fr10", "r10", "v10"}, "10" },
379 { { "fr11", "r11", "v11"}, "11" },
380 { { "fr12", "r12", "v12"}, "12" },
381 { { "fr13", "r13", "v13"}, "13" },
382 { { "fr14", "r14", "v14"}, "14" },
383 { { "fr15", "r15", "v15"}, "15" },
384 { { "fr16", "r16", "v16"}, "16" },
385 { { "fr17", "r17", "v17"}, "17" },
386 { { "fr18", "r18", "v18"}, "18" },
387 { { "fr19", "r19", "v19"}, "19" },
388 { { "fr20", "r20", "v20"}, "20" },
389 { { "fr21", "r21", "v21"}, "21" },
390 { { "fr22", "r22", "v22"}, "22" },
391 { { "fr23", "r23", "v23"}, "23" },
392 { { "fr24", "r24", "v24"}, "24" },
393 { { "fr25", "r25", "v25"}, "25" },
394 { { "fr26", "r26", "v26"}, "26" },
395 { { "fr27", "r27", "v27"}, "27" },
396 { { "fr28", "r28", "v28"}, "28" },
397 { { "fr29", "r29", "v29"}, "29" },
398 { { "fr30", "r30", "v30"}, "30" },
399 { { "fr31", "r31", "v31"}, "31" },
400 };
401
Chris Lattner0fb8d852008-03-08 08:24:01 +0000402 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000403 unsigned &NumAliases) {
404 Aliases = GCCRegAliases;
405 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000406 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000407
Anders Carlsson4ce42302007-11-27 04:11:28 +0000408 static bool validateAsmConstraint(char c,
409 TargetInfo::ConstraintInfo &info) {
410 switch (c) {
411 default: return false;
412 case 'O': // Zero
413 return true;
414 case 'b': // Base register
415 case 'f': // Floating point register
416 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
417 return true;
418 }
419 }
420
421 const char *getClobbers() {
422 return 0;
423 }
424
Anders Carlsson333052c2007-12-08 19:32:57 +0000425 const char *getTargetPrefix() {
426 return "ppc";
427 }
428
Chris Lattner4b009652007-07-25 00:24:17 +0000429} // End namespace PPC
430
Chris Lattner4b009652007-07-25 00:24:17 +0000431/// X86 builtin info.
432namespace X86 {
Chris Lattner4b009652007-07-25 00:24:17 +0000433 static const Builtin::Info BuiltinInfo[] = {
434#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlssone1449c12007-12-09 23:17:02 +0000435#include "clang/AST/X86Builtins.def"
Chris Lattner4b009652007-07-25 00:24:17 +0000436 };
437
438 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
439 Records = BuiltinInfo;
440 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
441 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000442
443 static const char *GCCRegNames[] = {
444 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
445 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlssonc411b492007-11-25 00:23:10 +0000446 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000447 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
448 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
449 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
450 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
451 };
452
453 static void getGCCRegNames(const char * const *&Names,
454 unsigned &NumNames) {
455 Names = GCCRegNames;
456 NumNames = llvm::array_lengthof(GCCRegNames);
457 }
458
Chris Lattner0fb8d852008-03-08 08:24:01 +0000459 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000460 { { "al", "ah", "eax", "rax" }, "ax" },
461 { { "bl", "bh", "ebx", "rbx" }, "bx" },
462 { { "cl", "ch", "ecx", "rcx" }, "cx" },
463 { { "dl", "dh", "edx", "rdx" }, "dx" },
464 { { "esi", "rsi" }, "si" },
465 { { "esp", "rsp" }, "sp" },
466 { { "ebp", "rbp" }, "bp" },
467 };
468
Chris Lattner0fb8d852008-03-08 08:24:01 +0000469 static void getGCCRegAliases(const TargetInfo::GCCRegAlias *&Aliases,
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000470 unsigned &NumAliases) {
471 Aliases = GCCRegAliases;
472 NumAliases = llvm::array_lengthof(GCCRegAliases);
473 }
474
Anders Carlsson4ce42302007-11-27 04:11:28 +0000475 static bool validateAsmConstraint(char c,
476 TargetInfo::ConstraintInfo &info) {
477 switch (c) {
478 default: return false;
479 case 'a': // eax.
480 case 'b': // ebx.
481 case 'c': // ecx.
482 case 'd': // edx.
483 case 'S': // esi.
484 case 'D': // edi.
485 case 'A': // edx:eax.
486 case 't': // top of floating point stack.
487 case 'u': // second from top of floating point stack.
488 case 'q': // a, b, c, d registers or any integer register in 64-bit.
Anders Carlssonae77fa02008-03-10 22:37:16 +0000489 case 'Z': // 32-bit integer constant for use with zero-extending x86_64
490 // instructions.
491 case 'N': // unsigned 8-bit integer constant for use with in and out
Anders Carlssonf8e50d92008-02-18 17:00:25 +0000492 // instructions.
Anders Carlsson4ce42302007-11-27 04:11:28 +0000493 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
494 return true;
495 }
496 }
497
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000498 static std::string convertConstraint(const char Constraint) {
499 switch (Constraint) {
500 case 'a': return std::string("{ax}");
501 case 'b': return std::string("{bx}");
502 case 'c': return std::string("{cx}");
503 case 'd': return std::string("{dx}");
504 case 'S': return std::string("{si}");
505 case 'D': return std::string("{di}");
506 case 't': // top of floating point stack.
507 return std::string("{st}");
508 case 'u': // second from top of floating point stack.
509 return std::string("{st(1)}"); // second from top of floating point stack.
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000510 default:
511 return std::string(1, Constraint);
512 }
513 }
514
Anders Carlsson4ce42302007-11-27 04:11:28 +0000515 const char *getClobbers() {
516 return "~{dirflag},~{fpsr},~{flags}";
517 }
518
Anders Carlsson333052c2007-12-08 19:32:57 +0000519 const char *getTargetPrefix() {
520 return "x86";
521 }
522
Chris Lattner4b009652007-07-25 00:24:17 +0000523} // End namespace X86
Chris Lattner9a3dedf2007-12-11 04:36:28 +0000524} // end namespace clang.
Chris Lattner4b009652007-07-25 00:24:17 +0000525
526//===----------------------------------------------------------------------===//
527// Specific target implementations.
528//===----------------------------------------------------------------------===//
529
530
531namespace {
532class DarwinPPCTargetInfo : public DarwinTargetInfo {
533public:
Ted Kremenek40499482007-12-03 22:06:55 +0000534 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
535
Chris Lattner0db667a2007-10-06 06:57:34 +0000536 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000537 DarwinTargetInfo::getTargetDefines(Defines);
538 getPowerPCDefines(Defines, false);
539 }
540 virtual void getTargetBuiltins(const Builtin::Info *&Records,
541 unsigned &NumRecords) const {
542 PPC::getBuiltins(Records, NumRecords);
543 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000544 virtual const char *getVAListDeclaration() const {
545 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000546 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000547 virtual const char *getTargetPrefix() const {
548 return PPC::getTargetPrefix();
549 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000550 virtual void getGCCRegNames(const char * const *&Names,
551 unsigned &NumNames) const {
552 PPC::getGCCRegNames(Names, NumNames);
553 }
554 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
555 unsigned &NumAliases) const {
556 PPC::getGCCRegAliases(Aliases, NumAliases);
557 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000558 virtual bool validateAsmConstraint(char c,
559 TargetInfo::ConstraintInfo &info) const {
560 return PPC::validateAsmConstraint(c, info);
561 }
562 virtual const char *getClobbers() const {
563 return PPC::getClobbers();
564 }
Chris Lattner4b009652007-07-25 00:24:17 +0000565};
566} // end anonymous namespace.
567
568namespace {
569class DarwinPPC64TargetInfo : public DarwinTargetInfo {
570public:
Ted Kremenek40499482007-12-03 22:06:55 +0000571 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
572
Chris Lattner0db667a2007-10-06 06:57:34 +0000573 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000574 DarwinTargetInfo::getTargetDefines(Defines);
575 getPowerPCDefines(Defines, true);
576 }
577 virtual void getTargetBuiltins(const Builtin::Info *&Records,
578 unsigned &NumRecords) const {
579 PPC::getBuiltins(Records, NumRecords);
580 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000581 virtual const char *getVAListDeclaration() const {
582 return getPPCVAListDeclaration();
583 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000584 virtual const char *getTargetPrefix() const {
585 return PPC::getTargetPrefix();
586 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000587 virtual void getGCCRegNames(const char * const *&Names,
588 unsigned &NumNames) const {
589 PPC::getGCCRegNames(Names, NumNames);
590 }
591 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
592 unsigned &NumAliases) const {
593 PPC::getGCCRegAliases(Aliases, NumAliases);
594 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000595 virtual bool validateAsmConstraint(char c,
596 TargetInfo::ConstraintInfo &info) const {
597 return PPC::validateAsmConstraint(c, info);
598 }
599 virtual const char *getClobbers() const {
600 return PPC::getClobbers();
601 }
Chris Lattner4b009652007-07-25 00:24:17 +0000602};
603} // end anonymous namespace.
604
605namespace {
606class DarwinI386TargetInfo : public DarwinTargetInfo {
607public:
Ted Kremenek40499482007-12-03 22:06:55 +0000608 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
609
Chris Lattner0db667a2007-10-06 06:57:34 +0000610 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000611 DarwinTargetInfo::getTargetDefines(Defines);
612 getX86Defines(Defines, false);
613 }
614 virtual void getTargetBuiltins(const Builtin::Info *&Records,
615 unsigned &NumRecords) const {
616 X86::getBuiltins(Records, NumRecords);
617 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000618 virtual const char *getVAListDeclaration() const {
619 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000620 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000621 virtual const char *getTargetPrefix() const {
622 return X86::getTargetPrefix();
623 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000624 virtual void getGCCRegNames(const char * const *&Names,
625 unsigned &NumNames) const {
626 X86::getGCCRegNames(Names, NumNames);
627 }
628 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
629 unsigned &NumAliases) const {
630 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000631 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000632 virtual bool validateAsmConstraint(char c,
633 TargetInfo::ConstraintInfo &info) const {
634 return X86::validateAsmConstraint(c, info);
635 }
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000636
637 virtual std::string convertConstraint(const char Constraint) const {
638 return X86::convertConstraint(Constraint);
639 }
640
Anders Carlsson4ce42302007-11-27 04:11:28 +0000641 virtual const char *getClobbers() const {
642 return X86::getClobbers();
643 }
Chris Lattner4b009652007-07-25 00:24:17 +0000644};
645} // end anonymous namespace.
646
647namespace {
648class DarwinX86_64TargetInfo : public DarwinTargetInfo {
649public:
Ted Kremenek40499482007-12-03 22:06:55 +0000650 DarwinX86_64TargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {}
651
Chris Lattner0db667a2007-10-06 06:57:34 +0000652 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000653 DarwinTargetInfo::getTargetDefines(Defines);
654 getX86Defines(Defines, true);
655 }
656 virtual void getTargetBuiltins(const Builtin::Info *&Records,
657 unsigned &NumRecords) const {
658 X86::getBuiltins(Records, NumRecords);
659 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000660 virtual const char *getVAListDeclaration() const {
661 return getX86_64VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000662 }
Anders Carlsson333052c2007-12-08 19:32:57 +0000663 virtual const char *getTargetPrefix() const {
664 return X86::getTargetPrefix();
665 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000666 virtual void getGCCRegNames(const char * const *&Names,
667 unsigned &NumNames) const {
668 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000669 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000670 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
671 unsigned &NumAliases) const {
672 X86::getGCCRegAliases(Aliases, NumAliases);
673 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000674 virtual bool validateAsmConstraint(char c,
675 TargetInfo::ConstraintInfo &info) const {
676 return X86::validateAsmConstraint(c, info);
Lauro Ramos Venanciobb37a042008-02-26 18:33:46 +0000677 }
678 virtual std::string convertConstraint(const char Constraint) const {
679 return X86::convertConstraint(Constraint);
680 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000681 virtual const char *getClobbers() const {
682 return X86::getClobbers();
683 }
Chris Lattner4b009652007-07-25 00:24:17 +0000684};
685} // end anonymous namespace.
686
687namespace {
Gabor Greif8a3ff0d2008-02-21 16:29:08 +0000688class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
689public:
690 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
691
692 virtual void getTargetDefines(std::vector<char> &Defines) const {
693 SolarisTargetInfo::getTargetDefines(Defines);
694// getSparcDefines(Defines, false);
695 Define(Defines, "__sparc");
696 Define(Defines, "__sparcv8");
697 }
698 virtual void getTargetBuiltins(const Builtin::Info *&Records,
699 unsigned &NumRecords) const {
700 PPC::getBuiltins(Records, NumRecords);
701 }
702 virtual const char *getVAListDeclaration() const {
703 return getPPCVAListDeclaration();
704 }
705 virtual const char *getTargetPrefix() const {
706 return PPC::getTargetPrefix();
707 }
708 virtual void getGCCRegNames(const char * const *&Names,
709 unsigned &NumNames) const {
710 PPC::getGCCRegNames(Names, NumNames);
711 }
712 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
713 unsigned &NumAliases) const {
714 PPC::getGCCRegAliases(Aliases, NumAliases);
715 }
716 virtual bool validateAsmConstraint(char c,
717 TargetInfo::ConstraintInfo &info) const {
718 return PPC::validateAsmConstraint(c, info);
719 }
720 virtual const char *getClobbers() const {
721 return PPC::getClobbers();
722 }
723};
724
725} // end anonymous namespace.
726
Chris Lattner4b009652007-07-25 00:24:17 +0000727
728//===----------------------------------------------------------------------===//
729// Driver code
730//===----------------------------------------------------------------------===//
731
Ted Kremenekb97d7672007-12-04 17:07:35 +0000732static inline bool IsX86(const std::string& TT) {
Ted Kremenek40499482007-12-03 22:06:55 +0000733 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
734 TT[4] == '-' && TT[1] - '3' < 6);
735}
736
Chris Lattnerfc457002008-03-05 01:18:20 +0000737/// CreateTargetInfo - Return the target info object for the specified target
738/// triple.
739TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
Chris Lattner2c63b9f2007-12-05 18:41:05 +0000740 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000741 return new DarwinPPCTargetInfo(T);
Ted Kremenekae51f692007-12-03 23:23:21 +0000742
Chris Lattnerfc457002008-03-05 01:18:20 +0000743 if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000744 return new DarwinPPC64TargetInfo(T);
Chris Lattner4b009652007-07-25 00:24:17 +0000745
Chris Lattnerfc457002008-03-05 01:18:20 +0000746 if (T.find("sparc-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000747 return new SolarisSparcV8TargetInfo(T); // ugly hack
Ted Kremenek40499482007-12-03 22:06:55 +0000748
Chris Lattnerfc457002008-03-05 01:18:20 +0000749 if (T.find("x86_64-") == 0)
Chris Lattner0fb8d852008-03-08 08:24:01 +0000750 return new DarwinX86_64TargetInfo(T);
Chris Lattnerfc457002008-03-05 01:18:20 +0000751
752 if (IsX86(T))
Chris Lattner0fb8d852008-03-08 08:24:01 +0000753 return new DarwinI386TargetInfo(T);
Chris Lattnerfc457002008-03-05 01:18:20 +0000754
Chris Lattnerfc457002008-03-05 01:18:20 +0000755 return NULL;
Chris Lattner4b009652007-07-25 00:24:17 +0000756}
Ted Kremenekd507bab2008-03-04 17:47:18 +0000757