blob: 581f475ece2063a956505a33940e2aa725f2615a [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"
19#include "llvm/Support/CommandLine.h"
20using namespace clang;
21
22/// Note: a hard coded list of targets is clearly silly, these should be
23/// dynamicly registered and loadable with "-load".
24enum SupportedTargets {
25 target_ppc, target_ppc64,
26 target_i386, target_x86_64,
27 target_linux_i386
28};
29
30static llvm::cl::list<SupportedTargets>
31Archs("arch", llvm::cl::desc("Architectures to compile for"),
32llvm::cl::values(clEnumValN(target_ppc, "ppc", "32-bit Darwin PowerPC"),
33 clEnumValN(target_ppc64, "ppc64", "64-bit Darwin PowerPC"),
34 clEnumValN(target_i386, "i386", "32-bit Darwin X86"),
35 clEnumValN(target_x86_64, "x86_64","64-bit Darwin X86"),
36 clEnumValN(target_linux_i386,"linux", "Linux i386"),
37 clEnumValEnd));
38
39//===----------------------------------------------------------------------===//
40// Common code shared among targets.
41//===----------------------------------------------------------------------===//
42
Chris Lattner0db667a2007-10-06 06:57:34 +000043static void Define(std::vector<char> &Buf, const char *Macro,
44 const char *Val = "1") {
45 const char *Def = "#define ";
46 Buf.insert(Buf.end(), Def, Def+strlen(Def));
47 Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
48 Buf.push_back(' ');
49 Buf.insert(Buf.end(), Val, Val+strlen(Val));
50 Buf.push_back('\n');
51}
52
53
Chris Lattner4b009652007-07-25 00:24:17 +000054namespace {
55class DarwinTargetInfo : public TargetInfoImpl {
56public:
Chris Lattner0db667a2007-10-06 06:57:34 +000057 virtual void getTargetDefines(std::vector<char> &Defs) const {
Chris Lattner1ed172d2007-10-17 06:04:46 +000058// FIXME: we need a real target configuration system. For now, only define
59// __APPLE__ if the host has it.
60#ifdef __APPLE__
Chris Lattner0db667a2007-10-06 06:57:34 +000061 Define(Defs, "__APPLE__");
62 Define(Defs, "__MACH__");
Chris Lattner1ed172d2007-10-17 06:04:46 +000063#endif
Chris Lattner4b009652007-07-25 00:24:17 +000064
65 if (1) {// -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000066 Define(Defs, "__weak", "");
67 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000068 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000069 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
70 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
71 Define(Defs, "__OBJC_GC__");
Chris Lattner4b009652007-07-25 00:24:17 +000072 }
73
74 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000075 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000076
77 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000078 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000079 }
80
81};
82} // end anonymous namespace.
83
84
85/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
86/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +000087static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000088 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +000089 Define(Defs, "__ppc__");
90 Define(Defs, "_ARCH_PPC");
91 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +000092 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000093 Define(Defs, "_ARCH_PPC64");
94 Define(Defs, "_LP64");
95 Define(Defs, "__LP64__");
96 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +000097 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000098 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +000099 }
100
101 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000102 Define(Defs, "_BIG_ENDIAN");
103 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000104
105 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000106 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
107 Define(Defs, "__INTMAX_TYPE__", "long int");
108 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
109 Define(Defs, "__PTRDIFF_TYPE__", "long int");
110 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000111 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000112 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
113 Define(Defs, "__INTMAX_TYPE__", "long long int");
114 Define(Defs, "__LONG_MAX__", "2147483647L");
115 Define(Defs, "__PTRDIFF_TYPE__", "int");
116 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000117 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000118 Define(Defs, "__INT_MAX__", "2147483647");
119 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
120 Define(Defs, "__CHAR_BIT__", "8");
121 Define(Defs, "__SCHAR_MAX__", "127");
122 Define(Defs, "__SHRT_MAX__", "32767");
123 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000124
125 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000126 Define(Defs, "__USER_LABEL_PREFIX__", "_");
127 Define(Defs, "__NATURAL_ALIGNMENT__");
128 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000129
Chris Lattner0db667a2007-10-06 06:57:34 +0000130 Define(Defs, "__WCHAR_MAX__", "2147483647");
131 Define(Defs, "__WCHAR_TYPE__", "int");
132 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000133
134 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000135 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
136 Define(Defs, "__FLT_DIG__", "6");
137 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
138 Define(Defs, "__FLT_EVAL_METHOD__", "0");
139 Define(Defs, "__FLT_HAS_INFINITY__");
140 Define(Defs, "__FLT_HAS_QUIET_NAN__");
141 Define(Defs, "__FLT_MANT_DIG__", "24");
142 Define(Defs, "__FLT_MAX_10_EXP__", "38");
143 Define(Defs, "__FLT_MAX_EXP__", "128");
144 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
145 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
146 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
147 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
148 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000149
150 // double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000151 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
152 Define(Defs, "__DBL_DIG__", "15");
153 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
154 Define(Defs, "__DBL_HAS_INFINITY__");
155 Define(Defs, "__DBL_HAS_QUIET_NAN__");
156 Define(Defs, "__DBL_MANT_DIG__", "53");
157 Define(Defs, "__DBL_MAX_10_EXP__", "308");
158 Define(Defs, "__DBL_MAX_EXP__", "1024");
159 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
160 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
161 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
162 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
163 Define(Defs, "__DECIMAL_DIG__", "33");
Chris Lattner4b009652007-07-25 00:24:17 +0000164
165 // 128-bit long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000166 Define(Defs, "__LDBL_DENORM_MIN__",
167 "4.94065645841246544176568792868221e-324L");
168 Define(Defs, "__LDBL_DIG__", "31");
169 Define(Defs, "__LDBL_EPSILON__",
170 "4.94065645841246544176568792868221e-324L");
171 Define(Defs, "__LDBL_HAS_INFINITY__");
172 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
173 Define(Defs, "__LDBL_MANT_DIG__", "106");
174 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
175 Define(Defs, "__LDBL_MAX_EXP__", "1024");
176 Define(Defs, "__LDBL_MAX__",
177 "1.79769313486231580793728971405301e+308L");
178 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
179 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
180 Define(Defs, "__LDBL_MIN__",
181 "2.00416836000897277799610805135016e-292L");
182 Define(Defs, "__LONG_DOUBLE_128__");
Chris Lattner4b009652007-07-25 00:24:17 +0000183}
184
185/// getX86Defines - Return a set of the X86-specific #defines that are
186/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000187static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000188 // Target identification.
189 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000190 Define(Defs, "_LP64");
191 Define(Defs, "__LP64__");
192 Define(Defs, "__amd64__");
193 Define(Defs, "__amd64");
194 Define(Defs, "__x86_64");
195 Define(Defs, "__x86_64__");
Chris Lattner4b009652007-07-25 00:24:17 +0000196 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000197 Define(Defs, "__i386__");
198 Define(Defs, "__i386");
199 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000200 }
201
202 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000203 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000204
205 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +0000206 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
207 Define(Defs, "__INTMAX_TYPE__", "long int");
208 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
209 Define(Defs, "__PTRDIFF_TYPE__", "long int");
210 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000211 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000212 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
213 Define(Defs, "__INTMAX_TYPE__", "long long int");
214 Define(Defs, "__LONG_MAX__", "2147483647L");
215 Define(Defs, "__PTRDIFF_TYPE__", "int");
216 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000217 }
Chris Lattner0db667a2007-10-06 06:57:34 +0000218 Define(Defs, "__CHAR_BIT__", "8");
219 Define(Defs, "__INT_MAX__", "2147483647");
220 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
221 Define(Defs, "__SCHAR_MAX__", "127");
222 Define(Defs, "__SHRT_MAX__", "32767");
223 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Chris Lattner4b009652007-07-25 00:24:17 +0000224
225 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000226 Define(Defs, "__nocona");
227 Define(Defs, "__nocona__");
228 Define(Defs, "__tune_nocona__");
229 Define(Defs, "__SSE2_MATH__");
230 Define(Defs, "__SSE2__");
231 Define(Defs, "__SSE_MATH__");
232 Define(Defs, "__SSE__");
233 Define(Defs, "__MMX__");
234 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000235
Chris Lattner0db667a2007-10-06 06:57:34 +0000236 Define(Defs, "__WCHAR_MAX__", "2147483647");
237 Define(Defs, "__WCHAR_TYPE__", "int");
238 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000239
240 // Float macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000241 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
242 Define(Defs, "__FLT_DIG__", "6");
243 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
244 Define(Defs, "__FLT_EVAL_METHOD__", "0");
245 Define(Defs, "__FLT_HAS_INFINITY__");
246 Define(Defs, "__FLT_HAS_QUIET_NAN__");
247 Define(Defs, "__FLT_MANT_DIG__", "24");
248 Define(Defs, "__FLT_MAX_10_EXP__", "38");
249 Define(Defs, "__FLT_MAX_EXP__", "128");
250 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
251 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
252 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
253 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
254 Define(Defs, "__FLT_RADIX__", "2");
Chris Lattner4b009652007-07-25 00:24:17 +0000255
256 // Double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000257 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
258 Define(Defs, "__DBL_DIG__", "15");
259 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
260 Define(Defs, "__DBL_HAS_INFINITY__");
261 Define(Defs, "__DBL_HAS_QUIET_NAN__");
262 Define(Defs, "__DBL_MANT_DIG__", "53");
263 Define(Defs, "__DBL_MAX_10_EXP__", "308");
264 Define(Defs, "__DBL_MAX_EXP__", "1024");
265 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
266 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
267 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
268 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
269 Define(Defs, "__DECIMAL_DIG__", "21");
Chris Lattner4b009652007-07-25 00:24:17 +0000270
271 // 80-bit Long double macros.
Chris Lattner0db667a2007-10-06 06:57:34 +0000272 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
273 Define(Defs, "__LDBL_DIG__", "18");
274 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
275 Define(Defs, "__LDBL_HAS_INFINITY__");
276 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
277 Define(Defs, "__LDBL_MANT_DIG__", "64");
278 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
279 Define(Defs, "__LDBL_MAX_EXP__", "16384");
280 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
281 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
282 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
283 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Chris Lattner4b009652007-07-25 00:24:17 +0000284}
285
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000286static const char* getI386VAListDeclaration() {
287 return "typedef char* __builtin_va_list;";
288}
289
290static const char* getX86_64VAListDeclaration() {
291 return
292 "typedef struct __va_list_tag {"
293 " unsigned gp_offset;"
294 " unsigned fp_offset;"
295 " void* overflow_arg_area;"
296 " void* reg_save_area;"
297 "} __builtin_va_list[1];";
298}
299
300static const char* getPPCVAListDeclaration() {
301 return
302 "typedef struct __va_list_tag {"
303 " unsigned char gpr;"
304 " unsigned char fpr;"
305 " unsigned short reserved;"
306 " void* overflow_arg_area;"
307 " void* reg_save_area;"
308 "} __builtin_va_list[1];";
309}
310
311
Chris Lattner4b009652007-07-25 00:24:17 +0000312/// PPC builtin info.
313namespace PPC {
314 enum {
315 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
316#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
317#include "PPCBuiltins.def"
318 LastTSBuiltin
319 };
320
321 static const Builtin::Info BuiltinInfo[] = {
322#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
323#include "PPCBuiltins.def"
324 };
325
326 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
327 Records = BuiltinInfo;
328 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
329 }
330} // End namespace PPC
331
332
333/// X86 builtin info.
334namespace X86 {
335 enum {
336 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
337#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
338#include "X86Builtins.def"
339 LastTSBuiltin
340 };
341
342 static const Builtin::Info BuiltinInfo[] = {
343#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
344#include "X86Builtins.def"
345 };
346
347 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
348 Records = BuiltinInfo;
349 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
350 }
351} // End namespace X86
352
353//===----------------------------------------------------------------------===//
354// Specific target implementations.
355//===----------------------------------------------------------------------===//
356
357
358namespace {
359class DarwinPPCTargetInfo : public DarwinTargetInfo {
360public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000361 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000362 DarwinTargetInfo::getTargetDefines(Defines);
363 getPowerPCDefines(Defines, false);
364 }
365 virtual void getTargetBuiltins(const Builtin::Info *&Records,
366 unsigned &NumRecords) const {
367 PPC::getBuiltins(Records, NumRecords);
368 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000369 virtual const char *getVAListDeclaration() const {
370 return getPPCVAListDeclaration();
371 }
Chris Lattner4b009652007-07-25 00:24:17 +0000372};
373} // end anonymous namespace.
374
375namespace {
376class DarwinPPC64TargetInfo : public DarwinTargetInfo {
377public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000378 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000379 DarwinTargetInfo::getTargetDefines(Defines);
380 getPowerPCDefines(Defines, true);
381 }
382 virtual void getTargetBuiltins(const Builtin::Info *&Records,
383 unsigned &NumRecords) const {
384 PPC::getBuiltins(Records, NumRecords);
385 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000386 virtual const char *getVAListDeclaration() const {
387 return getPPCVAListDeclaration();
388 }
Chris Lattner4b009652007-07-25 00:24:17 +0000389};
390} // end anonymous namespace.
391
392namespace {
393class DarwinI386TargetInfo : public DarwinTargetInfo {
394public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000395 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000396 DarwinTargetInfo::getTargetDefines(Defines);
397 getX86Defines(Defines, false);
398 }
399 virtual void getTargetBuiltins(const Builtin::Info *&Records,
400 unsigned &NumRecords) const {
401 X86::getBuiltins(Records, NumRecords);
402 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000403
404 virtual const char *getVAListDeclaration() const {
405 return getI386VAListDeclaration();
406 }
Chris Lattner4b009652007-07-25 00:24:17 +0000407};
408} // end anonymous namespace.
409
410namespace {
411class DarwinX86_64TargetInfo : public DarwinTargetInfo {
412public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000413 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000414 DarwinTargetInfo::getTargetDefines(Defines);
415 getX86Defines(Defines, true);
416 }
417 virtual void getTargetBuiltins(const Builtin::Info *&Records,
418 unsigned &NumRecords) const {
419 X86::getBuiltins(Records, NumRecords);
420 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000421 virtual const char *getVAListDeclaration() const {
422 return getX86_64VAListDeclaration();
423 }
Chris Lattner4b009652007-07-25 00:24:17 +0000424};
425} // end anonymous namespace.
426
427namespace {
428class LinuxTargetInfo : public DarwinTargetInfo {
429public:
430 LinuxTargetInfo() {
431 // Note: I have no idea if this is right, just for testing.
432 WCharWidth = 16;
433 WCharAlign = 16;
434 }
435
Chris Lattner0db667a2007-10-06 06:57:34 +0000436 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000437 // TODO: linux-specific stuff.
438 getX86Defines(Defines, false);
439 }
440 virtual void getTargetBuiltins(const Builtin::Info *&Records,
441 unsigned &NumRecords) const {
442 X86::getBuiltins(Records, NumRecords);
443 }
Anders Carlsson8b58e8a2007-10-13 00:45:48 +0000444 virtual const char *getVAListDeclaration() const {
445 return getI386VAListDeclaration();
446 }
Chris Lattner4b009652007-07-25 00:24:17 +0000447};
448} // end anonymous namespace.
449
450
451//===----------------------------------------------------------------------===//
452// Driver code
453//===----------------------------------------------------------------------===//
454
455/// CreateTarget - Create the TargetInfoImpl object for the specified target
456/// enum value.
457static TargetInfoImpl *CreateTarget(SupportedTargets T) {
458 switch (T) {
459 default: assert(0 && "Unknown target!");
460 case target_ppc: return new DarwinPPCTargetInfo();
461 case target_ppc64: return new DarwinPPC64TargetInfo();
462 case target_i386: return new DarwinI386TargetInfo();
463 case target_x86_64: return new DarwinX86_64TargetInfo();
464 case target_linux_i386: return new LinuxTargetInfo();
465 }
466}
467
468/// CreateTargetInfo - Return the set of target info objects as specified by
469/// the -arch command line option.
470TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
471 // If the user didn't specify at least one architecture, auto-sense the
472 // current host. TODO: This is a hack. :)
473 if (Archs.empty()) {
474#ifndef __APPLE__
475 // Assume non-apple = i386 for now.
476 Archs.push_back(target_i386);
477#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
478 defined(__ppc64__)
479 Archs.push_back(target_ppc64);
480#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
481 Archs.push_back(target_ppc);
482#elif defined(__x86_64__)
483 Archs.push_back(target_x86_64);
484#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
485 Archs.push_back(target_i386);
486#else
487 // Don't know what this is!
488 return 0;
489#endif
490 }
491
492 // Create the primary target and target info.
493 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
494
495 // Add all secondary targets.
496 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
497 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
498 return TI;
499}