blob: bf05c645c9fdb08949c385467831c6ae828370a5 [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 {
58 Define(Defs, "__APPLE__");
59 Define(Defs, "__MACH__");
Chris Lattner4b009652007-07-25 00:24:17 +000060
61 if (1) {// -fobjc-gc controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000062 Define(Defs, "__weak", "");
63 Define(Defs, "__strong", "");
Chris Lattner4b009652007-07-25 00:24:17 +000064 } else {
Chris Lattner0db667a2007-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__");
Chris Lattner4b009652007-07-25 00:24:17 +000068 }
69
70 // darwin_constant_cfstrings controls this.
Chris Lattner0db667a2007-10-06 06:57:34 +000071 Define(Defs, "__CONSTANT_CFSTRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +000072
73 if (0) // darwin_pascal_strings
Chris Lattner0db667a2007-10-06 06:57:34 +000074 Define(Defs, "__PASCAL_STRINGS__");
Chris Lattner4b009652007-07-25 00:24:17 +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 Lattner0db667a2007-10-06 06:57:34 +000083static void getPowerPCDefines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +000084 // Target identification.
Chris Lattner0db667a2007-10-06 06:57:34 +000085 Define(Defs, "__ppc__");
86 Define(Defs, "_ARCH_PPC");
87 Define(Defs, "__POWERPC__");
Chris Lattner4b009652007-07-25 00:24:17 +000088 if (is64Bit) {
Chris Lattner0db667a2007-10-06 06:57:34 +000089 Define(Defs, "_ARCH_PPC64");
90 Define(Defs, "_LP64");
91 Define(Defs, "__LP64__");
92 Define(Defs, "__ppc64__");
Chris Lattner4b009652007-07-25 00:24:17 +000093 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +000094 Define(Defs, "__ppc__");
Chris Lattner4b009652007-07-25 00:24:17 +000095 }
96
97 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +000098 Define(Defs, "_BIG_ENDIAN");
99 Define(Defs, "__BIG_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000100
101 if (is64Bit) {
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000107 } else {
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000113 }
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000120
121 // Subtarget options.
Chris Lattner0db667a2007-10-06 06:57:34 +0000122 Define(Defs, "__USER_LABEL_PREFIX__", "_");
123 Define(Defs, "__NATURAL_ALIGNMENT__");
124 Define(Defs, "__REGISTER_PREFIX__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000125
Chris Lattner0db667a2007-10-06 06:57:34 +0000126 Define(Defs, "__WCHAR_MAX__", "2147483647");
127 Define(Defs, "__WCHAR_TYPE__", "int");
128 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000129
130 // Float macros.
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000145
146 // double macros.
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000160
161 // 128-bit long double macros.
Chris Lattner0db667a2007-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__");
Chris Lattner4b009652007-07-25 00:24:17 +0000179}
180
181/// getX86Defines - Return a set of the X86-specific #defines that are
182/// not tied to a specific subtarget.
Chris Lattner0db667a2007-10-06 06:57:34 +0000183static void getX86Defines(std::vector<char> &Defs, bool is64Bit) {
Chris Lattner4b009652007-07-25 00:24:17 +0000184 // Target identification.
185 if (is64Bit) {
Chris Lattner0db667a2007-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__");
Chris Lattner4b009652007-07-25 00:24:17 +0000192 } else {
Chris Lattner0db667a2007-10-06 06:57:34 +0000193 Define(Defs, "__i386__");
194 Define(Defs, "__i386");
195 Define(Defs, "i386");
Chris Lattner4b009652007-07-25 00:24:17 +0000196 }
197
198 // Target properties.
Chris Lattner0db667a2007-10-06 06:57:34 +0000199 Define(Defs, "__LITTLE_ENDIAN__");
Chris Lattner4b009652007-07-25 00:24:17 +0000200
201 if (is64Bit) {
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000207 } else {
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000213 }
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000220
221 // Subtarget options.
Chris Lattner0db667a2007-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__", "");
Chris Lattner4b009652007-07-25 00:24:17 +0000231
Chris Lattner0db667a2007-10-06 06:57:34 +0000232 Define(Defs, "__WCHAR_MAX__", "2147483647");
233 Define(Defs, "__WCHAR_TYPE__", "int");
234 Define(Defs, "__WINT_TYPE__", "int");
Chris Lattner4b009652007-07-25 00:24:17 +0000235
236 // Float macros.
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000251
252 // Double macros.
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000266
267 // 80-bit Long double macros.
Chris Lattner0db667a2007-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");
Chris Lattner4b009652007-07-25 00:24:17 +0000280}
281
282/// PPC builtin info.
283namespace PPC {
284 enum {
285 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
286#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
287#include "PPCBuiltins.def"
288 LastTSBuiltin
289 };
290
291 static const Builtin::Info BuiltinInfo[] = {
292#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
293#include "PPCBuiltins.def"
294 };
295
296 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
297 Records = BuiltinInfo;
298 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
299 }
300} // End namespace PPC
301
302
303/// X86 builtin info.
304namespace X86 {
305 enum {
306 LastTIBuiltin = Builtin::FirstTSBuiltin-1,
307#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
308#include "X86Builtins.def"
309 LastTSBuiltin
310 };
311
312 static const Builtin::Info BuiltinInfo[] = {
313#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS },
314#include "X86Builtins.def"
315 };
316
317 static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) {
318 Records = BuiltinInfo;
319 NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin;
320 }
321} // End namespace X86
322
323//===----------------------------------------------------------------------===//
324// Specific target implementations.
325//===----------------------------------------------------------------------===//
326
327
328namespace {
329class DarwinPPCTargetInfo : public DarwinTargetInfo {
330public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000331 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000332 DarwinTargetInfo::getTargetDefines(Defines);
333 getPowerPCDefines(Defines, false);
334 }
335 virtual void getTargetBuiltins(const Builtin::Info *&Records,
336 unsigned &NumRecords) const {
337 PPC::getBuiltins(Records, NumRecords);
338 }
339};
340} // end anonymous namespace.
341
342namespace {
343class DarwinPPC64TargetInfo : public DarwinTargetInfo {
344public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000345 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000346 DarwinTargetInfo::getTargetDefines(Defines);
347 getPowerPCDefines(Defines, true);
348 }
349 virtual void getTargetBuiltins(const Builtin::Info *&Records,
350 unsigned &NumRecords) const {
351 PPC::getBuiltins(Records, NumRecords);
352 }
353};
354} // end anonymous namespace.
355
356namespace {
357class DarwinI386TargetInfo : public DarwinTargetInfo {
358public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000359 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000360 DarwinTargetInfo::getTargetDefines(Defines);
361 getX86Defines(Defines, false);
362 }
363 virtual void getTargetBuiltins(const Builtin::Info *&Records,
364 unsigned &NumRecords) const {
365 X86::getBuiltins(Records, NumRecords);
366 }
367};
368} // end anonymous namespace.
369
370namespace {
371class DarwinX86_64TargetInfo : public DarwinTargetInfo {
372public:
Chris Lattner0db667a2007-10-06 06:57:34 +0000373 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000374 DarwinTargetInfo::getTargetDefines(Defines);
375 getX86Defines(Defines, true);
376 }
377 virtual void getTargetBuiltins(const Builtin::Info *&Records,
378 unsigned &NumRecords) const {
379 X86::getBuiltins(Records, NumRecords);
380 }
381};
382} // end anonymous namespace.
383
384namespace {
385class LinuxTargetInfo : public DarwinTargetInfo {
386public:
387 LinuxTargetInfo() {
388 // Note: I have no idea if this is right, just for testing.
389 WCharWidth = 16;
390 WCharAlign = 16;
391 }
392
Chris Lattner0db667a2007-10-06 06:57:34 +0000393 virtual void getTargetDefines(std::vector<char> &Defines) const {
Chris Lattner4b009652007-07-25 00:24:17 +0000394 // TODO: linux-specific stuff.
395 getX86Defines(Defines, false);
396 }
397 virtual void getTargetBuiltins(const Builtin::Info *&Records,
398 unsigned &NumRecords) const {
399 X86::getBuiltins(Records, NumRecords);
400 }
401};
402} // end anonymous namespace.
403
404
405//===----------------------------------------------------------------------===//
406// Driver code
407//===----------------------------------------------------------------------===//
408
409/// CreateTarget - Create the TargetInfoImpl object for the specified target
410/// enum value.
411static TargetInfoImpl *CreateTarget(SupportedTargets T) {
412 switch (T) {
413 default: assert(0 && "Unknown target!");
414 case target_ppc: return new DarwinPPCTargetInfo();
415 case target_ppc64: return new DarwinPPC64TargetInfo();
416 case target_i386: return new DarwinI386TargetInfo();
417 case target_x86_64: return new DarwinX86_64TargetInfo();
418 case target_linux_i386: return new LinuxTargetInfo();
419 }
420}
421
422/// CreateTargetInfo - Return the set of target info objects as specified by
423/// the -arch command line option.
424TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) {
425 // If the user didn't specify at least one architecture, auto-sense the
426 // current host. TODO: This is a hack. :)
427 if (Archs.empty()) {
428#ifndef __APPLE__
429 // Assume non-apple = i386 for now.
430 Archs.push_back(target_i386);
431#elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \
432 defined(__ppc64__)
433 Archs.push_back(target_ppc64);
434#elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)
435 Archs.push_back(target_ppc);
436#elif defined(__x86_64__)
437 Archs.push_back(target_x86_64);
438#elif defined(__i386__) || defined(i386) || defined(_M_IX86)
439 Archs.push_back(target_i386);
440#else
441 // Don't know what this is!
442 return 0;
443#endif
444 }
445
446 // Create the primary target and target info.
447 TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags);
448
449 // Add all secondary targets.
450 for (unsigned i = 1, e = Archs.size(); i != e; ++i)
451 TI->AddSecondaryTarget(CreateTarget(Archs[i]));
452 return TI;
453}