blob: 7a51e175f16e644213cad4c94cd5d14d69406e50 [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//
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 Carlsson3346ae62007-11-24 23:38:12 +000019#include "llvm/ADT/STLExtras.h"
Reid Spencer5f016e22007-07-11 17:01:13 +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 Lattnerd15fa822007-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
Reid Spencer5f016e22007-07-11 17:01:13 +000055namespace {
56class DarwinTargetInfo : public TargetInfoImpl {
57public:
Chris Lattnerd15fa822007-10-06 06:57:34 +000058 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner338128b2007-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 Lattnerd15fa822007-10-06 06:57:34 +000062 Define(Defs, "__APPLE__");
63 Define(Defs, "__MACH__");
Chris Lattner338128b2007-10-17 06:04:46 +000064#endif
Reid Spencer5f016e22007-07-11 17:01:13 +000065
66 if (1) {// -fobjc-gc controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000067 Define(Defs, "__weak", "");
68 Define(Defs, "__strong", "");
Reid Spencer5f016e22007-07-11 17:01:13 +000069 } else {
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +000073 }
74
75 // darwin_constant_cfstrings controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000076 Define(Defs, "__CONSTANT_CFSTRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000077
78 if (0) // darwin_pascal_strings
Chris Lattnerd15fa822007-10-06 06:57:34 +000079 Define(Defs, "__PASCAL_STRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +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 Lattnerd15fa822007-10-06 06:57:34 +000088static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +000089 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +000090 Define(Defs, "__ppc__");
91 Define(Defs, "_ARCH_PPC");
92 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +000093 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +000094 Define(Defs, "_ARCH_PPC64");
95 Define(Defs, "_LP64");
96 Define(Defs, "__LP64__");
97 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +000098 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +000099 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000100 }
101
102 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000103 Define(Defs, "_BIG_ENDIAN");
104 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000105
106 if (is64Bit) {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000112 } else {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000118 }
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000125
126 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000127 Define(Defs, "__USER_LABEL_PREFIX__", "_");
128 Define(Defs, "__NATURAL_ALIGNMENT__");
129 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000130
Chris Lattnerd15fa822007-10-06 06:57:34 +0000131 Define(Defs, "__WCHAR_MAX__", "2147483647");
132 Define(Defs, "__WCHAR_TYPE__", "int");
133 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000134
135 // Float macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000150
151 // double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000165
166 // 128-bit long double macros.
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000184}
185
186/// getX86Defines - Return a set of the X86-specific #defines that are
187/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000188static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000189 // Target identification.
190 if (is64Bit) {
Chris Lattnerd15fa822007-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__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000197 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000198 Define(Defs, "__i386__");
199 Define(Defs, "__i386");
200 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000201 }
202
203 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000204 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000205
206 if (is64Bit) {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000212 } else {
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000218 }
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000225
226 // Subtarget options.
Chris Lattnerd15fa822007-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__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000236
Chris Lattnerd15fa822007-10-06 06:57:34 +0000237 Define(Defs, "__WCHAR_MAX__", "2147483647");
238 Define(Defs, "__WCHAR_TYPE__", "int");
239 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000240
241 // Float macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000256
257 // Double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000271
272 // 80-bit Long double macros.
Chris Lattnerd15fa822007-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");
Reid Spencer5f016e22007-07-11 17:01:13 +0000285}
286
Anders Carlssonfb5e5ba2007-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
Reid Spencer5f016e22007-07-11 17:01:13 +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 Carlsson3346ae62007-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);
400 }
401
Reid Spencer5f016e22007-07-11 17:01:13 +0000402} // End namespace PPC
403
404
405/// X86 builtin info.
406namespace X86 {
407 enum {
408 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
409#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
410#include "X86Builtins.def"
411 LastTSBuiltin
412 };
413
414 static const Builtin::Info BuiltinInfo[] = {
415#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
416#include "X86Builtins.def"
417 };
Anders Carlsson3346ae62007-11-24 23:38:12 +0000418
Reid Spencer5f016e22007-07-11 17:01:13 +0000419
420 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
421 Records = BuiltinInfo;
422 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
423 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000424
425 static const char *GCCRegNames[] = {
426 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
427 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Anders Carlsson646b2612007-11-25 00:23:10 +0000428 "argp", "flags", "fspr", "dirflag", "frame",
Anders Carlsson3346ae62007-11-24 23:38:12 +0000429 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
430 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
431 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
432 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
433 };
434
435 static void getGCCRegNames(const char * const *&Names,
436 unsigned &NumNames) {
437 Names = GCCRegNames;
438 NumNames = llvm::array_lengthof(GCCRegNames);
439 }
440
441 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
442 { { "al", "ah", "eax", "rax" }, "ax" },
443 { { "bl", "bh", "ebx", "rbx" }, "bx" },
444 { { "cl", "ch", "ecx", "rcx" }, "cx" },
445 { { "dl", "dh", "edx", "rdx" }, "dx" },
446 { { "esi", "rsi" }, "si" },
447 { { "esp", "rsp" }, "sp" },
448 { { "ebp", "rbp" }, "bp" },
449 };
450
451 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
452 unsigned &NumAliases) {
453 Aliases = GCCRegAliases;
454 NumAliases = llvm::array_lengthof(GCCRegAliases);
455 }
456
Reid Spencer5f016e22007-07-11 17:01:13 +0000457} // End namespace X86
458
459//===----------------------------------------------------------------------===//
460// Specific target implementations.
461//===----------------------------------------------------------------------===//
462
463
464namespace {
465class DarwinPPCTargetInfo : public DarwinTargetInfo {
466public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000467 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000468 DarwinTargetInfo::getTargetDefines(Defines);
469 getPowerPCDefines(Defines, false);
470 }
471 virtual void getTargetBuiltins(const Builtin::Info *&Records,
472 unsigned &NumRecords) const {
473 PPC::getBuiltins(Records, NumRecords);
474 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000475 virtual const char *getVAListDeclaration() const {
476 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000477 }
478 virtual void getGCCRegNames(const char * const *&Names,
479 unsigned &NumNames) const {
480 PPC::getGCCRegNames(Names, NumNames);
481 }
482 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
483 unsigned &NumAliases) const {
484 PPC::getGCCRegAliases(Aliases, NumAliases);
485 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000486};
487} // end anonymous namespace.
488
489namespace {
490class DarwinPPC64TargetInfo : public DarwinTargetInfo {
491public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000492 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000493 DarwinTargetInfo::getTargetDefines(Defines);
494 getPowerPCDefines(Defines, true);
495 }
496 virtual void getTargetBuiltins(const Builtin::Info *&Records,
497 unsigned &NumRecords) const {
498 PPC::getBuiltins(Records, NumRecords);
499 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000500 virtual const char *getVAListDeclaration() const {
501 return getPPCVAListDeclaration();
502 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000503 virtual void getGCCRegNames(const char * const *&Names,
504 unsigned &NumNames) const {
505 PPC::getGCCRegNames(Names, NumNames);
506 }
507 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
508 unsigned &NumAliases) const {
509 PPC::getGCCRegAliases(Aliases, NumAliases);
510 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000511};
512} // end anonymous namespace.
513
514namespace {
515class DarwinI386TargetInfo : public DarwinTargetInfo {
516public:
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 getX86Defines(Defines, false);
520 }
521 virtual void getTargetBuiltins(const Builtin::Info *&Records,
522 unsigned &NumRecords) const {
523 X86::getBuiltins(Records, NumRecords);
524 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000525 virtual const char *getVAListDeclaration() const {
526 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000527 }
528 virtual void getGCCRegNames(const char * const *&Names,
529 unsigned &NumNames) const {
530 X86::getGCCRegNames(Names, NumNames);
531 }
532 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
533 unsigned &NumAliases) const {
534 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000535 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000536};
537} // end anonymous namespace.
538
539namespace {
540class DarwinX86_64TargetInfo : public DarwinTargetInfo {
541public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000542 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000543 DarwinTargetInfo::getTargetDefines(Defines);
544 getX86Defines(Defines, true);
545 }
546 virtual void getTargetBuiltins(const Builtin::Info *&Records,
547 unsigned &NumRecords) const {
548 X86::getBuiltins(Records, NumRecords);
549 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000550 virtual const char *getVAListDeclaration() const {
551 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000552 }
553 virtual void getGCCRegNames(const char * const *&Names,
554 unsigned &NumNames) const {
555 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000556 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000557 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
558 unsigned &NumAliases) const {
559 X86::getGCCRegAliases(Aliases, NumAliases);
560 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000561};
562} // end anonymous namespace.
563
564namespace {
565class LinuxTargetInfo : public DarwinTargetInfo {
566public:
567 LinuxTargetInfo() {
568 // Note: I have no idea if this is right, just for testing.
569 WCharWidth = 16;
Chris Lattnerd2d2a112007-07-14 01:29:45 +0000570 WCharAlign = 16;
Reid Spencer5f016e22007-07-11 17:01:13 +0000571 }
572
Chris Lattnerd15fa822007-10-06 06:57:34 +0000573 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000574 // TODO: linux-specific stuff.
575 getX86Defines(Defines, false);
576 }
577 virtual void getTargetBuiltins(const Builtin::Info *&Records,
578 unsigned &NumRecords) const {
579 X86::getBuiltins(Records, NumRecords);
580 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000581 virtual const char *getVAListDeclaration() const {
582 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000583 }
584 virtual void getGCCRegNames(const char * const *&Names,
585 unsigned &NumNames) const {
586 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000587 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000588 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
589 unsigned &NumAliases) const {
590 X86::getGCCRegAliases(Aliases, NumAliases);
591 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000592};
593} // end anonymous namespace.
594
595
596//===----------------------------------------------------------------------===//
597// Driver code
598//===----------------------------------------------------------------------===//
599
600/// CreateTarget - Create the TargetInfoImpl object for the specified target
601/// enum value.
602static TargetInfoImpl *CreateTarget(SupportedTargets T) {
603 switch (T) {
604 default: assert(0 && "Unknown target!");
605 case target_ppc: return new DarwinPPCTargetInfo();
606 case target_ppc64: return new DarwinPPC64TargetInfo();
607 case target_i386: return new DarwinI386TargetInfo();
608 case target_x86_64: return new DarwinX86_64TargetInfo();
609 case target_linux_i386: return new LinuxTargetInfo();
610 }
611}
612
613/// CreateTargetInfo - Return the set of target info objects as specified by
614/// the -arch command line option.
615TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
616 // If the user didn't specify at least one architecture, auto-sense the
617 // current host. TODO: This is a hack. :)
618 if (Archs.empty()) {
619#ifndef __APPLE__
Chris Lattnerc3f89372007-07-15 01:37:36 +0000620 // Assume non-apple = i386 for now.
621 Archs.push_back(target_i386);
Reid Spencer5f016e22007-07-11 17:01:13 +0000622#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
623 defined(__ppc64__)
624 Archs.push_back(target_ppc64);
625#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
626 Archs.push_back(target_ppc);
627#elif defined(__x86_64__)
628 Archs.push_back(target_x86_64);
629#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
630 Archs.push_back(target_i386);
631#else
632 // Don't know what this is!
633 return 0;
634#endif
635 }
636
637 // Create the primary target and target info.
638 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
639
640 // Add all secondary targets.
641 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
642 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
643 return TI;
644}