Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 1 | //===--- 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" |
| 20 | using namespace clang; |
| 21 | |
| 22 | /// Note: a hard coded list of targets is clearly silly, these should be |
| 23 | /// dynamicly registered and loadable with "-load". |
| 24 | enum SupportedTargets { |
| 25 | target_ppc, target_ppc64, |
| 26 | target_i386, target_x86_64, |
| 27 | target_linux_i386 |
| 28 | }; |
| 29 | |
| 30 | static llvm::cl::list<SupportedTargets> |
| 31 | Archs("arch", llvm::cl::desc("Architectures to compile for"), |
| 32 | llvm::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 | |
| 43 | namespace { |
| 44 | class DarwinTargetInfo : public TargetInfoImpl { |
| 45 | public: |
| 46 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 47 | Defines.push_back("__APPLE__=1"); |
| 48 | Defines.push_back("__MACH__=1"); |
| 49 | |
| 50 | if (1) {// -fobjc-gc controls this. |
| 51 | Defines.push_back("__weak="); |
| 52 | Defines.push_back("__strong="); |
| 53 | } else { |
| 54 | Defines.push_back("__weak=__attribute__((objc_gc(weak)))"); |
| 55 | Defines.push_back("__strong=__attribute__((objc_gc(strong)))"); |
| 56 | Defines.push_back("__OBJC_GC__"); |
| 57 | } |
| 58 | |
| 59 | // darwin_constant_cfstrings controls this. |
| 60 | Defines.push_back("__CONSTANT_CFSTRINGS__=1"); |
| 61 | |
| 62 | if (0) // darwin_pascal_strings |
| 63 | Defines.push_back("__PASCAL_STRINGS__"); |
| 64 | } |
| 65 | |
| 66 | }; |
| 67 | } // end anonymous namespace. |
| 68 | |
| 69 | |
| 70 | /// getPowerPCDefines - Return a set of the PowerPC-specific #defines that are |
| 71 | /// not tied to a specific subtarget. |
| 72 | static void getPowerPCDefines(std::vector<std::string> &Defines, bool is64Bit) { |
| 73 | // Target identification. |
| 74 | Defines.push_back("__ppc__"); |
| 75 | Defines.push_back("_ARCH_PPC=1"); |
| 76 | Defines.push_back("__POWERPC__=1"); |
| 77 | if (is64Bit) { |
| 78 | Defines.push_back("_ARCH_PPC64"); |
| 79 | Defines.push_back("_LP64"); |
| 80 | Defines.push_back("__LP64__"); |
| 81 | Defines.push_back("__ppc64__"); |
| 82 | } else { |
| 83 | Defines.push_back("__ppc__=1"); |
| 84 | } |
| 85 | |
| 86 | // Target properties. |
| 87 | Defines.push_back("_BIG_ENDIAN=1"); |
| 88 | Defines.push_back("__BIG_ENDIAN__=1"); |
| 89 | |
| 90 | if (is64Bit) { |
| 91 | Defines.push_back("__INTMAX_MAX__=9223372036854775807L"); |
| 92 | Defines.push_back("__INTMAX_TYPE__=long int"); |
| 93 | Defines.push_back("__LONG_MAX__=9223372036854775807L"); |
| 94 | Defines.push_back("__PTRDIFF_TYPE__=long int"); |
| 95 | Defines.push_back("__UINTMAX_TYPE__=long unsigned int"); |
| 96 | } else { |
| 97 | Defines.push_back("__INTMAX_MAX__=9223372036854775807LL"); |
| 98 | Defines.push_back("__INTMAX_TYPE__=long long int"); |
| 99 | Defines.push_back("__LONG_MAX__=2147483647L"); |
| 100 | Defines.push_back("__PTRDIFF_TYPE__=int"); |
| 101 | Defines.push_back("__UINTMAX_TYPE__=long long unsigned int"); |
| 102 | } |
| 103 | Defines.push_back("__INT_MAX__=2147483647"); |
| 104 | Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL"); |
| 105 | Defines.push_back("__CHAR_BIT__=8"); |
| 106 | Defines.push_back("__SCHAR_MAX__=127"); |
| 107 | Defines.push_back("__SHRT_MAX__=32767"); |
| 108 | Defines.push_back("__SIZE_TYPE__=long unsigned int"); |
| 109 | |
| 110 | // Subtarget options. |
| 111 | Defines.push_back("__USER_LABEL_PREFIX__=_"); |
| 112 | Defines.push_back("__NATURAL_ALIGNMENT__=1"); |
| 113 | Defines.push_back("__REGISTER_PREFIX__="); |
| 114 | |
| 115 | Defines.push_back("__WCHAR_MAX__=2147483647"); |
| 116 | Defines.push_back("__WCHAR_TYPE__=int"); |
| 117 | Defines.push_back("__WINT_TYPE__=int"); |
| 118 | |
| 119 | // Float macros. |
| 120 | Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F"); |
| 121 | Defines.push_back("__FLT_DIG__=6"); |
| 122 | Defines.push_back("__FLT_EPSILON__=1.19209290e-7F"); |
| 123 | Defines.push_back("__FLT_EVAL_METHOD__=0"); |
| 124 | Defines.push_back("__FLT_HAS_INFINITY__=1"); |
| 125 | Defines.push_back("__FLT_HAS_QUIET_NAN__=1"); |
| 126 | Defines.push_back("__FLT_MANT_DIG__=24"); |
| 127 | Defines.push_back("__FLT_MAX_10_EXP__=38"); |
| 128 | Defines.push_back("__FLT_MAX_EXP__=128"); |
| 129 | Defines.push_back("__FLT_MAX__=3.40282347e+38F"); |
| 130 | Defines.push_back("__FLT_MIN_10_EXP__=(-37)"); |
| 131 | Defines.push_back("__FLT_MIN_EXP__=(-125)"); |
| 132 | Defines.push_back("__FLT_MIN__=1.17549435e-38F"); |
| 133 | Defines.push_back("__FLT_RADIX__=2"); |
| 134 | |
| 135 | // double macros. |
| 136 | Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324"); |
| 137 | Defines.push_back("__DBL_DIG__=15"); |
| 138 | Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16"); |
| 139 | Defines.push_back("__DBL_HAS_INFINITY__=1"); |
| 140 | Defines.push_back("__DBL_HAS_QUIET_NAN__=1"); |
| 141 | Defines.push_back("__DBL_MANT_DIG__=53"); |
| 142 | Defines.push_back("__DBL_MAX_10_EXP__=308"); |
| 143 | Defines.push_back("__DBL_MAX_EXP__=1024"); |
| 144 | Defines.push_back("__DBL_MAX__=1.7976931348623157e+308"); |
| 145 | Defines.push_back("__DBL_MIN_10_EXP__=(-307)"); |
| 146 | Defines.push_back("__DBL_MIN_EXP__=(-1021)"); |
| 147 | Defines.push_back("__DBL_MIN__=2.2250738585072014e-308"); |
| 148 | Defines.push_back("__DECIMAL_DIG__=33"); |
| 149 | |
| 150 | // 128-bit long double macros. |
| 151 | Defines.push_back("__LDBL_DENORM_MIN__=4.940656458412465441765687" |
| 152 | "92868221e-324L"); |
| 153 | Defines.push_back("__LDBL_DIG__=31"); |
| 154 | Defines.push_back("__LDBL_EPSILON__=4.9406564584124654417656879286822" |
| 155 | "1e-324L"); |
| 156 | Defines.push_back("__LDBL_HAS_INFINITY__=1"); |
| 157 | Defines.push_back("__LDBL_HAS_QUIET_NAN__=1"); |
| 158 | Defines.push_back("__LDBL_MANT_DIG__=106"); |
| 159 | Defines.push_back("__LDBL_MAX_10_EXP__=308"); |
| 160 | Defines.push_back("__LDBL_MAX_EXP__=1024"); |
| 161 | Defines.push_back("__LDBL_MAX__=1.7976931348623158079372897140" |
| 162 | "5301e+308L"); |
| 163 | Defines.push_back("__LDBL_MIN_10_EXP__=(-291)"); |
| 164 | Defines.push_back("__LDBL_MIN_EXP__=(-968)"); |
| 165 | Defines.push_back("__LDBL_MIN__=2.004168360008972777996108051350" |
| 166 | "16e-292L"); |
| 167 | Defines.push_back("__LONG_DOUBLE_128__=1"); |
| 168 | |
| 169 | } |
| 170 | |
| 171 | /// getX86Defines - Return a set of the X86-specific #defines that are |
| 172 | /// not tied to a specific subtarget. |
| 173 | static void getX86Defines(std::vector<std::string> &Defines, bool is64Bit) { |
| 174 | // Target identification. |
| 175 | if (is64Bit) { |
| 176 | Defines.push_back("_LP64"); |
| 177 | Defines.push_back("__LP64__"); |
| 178 | Defines.push_back("__amd64__"); |
| 179 | Defines.push_back("__amd64"); |
| 180 | Defines.push_back("__x86_64"); |
| 181 | Defines.push_back("__x86_64__"); |
| 182 | } else { |
| 183 | Defines.push_back("__i386__=1"); |
| 184 | Defines.push_back("__i386=1"); |
| 185 | Defines.push_back("i386=1"); |
| 186 | } |
| 187 | |
| 188 | // Target properties. |
| 189 | Defines.push_back("__LITTLE_ENDIAN__=1"); |
| 190 | |
| 191 | if (is64Bit) { |
| 192 | Defines.push_back("__INTMAX_MAX__=9223372036854775807L"); |
| 193 | Defines.push_back("__INTMAX_TYPE__=long int"); |
| 194 | Defines.push_back("__LONG_MAX__=9223372036854775807L"); |
| 195 | Defines.push_back("__PTRDIFF_TYPE__=long int"); |
| 196 | Defines.push_back("__UINTMAX_TYPE__=long unsigned int"); |
| 197 | } else { |
| 198 | Defines.push_back("__INTMAX_MAX__=9223372036854775807LL"); |
| 199 | Defines.push_back("__INTMAX_TYPE__=long long int"); |
| 200 | Defines.push_back("__LONG_MAX__=2147483647L"); |
| 201 | Defines.push_back("__PTRDIFF_TYPE__=int"); |
| 202 | Defines.push_back("__UINTMAX_TYPE__=long long unsigned int"); |
| 203 | } |
| 204 | Defines.push_back("__CHAR_BIT__=8"); |
| 205 | Defines.push_back("__INT_MAX__=2147483647"); |
| 206 | Defines.push_back("__LONG_LONG_MAX__=9223372036854775807LL"); |
| 207 | Defines.push_back("__SCHAR_MAX__=127"); |
| 208 | Defines.push_back("__SHRT_MAX__=32767"); |
| 209 | Defines.push_back("__SIZE_TYPE__=long unsigned int"); |
| 210 | |
| 211 | // Subtarget options. |
| 212 | Defines.push_back("__nocona=1"); |
| 213 | Defines.push_back("__nocona__=1"); |
| 214 | Defines.push_back("__tune_nocona__=1"); |
| 215 | Defines.push_back("__SSE2_MATH__=1"); |
| 216 | Defines.push_back("__SSE2__=1"); |
| 217 | Defines.push_back("__SSE_MATH__=1"); |
| 218 | Defines.push_back("__SSE__=1"); |
| 219 | Defines.push_back("__MMX__=1"); |
| 220 | Defines.push_back("__REGISTER_PREFIX__="); |
| 221 | |
| 222 | Defines.push_back("__WCHAR_MAX__=2147483647"); |
| 223 | Defines.push_back("__WCHAR_TYPE__=int"); |
| 224 | Defines.push_back("__WINT_TYPE__=int"); |
| 225 | |
| 226 | // Float macros. |
| 227 | Defines.push_back("__FLT_DENORM_MIN__=1.40129846e-45F"); |
| 228 | Defines.push_back("__FLT_DIG__=6"); |
| 229 | Defines.push_back("__FLT_EPSILON__=1.19209290e-7F"); |
| 230 | Defines.push_back("__FLT_EVAL_METHOD__=0"); |
| 231 | Defines.push_back("__FLT_HAS_INFINITY__=1"); |
| 232 | Defines.push_back("__FLT_HAS_QUIET_NAN__=1"); |
| 233 | Defines.push_back("__FLT_MANT_DIG__=24"); |
| 234 | Defines.push_back("__FLT_MAX_10_EXP__=38"); |
| 235 | Defines.push_back("__FLT_MAX_EXP__=128"); |
| 236 | Defines.push_back("__FLT_MAX__=3.40282347e+38F"); |
| 237 | Defines.push_back("__FLT_MIN_10_EXP__=(-37)"); |
| 238 | Defines.push_back("__FLT_MIN_EXP__=(-125)"); |
| 239 | Defines.push_back("__FLT_MIN__=1.17549435e-38F"); |
| 240 | Defines.push_back("__FLT_RADIX__=2"); |
| 241 | |
| 242 | // Double macros. |
| 243 | Defines.push_back("__DBL_DENORM_MIN__=4.9406564584124654e-324"); |
| 244 | Defines.push_back("__DBL_DIG__=15"); |
| 245 | Defines.push_back("__DBL_EPSILON__=2.2204460492503131e-16"); |
| 246 | Defines.push_back("__DBL_HAS_INFINITY__=1"); |
| 247 | Defines.push_back("__DBL_HAS_QUIET_NAN__=1"); |
| 248 | Defines.push_back("__DBL_MANT_DIG__=53"); |
| 249 | Defines.push_back("__DBL_MAX_10_EXP__=308"); |
| 250 | Defines.push_back("__DBL_MAX_EXP__=1024"); |
| 251 | Defines.push_back("__DBL_MAX__=1.7976931348623157e+308"); |
| 252 | Defines.push_back("__DBL_MIN_10_EXP__=(-307)"); |
| 253 | Defines.push_back("__DBL_MIN_EXP__=(-1021)"); |
| 254 | Defines.push_back("__DBL_MIN__=2.2250738585072014e-308"); |
| 255 | Defines.push_back("__DECIMAL_DIG__=21"); |
| 256 | |
| 257 | // 80-bit Long double macros. |
| 258 | Defines.push_back("__LDBL_DENORM_MIN__=3.64519953188247460253e-4951L"); |
| 259 | Defines.push_back("__LDBL_DIG__=18"); |
| 260 | Defines.push_back("__LDBL_EPSILON__=1.08420217248550443401e-19L"); |
| 261 | Defines.push_back("__LDBL_HAS_INFINITY__=1"); |
| 262 | Defines.push_back("__LDBL_HAS_QUIET_NAN__=1"); |
| 263 | Defines.push_back("__LDBL_MANT_DIG__=64"); |
| 264 | Defines.push_back("__LDBL_MAX_10_EXP__=4932"); |
| 265 | Defines.push_back("__LDBL_MAX_EXP__=16384"); |
| 266 | Defines.push_back("__LDBL_MAX__=1.18973149535723176502e+4932L"); |
| 267 | Defines.push_back("__LDBL_MIN_10_EXP__=(-4931)"); |
| 268 | Defines.push_back("__LDBL_MIN_EXP__=(-16381)"); |
| 269 | Defines.push_back("__LDBL_MIN__=3.36210314311209350626e-4932L"); |
| 270 | |
| 271 | } |
| 272 | |
| 273 | /// PPC builtin info. |
| 274 | namespace PPC { |
| 275 | enum { |
| 276 | LastTIBuiltin = Builtin::FirstTSBuiltin-1, |
| 277 | #define BUILTIN(ID, TYPE, ATTRS) BI##ID, |
| 278 | #include "PPCBuiltins.def" |
| 279 | LastTSBuiltin |
| 280 | }; |
| 281 | |
| 282 | static const Builtin::Info BuiltinInfo[] = { |
| 283 | #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS }, |
| 284 | #include "PPCBuiltins.def" |
| 285 | }; |
| 286 | |
| 287 | static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) { |
| 288 | Records = BuiltinInfo; |
| 289 | NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin; |
| 290 | } |
| 291 | } // End namespace PPC |
| 292 | |
| 293 | |
| 294 | /// X86 builtin info. |
| 295 | namespace X86 { |
| 296 | enum { |
| 297 | LastTIBuiltin = Builtin::FirstTSBuiltin-1, |
| 298 | #define BUILTIN(ID, TYPE, ATTRS) BI##ID, |
| 299 | #include "X86Builtins.def" |
| 300 | LastTSBuiltin |
| 301 | }; |
| 302 | |
| 303 | static const Builtin::Info BuiltinInfo[] = { |
| 304 | #define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS }, |
| 305 | #include "X86Builtins.def" |
| 306 | }; |
| 307 | |
| 308 | static void getBuiltins(const Builtin::Info *&Records, unsigned &NumRecords) { |
| 309 | Records = BuiltinInfo; |
| 310 | NumRecords = LastTSBuiltin-Builtin::FirstTSBuiltin; |
| 311 | } |
| 312 | } // End namespace X86 |
| 313 | |
| 314 | //===----------------------------------------------------------------------===// |
| 315 | // Specific target implementations. |
| 316 | //===----------------------------------------------------------------------===// |
| 317 | |
| 318 | |
| 319 | namespace { |
| 320 | class DarwinPPCTargetInfo : public DarwinTargetInfo { |
| 321 | public: |
| 322 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 323 | DarwinTargetInfo::getTargetDefines(Defines); |
| 324 | getPowerPCDefines(Defines, false); |
| 325 | } |
| 326 | virtual void getTargetBuiltins(const Builtin::Info *&Records, |
| 327 | unsigned &NumRecords) const { |
| 328 | PPC::getBuiltins(Records, NumRecords); |
| 329 | } |
| 330 | }; |
| 331 | } // end anonymous namespace. |
| 332 | |
| 333 | namespace { |
| 334 | class DarwinPPC64TargetInfo : public DarwinTargetInfo { |
| 335 | public: |
| 336 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 337 | DarwinTargetInfo::getTargetDefines(Defines); |
| 338 | getPowerPCDefines(Defines, true); |
| 339 | } |
| 340 | virtual void getTargetBuiltins(const Builtin::Info *&Records, |
| 341 | unsigned &NumRecords) const { |
| 342 | PPC::getBuiltins(Records, NumRecords); |
| 343 | } |
| 344 | }; |
| 345 | } // end anonymous namespace. |
| 346 | |
| 347 | namespace { |
| 348 | class DarwinI386TargetInfo : public DarwinTargetInfo { |
| 349 | public: |
| 350 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 351 | DarwinTargetInfo::getTargetDefines(Defines); |
| 352 | getX86Defines(Defines, false); |
| 353 | } |
| 354 | virtual void getTargetBuiltins(const Builtin::Info *&Records, |
| 355 | unsigned &NumRecords) const { |
| 356 | X86::getBuiltins(Records, NumRecords); |
| 357 | } |
| 358 | }; |
| 359 | } // end anonymous namespace. |
| 360 | |
| 361 | namespace { |
| 362 | class DarwinX86_64TargetInfo : public DarwinTargetInfo { |
| 363 | public: |
| 364 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 365 | DarwinTargetInfo::getTargetDefines(Defines); |
| 366 | getX86Defines(Defines, true); |
| 367 | } |
| 368 | virtual void getTargetBuiltins(const Builtin::Info *&Records, |
| 369 | unsigned &NumRecords) const { |
| 370 | X86::getBuiltins(Records, NumRecords); |
| 371 | } |
| 372 | }; |
| 373 | } // end anonymous namespace. |
| 374 | |
| 375 | namespace { |
| 376 | class LinuxTargetInfo : public DarwinTargetInfo { |
| 377 | public: |
| 378 | LinuxTargetInfo() { |
| 379 | // Note: I have no idea if this is right, just for testing. |
| 380 | WCharWidth = 16; |
Chris Lattner | d2d2a11 | 2007-07-14 01:29:45 +0000 | [diff] [blame] | 381 | WCharAlign = 16; |
Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 382 | } |
| 383 | |
| 384 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 385 | // TODO: linux-specific stuff. |
| 386 | getX86Defines(Defines, false); |
| 387 | } |
| 388 | virtual void getTargetBuiltins(const Builtin::Info *&Records, |
| 389 | unsigned &NumRecords) const { |
| 390 | X86::getBuiltins(Records, NumRecords); |
| 391 | } |
| 392 | }; |
| 393 | } // end anonymous namespace. |
| 394 | |
| 395 | |
| 396 | //===----------------------------------------------------------------------===// |
| 397 | // Driver code |
| 398 | //===----------------------------------------------------------------------===// |
| 399 | |
| 400 | /// CreateTarget - Create the TargetInfoImpl object for the specified target |
| 401 | /// enum value. |
| 402 | static TargetInfoImpl *CreateTarget(SupportedTargets T) { |
| 403 | switch (T) { |
| 404 | default: assert(0 && "Unknown target!"); |
| 405 | case target_ppc: return new DarwinPPCTargetInfo(); |
| 406 | case target_ppc64: return new DarwinPPC64TargetInfo(); |
| 407 | case target_i386: return new DarwinI386TargetInfo(); |
| 408 | case target_x86_64: return new DarwinX86_64TargetInfo(); |
| 409 | case target_linux_i386: return new LinuxTargetInfo(); |
| 410 | } |
| 411 | } |
| 412 | |
| 413 | /// CreateTargetInfo - Return the set of target info objects as specified by |
| 414 | /// the -arch command line option. |
| 415 | TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) { |
| 416 | // If the user didn't specify at least one architecture, auto-sense the |
| 417 | // current host. TODO: This is a hack. :) |
| 418 | if (Archs.empty()) { |
| 419 | #ifndef __APPLE__ |
| 420 | // Assume non-apple = linux. |
| 421 | Archs.push_back(target_linux_i386); |
| 422 | #elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \ |
| 423 | defined(__ppc64__) |
| 424 | Archs.push_back(target_ppc64); |
| 425 | #elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) |
| 426 | Archs.push_back(target_ppc); |
| 427 | #elif defined(__x86_64__) |
| 428 | Archs.push_back(target_x86_64); |
| 429 | #elif defined(__i386__) || defined(i386) || defined(_M_IX86) |
| 430 | Archs.push_back(target_i386); |
| 431 | #else |
| 432 | // Don't know what this is! |
| 433 | return 0; |
| 434 | #endif |
| 435 | } |
| 436 | |
| 437 | // Create the primary target and target info. |
| 438 | TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags); |
| 439 | |
| 440 | // Add all secondary targets. |
| 441 | for (unsigned i = 1, e = Archs.size(); i != e; ++i) |
| 442 | TI->AddSecondaryTarget(CreateTarget(Archs[i])); |
| 443 | return TI; |
| 444 | } |