Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +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/Basic/Diagnostic.h" |
| 17 | #include "clang/Basic/TargetInfo.h" |
| 18 | #include "llvm/Support/CommandLine.h" |
| 19 | using namespace llvm; |
| 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 cl::list<SupportedTargets> |
| 31 | Archs("arch", cl::desc("Architectures to compile for"), |
| 32 | 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 | //===----------------------------------------------------------------------===// |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 40 | // Common code shared among targets. |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 41 | //===----------------------------------------------------------------------===// |
| 42 | |
| 43 | namespace { |
| 44 | class DarwinTargetInfo : public TargetInfoImpl { |
| 45 | public: |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 46 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
Chris Lattner | 9c83753 | 2006-10-15 01:05:46 +0000 | [diff] [blame^] | 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__"); |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 64 | } |
| 65 | |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 66 | }; |
| 67 | } // end anonymous namespace. |
| 68 | |
| 69 | |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 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) { |
Chris Lattner | 9c83753 | 2006-10-15 01:05:46 +0000 | [diff] [blame^] | 73 | // Target identification. |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 74 | Defines.push_back("__ppc__"); |
Chris Lattner | 9c83753 | 2006-10-15 01:05:46 +0000 | [diff] [blame^] | 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 | } |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 85 | |
Chris Lattner | 9c83753 | 2006-10-15 01:05:46 +0000 | [diff] [blame^] | 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 | |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 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) { |
Chris Lattner | 9c83753 | 2006-10-15 01:05:46 +0000 | [diff] [blame^] | 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"); |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 270 | |
| 271 | } |
| 272 | |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 273 | //===----------------------------------------------------------------------===// |
| 274 | // Specific target implementations. |
| 275 | //===----------------------------------------------------------------------===// |
| 276 | |
Chris Lattner | 02dffbd | 2006-10-14 07:50:21 +0000 | [diff] [blame] | 277 | |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 278 | namespace { |
| 279 | class DarwinPPCTargetInfo : public DarwinTargetInfo { |
| 280 | public: |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 281 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 282 | DarwinTargetInfo::getTargetDefines(Defines); |
| 283 | getPowerPCDefines(Defines, false); |
| 284 | } |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 285 | }; |
| 286 | } // end anonymous namespace. |
| 287 | |
| 288 | namespace { |
| 289 | class DarwinPPC64TargetInfo : public DarwinTargetInfo { |
| 290 | public: |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 291 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 292 | DarwinTargetInfo::getTargetDefines(Defines); |
| 293 | getPowerPCDefines(Defines, true); |
| 294 | } |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 295 | }; |
| 296 | } // end anonymous namespace. |
| 297 | |
| 298 | namespace { |
| 299 | class DarwinI386TargetInfo : public DarwinTargetInfo { |
| 300 | public: |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 301 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 302 | DarwinTargetInfo::getTargetDefines(Defines); |
| 303 | getX86Defines(Defines, false); |
| 304 | } |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 305 | }; |
| 306 | } // end anonymous namespace. |
| 307 | |
| 308 | namespace { |
| 309 | class DarwinX86_64TargetInfo : public DarwinTargetInfo { |
| 310 | public: |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 311 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 312 | DarwinTargetInfo::getTargetDefines(Defines); |
| 313 | getX86Defines(Defines, true); |
| 314 | } |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 315 | }; |
| 316 | } // end anonymous namespace. |
| 317 | |
| 318 | namespace { |
| 319 | class LinuxTargetInfo : public DarwinTargetInfo { |
| 320 | public: |
| 321 | LinuxTargetInfo() { |
| 322 | // Note: I have no idea if this is right, just for testing. |
| 323 | WCharWidth = 2; |
| 324 | } |
Chris Lattner | 1f5ad11 | 2006-10-14 18:32:12 +0000 | [diff] [blame] | 325 | |
| 326 | virtual void getTargetDefines(std::vector<std::string> &Defines) const { |
| 327 | // TODO: linux-specific stuff. |
| 328 | getX86Defines(Defines, false); |
| 329 | } |
Chris Lattner | 5ba61f0 | 2006-10-14 07:39:34 +0000 | [diff] [blame] | 330 | }; |
| 331 | } // end anonymous namespace. |
| 332 | |
| 333 | |
| 334 | //===----------------------------------------------------------------------===// |
| 335 | // Driver code |
| 336 | //===----------------------------------------------------------------------===// |
| 337 | |
| 338 | /// CreateTarget - Create the TargetInfoImpl object for the specified target |
| 339 | /// enum value. |
| 340 | static TargetInfoImpl *CreateTarget(SupportedTargets T) { |
| 341 | switch (T) { |
| 342 | default: assert(0 && "Unknown target!"); |
| 343 | case target_ppc: return new DarwinPPCTargetInfo(); |
| 344 | case target_ppc64: return new DarwinPPC64TargetInfo(); |
| 345 | case target_i386: return new DarwinI386TargetInfo(); |
| 346 | case target_x86_64: return new DarwinX86_64TargetInfo(); |
| 347 | case target_linux_i386: return new LinuxTargetInfo(); |
| 348 | } |
| 349 | } |
| 350 | |
| 351 | /// CreateTargetInfo - Return the set of target info objects as specified by |
| 352 | /// the -arch command line option. |
| 353 | TargetInfo *clang::CreateTargetInfo(Diagnostic &Diags) { |
| 354 | // If the user didn't specify at least one architecture, auto-sense the |
| 355 | // current host. TODO: This is a hack. :) |
| 356 | if (Archs.empty()) { |
| 357 | #ifndef __APPLE__ |
| 358 | // Assume non-apple = linux. |
| 359 | Archs.push_back(target_linux_i386); |
| 360 | #elif (defined(__POWERPC__) || defined (__ppc__) || defined(_POWER)) && \ |
| 361 | defined(__ppc64__) |
| 362 | Archs.push_back(target_ppc64); |
| 363 | #elif defined(__POWERPC__) || defined (__ppc__) || defined(_POWER) |
| 364 | Archs.push_back(target_ppc); |
| 365 | #elif defined(__x86_64__) |
| 366 | Archs.push_back(target_x86_64); |
| 367 | #elif defined(__i386__) || defined(i386) || defined(_M_IX86) |
| 368 | Archs.push_back(target_i386); |
| 369 | #else |
| 370 | // Don't know what this is! |
| 371 | return 0; |
| 372 | #endif |
| 373 | } |
| 374 | |
| 375 | // Create the primary target and target info. |
| 376 | TargetInfo *TI = new TargetInfo(CreateTarget(Archs[0]), &Diags); |
| 377 | |
| 378 | // Add all secondary targets. |
| 379 | for (unsigned i = 1, e = Archs.size(); i != e; ++i) |
| 380 | TI->AddSecondaryTarget(CreateTarget(Archs[i])); |
| 381 | return TI; |
| 382 | } |