blob: 5a99f7a9257ad64df9166268f55670b347b861dd [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//
5// This file was developed by Chris Lattner and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the -arch command line option and creates a TargetInfo
11// that represents them.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang.h"
16#include "clang/AST/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/TargetInfo.h"
Anders Carlsson7dd1c952007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Chris Lattner4b009652007-07-25 00:24:17 +000020#include "llvm/Support/CommandLine.h"
21using namespace clang;
22
23/// Note: a hard coded list of targets is clearly silly, these should be
24/// dynamicly registered and loadable with "-load".
25enum SupportedTargets {
26 target_ppc, target_ppc64,
27 target_i386, target_x86_64,
28 target_linux_i386
29};
30
31static llvm::cl::list<SupportedTargets>
32Archs("arch", llvm::cl::desc("Architectures to compile for"),
33llvm::cl::values(clEnumValN(target_ppc, "ppc", "32-bit Darwin PowerPC"),
34 clEnumValN(target_ppc64, "ppc64", "64-bit Darwin PowerPC"),
35 clEnumValN(target_i386, "i386", "32-bit Darwin X86"),
36 clEnumValN(target_x86_64, "x86_64","64-bit Darwin X86"),
37 clEnumValN(target_linux_i386,"linux", "Linux i386"),
38 clEnumValEnd));
39
40//===----------------------------------------------------------------------===//
41// Common code shared among targets.
42//===----------------------------------------------------------------------===//
43
Chris Lattner0db667a2007-10-06 06:57:34 +000044static void Define(std::vector<char> &Buf, const char *Macro,
45 const char *Val = "1") {
46 const char *Def = "#define ";
47 Buf.insert(Buf.end(), Def, Def+strlen(Def));
48 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
49 Buf.push_back(' ');
50 Buf.insert(Buf.end(), Val, Val+strlen(Val));
51 Buf.push_back('\n');
52}
53
54
Chris Lattner4b009652007-07-25 00:24:17 +000055namespace {
56class DarwinTargetInfo : public TargetInfoImpl {
57public:
Chris Lattner0db667a2007-10-06 06:57:34 +000058 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner1ed172d2007-10-17 06:04:46 +000059// FIXME: we need a real target configuration system. For now, only define
60// __APPLE__ if the host has it.
61#ifdef __APPLE__
Chris Lattner0db667a2007-10-06 06:57:34 +000062 Define(Defs, "__APPLE__");
63 Define(Defs, "__MACH__");
Chris Lattner1ed172d2007-10-17 06:04:46 +000064#endif
Chris Lattner4b009652007-07-25 00:24:17 +000065
66 if (1) {// -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000067 Define(Defs, "__weak", "");
68 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000069 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000070 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
71 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
72 Define(Defs, "__OBJC_GC__");
Chris Lattner4b009652007-07-25 00:24:17 +000073 }
74
75 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000076 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000077
78 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000079 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000080 }
81
82};
83} // end anonymous namespace.
84
85
86/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
87/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +000088static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000089 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +000090 Define(Defs, "__ppc__");
91 Define(Defs, "_ARCH_PPC");
92 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +000093 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000094 Define(Defs, "_ARCH_PPC64");
95 Define(Defs, "_LP64");
96 Define(Defs, "__LP64__");
97 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +000098 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000099 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +0000100 }
101
102 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000103 Define(Defs, "_BIG_ENDIAN");
104 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000105
106 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000107 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
108 Define(Defs, "__INTMAX_TYPE__", "long int");
109 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
110 Define(Defs, "__PTRDIFF_TYPE__", "long int");
111 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000112 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000113 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
114 Define(Defs, "__INTMAX_TYPE__", "long long int");
115 Define(Defs, "__LONG_MAX__", "2147483647L");
116 Define(Defs, "__PTRDIFF_TYPE__", "int");
117 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000118 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000119 Define(Defs, "__INT_MAX__", "2147483647");
120 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
121 Define(Defs, "__CHAR_BIT__", "8");
122 Define(Defs, "__SCHAR_MAX__", "127");
123 Define(Defs, "__SHRT_MAX__", "32767");
124 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000125
126 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000127 Define(Defs, "__USER_LABEL_PREFIX__", "_");
128 Define(Defs, "__NATURAL_ALIGNMENT__");
129 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000130
Chris Lattner0db667a2007-10-06 06:57:34 +0000131 Define(Defs, "__WCHAR_MAX__", "2147483647");
132 Define(Defs, "__WCHAR_TYPE__", "int");
133 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000134
135 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000136 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
137 Define(Defs, "__FLT_DIG__", "6");
138 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
139 Define(Defs, "__FLT_EVAL_METHOD__", "0");
140 Define(Defs, "__FLT_HAS_INFINITY__");
141 Define(Defs, "__FLT_HAS_QUIET_NAN__");
142 Define(Defs, "__FLT_MANT_DIG__", "24");
143 Define(Defs, "__FLT_MAX_10_EXP__", "38");
144 Define(Defs, "__FLT_MAX_EXP__", "128");
145 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
146 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
147 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
148 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
149 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000150
151 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000152 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
153 Define(Defs, "__DBL_DIG__", "15");
154 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
155 Define(Defs, "__DBL_HAS_INFINITY__");
156 Define(Defs, "__DBL_HAS_QUIET_NAN__");
157 Define(Defs, "__DBL_MANT_DIG__", "53");
158 Define(Defs, "__DBL_MAX_10_EXP__", "308");
159 Define(Defs, "__DBL_MAX_EXP__", "1024");
160 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
161 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
162 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
163 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
164 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000165
166 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000167 Define(Defs, "__LDBL_DENORM_MIN__",
168 "4.94065645841246544176568792868221e-324L");
169 Define(Defs, "__LDBL_DIG__", "31");
170 Define(Defs, "__LDBL_EPSILON__",
171 "4.94065645841246544176568792868221e-324L");
172 Define(Defs, "__LDBL_HAS_INFINITY__");
173 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
174 Define(Defs, "__LDBL_MANT_DIG__", "106");
175 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
176 Define(Defs, "__LDBL_MAX_EXP__", "1024");
177 Define(Defs, "__LDBL_MAX__",
178 "1.79769313486231580793728971405301e+308L");
179 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
180 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
181 Define(Defs, "__LDBL_MIN__",
182 "2.00416836000897277799610805135016e-292L");
183 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000191 Define(Defs, "_LP64");
192 Define(Defs, "__LP64__");
193 Define(Defs, "__amd64__");
194 Define(Defs, "__amd64");
195 Define(Defs, "__x86_64");
196 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000197 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000201 }
202
203 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000205
206 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000207 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
208 Define(Defs, "__INTMAX_TYPE__", "long int");
209 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
210 Define(Defs, "__PTRDIFF_TYPE__", "long int");
211 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000212 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000213 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
214 Define(Defs, "__INTMAX_TYPE__", "long long int");
215 Define(Defs, "__LONG_MAX__", "2147483647L");
216 Define(Defs, "__PTRDIFF_TYPE__", "int");
217 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000218 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000219 Define(Defs, "__CHAR_BIT__", "8");
220 Define(Defs, "__INT_MAX__", "2147483647");
221 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
222 Define(Defs, "__SCHAR_MAX__", "127");
223 Define(Defs, "__SHRT_MAX__", "32767");
224 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000225
226 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000227 Define(Defs, "__nocona");
228 Define(Defs, "__nocona__");
229 Define(Defs, "__tune_nocona__");
230 Define(Defs, "__SSE2_MATH__");
231 Define(Defs, "__SSE2__");
232 Define(Defs, "__SSE_MATH__");
233 Define(Defs, "__SSE__");
234 Define(Defs, "__MMX__");
235 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000236
Chris Lattner0db667a2007-10-06 06:57:34 +0000237 Define(Defs, "__WCHAR_MAX__", "2147483647");
238 Define(Defs, "__WCHAR_TYPE__", "int");
239 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000240
241 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000242 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
243 Define(Defs, "__FLT_DIG__", "6");
244 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
245 Define(Defs, "__FLT_EVAL_METHOD__", "0");
246 Define(Defs, "__FLT_HAS_INFINITY__");
247 Define(Defs, "__FLT_HAS_QUIET_NAN__");
248 Define(Defs, "__FLT_MANT_DIG__", "24");
249 Define(Defs, "__FLT_MAX_10_EXP__", "38");
250 Define(Defs, "__FLT_MAX_EXP__", "128");
251 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
252 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
253 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
254 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
255 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000256
257 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000258 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
259 Define(Defs, "__DBL_DIG__", "15");
260 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
261 Define(Defs, "__DBL_HAS_INFINITY__");
262 Define(Defs, "__DBL_HAS_QUIET_NAN__");
263 Define(Defs, "__DBL_MANT_DIG__", "53");
264 Define(Defs, "__DBL_MAX_10_EXP__", "308");
265 Define(Defs, "__DBL_MAX_EXP__", "1024");
266 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
267 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
268 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
269 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
270 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000271
272 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000273 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
274 Define(Defs, "__LDBL_DIG__", "18");
275 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
276 Define(Defs, "__LDBL_HAS_INFINITY__");
277 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
278 Define(Defs, "__LDBL_MANT_DIG__", "64");
279 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
280 Define(Defs, "__LDBL_MAX_EXP__", "16384");
281 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
282 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
283 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
284 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000285}
286
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000287static const char* getI386VAListDeclaration() {
288 return "typedef char* __builtin_va_list;";
289}
290
291static const char* getX86_64VAListDeclaration() {
292 return
293 "typedef struct __va_list_tag {"
294 " unsigned gp_offset;"
295 " unsigned fp_offset;"
296 " void* overflow_arg_area;"
297 " void* reg_save_area;"
298 "} __builtin_va_list[1];";
299}
300
301static const char* getPPCVAListDeclaration() {
302 return
303 "typedef struct __va_list_tag {"
304 " unsigned char gpr;"
305 " unsigned char fpr;"
306 " unsigned short reserved;"
307 " void* overflow_arg_area;"
308 " void* reg_save_area;"
309 "} __builtin_va_list[1];";
310}
311
312
Chris Lattner4b009652007-07-25 00:24:17 +0000313/// PPC builtin info.
314namespace PPC {
315 enum {
316 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
317#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
318#include "PPCBuiltins.def"
319 LastTSBuiltin
320 };
321
322 static const Builtin::Info BuiltinInfo[] = {
323#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
324#include "PPCBuiltins.def"
325 };
326
327 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
328 Records = BuiltinInfo;
329 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
330 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000331
332 static const char * const GCCRegNames[] = {
333 "0", "1", "2", "3", "4", "5", "6", "7",
334 "8", "9", "10", "11", "12", "13", "14", "15",
335 "16", "17", "18", "19", "20", "21", "22", "23",
336 "24", "25", "26", "27", "28", "29", "30", "31",
337 "0", "1", "2", "3", "4", "5", "6", "7",
338 "8", "9", "10", "11", "12", "13", "14", "15",
339 "16", "17", "18", "19", "20", "21", "22", "23",
340 "24", "25", "26", "27", "28", "29", "30", "31",
341 "mq", "lr", "ctr", "ap",
342 "0", "1", "2", "3", "4", "5", "6", "7",
343 "xer",
344 "0", "1", "2", "3", "4", "5", "6", "7",
345 "8", "9", "10", "11", "12", "13", "14", "15",
346 "16", "17", "18", "19", "20", "21", "22", "23",
347 "24", "25", "26", "27", "28", "29", "30", "31",
348 "vrsave", "vscr",
349 "spe_acc", "spefscr",
350 "sfp"
351 };
352
353 static void getGCCRegNames(const char * const *&Names,
354 unsigned &NumNames) {
355 Names = GCCRegNames;
356 NumNames = llvm::array_lengthof(GCCRegNames);
357 }
358
359 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
360 // While some of these aliases do map to different registers
361 // they still share the same register name.
362 { { "cc", "cr0", "fr0", "r0", "v0"}, "0" },
363 { { "cr1", "fr1", "r1", "sp", "v1"}, "1" },
364 { { "cr2", "fr2", "r2", "toc", "v2"}, "2" },
365 { { "cr3", "fr3", "r3", "v3"}, "3" },
366 { { "cr4", "fr4", "r4", "v4"}, "4" },
367 { { "cr5", "fr5", "r5", "v5"}, "5" },
368 { { "cr6", "fr6", "r6", "v6"}, "6" },
369 { { "cr7", "fr7", "r7", "v7"}, "7" },
370 { { "fr8", "r8", "v8"}, "8" },
371 { { "fr9", "r9", "v9"}, "9" },
372 { { "fr10", "r10", "v10"}, "10" },
373 { { "fr11", "r11", "v11"}, "11" },
374 { { "fr12", "r12", "v12"}, "12" },
375 { { "fr13", "r13", "v13"}, "13" },
376 { { "fr14", "r14", "v14"}, "14" },
377 { { "fr15", "r15", "v15"}, "15" },
378 { { "fr16", "r16", "v16"}, "16" },
379 { { "fr17", "r17", "v17"}, "17" },
380 { { "fr18", "r18", "v18"}, "18" },
381 { { "fr19", "r19", "v19"}, "19" },
382 { { "fr20", "r20", "v20"}, "20" },
383 { { "fr21", "r21", "v21"}, "21" },
384 { { "fr22", "r22", "v22"}, "22" },
385 { { "fr23", "r23", "v23"}, "23" },
386 { { "fr24", "r24", "v24"}, "24" },
387 { { "fr25", "r25", "v25"}, "25" },
388 { { "fr26", "r26", "v26"}, "26" },
389 { { "fr27", "r27", "v27"}, "27" },
390 { { "fr28", "r28", "v28"}, "28" },
391 { { "fr29", "r29", "v29"}, "29" },
392 { { "fr30", "r30", "v30"}, "30" },
393 { { "fr31", "r31", "v31"}, "31" },
394 };
395
396 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
397 unsigned &NumAliases) {
398 Aliases = GCCRegAliases;
399 NumAliases = llvm::array_lengthof(GCCRegAliases);
Anders Carlsson4ce42302007-11-27 04:11:28 +0000400 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000401
Anders Carlsson4ce42302007-11-27 04:11:28 +0000402 static bool validateAsmConstraint(char c,
403 TargetInfo::ConstraintInfo &info) {
404 switch (c) {
405 default: return false;
406 case 'O': // Zero
407 return true;
408 case 'b': // Base register
409 case 'f': // Floating point register
410 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
411 return true;
412 }
413 }
414
415 const char *getClobbers() {
416 return 0;
417 }
418
Chris Lattner4b009652007-07-25 00:24:17 +0000419} // End namespace PPC
420
421
422/// X86 builtin info.
423namespace X86 {
424 enum {
425 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
426#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
427#include "X86Builtins.def"
428 LastTSBuiltin
429 };
430
431 static const Builtin::Info BuiltinInfo[] = {
432#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
433#include "X86Builtins.def"
434 };
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000435
Chris Lattner4b009652007-07-25 00:24:17 +0000436
437 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
438 Records = BuiltinInfo;
439 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
440 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000441
442 static const char *GCCRegNames[] = {
443 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
444 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlssonc411b492007-11-25 00:23:10 +0000445 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000446 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
447 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
448 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
449 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
450 };
451
452 static void getGCCRegNames(const char * const *&Names,
453 unsigned &NumNames) {
454 Names = GCCRegNames;
455 NumNames = llvm::array_lengthof(GCCRegNames);
456 }
457
458 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
459 { { "al", "ah", "eax", "rax" }, "ax" },
460 { { "bl", "bh", "ebx", "rbx" }, "bx" },
461 { { "cl", "ch", "ecx", "rcx" }, "cx" },
462 { { "dl", "dh", "edx", "rdx" }, "dx" },
463 { { "esi", "rsi" }, "si" },
464 { { "esp", "rsp" }, "sp" },
465 { { "ebp", "rbp" }, "bp" },
466 };
467
468 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
469 unsigned &NumAliases) {
470 Aliases = GCCRegAliases;
471 NumAliases = llvm::array_lengthof(GCCRegAliases);
472 }
473
Anders Carlsson4ce42302007-11-27 04:11:28 +0000474 static bool validateAsmConstraint(char c,
475 TargetInfo::ConstraintInfo &info) {
476 switch (c) {
477 default: return false;
478 case 'a': // eax.
479 case 'b': // ebx.
480 case 'c': // ecx.
481 case 'd': // edx.
482 case 'S': // esi.
483 case 'D': // edi.
484 case 'A': // edx:eax.
485 case 't': // top of floating point stack.
486 case 'u': // second from top of floating point stack.
487 case 'q': // a, b, c, d registers or any integer register in 64-bit.
488 info = (TargetInfo::ConstraintInfo)(info|TargetInfo::CI_AllowsRegister);
489 return true;
490 }
491 }
492
493 const char *getClobbers() {
494 return "~{dirflag},~{fpsr},~{flags}";
495 }
496
Chris Lattner4b009652007-07-25 00:24:17 +0000497} // End namespace X86
498
499//===----------------------------------------------------------------------===//
500// Specific target implementations.
501//===----------------------------------------------------------------------===//
502
503
504namespace {
505class DarwinPPCTargetInfo : public DarwinTargetInfo {
506public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000507 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000508 DarwinTargetInfo::getTargetDefines(Defines);
509 getPowerPCDefines(Defines, false);
510 }
511 virtual void getTargetBuiltins(const Builtin::Info *&Records,
512 unsigned &NumRecords) const {
513 PPC::getBuiltins(Records, NumRecords);
514 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000515 virtual const char *getVAListDeclaration() const {
516 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000517 }
518 virtual void getGCCRegNames(const char * const *&Names,
519 unsigned &NumNames) const {
520 PPC::getGCCRegNames(Names, NumNames);
521 }
522 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
523 unsigned &NumAliases) const {
524 PPC::getGCCRegAliases(Aliases, NumAliases);
525 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000526 virtual bool validateAsmConstraint(char c,
527 TargetInfo::ConstraintInfo &info) const {
528 return PPC::validateAsmConstraint(c, info);
529 }
530 virtual const char *getClobbers() const {
531 return PPC::getClobbers();
532 }
Chris Lattner4b009652007-07-25 00:24:17 +0000533};
534} // end anonymous namespace.
535
536namespace {
537class DarwinPPC64TargetInfo : public DarwinTargetInfo {
538public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000539 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000540 DarwinTargetInfo::getTargetDefines(Defines);
541 getPowerPCDefines(Defines, true);
542 }
543 virtual void getTargetBuiltins(const Builtin::Info *&Records,
544 unsigned &NumRecords) const {
545 PPC::getBuiltins(Records, NumRecords);
546 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000547 virtual const char *getVAListDeclaration() const {
548 return getPPCVAListDeclaration();
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 DarwinI386TargetInfo : public DarwinTargetInfo {
570public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000571 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000572 DarwinTargetInfo::getTargetDefines(Defines);
573 getX86Defines(Defines, false);
574 }
575 virtual void getTargetBuiltins(const Builtin::Info *&Records,
576 unsigned &NumRecords) const {
577 X86::getBuiltins(Records, NumRecords);
578 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000579 virtual const char *getVAListDeclaration() const {
580 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000581 }
582 virtual void getGCCRegNames(const char * const *&Names,
583 unsigned &NumNames) const {
584 X86::getGCCRegNames(Names, NumNames);
585 }
586 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
587 unsigned &NumAliases) const {
588 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000589 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000590 virtual bool validateAsmConstraint(char c,
591 TargetInfo::ConstraintInfo &info) const {
592 return X86::validateAsmConstraint(c, info);
593 }
594 virtual const char *getClobbers() const {
595 return X86::getClobbers();
596 }
Chris Lattner4b009652007-07-25 00:24:17 +0000597};
598} // end anonymous namespace.
599
600namespace {
601class DarwinX86_64TargetInfo : public DarwinTargetInfo {
602public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000603 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000604 DarwinTargetInfo::getTargetDefines(Defines);
605 getX86Defines(Defines, true);
606 }
607 virtual void getTargetBuiltins(const Builtin::Info *&Records,
608 unsigned &NumRecords) const {
609 X86::getBuiltins(Records, NumRecords);
610 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000611 virtual const char *getVAListDeclaration() const {
612 return getX86_64VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000613 }
614 virtual void getGCCRegNames(const char * const *&Names,
615 unsigned &NumNames) const {
616 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000617 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000618 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
619 unsigned &NumAliases) const {
620 X86::getGCCRegAliases(Aliases, NumAliases);
621 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000622 virtual bool validateAsmConstraint(char c,
623 TargetInfo::ConstraintInfo &info) const {
624 return X86::validateAsmConstraint(c, info);
625 }
626 virtual const char *getClobbers() const {
627 return X86::getClobbers();
628 }
Chris Lattner4b009652007-07-25 00:24:17 +0000629};
630} // end anonymous namespace.
631
632namespace {
633class LinuxTargetInfo : public DarwinTargetInfo {
634public:
635 LinuxTargetInfo() {
636 // Note: I have no idea if this is right, just for testing.
637 WCharWidth = 16;
638 WCharAlign = 16;
639 }
640
Chris Lattner0db667a2007-10-06 06:57:34 +0000641 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000642 // TODO: linux-specific stuff.
643 getX86Defines(Defines, false);
644 }
645 virtual void getTargetBuiltins(const Builtin::Info *&Records,
646 unsigned &NumRecords) const {
647 X86::getBuiltins(Records, NumRecords);
648 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000649 virtual const char *getVAListDeclaration() const {
650 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000651 }
652 virtual void getGCCRegNames(const char * const *&Names,
653 unsigned &NumNames) const {
654 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000655 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000656 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
657 unsigned &NumAliases) const {
658 X86::getGCCRegAliases(Aliases, NumAliases);
659 }
Anders Carlsson4ce42302007-11-27 04:11:28 +0000660 virtual bool validateAsmConstraint(char c,
661 TargetInfo::ConstraintInfo &info) const {
662 return X86::validateAsmConstraint(c, info);
663 }
664 virtual const char *getClobbers() const {
665 return X86::getClobbers();
666 }
Chris Lattner4b009652007-07-25 00:24:17 +0000667};
668} // end anonymous namespace.
669
670
671//===----------------------------------------------------------------------===//
672// Driver code
673//===----------------------------------------------------------------------===//
674
675/// CreateTarget - Create the TargetInfoImpl object for the specified target
676/// enum value.
677static TargetInfoImpl *CreateTarget(SupportedTargets T) {
678 switch (T) {
679 default: assert(0 && "Unknown target!");
680 case target_ppc: return new DarwinPPCTargetInfo();
681 case target_ppc64: return new DarwinPPC64TargetInfo();
682 case target_i386: return new DarwinI386TargetInfo();
683 case target_x86_64: return new DarwinX86_64TargetInfo();
684 case target_linux_i386: return new LinuxTargetInfo();
685 }
686}
687
688/// CreateTargetInfo - Return the set of target info objects as specified by
689/// the -arch command line option.
690TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
691 // If the user didn't specify at least one architecture, auto-sense the
692 // current host. TODO: This is a hack. :)
693 if (Archs.empty()) {
694#ifndef __APPLE__
695 // Assume non-apple = i386 for now.
696 Archs.push_back(target_i386);
697#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
698 defined(__ppc64__)
699 Archs.push_back(target_ppc64);
700#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
701 Archs.push_back(target_ppc);
702#elif defined(__x86_64__)
703 Archs.push_back(target_x86_64);
704#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
705 Archs.push_back(target_i386);
706#else
707 // Don't know what this is!
708 return 0;
709#endif
710 }
711
712 // Create the primary target and target info.
713 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
714
715 // Add all secondary targets.
716 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
717 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
718 return TI;
719}