blob: 6888d44f5efce78e0560abc3cb8d777256afdd84 [file] [log] [blame]
Reid Spencer5f016e22007-07-11 17:01:13 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner0bc735f2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Reid Spencer5f016e22007-07-11 17:01:13 +00007//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenekbbced582007-12-12 18:05:32 +000010// This file implements construction of a TargetInfo object from a
11// target triple.
Reid Spencer5f016e22007-07-11 17:01:13 +000012//
13//===----------------------------------------------------------------------===//
14
Reid Spencer5f016e22007-07-11 17:01:13 +000015#include "clang/AST/Builtins.h"
Anders Carlsson564f1de2007-12-09 23:17:02 +000016#include "clang/AST/TargetBuiltins.h"
Reid Spencer5f016e22007-07-11 17:01:13 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson3346ae62007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Ted Kremenekae360762007-12-03 22:06:55 +000020
Reid Spencer5f016e22007-07-11 17:01:13 +000021using namespace clang;
22
Reid Spencer5f016e22007-07-11 17:01:13 +000023//===----------------------------------------------------------------------===//
24// Common code shared among targets.
25//===----------------------------------------------------------------------===//
26
Chris Lattnerd15fa822007-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
Reid Spencer5f016e22007-07-11 17:01:13 +000038namespace {
39class DarwinTargetInfo : public TargetInfoImpl {
40public:
Ted Kremenekae360762007-12-03 22:06:55 +000041 DarwinTargetInfo(const std::string& triple) : TargetInfoImpl(triple) {}
42
Chris Lattnerd15fa822007-10-06 06:57:34 +000043 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner338128b2007-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 Lattnerd15fa822007-10-06 06:57:34 +000047 Define(Defs, "__APPLE__");
48 Define(Defs, "__MACH__");
Chris Lattner338128b2007-10-17 06:04:46 +000049#endif
Reid Spencer5f016e22007-07-11 17:01:13 +000050
51 if (1) {// -fobjc-gc controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000052 Define(Defs, "__weak", "");
53 Define(Defs, "__strong", "");
Reid Spencer5f016e22007-07-11 17:01:13 +000054 } else {
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +000058 }
59
60 // darwin_constant_cfstrings controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000061 Define(Defs, "__CONSTANT_CFSTRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000062
63 if (0) // darwin_pascal_strings
Chris Lattnerd15fa822007-10-06 06:57:34 +000064 Define(Defs, "__PASCAL_STRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000065 }
66
67};
Gabor Greif26658672008-02-21 16:29:08 +000068
69
70class SolarisTargetInfo : public TargetInfoImpl {
71public:
72 SolarisTargetInfo(const std::string& triple) : TargetInfoImpl(triple) {}
73
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};
Reid Spencer5f016e22007-07-11 17:01:13 +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 Lattnerd15fa822007-10-06 06:57:34 +000098static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +000099 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000100 Define(Defs, "__ppc__");
101 Define(Defs, "_ARCH_PPC");
102 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000103 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000104 Define(Defs, "_ARCH_PPC64");
105 Define(Defs, "_LP64");
106 Define(Defs, "__LP64__");
107 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000108 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000109 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000110 }
111
112 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000113 Define(Defs, "_BIG_ENDIAN");
114 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000115
116 if (is64Bit) {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000122 } else {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000128 }
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000135
136 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000137 Define(Defs, "__USER_LABEL_PREFIX__", "_");
138 Define(Defs, "__NATURAL_ALIGNMENT__");
139 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000140
Chris Lattnerd15fa822007-10-06 06:57:34 +0000141 Define(Defs, "__WCHAR_MAX__", "2147483647");
142 Define(Defs, "__WCHAR_TYPE__", "int");
143 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000144
145 // Float macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000160
161 // double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000175
176 // 128-bit long double macros.
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000194}
195
196/// getX86Defines - Return a set of the X86-specific #defines that are
197/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000198static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000199 // Target identification.
200 if (is64Bit) {
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000207 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000208 Define(Defs, "__i386__");
209 Define(Defs, "__i386");
210 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000211 }
212
213 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000214 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000215
216 if (is64Bit) {
Chris Lattnerd15fa822007-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 Venancioe0e3abc2008-01-20 04:02:16 +0000222 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000223 } else {
Chris Lattnerd15fa822007-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 Venancioe0e3abc2008-01-20 04:02:16 +0000229 Define(Defs, "__SIZE_TYPE__", "unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000230 }
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000236
237 // Subtarget options.
Chris Lattnerd15fa822007-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__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000247
Chris Lattnerd15fa822007-10-06 06:57:34 +0000248 Define(Defs, "__WCHAR_MAX__", "2147483647");
249 Define(Defs, "__WCHAR_TYPE__", "int");
250 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000251
252 // Float macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000267
268 // Double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000282
283 // 80-bit Long double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000296}
297
Anders Carlssonfb5e5ba2007-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
Reid Spencer5f016e22007-07-11 17:01:13 +0000324/// PPC builtin info.
Chris Lattnerfb344d32007-12-11 04:36:28 +0000325namespace clang {
Reid Spencer5f016e22007-07-11 17:01:13 +0000326namespace PPC {
Reid Spencer5f016e22007-07-11 17:01:13 +0000327
328 static const Builtin::Info BuiltinInfo[] = {
329#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000330#include "clang/AST/PPCBuiltins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000331 };
332
333 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
334 Records = BuiltinInfo;
335 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
336 }
Anders Carlsson3346ae62007-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
365 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
366 // 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
402 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
403 unsigned &NumAliases) {
404 Aliases = GCCRegAliases;
405 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlssond04c6e22007-11-27 04:11:28 +0000406 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000407
Anders Carlssond04c6e22007-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 Carlsson44fe49c2007-12-08 19:32:57 +0000425 const char *getTargetPrefix() {
426 return "ppc";
427 }
428
Reid Spencer5f016e22007-07-11 17:01:13 +0000429} // End namespace PPC
430
Reid Spencer5f016e22007-07-11 17:01:13 +0000431/// X86 builtin info.
432namespace X86 {
Reid Spencer5f016e22007-07-11 17:01:13 +0000433 static const Builtin::Info BuiltinInfo[] = {
434#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
Anders Carlsson564f1de2007-12-09 23:17:02 +0000435#include "clang/AST/X86Builtins.def"
Reid Spencer5f016e22007-07-11 17:01:13 +0000436 };
437
438 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
439 Records = BuiltinInfo;
440 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
441 }
Anders Carlsson3346ae62007-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 Carlsson646b2612007-11-25 00:23:10 +0000446 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson3346ae62007-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
459 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
460 { { "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
469 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
470 unsigned &NumAliases) {
471 Aliases = GCCRegAliases;
472 NumAliases = llvm::array_lengthof(GCCRegAliases);
473 }
474
Anders Carlssond04c6e22007-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 Carlssonb41edf92008-02-18 17:00:25 +0000489 case 'Z': // 32-bit integer constant for used with zero-extending x86_64
490 // instructions.
Anders Carlssond04c6e22007-11-27 04:11:28 +0000491 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
492 return true;
493 }
494 }
495
496 const char *getClobbers() {
497 return "~{dirflag},~{fpsr},~{flags}";
498 }
499
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000500 const char *getTargetPrefix() {
501 return "x86";
502 }
503
Reid Spencer5f016e22007-07-11 17:01:13 +0000504} // End namespace X86
Chris Lattnerfb344d32007-12-11 04:36:28 +0000505} // end namespace clang.
Reid Spencer5f016e22007-07-11 17:01:13 +0000506
507//===----------------------------------------------------------------------===//
508// Specific target implementations.
509//===----------------------------------------------------------------------===//
510
511
512namespace {
513class DarwinPPCTargetInfo : public DarwinTargetInfo {
514public:
Ted Kremenekae360762007-12-03 22:06:55 +0000515 DarwinPPCTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
516
Chris Lattnerd15fa822007-10-06 06:57:34 +0000517 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000518 DarwinTargetInfo::getTargetDefines(Defines);
519 getPowerPCDefines(Defines, false);
520 }
521 virtual void getTargetBuiltins(const Builtin::Info *&Records,
522 unsigned &NumRecords) const {
523 PPC::getBuiltins(Records, NumRecords);
524 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000525 virtual const char *getVAListDeclaration() const {
526 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000527 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000528 virtual const char *getTargetPrefix() const {
529 return PPC::getTargetPrefix();
530 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000531 virtual void getGCCRegNames(const char * const *&Names,
532 unsigned &NumNames) const {
533 PPC::getGCCRegNames(Names, NumNames);
534 }
535 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
536 unsigned &NumAliases) const {
537 PPC::getGCCRegAliases(Aliases, NumAliases);
538 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000539 virtual bool validateAsmConstraint(char c,
540 TargetInfo::ConstraintInfo &info) const {
541 return PPC::validateAsmConstraint(c, info);
542 }
543 virtual const char *getClobbers() const {
544 return PPC::getClobbers();
545 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000546};
547} // end anonymous namespace.
548
549namespace {
550class DarwinPPC64TargetInfo : public DarwinTargetInfo {
551public:
Ted Kremenekae360762007-12-03 22:06:55 +0000552 DarwinPPC64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
553
Chris Lattnerd15fa822007-10-06 06:57:34 +0000554 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000555 DarwinTargetInfo::getTargetDefines(Defines);
556 getPowerPCDefines(Defines, true);
557 }
558 virtual void getTargetBuiltins(const Builtin::Info *&Records,
559 unsigned &NumRecords) const {
560 PPC::getBuiltins(Records, NumRecords);
561 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000562 virtual const char *getVAListDeclaration() const {
563 return getPPCVAListDeclaration();
564 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000565 virtual const char *getTargetPrefix() const {
566 return PPC::getTargetPrefix();
567 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000568 virtual void getGCCRegNames(const char * const *&Names,
569 unsigned &NumNames) const {
570 PPC::getGCCRegNames(Names, NumNames);
571 }
572 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
573 unsigned &NumAliases) const {
574 PPC::getGCCRegAliases(Aliases, NumAliases);
575 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000576 virtual bool validateAsmConstraint(char c,
577 TargetInfo::ConstraintInfo &info) const {
578 return PPC::validateAsmConstraint(c, info);
579 }
580 virtual const char *getClobbers() const {
581 return PPC::getClobbers();
582 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000583};
584} // end anonymous namespace.
585
586namespace {
587class DarwinI386TargetInfo : public DarwinTargetInfo {
588public:
Ted Kremenekae360762007-12-03 22:06:55 +0000589 DarwinI386TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {}
590
Chris Lattnerd15fa822007-10-06 06:57:34 +0000591 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000592 DarwinTargetInfo::getTargetDefines(Defines);
593 getX86Defines(Defines, false);
594 }
595 virtual void getTargetBuiltins(const Builtin::Info *&Records,
596 unsigned &NumRecords) const {
597 X86::getBuiltins(Records, NumRecords);
598 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000599 virtual const char *getVAListDeclaration() const {
600 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000601 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000602 virtual const char *getTargetPrefix() const {
603 return X86::getTargetPrefix();
604 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000605 virtual void getGCCRegNames(const char * const *&Names,
606 unsigned &NumNames) const {
607 X86::getGCCRegNames(Names, NumNames);
608 }
609 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
610 unsigned &NumAliases) const {
611 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000612 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000613 virtual bool validateAsmConstraint(char c,
614 TargetInfo::ConstraintInfo &info) const {
615 return X86::validateAsmConstraint(c, info);
616 }
617 virtual const char *getClobbers() const {
618 return X86::getClobbers();
619 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000620};
621} // end anonymous namespace.
622
623namespace {
624class DarwinX86_64TargetInfo : public DarwinTargetInfo {
625public:
Ted Kremenekae360762007-12-03 22:06:55 +0000626 DarwinX86_64TargetInfo(const std::string& triple) :DarwinTargetInfo(triple) {}
627
Chris Lattnerd15fa822007-10-06 06:57:34 +0000628 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000629 DarwinTargetInfo::getTargetDefines(Defines);
630 getX86Defines(Defines, true);
631 }
632 virtual void getTargetBuiltins(const Builtin::Info *&Records,
633 unsigned &NumRecords) const {
634 X86::getBuiltins(Records, NumRecords);
635 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000636 virtual const char *getVAListDeclaration() const {
637 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000638 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000639 virtual const char *getTargetPrefix() const {
640 return X86::getTargetPrefix();
641 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000642 virtual void getGCCRegNames(const char * const *&Names,
643 unsigned &NumNames) const {
644 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000645 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000646 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
647 unsigned &NumAliases) const {
648 X86::getGCCRegAliases(Aliases, NumAliases);
649 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000650 virtual bool validateAsmConstraint(char c,
651 TargetInfo::ConstraintInfo &info) const {
652 return X86::validateAsmConstraint(c, info);
653 }
654 virtual const char *getClobbers() const {
655 return X86::getClobbers();
656 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000657};
658} // end anonymous namespace.
659
660namespace {
Gabor Greif26658672008-02-21 16:29:08 +0000661class SolarisSparcV8TargetInfo : public SolarisTargetInfo {
662public:
663 SolarisSparcV8TargetInfo(const std::string& triple) : SolarisTargetInfo(triple) {}
664
665 virtual void getTargetDefines(std::vector<char> &Defines) const {
666 SolarisTargetInfo::getTargetDefines(Defines);
667// getSparcDefines(Defines, false);
668 Define(Defines, "__sparc");
669 Define(Defines, "__sparcv8");
670 }
671 virtual void getTargetBuiltins(const Builtin::Info *&Records,
672 unsigned &NumRecords) const {
673 PPC::getBuiltins(Records, NumRecords);
674 }
675 virtual const char *getVAListDeclaration() const {
676 return getPPCVAListDeclaration();
677 }
678 virtual const char *getTargetPrefix() const {
679 return PPC::getTargetPrefix();
680 }
681 virtual void getGCCRegNames(const char * const *&Names,
682 unsigned &NumNames) const {
683 PPC::getGCCRegNames(Names, NumNames);
684 }
685 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
686 unsigned &NumAliases) const {
687 PPC::getGCCRegAliases(Aliases, NumAliases);
688 }
689 virtual bool validateAsmConstraint(char c,
690 TargetInfo::ConstraintInfo &info) const {
691 return PPC::validateAsmConstraint(c, info);
692 }
693 virtual const char *getClobbers() const {
694 return PPC::getClobbers();
695 }
696};
697
698} // end anonymous namespace.
699
700namespace {
Reid Spencer5f016e22007-07-11 17:01:13 +0000701class LinuxTargetInfo : public DarwinTargetInfo {
702public:
Ted Kremenekae360762007-12-03 22:06:55 +0000703 LinuxTargetInfo(const std::string& triple) : DarwinTargetInfo(triple) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000704 // Note: I have no idea if this is right, just for testing.
705 WCharWidth = 16;
Chris Lattnerd2d2a112007-07-14 01:29:45 +0000706 WCharAlign = 16;
Reid Spencer5f016e22007-07-11 17:01:13 +0000707 }
708
Chris Lattnerd15fa822007-10-06 06:57:34 +0000709 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000710 // TODO: linux-specific stuff.
711 getX86Defines(Defines, false);
712 }
713 virtual void getTargetBuiltins(const Builtin::Info *&Records,
714 unsigned &NumRecords) const {
715 X86::getBuiltins(Records, NumRecords);
716 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000717 virtual const char *getVAListDeclaration() const {
718 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000719 }
Anders Carlsson44fe49c2007-12-08 19:32:57 +0000720 virtual const char *getTargetPrefix() const {
721 return X86::getTargetPrefix();
722 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000723 virtual void getGCCRegNames(const char * const *&Names,
724 unsigned &NumNames) const {
725 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000726 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
728 unsigned &NumAliases) const {
729 X86::getGCCRegAliases(Aliases, NumAliases);
730 }
Anders Carlssond04c6e22007-11-27 04:11:28 +0000731 virtual bool validateAsmConstraint(char c,
732 TargetInfo::ConstraintInfo &info) const {
733 return X86::validateAsmConstraint(c, info);
734 }
735 virtual const char *getClobbers() const {
736 return X86::getClobbers();
737 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000738};
739} // end anonymous namespace.
740
741
742//===----------------------------------------------------------------------===//
743// Driver code
744//===----------------------------------------------------------------------===//
745
Ted Kremenek8448d382007-12-04 17:07:35 +0000746static inline bool IsX86(const std::string& TT) {
Ted Kremenekae360762007-12-03 22:06:55 +0000747 return (TT.size() >= 5 && TT[0] == 'i' && TT[2] == '8' && TT[3] == '6' &&
748 TT[4] == '-' && TT[1] - '3' < 6);
749}
750
Reid Spencer5f016e22007-07-11 17:01:13 +0000751/// CreateTarget - Create the TargetInfoImpl object for the specified target
752/// enum value.
Ted Kremenekae360762007-12-03 22:06:55 +0000753static TargetInfoImpl *CreateTarget(const std::string& T) {
Chris Lattner82817ba2007-12-05 18:41:05 +0000754 if (T.find("ppc-") == 0 || T.find("powerpc-") == 0)
Ted Kremenek8448d382007-12-04 17:07:35 +0000755 return new DarwinPPCTargetInfo(T);
Chris Lattner82817ba2007-12-05 18:41:05 +0000756 else if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0)
Ted Kremenek8448d382007-12-04 17:07:35 +0000757 return new DarwinPPC64TargetInfo(T);
Gabor Greif26658672008-02-21 16:29:08 +0000758 else if (T.find("sparc-") == 0)
759 return new SolarisSparcV8TargetInfo(T); // ugly hack
Ted Kremenek8448d382007-12-04 17:07:35 +0000760 else if (T.find("x86_64-") == 0)
761 return new DarwinX86_64TargetInfo(T);
762 else if (IsX86(T))
763 return new DarwinI386TargetInfo(T);
764 else if (T.find("bogusW16W16-") == 0) // For testing portability.
765 return new LinuxTargetInfo(T);
766 else
767 return NULL;
Reid Spencer5f016e22007-07-11 17:01:13 +0000768}
769
770/// CreateTargetInfo - Return the set of target info objects as specified by
771/// the -arch command line option.
Ted Kremenek9c728dc2007-12-12 22:39:36 +0000772TargetInfo* TargetInfo::CreateTargetInfo(const std::string* TriplesStart,
Ted Kremenekbbced582007-12-12 18:05:32 +0000773 const std::string* TriplesEnd,
774 Diagnostic *Diags) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000775
776 // Create the primary target and target info.
Ted Kremenekbbced582007-12-12 18:05:32 +0000777 TargetInfoImpl* PrimaryTarget = CreateTarget(*TriplesStart);
Ted Kremenekaead4722007-12-03 23:23:21 +0000778
779 if (!PrimaryTarget)
780 return NULL;
781
Ted Kremenek9c728dc2007-12-12 22:39:36 +0000782 TargetInfo *TI = new TargetInfo(PrimaryTarget, Diags);
Reid Spencer5f016e22007-07-11 17:01:13 +0000783
784 // Add all secondary targets.
Ted Kremenekbbced582007-12-12 18:05:32 +0000785 for (const std::string* I=TriplesStart+1; I != TriplesEnd; ++I) {
786 TargetInfoImpl* SecondaryTarget = CreateTarget(*I);
Ted Kremenekaead4722007-12-03 23:23:21 +0000787
788 if (!SecondaryTarget) {
Ted Kremenekbbced582007-12-12 18:05:32 +0000789 fprintf (stderr,
790 "Warning: secondary target '%s' unrecognized.\n",
791 I->c_str());
792
Ted Kremenekaead4722007-12-03 23:23:21 +0000793 continue;
794 }
795
Ted Kremenekbbced582007-12-12 18:05:32 +0000796 TI->AddSecondaryTarget(SecondaryTarget);
Ted Kremenekaead4722007-12-03 23:23:21 +0000797 }
Ted Kremenekae360762007-12-03 22:06:55 +0000798
Reid Spencer5f016e22007-07-11 17:01:13 +0000799 return TI;
800}