blob: 7c3101b7d08e8a61c4c32e598a5fc822d09f9e27 [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)",
428 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
429 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
430 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
431 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15"
432 };
433
434 static void getGCCRegNames(const char * const *&Names,
435 unsigned &NumNames) {
436 Names = GCCRegNames;
437 NumNames = llvm::array_lengthof(GCCRegNames);
438 }
439
440 static const TargetInfoImpl::GCCRegAlias GCCRegAliases[] = {
441 { { "al", "ah", "eax", "rax" }, "ax" },
442 { { "bl", "bh", "ebx", "rbx" }, "bx" },
443 { { "cl", "ch", "ecx", "rcx" }, "cx" },
444 { { "dl", "dh", "edx", "rdx" }, "dx" },
445 { { "esi", "rsi" }, "si" },
446 { { "esp", "rsp" }, "sp" },
447 { { "ebp", "rbp" }, "bp" },
448 };
449
450 static void getGCCRegAliases(const TargetInfoImpl::GCCRegAlias *&Aliases,
451 unsigned &NumAliases) {
452 Aliases = GCCRegAliases;
453 NumAliases = llvm::array_lengthof(GCCRegAliases);
454 }
455
Reid Spencer5f016e22007-07-11 17:01:13 +0000456} // End namespace X86
457
458//===----------------------------------------------------------------------===//
459// Specific target implementations.
460//===----------------------------------------------------------------------===//
461
462
463namespace {
464class DarwinPPCTargetInfo : public DarwinTargetInfo {
465public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000466 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000467 DarwinTargetInfo::getTargetDefines(Defines);
468 getPowerPCDefines(Defines, false);
469 }
470 virtual void getTargetBuiltins(const Builtin::Info *&Records,
471 unsigned &NumRecords) const {
472 PPC::getBuiltins(Records, NumRecords);
473 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000474 virtual const char *getVAListDeclaration() const {
475 return getPPCVAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000476 }
477 virtual void getGCCRegNames(const char * const *&Names,
478 unsigned &NumNames) const {
479 PPC::getGCCRegNames(Names, NumNames);
480 }
481 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
482 unsigned &NumAliases) const {
483 PPC::getGCCRegAliases(Aliases, NumAliases);
484 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000485};
486} // end anonymous namespace.
487
488namespace {
489class DarwinPPC64TargetInfo : public DarwinTargetInfo {
490public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000491 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000492 DarwinTargetInfo::getTargetDefines(Defines);
493 getPowerPCDefines(Defines, true);
494 }
495 virtual void getTargetBuiltins(const Builtin::Info *&Records,
496 unsigned &NumRecords) const {
497 PPC::getBuiltins(Records, NumRecords);
498 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000499 virtual const char *getVAListDeclaration() const {
500 return getPPCVAListDeclaration();
501 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000502 virtual void getGCCRegNames(const char * const *&Names,
503 unsigned &NumNames) const {
504 PPC::getGCCRegNames(Names, NumNames);
505 }
506 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
507 unsigned &NumAliases) const {
508 PPC::getGCCRegAliases(Aliases, NumAliases);
509 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000510};
511} // end anonymous namespace.
512
513namespace {
514class DarwinI386TargetInfo : public DarwinTargetInfo {
515public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000516 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000517 DarwinTargetInfo::getTargetDefines(Defines);
518 getX86Defines(Defines, false);
519 }
520 virtual void getTargetBuiltins(const Builtin::Info *&Records,
521 unsigned &NumRecords) const {
522 X86::getBuiltins(Records, NumRecords);
523 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000524 virtual const char *getVAListDeclaration() const {
525 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000526 }
527 virtual void getGCCRegNames(const char * const *&Names,
528 unsigned &NumNames) const {
529 X86::getGCCRegNames(Names, NumNames);
530 }
531 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
532 unsigned &NumAliases) const {
533 X86::getGCCRegAliases(Aliases, NumAliases);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000534 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000535};
536} // end anonymous namespace.
537
538namespace {
539class DarwinX86_64TargetInfo : public DarwinTargetInfo {
540public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000541 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000542 DarwinTargetInfo::getTargetDefines(Defines);
543 getX86Defines(Defines, true);
544 }
545 virtual void getTargetBuiltins(const Builtin::Info *&Records,
546 unsigned &NumRecords) const {
547 X86::getBuiltins(Records, NumRecords);
548 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000549 virtual const char *getVAListDeclaration() const {
550 return getX86_64VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000551 }
552 virtual void getGCCRegNames(const char * const *&Names,
553 unsigned &NumNames) const {
554 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000555 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
557 unsigned &NumAliases) const {
558 X86::getGCCRegAliases(Aliases, NumAliases);
559 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000560};
561} // end anonymous namespace.
562
563namespace {
564class LinuxTargetInfo : public DarwinTargetInfo {
565public:
566 LinuxTargetInfo() {
567 // Note: I have no idea if this is right, just for testing.
568 WCharWidth = 16;
Chris Lattnerd2d2a112007-07-14 01:29:45 +0000569 WCharAlign = 16;
Reid Spencer5f016e22007-07-11 17:01:13 +0000570 }
571
Chris Lattnerd15fa822007-10-06 06:57:34 +0000572 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000573 // TODO: linux-specific stuff.
574 getX86Defines(Defines, false);
575 }
576 virtual void getTargetBuiltins(const Builtin::Info *&Records,
577 unsigned &NumRecords) const {
578 X86::getBuiltins(Records, NumRecords);
579 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000580 virtual const char *getVAListDeclaration() const {
581 return getI386VAListDeclaration();
Anders Carlsson3346ae62007-11-24 23:38:12 +0000582 }
583 virtual void getGCCRegNames(const char * const *&Names,
584 unsigned &NumNames) const {
585 X86::getGCCRegNames(Names, NumNames);
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000586 }
Anders Carlsson3346ae62007-11-24 23:38:12 +0000587 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
588 unsigned &NumAliases) const {
589 X86::getGCCRegAliases(Aliases, NumAliases);
590 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000591};
592} // end anonymous namespace.
593
594
595//===----------------------------------------------------------------------===//
596// Driver code
597//===----------------------------------------------------------------------===//
598
599/// CreateTarget - Create the TargetInfoImpl object for the specified target
600/// enum value.
601static TargetInfoImpl *CreateTarget(SupportedTargets T) {
602 switch (T) {
603 default: assert(0 && "Unknown target!");
604 case target_ppc: return new DarwinPPCTargetInfo();
605 case target_ppc64: return new DarwinPPC64TargetInfo();
606 case target_i386: return new DarwinI386TargetInfo();
607 case target_x86_64: return new DarwinX86_64TargetInfo();
608 case target_linux_i386: return new LinuxTargetInfo();
609 }
610}
611
612/// CreateTargetInfo - Return the set of target info objects as specified by
613/// the -arch command line option.
614TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
615 // If the user didn't specify at least one architecture, auto-sense the
616 // current host. TODO: This is a hack. :)
617 if (Archs.empty()) {
618#ifndef __APPLE__
Chris Lattnerc3f89372007-07-15 01:37:36 +0000619 // Assume non-apple = i386 for now.
620 Archs.push_back(target_i386);
Reid Spencer5f016e22007-07-11 17:01:13 +0000621#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
622 defined(__ppc64__)
623 Archs.push_back(target_ppc64);
624#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
625 Archs.push_back(target_ppc);
626#elif defined(__x86_64__)
627 Archs.push_back(target_x86_64);
628#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
629 Archs.push_back(target_i386);
630#else
631 // Don't know what this is!
632 return 0;
633#endif
634 }
635
636 // Create the primary target and target info.
637 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
638
639 // Add all secondary targets.
640 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
641 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
642 return TI;
643}