blob: 7c3101b7d08e8a61c4c32e598a5fc822d09f9e27 [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);
400 }
401
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson7dd1c952007-11-24 23:38:12 +0000418
Chris Lattner4b009652007-07-25 00:24:17 +0000419
420 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
421 Records = BuiltinInfo;
422 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
423 }
Anders Carlsson7dd1c952007-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
Chris Lattner4b009652007-07-25 00:24:17 +0000456} // End namespace X86
457
458//===----------------------------------------------------------------------===//
459// Specific target implementations.
460//===----------------------------------------------------------------------===//
461
462
463namespace {
464class DarwinPPCTargetInfo : public DarwinTargetInfo {
465public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000466 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson8b58e8a2007-10-13 00:45:48 +0000474 virtual const char *getVAListDeclaration() const {
475 return getPPCVAListDeclaration();
Anders Carlsson7dd1c952007-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 }
Chris Lattner4b009652007-07-25 00:24:17 +0000485};
486} // end anonymous namespace.
487
488namespace {
489class DarwinPPC64TargetInfo : public DarwinTargetInfo {
490public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000491 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson8b58e8a2007-10-13 00:45:48 +0000499 virtual const char *getVAListDeclaration() const {
500 return getPPCVAListDeclaration();
501 }
Anders Carlsson7dd1c952007-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 }
Chris Lattner4b009652007-07-25 00:24:17 +0000510};
511} // end anonymous namespace.
512
513namespace {
514class DarwinI386TargetInfo : public DarwinTargetInfo {
515public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000516 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson8b58e8a2007-10-13 00:45:48 +0000524 virtual const char *getVAListDeclaration() const {
525 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-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 Carlsson8b58e8a2007-10-13 00:45:48 +0000534 }
Chris Lattner4b009652007-07-25 00:24:17 +0000535};
536} // end anonymous namespace.
537
538namespace {
539class DarwinX86_64TargetInfo : public DarwinTargetInfo {
540public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000541 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson8b58e8a2007-10-13 00:45:48 +0000549 virtual const char *getVAListDeclaration() const {
550 return getX86_64VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000551 }
552 virtual void getGCCRegNames(const char * const *&Names,
553 unsigned &NumNames) const {
554 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000555 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
557 unsigned &NumAliases) const {
558 X86::getGCCRegAliases(Aliases, NumAliases);
559 }
Chris Lattner4b009652007-07-25 00:24:17 +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;
569 WCharAlign = 16;
570 }
571
Chris Lattner0db667a2007-10-06 06:57:34 +0000572 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +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 Carlsson8b58e8a2007-10-13 00:45:48 +0000580 virtual const char *getVAListDeclaration() const {
581 return getI386VAListDeclaration();
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000582 }
583 virtual void getGCCRegNames(const char * const *&Names,
584 unsigned &NumNames) const {
585 X86::getGCCRegNames(Names, NumNames);
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000586 }
Anders Carlsson7dd1c952007-11-24 23:38:12 +0000587 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
588 unsigned &NumAliases) const {
589 X86::getGCCRegAliases(Aliases, NumAliases);
590 }
Chris Lattner4b009652007-07-25 00:24:17 +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__
619 // Assume non-apple = i386 for now.
620 Archs.push_back(target_i386);
621#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}