blob: e7e6a051dacafd2043a2578647ec534ca996c067 [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"
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 Lattnerd15fa822007-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
Reid Spencer5f016e22007-07-11 17:01:13 +000054namespace {
55class DarwinTargetInfo : public TargetInfoImpl {
56public:
Chris Lattnerd15fa822007-10-06 06:57:34 +000057 virtual void getTargetDefines(std::vector<char> &Defs) const {
58 Define(Defs, "__APPLE__");
59 Define(Defs, "__MACH__");
Reid Spencer5f016e22007-07-11 17:01:13 +000060
61 if (1) {// -fobjc-gc controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000062 Define(Defs, "__weak", "");
63 Define(Defs, "__strong", "");
Reid Spencer5f016e22007-07-11 17:01:13 +000064 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +000065 Define(Defs, "__weak", "__attribute__((objc_gc(weak)))");
66 Define(Defs, "__strong", "__attribute__((objc_gc(strong)))");
67 Define(Defs, "__OBJC_GC__");
Reid Spencer5f016e22007-07-11 17:01:13 +000068 }
69
70 // darwin_constant_cfstrings controls this.
Chris Lattnerd15fa822007-10-06 06:57:34 +000071 Define(Defs, "__CONSTANT_CFSTRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000072
73 if (0) // darwin_pascal_strings
Chris Lattnerd15fa822007-10-06 06:57:34 +000074 Define(Defs, "__PASCAL_STRINGS__");
Reid Spencer5f016e22007-07-11 17:01:13 +000075 }
76
77};
78} // end anonymous namespace.
79
80
81/// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are
82/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +000083static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +000084 // Target identification.
Chris Lattnerd15fa822007-10-06 06:57:34 +000085 Define(Defs, "__ppc__");
86 Define(Defs, "_ARCH_PPC");
87 Define(Defs, "__POWERPC__");
Reid Spencer5f016e22007-07-11 17:01:13 +000088 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +000089 Define(Defs, "_ARCH_PPC64");
90 Define(Defs, "_LP64");
91 Define(Defs, "__LP64__");
92 Define(Defs, "__ppc64__");
Reid Spencer5f016e22007-07-11 17:01:13 +000093 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +000094 Define(Defs, "__ppc__");
Reid Spencer5f016e22007-07-11 17:01:13 +000095 }
96
97 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +000098 Define(Defs, "_BIG_ENDIAN");
99 Define(Defs, "__BIG_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000100
101 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000102 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
103 Define(Defs, "__INTMAX_TYPE__", "long int");
104 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
105 Define(Defs, "__PTRDIFF_TYPE__", "long int");
106 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000107 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000108 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
109 Define(Defs, "__INTMAX_TYPE__", "long long int");
110 Define(Defs, "__LONG_MAX__", "2147483647L");
111 Define(Defs, "__PTRDIFF_TYPE__", "int");
112 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000113 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000114 Define(Defs, "__INT_MAX__", "2147483647");
115 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
116 Define(Defs, "__CHAR_BIT__", "8");
117 Define(Defs, "__SCHAR_MAX__", "127");
118 Define(Defs, "__SHRT_MAX__", "32767");
119 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000120
121 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000122 Define(Defs, "__USER_LABEL_PREFIX__", "_");
123 Define(Defs, "__NATURAL_ALIGNMENT__");
124 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000125
Chris Lattnerd15fa822007-10-06 06:57:34 +0000126 Define(Defs, "__WCHAR_MAX__", "2147483647");
127 Define(Defs, "__WCHAR_TYPE__", "int");
128 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000129
130 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000131 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
132 Define(Defs, "__FLT_DIG__", "6");
133 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
134 Define(Defs, "__FLT_EVAL_METHOD__", "0");
135 Define(Defs, "__FLT_HAS_INFINITY__");
136 Define(Defs, "__FLT_HAS_QUIET_NAN__");
137 Define(Defs, "__FLT_MANT_DIG__", "24");
138 Define(Defs, "__FLT_MAX_10_EXP__", "38");
139 Define(Defs, "__FLT_MAX_EXP__", "128");
140 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
141 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
142 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
143 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
144 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000145
146 // double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000147 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
148 Define(Defs, "__DBL_DIG__", "15");
149 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
150 Define(Defs, "__DBL_HAS_INFINITY__");
151 Define(Defs, "__DBL_HAS_QUIET_NAN__");
152 Define(Defs, "__DBL_MANT_DIG__", "53");
153 Define(Defs, "__DBL_MAX_10_EXP__", "308");
154 Define(Defs, "__DBL_MAX_EXP__", "1024");
155 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
156 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
157 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
158 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
159 Define(Defs, "__DECIMAL_DIG__", "33");
Reid Spencer5f016e22007-07-11 17:01:13 +0000160
161 // 128-bit long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000162 Define(Defs, "__LDBL_DENORM_MIN__",
163 "4.94065645841246544176568792868221e-324L");
164 Define(Defs, "__LDBL_DIG__", "31");
165 Define(Defs, "__LDBL_EPSILON__",
166 "4.94065645841246544176568792868221e-324L");
167 Define(Defs, "__LDBL_HAS_INFINITY__");
168 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
169 Define(Defs, "__LDBL_MANT_DIG__", "106");
170 Define(Defs, "__LDBL_MAX_10_EXP__", "308");
171 Define(Defs, "__LDBL_MAX_EXP__", "1024");
172 Define(Defs, "__LDBL_MAX__",
173 "1.79769313486231580793728971405301e+308L");
174 Define(Defs, "__LDBL_MIN_10_EXP__", "(-291)");
175 Define(Defs, "__LDBL_MIN_EXP__", "(-968)");
176 Define(Defs, "__LDBL_MIN__",
177 "2.00416836000897277799610805135016e-292L");
178 Define(Defs, "__LONG_DOUBLE_128__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000179}
180
181/// getX86Defines - Return a set of the X86-specific #defines that are
182/// not tied to a specific subtarget.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000183static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Reid Spencer5f016e22007-07-11 17:01:13 +0000184 // Target identification.
185 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000186 Define(Defs, "_LP64");
187 Define(Defs, "__LP64__");
188 Define(Defs, "__amd64__");
189 Define(Defs, "__amd64");
190 Define(Defs, "__x86_64");
191 Define(Defs, "__x86_64__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000192 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000193 Define(Defs, "__i386__");
194 Define(Defs, "__i386");
195 Define(Defs, "i386");
Reid Spencer5f016e22007-07-11 17:01:13 +0000196 }
197
198 // Target properties.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000199 Define(Defs, "__LITTLE_ENDIAN__");
Reid Spencer5f016e22007-07-11 17:01:13 +0000200
201 if (is64Bit) {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000202 Define(Defs, "__INTMAX_MAX__", "9223372036854775807L");
203 Define(Defs, "__INTMAX_TYPE__", "long int");
204 Define(Defs, "__LONG_MAX__", "9223372036854775807L");
205 Define(Defs, "__PTRDIFF_TYPE__", "long int");
206 Define(Defs, "__UINTMAX_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000207 } else {
Chris Lattnerd15fa822007-10-06 06:57:34 +0000208 Define(Defs, "__INTMAX_MAX__", "9223372036854775807LL");
209 Define(Defs, "__INTMAX_TYPE__", "long long int");
210 Define(Defs, "__LONG_MAX__", "2147483647L");
211 Define(Defs, "__PTRDIFF_TYPE__", "int");
212 Define(Defs, "__UINTMAX_TYPE__", "long long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000213 }
Chris Lattnerd15fa822007-10-06 06:57:34 +0000214 Define(Defs, "__CHAR_BIT__", "8");
215 Define(Defs, "__INT_MAX__", "2147483647");
216 Define(Defs, "__LONG_LONG_MAX__", "9223372036854775807LL");
217 Define(Defs, "__SCHAR_MAX__", "127");
218 Define(Defs, "__SHRT_MAX__", "32767");
219 Define(Defs, "__SIZE_TYPE__", "long unsigned int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000220
221 // Subtarget options.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000222 Define(Defs, "__nocona");
223 Define(Defs, "__nocona__");
224 Define(Defs, "__tune_nocona__");
225 Define(Defs, "__SSE2_MATH__");
226 Define(Defs, "__SSE2__");
227 Define(Defs, "__SSE_MATH__");
228 Define(Defs, "__SSE__");
229 Define(Defs, "__MMX__");
230 Define(Defs, "__REGISTER_PREFIX__", "");
Reid Spencer5f016e22007-07-11 17:01:13 +0000231
Chris Lattnerd15fa822007-10-06 06:57:34 +0000232 Define(Defs, "__WCHAR_MAX__", "2147483647");
233 Define(Defs, "__WCHAR_TYPE__", "int");
234 Define(Defs, "__WINT_TYPE__", "int");
Reid Spencer5f016e22007-07-11 17:01:13 +0000235
236 // Float macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000237 Define(Defs, "__FLT_DENORM_MIN__", "1.40129846e-45F");
238 Define(Defs, "__FLT_DIG__", "6");
239 Define(Defs, "__FLT_EPSILON__", "1.19209290e-7F");
240 Define(Defs, "__FLT_EVAL_METHOD__", "0");
241 Define(Defs, "__FLT_HAS_INFINITY__");
242 Define(Defs, "__FLT_HAS_QUIET_NAN__");
243 Define(Defs, "__FLT_MANT_DIG__", "24");
244 Define(Defs, "__FLT_MAX_10_EXP__", "38");
245 Define(Defs, "__FLT_MAX_EXP__", "128");
246 Define(Defs, "__FLT_MAX__", "3.40282347e+38F");
247 Define(Defs, "__FLT_MIN_10_EXP__", "(-37)");
248 Define(Defs, "__FLT_MIN_EXP__", "(-125)");
249 Define(Defs, "__FLT_MIN__", "1.17549435e-38F");
250 Define(Defs, "__FLT_RADIX__", "2");
Reid Spencer5f016e22007-07-11 17:01:13 +0000251
252 // Double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000253 Define(Defs, "__DBL_DENORM_MIN__", "4.9406564584124654e-324");
254 Define(Defs, "__DBL_DIG__", "15");
255 Define(Defs, "__DBL_EPSILON__", "2.2204460492503131e-16");
256 Define(Defs, "__DBL_HAS_INFINITY__");
257 Define(Defs, "__DBL_HAS_QUIET_NAN__");
258 Define(Defs, "__DBL_MANT_DIG__", "53");
259 Define(Defs, "__DBL_MAX_10_EXP__", "308");
260 Define(Defs, "__DBL_MAX_EXP__", "1024");
261 Define(Defs, "__DBL_MAX__", "1.7976931348623157e+308");
262 Define(Defs, "__DBL_MIN_10_EXP__", "(-307)");
263 Define(Defs, "__DBL_MIN_EXP__", "(-1021)");
264 Define(Defs, "__DBL_MIN__", "2.2250738585072014e-308");
265 Define(Defs, "__DECIMAL_DIG__", "21");
Reid Spencer5f016e22007-07-11 17:01:13 +0000266
267 // 80-bit Long double macros.
Chris Lattnerd15fa822007-10-06 06:57:34 +0000268 Define(Defs, "__LDBL_DENORM_MIN__", "3.64519953188247460253e-4951L");
269 Define(Defs, "__LDBL_DIG__", "18");
270 Define(Defs, "__LDBL_EPSILON__", "1.08420217248550443401e-19L");
271 Define(Defs, "__LDBL_HAS_INFINITY__");
272 Define(Defs, "__LDBL_HAS_QUIET_NAN__");
273 Define(Defs, "__LDBL_MANT_DIG__", "64");
274 Define(Defs, "__LDBL_MAX_10_EXP__", "4932");
275 Define(Defs, "__LDBL_MAX_EXP__", "16384");
276 Define(Defs, "__LDBL_MAX__", "1.18973149535723176502e+4932L");
277 Define(Defs, "__LDBL_MIN_10_EXP__", "(-4931)");
278 Define(Defs, "__LDBL_MIN_EXP__", "(-16381)");
279 Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L");
Reid Spencer5f016e22007-07-11 17:01:13 +0000280}
281
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000282static const char* getI386VAListDeclaration() {
283 return "typedef char* __builtin_va_list;";
284}
285
286static const char* getX86_64VAListDeclaration() {
287 return
288 "typedef struct __va_list_tag {"
289 " unsigned gp_offset;"
290 " unsigned fp_offset;"
291 " void* overflow_arg_area;"
292 " void* reg_save_area;"
293 "} __builtin_va_list[1];";
294}
295
296static const char* getPPCVAListDeclaration() {
297 return
298 "typedef struct __va_list_tag {"
299 " unsigned char gpr;"
300 " unsigned char fpr;"
301 " unsigned short reserved;"
302 " void* overflow_arg_area;"
303 " void* reg_save_area;"
304 "} __builtin_va_list[1];";
305}
306
307
Reid Spencer5f016e22007-07-11 17:01:13 +0000308/// PPC builtin info.
309namespace PPC {
310 enum {
311 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
312#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
313#include "PPCBuiltins.def"
314 LastTSBuiltin
315 };
316
317 static const Builtin::Info BuiltinInfo[] = {
318#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
319#include "PPCBuiltins.def"
320 };
321
322 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
323 Records = BuiltinInfo;
324 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
325 }
326} // End namespace PPC
327
328
329/// X86 builtin info.
330namespace X86 {
331 enum {
332 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
333#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
334#include "X86Builtins.def"
335 LastTSBuiltin
336 };
337
338 static const Builtin::Info BuiltinInfo[] = {
339#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
340#include "X86Builtins.def"
341 };
342
343 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
344 Records = BuiltinInfo;
345 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
346 }
347} // End namespace X86
348
349//===----------------------------------------------------------------------===//
350// Specific target implementations.
351//===----------------------------------------------------------------------===//
352
353
354namespace {
355class DarwinPPCTargetInfo : public DarwinTargetInfo {
356public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000357 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000358 DarwinTargetInfo::getTargetDefines(Defines);
359 getPowerPCDefines(Defines, false);
360 }
361 virtual void getTargetBuiltins(const Builtin::Info *&Records,
362 unsigned &NumRecords) const {
363 PPC::getBuiltins(Records, NumRecords);
364 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000365 virtual const char *getVAListDeclaration() const {
366 return getPPCVAListDeclaration();
367 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000368};
369} // end anonymous namespace.
370
371namespace {
372class DarwinPPC64TargetInfo : public DarwinTargetInfo {
373public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000374 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000375 DarwinTargetInfo::getTargetDefines(Defines);
376 getPowerPCDefines(Defines, true);
377 }
378 virtual void getTargetBuiltins(const Builtin::Info *&Records,
379 unsigned &NumRecords) const {
380 PPC::getBuiltins(Records, NumRecords);
381 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000382 virtual const char *getVAListDeclaration() const {
383 return getPPCVAListDeclaration();
384 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000385};
386} // end anonymous namespace.
387
388namespace {
389class DarwinI386TargetInfo : public DarwinTargetInfo {
390public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000391 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000392 DarwinTargetInfo::getTargetDefines(Defines);
393 getX86Defines(Defines, false);
394 }
395 virtual void getTargetBuiltins(const Builtin::Info *&Records,
396 unsigned &NumRecords) const {
397 X86::getBuiltins(Records, NumRecords);
398 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000399
400 virtual const char *getVAListDeclaration() const {
401 return getI386VAListDeclaration();
402 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000403};
404} // end anonymous namespace.
405
406namespace {
407class DarwinX86_64TargetInfo : public DarwinTargetInfo {
408public:
Chris Lattnerd15fa822007-10-06 06:57:34 +0000409 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000410 DarwinTargetInfo::getTargetDefines(Defines);
411 getX86Defines(Defines, true);
412 }
413 virtual void getTargetBuiltins(const Builtin::Info *&Records,
414 unsigned &NumRecords) const {
415 X86::getBuiltins(Records, NumRecords);
416 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000417 virtual const char *getVAListDeclaration() const {
418 return getX86_64VAListDeclaration();
419 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000420};
421} // end anonymous namespace.
422
423namespace {
424class LinuxTargetInfo : public DarwinTargetInfo {
425public:
426 LinuxTargetInfo() {
427 // Note: I have no idea if this is right, just for testing.
428 WCharWidth = 16;
Chris Lattnerd2d2a112007-07-14 01:29:45 +0000429 WCharAlign = 16;
Reid Spencer5f016e22007-07-11 17:01:13 +0000430 }
431
Chris Lattnerd15fa822007-10-06 06:57:34 +0000432 virtual void getTargetDefines(std::vector<char> &Defines) const {
Reid Spencer5f016e22007-07-11 17:01:13 +0000433 // TODO: linux-specific stuff.
434 getX86Defines(Defines, false);
435 }
436 virtual void getTargetBuiltins(const Builtin::Info *&Records,
437 unsigned &NumRecords) const {
438 X86::getBuiltins(Records, NumRecords);
439 }
Anders Carlssonfb5e5ba2007-10-13 00:45:48 +0000440 virtual const char *getVAListDeclaration() const {
441 return getI386VAListDeclaration();
442 }
Reid Spencer5f016e22007-07-11 17:01:13 +0000443};
444} // end anonymous namespace.
445
446
447//===----------------------------------------------------------------------===//
448// Driver code
449//===----------------------------------------------------------------------===//
450
451/// CreateTarget - Create the TargetInfoImpl object for the specified target
452/// enum value.
453static TargetInfoImpl *CreateTarget(SupportedTargets T) {
454 switch (T) {
455 default: assert(0 && "Unknown target!");
456 case target_ppc: return new DarwinPPCTargetInfo();
457 case target_ppc64: return new DarwinPPC64TargetInfo();
458 case target_i386: return new DarwinI386TargetInfo();
459 case target_x86_64: return new DarwinX86_64TargetInfo();
460 case target_linux_i386: return new LinuxTargetInfo();
461 }
462}
463
464/// CreateTargetInfo - Return the set of target info objects as specified by
465/// the -arch command line option.
466TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
467 // If the user didn't specify at least one architecture, auto-sense the
468 // current host. TODO: This is a hack. :)
469 if (Archs.empty()) {
470#ifndef __APPLE__
Chris Lattnerc3f89372007-07-15 01:37:36 +0000471 // Assume non-apple = i386 for now.
472 Archs.push_back(target_i386);
Reid Spencer5f016e22007-07-11 17:01:13 +0000473#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
474 defined(__ppc64__)
475 Archs.push_back(target_ppc64);
476#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
477 Archs.push_back(target_ppc);
478#elif defined(__x86_64__)
479 Archs.push_back(target_x86_64);
480#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
481 Archs.push_back(target_i386);
482#else
483 // Don't know what this is!
484 return 0;
485#endif
486 }
487
488 // Create the primary target and target info.
489 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
490
491 // Add all secondary targets.
492 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
493 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
494 return TI;
495}