1 //===--- ToolChains.cpp - ToolChain Implementations -----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "ToolChains.h" 11 12 #include "clang/Driver/Arg.h" 13 #include "clang/Driver/ArgList.h" 14 #include "clang/Driver/Compilation.h" 15 #include "clang/Driver/Driver.h" 16 #include "clang/Driver/DriverDiagnostic.h" 17 #include "clang/Driver/OptTable.h" 18 #include "clang/Driver/Option.h" 19 #include "clang/Driver/Options.h" 20 #include "clang/Basic/ObjCRuntime.h" 21 #include "clang/Basic/Version.h" 22 23 #include "llvm/ADT/SmallString.h" 24 #include "llvm/ADT/StringExtras.h" 25 #include "llvm/ADT/StringSwitch.h" 26 #include "llvm/ADT/STLExtras.h" 27 #include "llvm/Support/ErrorHandling.h" 28 #include "llvm/Support/FileSystem.h" 29 #include "llvm/Support/MemoryBuffer.h" 30 #include "llvm/Support/raw_ostream.h" 31 #include "llvm/Support/Path.h" 32 #include "llvm/Support/system_error.h" 33 34 #include <cstdlib> // ::getenv 35 36 #include "clang/Config/config.h" // for GCC_INSTALL_PREFIX 37 38 using namespace clang::driver; 39 using namespace clang::driver::toolchains; 40 using namespace clang; 41 42 /// Darwin - Darwin tool chain for i386 and x86_64. 43 Darwin(const Driver & D,const llvm::Triple & Triple)44 Darwin::Darwin(const Driver &D, const llvm::Triple& Triple) 45 : ToolChain(D, Triple), TargetInitialized(false) 46 { 47 // Compute the initial Darwin version from the triple 48 unsigned Major, Minor, Micro; 49 if (!Triple.getMacOSXVersion(Major, Minor, Micro)) 50 getDriver().Diag(diag::err_drv_invalid_darwin_version) << 51 Triple.getOSName(); 52 llvm::raw_string_ostream(MacosxVersionMin) 53 << Major << '.' << Minor << '.' << Micro; 54 55 // FIXME: DarwinVersion is only used to find GCC's libexec directory. 56 // It should be removed when we stop supporting that. 57 DarwinVersion[0] = Minor + 4; 58 DarwinVersion[1] = Micro; 59 DarwinVersion[2] = 0; 60 61 // Compute the initial iOS version from the triple 62 Triple.getiOSVersion(Major, Minor, Micro); 63 llvm::raw_string_ostream(iOSVersionMin) 64 << Major << '.' << Minor << '.' << Micro; 65 } 66 LookupTypeForExtension(const char * Ext) const67 types::ID Darwin::LookupTypeForExtension(const char *Ext) const { 68 types::ID Ty = types::lookupTypeForExtension(Ext); 69 70 // Darwin always preprocesses assembly files (unless -x is used explicitly). 71 if (Ty == types::TY_PP_Asm) 72 return types::TY_Asm; 73 74 return Ty; 75 } 76 HasNativeLLVMSupport() const77 bool Darwin::HasNativeLLVMSupport() const { 78 return true; 79 } 80 81 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0. getDefaultObjCRuntime(bool isNonFragile) const82 ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const { 83 if (isTargetIPhoneOS()) { 84 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion); 85 } else if (TargetSimulatorVersionFromDefines != VersionTuple()) { 86 return ObjCRuntime(ObjCRuntime::iOS, TargetSimulatorVersionFromDefines); 87 } else { 88 if (isNonFragile) { 89 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion); 90 } else { 91 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion); 92 } 93 } 94 } 95 96 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2. hasBlocksRuntime() const97 bool Darwin::hasBlocksRuntime() const { 98 if (isTargetIPhoneOS()) 99 return !isIPhoneOSVersionLT(3, 2); 100 else 101 return !isMacosxVersionLT(10, 6); 102 } 103 GetArmArchForMArch(StringRef Value)104 static const char *GetArmArchForMArch(StringRef Value) { 105 return llvm::StringSwitch<const char*>(Value) 106 .Case("armv6k", "armv6") 107 .Case("armv5tej", "armv5") 108 .Case("xscale", "xscale") 109 .Case("armv4t", "armv4t") 110 .Case("armv7", "armv7") 111 .Cases("armv7a", "armv7-a", "armv7") 112 .Cases("armv7r", "armv7-r", "armv7") 113 .Cases("armv7m", "armv7-m", "armv7") 114 .Default(0); 115 } 116 GetArmArchForMCpu(StringRef Value)117 static const char *GetArmArchForMCpu(StringRef Value) { 118 return llvm::StringSwitch<const char *>(Value) 119 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5") 120 .Cases("arm10e", "arm10tdmi", "armv5") 121 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5") 122 .Case("xscale", "xscale") 123 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", 124 "arm1176jzf-s", "cortex-m0", "armv6") 125 .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7") 126 .Default(0); 127 } 128 getDarwinArchName(const ArgList & Args) const129 StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 130 switch (getTriple().getArch()) { 131 default: 132 return getArchName(); 133 134 case llvm::Triple::thumb: 135 case llvm::Triple::arm: { 136 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 137 if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 138 return Arch; 139 140 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 141 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 142 return Arch; 143 144 return "arm"; 145 } 146 } 147 } 148 ~Darwin()149 Darwin::~Darwin() { 150 // Free tool implementations. 151 for (llvm::DenseMap<unsigned, Tool*>::iterator 152 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 153 delete it->second; 154 } 155 ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const156 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, 157 types::ID InputType) const { 158 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 159 160 // If the target isn't initialized (e.g., an unknown Darwin platform, return 161 // the default triple). 162 if (!isTargetInitialized()) 163 return Triple.getTriple(); 164 165 SmallString<16> Str; 166 Str += isTargetIPhoneOS() ? "ios" : "macosx"; 167 Str += getTargetVersion().getAsString(); 168 Triple.setOSName(Str); 169 170 return Triple.getTriple(); 171 } 172 anchor()173 void Generic_ELF::anchor() {} 174 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const175 Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA, 176 const ActionList &Inputs) const { 177 Action::ActionClass Key = JA.getKind(); 178 bool useClang = false; 179 180 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) { 181 useClang = true; 182 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI. 183 if (!getDriver().shouldForceClangUse() && 184 Inputs.size() == 1 && 185 types::isCXX(Inputs[0]->getType()) && 186 getTriple().isOSDarwin() && 187 getTriple().getArch() == llvm::Triple::x86 && 188 (C.getArgs().getLastArg(options::OPT_fapple_kext) || 189 C.getArgs().getLastArg(options::OPT_mkernel))) 190 useClang = false; 191 } 192 193 // FIXME: This seems like a hacky way to choose clang frontend. 194 if (useClang) 195 Key = Action::AnalyzeJobClass; 196 197 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 198 options::OPT_no_integrated_as, 199 IsIntegratedAssemblerDefault()); 200 201 Tool *&T = Tools[Key]; 202 if (!T) { 203 switch (Key) { 204 case Action::InputClass: 205 case Action::BindArchClass: 206 llvm_unreachable("Invalid tool kind."); 207 case Action::PreprocessJobClass: 208 T = new tools::darwin::Preprocess(*this); break; 209 case Action::AnalyzeJobClass: 210 case Action::MigrateJobClass: 211 T = new tools::Clang(*this); break; 212 case Action::PrecompileJobClass: 213 case Action::CompileJobClass: 214 T = new tools::darwin::Compile(*this); break; 215 case Action::AssembleJobClass: { 216 if (UseIntegratedAs) 217 T = new tools::ClangAs(*this); 218 else 219 T = new tools::darwin::Assemble(*this); 220 break; 221 } 222 case Action::LinkJobClass: 223 T = new tools::darwin::Link(*this); break; 224 case Action::LipoJobClass: 225 T = new tools::darwin::Lipo(*this); break; 226 case Action::DsymutilJobClass: 227 T = new tools::darwin::Dsymutil(*this); break; 228 case Action::VerifyJobClass: 229 T = new tools::darwin::VerifyDebug(*this); break; 230 } 231 } 232 233 return *T; 234 } 235 236 DarwinClang(const Driver & D,const llvm::Triple & Triple)237 DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple) 238 : Darwin(D, Triple) 239 { 240 getProgramPaths().push_back(getDriver().getInstalledDir()); 241 if (getDriver().getInstalledDir() != getDriver().Dir) 242 getProgramPaths().push_back(getDriver().Dir); 243 244 // We expect 'as', 'ld', etc. to be adjacent to our install dir. 245 getProgramPaths().push_back(getDriver().getInstalledDir()); 246 if (getDriver().getInstalledDir() != getDriver().Dir) 247 getProgramPaths().push_back(getDriver().Dir); 248 249 // For fallback, we need to know how to find the GCC cc1 executables, so we 250 // also add the GCC libexec paths. This is legacy code that can be removed 251 // once fallback is no longer useful. 252 AddGCCLibexecPath(DarwinVersion[0]); 253 AddGCCLibexecPath(DarwinVersion[0] - 2); 254 AddGCCLibexecPath(DarwinVersion[0] - 1); 255 AddGCCLibexecPath(DarwinVersion[0] + 1); 256 AddGCCLibexecPath(DarwinVersion[0] + 2); 257 } 258 AddGCCLibexecPath(unsigned darwinVersion)259 void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) { 260 std::string ToolChainDir = "i686-apple-darwin"; 261 ToolChainDir += llvm::utostr(darwinVersion); 262 ToolChainDir += "/4.2.1"; 263 264 std::string Path = getDriver().Dir; 265 Path += "/../llvm-gcc-4.2/libexec/gcc/"; 266 Path += ToolChainDir; 267 getProgramPaths().push_back(Path); 268 269 Path = "/usr/llvm-gcc-4.2/libexec/gcc/"; 270 Path += ToolChainDir; 271 getProgramPaths().push_back(Path); 272 } 273 AddLinkARCArgs(const ArgList & Args,ArgStringList & CmdArgs) const274 void DarwinClang::AddLinkARCArgs(const ArgList &Args, 275 ArgStringList &CmdArgs) const { 276 277 CmdArgs.push_back("-force_load"); 278 llvm::sys::Path P(getDriver().ClangExecutable); 279 P.eraseComponent(); // 'clang' 280 P.eraseComponent(); // 'bin' 281 P.appendComponent("lib"); 282 P.appendComponent("arc"); 283 P.appendComponent("libarclite_"); 284 std::string s = P.str(); 285 // Mash in the platform. 286 if (isTargetIOSSimulator()) 287 s += "iphonesimulator"; 288 else if (isTargetIPhoneOS()) 289 s += "iphoneos"; 290 // FIXME: Remove this once we depend fully on -mios-simulator-version-min. 291 else if (TargetSimulatorVersionFromDefines != VersionTuple()) 292 s += "iphonesimulator"; 293 else 294 s += "macosx"; 295 s += ".a"; 296 297 CmdArgs.push_back(Args.MakeArgString(s)); 298 } 299 AddLinkRuntimeLib(const ArgList & Args,ArgStringList & CmdArgs,const char * DarwinStaticLib) const300 void DarwinClang::AddLinkRuntimeLib(const ArgList &Args, 301 ArgStringList &CmdArgs, 302 const char *DarwinStaticLib) const { 303 llvm::sys::Path P(getDriver().ResourceDir); 304 P.appendComponent("lib"); 305 P.appendComponent("darwin"); 306 P.appendComponent(DarwinStaticLib); 307 308 // For now, allow missing resource libraries to support developers who may 309 // not have compiler-rt checked out or integrated into their build. 310 bool Exists; 311 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 312 CmdArgs.push_back(Args.MakeArgString(P.str())); 313 } 314 AddLinkRuntimeLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const315 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 316 ArgStringList &CmdArgs) const { 317 // Darwin only supports the compiler-rt based runtime libraries. 318 switch (GetRuntimeLibType(Args)) { 319 case ToolChain::RLT_CompilerRT: 320 break; 321 default: 322 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) 323 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue(Args) << "darwin"; 324 return; 325 } 326 327 // Darwin doesn't support real static executables, don't link any runtime 328 // libraries with -static. 329 if (Args.hasArg(options::OPT_static)) 330 return; 331 332 // Reject -static-libgcc for now, we can deal with this when and if someone 333 // cares. This is useful in situations where someone wants to statically link 334 // something like libstdc++, and needs its runtime support routines. 335 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 336 getDriver().Diag(diag::err_drv_unsupported_opt) 337 << A->getAsString(Args); 338 return; 339 } 340 341 // If we are building profile support, link that library in. 342 if (Args.hasArg(options::OPT_fprofile_arcs) || 343 Args.hasArg(options::OPT_fprofile_generate) || 344 Args.hasArg(options::OPT_fcreate_profile) || 345 Args.hasArg(options::OPT_coverage)) { 346 // Select the appropriate runtime library for the target. 347 if (isTargetIPhoneOS()) { 348 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a"); 349 } else { 350 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a"); 351 } 352 } 353 354 // Add ASAN runtime library, if required. Dynamic libraries and bundles 355 // should not be linked with the runtime library. 356 if (Args.hasFlag(options::OPT_faddress_sanitizer, 357 options::OPT_fno_address_sanitizer, false)) { 358 if (Args.hasArg(options::OPT_dynamiclib) || 359 Args.hasArg(options::OPT_bundle)) return; 360 if (isTargetIPhoneOS()) { 361 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) 362 << "-faddress-sanitizer"; 363 } else { 364 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx.a"); 365 366 // The ASAN runtime library requires C++ and CoreFoundation. 367 AddCXXStdlibLibArgs(Args, CmdArgs); 368 CmdArgs.push_back("-framework"); 369 CmdArgs.push_back("CoreFoundation"); 370 } 371 } 372 373 // Otherwise link libSystem, then the dynamic runtime library, and finally any 374 // target specific static runtime library. 375 CmdArgs.push_back("-lSystem"); 376 377 // Select the dynamic runtime library and the target specific static library. 378 if (isTargetIPhoneOS()) { 379 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1, 380 // it never went into the SDK. 381 // Linking against libgcc_s.1 isn't needed for iOS 5.0+ 382 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator()) 383 CmdArgs.push_back("-lgcc_s.1"); 384 385 // We currently always need a static runtime library for iOS. 386 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a"); 387 } else { 388 // The dynamic runtime library was merged with libSystem for 10.6 and 389 // beyond; only 10.4 and 10.5 need an additional runtime library. 390 if (isMacosxVersionLT(10, 5)) 391 CmdArgs.push_back("-lgcc_s.10.4"); 392 else if (isMacosxVersionLT(10, 6)) 393 CmdArgs.push_back("-lgcc_s.10.5"); 394 395 // For OS X, we thought we would only need a static runtime library when 396 // targeting 10.4, to provide versions of the static functions which were 397 // omitted from 10.4.dylib. 398 // 399 // Unfortunately, that turned out to not be true, because Darwin system 400 // headers can still use eprintf on i386, and it is not exported from 401 // libSystem. Therefore, we still must provide a runtime library just for 402 // the tiny tiny handful of projects that *might* use that symbol. 403 if (isMacosxVersionLT(10, 5)) { 404 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a"); 405 } else { 406 if (getTriple().getArch() == llvm::Triple::x86) 407 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a"); 408 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a"); 409 } 410 } 411 } 412 SimulatorVersionDefineName()413 static inline StringRef SimulatorVersionDefineName() { 414 return "__IPHONE_OS_VERSION_MIN_REQUIRED"; 415 } 416 417 /// \brief Parse the simulator version define: 418 /// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9]) 419 // and return the grouped values as integers, e.g: 420 // __IPHONE_OS_VERSION_MIN_REQUIRED=40201 421 // will return Major=4, Minor=2, Micro=1. GetVersionFromSimulatorDefine(StringRef define,unsigned & Major,unsigned & Minor,unsigned & Micro)422 static bool GetVersionFromSimulatorDefine(StringRef define, 423 unsigned &Major, unsigned &Minor, 424 unsigned &Micro) { 425 assert(define.startswith(SimulatorVersionDefineName())); 426 StringRef name, version; 427 llvm::tie(name, version) = define.split('='); 428 if (version.empty()) 429 return false; 430 std::string verstr = version.str(); 431 char *end; 432 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10); 433 if (*end != '\0') 434 return false; 435 Major = num / 10000; 436 num = num % 10000; 437 Minor = num / 100; 438 Micro = num % 100; 439 return true; 440 } 441 AddDeploymentTarget(DerivedArgList & Args) const442 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 443 const OptTable &Opts = getDriver().getOpts(); 444 445 // Support allowing the SDKROOT environment variable used by xcrun and other 446 // Xcode tools to define the default sysroot, by making it the default for 447 // isysroot. 448 if (!Args.hasArg(options::OPT_isysroot)) { 449 if (char *env = ::getenv("SDKROOT")) { 450 // We only use this value as the default if it is an absolute path and 451 // exists. 452 if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env)) { 453 Args.append(Args.MakeSeparateArg( 454 0, Opts.getOption(options::OPT_isysroot), env)); 455 } 456 } 457 } 458 459 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 460 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 461 Arg *iOSSimVersion = Args.getLastArg( 462 options::OPT_mios_simulator_version_min_EQ); 463 464 // FIXME: HACK! When compiling for the simulator we don't get a 465 // '-miphoneos-version-min' to help us know whether there is an ARC runtime 466 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED 467 // define passed in command-line. 468 if (!iOSVersion && !iOSSimVersion) { 469 for (arg_iterator it = Args.filtered_begin(options::OPT_D), 470 ie = Args.filtered_end(); it != ie; ++it) { 471 StringRef define = (*it)->getValue(Args); 472 if (define.startswith(SimulatorVersionDefineName())) { 473 unsigned Major = 0, Minor = 0, Micro = 0; 474 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) && 475 Major < 10 && Minor < 100 && Micro < 100) { 476 TargetSimulatorVersionFromDefines = VersionTuple(Major, Minor, Micro); 477 } 478 // When using the define to indicate the simulator, we force 479 // 10.6 macosx target. 480 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 481 OSXVersion = Args.MakeJoinedArg(0, O, "10.6"); 482 Args.append(OSXVersion); 483 break; 484 } 485 } 486 } 487 488 if (OSXVersion && (iOSVersion || iOSSimVersion)) { 489 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 490 << OSXVersion->getAsString(Args) 491 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args); 492 iOSVersion = iOSSimVersion = 0; 493 } else if (iOSVersion && iOSSimVersion) { 494 getDriver().Diag(diag::err_drv_argument_not_allowed_with) 495 << iOSVersion->getAsString(Args) 496 << iOSSimVersion->getAsString(Args); 497 iOSSimVersion = 0; 498 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) { 499 // If no deployment target was specified on the command line, check for 500 // environment defines. 501 StringRef OSXTarget; 502 StringRef iOSTarget; 503 StringRef iOSSimTarget; 504 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET")) 505 OSXTarget = env; 506 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET")) 507 iOSTarget = env; 508 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET")) 509 iOSSimTarget = env; 510 511 // If no '-miphoneos-version-min' specified on the command line and 512 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default 513 // based on -isysroot. 514 if (iOSTarget.empty()) { 515 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 516 StringRef first, second; 517 StringRef isysroot = A->getValue(Args); 518 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS")); 519 if (second != "") 520 iOSTarget = second.substr(0,3); 521 } 522 } 523 524 // If no OSX or iOS target has been specified and we're compiling for armv7, 525 // go ahead as assume we're targeting iOS. 526 if (OSXTarget.empty() && iOSTarget.empty() && 527 getDarwinArchName(Args) == "armv7") 528 iOSTarget = iOSVersionMin; 529 530 // Handle conflicting deployment targets 531 // 532 // FIXME: Don't hardcode default here. 533 534 // Do not allow conflicts with the iOS simulator target. 535 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) { 536 getDriver().Diag(diag::err_drv_conflicting_deployment_targets) 537 << "IOS_SIMULATOR_DEPLOYMENT_TARGET" 538 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" : 539 "IPHONEOS_DEPLOYMENT_TARGET"); 540 } 541 542 // Allow conflicts among OSX and iOS for historical reasons, but choose the 543 // default platform. 544 if (!OSXTarget.empty() && !iOSTarget.empty()) { 545 if (getTriple().getArch() == llvm::Triple::arm || 546 getTriple().getArch() == llvm::Triple::thumb) 547 OSXTarget = ""; 548 else 549 iOSTarget = ""; 550 } 551 552 if (!OSXTarget.empty()) { 553 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 554 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); 555 Args.append(OSXVersion); 556 } else if (!iOSTarget.empty()) { 557 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 558 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget); 559 Args.append(iOSVersion); 560 } else if (!iOSSimTarget.empty()) { 561 const Option *O = Opts.getOption( 562 options::OPT_mios_simulator_version_min_EQ); 563 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget); 564 Args.append(iOSSimVersion); 565 } else { 566 // Otherwise, assume we are targeting OS X. 567 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 568 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); 569 Args.append(OSXVersion); 570 } 571 } 572 573 // Reject invalid architecture combinations. 574 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 && 575 getTriple().getArch() != llvm::Triple::x86_64)) { 576 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target) 577 << getTriple().getArchName() << iOSSimVersion->getAsString(Args); 578 } 579 580 // Set the tool chain target information. 581 unsigned Major, Minor, Micro; 582 bool HadExtra; 583 if (OSXVersion) { 584 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!"); 585 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 586 Micro, HadExtra) || HadExtra || 587 Major != 10 || Minor >= 100 || Micro >= 100) 588 getDriver().Diag(diag::err_drv_invalid_version_number) 589 << OSXVersion->getAsString(Args); 590 } else { 591 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion; 592 assert(Version && "Unknown target platform!"); 593 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor, 594 Micro, HadExtra) || HadExtra || 595 Major >= 10 || Minor >= 100 || Micro >= 100) 596 getDriver().Diag(diag::err_drv_invalid_version_number) 597 << Version->getAsString(Args); 598 } 599 600 bool IsIOSSim = bool(iOSSimVersion); 601 602 // In GCC, the simulator historically was treated as being OS X in some 603 // contexts, like determining the link logic, despite generally being called 604 // with an iOS deployment target. For compatibility, we detect the 605 // simulator as iOS + x86, and treat it differently in a few contexts. 606 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 || 607 getTriple().getArch() == llvm::Triple::x86_64)) 608 IsIOSSim = true; 609 610 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim); 611 } 612 AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const613 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 614 ArgStringList &CmdArgs) const { 615 CXXStdlibType Type = GetCXXStdlibType(Args); 616 617 switch (Type) { 618 case ToolChain::CST_Libcxx: 619 CmdArgs.push_back("-lc++"); 620 break; 621 622 case ToolChain::CST_Libstdcxx: { 623 // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 624 // it was previously found in the gcc lib dir. However, for all the Darwin 625 // platforms we care about it was -lstdc++.6, so we search for that 626 // explicitly if we can't see an obvious -lstdc++ candidate. 627 628 // Check in the sysroot first. 629 bool Exists; 630 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 631 llvm::sys::Path P(A->getValue(Args)); 632 P.appendComponent("usr"); 633 P.appendComponent("lib"); 634 P.appendComponent("libstdc++.dylib"); 635 636 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) { 637 P.eraseComponent(); 638 P.appendComponent("libstdc++.6.dylib"); 639 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) { 640 CmdArgs.push_back(Args.MakeArgString(P.str())); 641 return; 642 } 643 } 644 } 645 646 // Otherwise, look in the root. 647 // FIXME: This should be removed someday when we don't have to care about 648 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist. 649 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&& 650 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){ 651 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 652 return; 653 } 654 655 // Otherwise, let the linker search. 656 CmdArgs.push_back("-lstdc++"); 657 break; 658 } 659 } 660 } 661 AddCCKextLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const662 void DarwinClang::AddCCKextLibArgs(const ArgList &Args, 663 ArgStringList &CmdArgs) const { 664 665 // For Darwin platforms, use the compiler-rt-based support library 666 // instead of the gcc-provided one (which is also incidentally 667 // only present in the gcc lib dir, which makes it hard to find). 668 669 llvm::sys::Path P(getDriver().ResourceDir); 670 P.appendComponent("lib"); 671 P.appendComponent("darwin"); 672 P.appendComponent("libclang_rt.cc_kext.a"); 673 674 // For now, allow missing resource libraries to support developers who may 675 // not have compiler-rt checked out or integrated into their build. 676 bool Exists; 677 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) 678 CmdArgs.push_back(Args.MakeArgString(P.str())); 679 } 680 TranslateArgs(const DerivedArgList & Args,const char * BoundArch) const681 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 682 const char *BoundArch) const { 683 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 684 const OptTable &Opts = getDriver().getOpts(); 685 686 // FIXME: We really want to get out of the tool chain level argument 687 // translation business, as it makes the driver functionality much 688 // more opaque. For now, we follow gcc closely solely for the 689 // purpose of easily achieving feature parity & testability. Once we 690 // have something that works, we should reevaluate each translation 691 // and try to push it down into tool specific logic. 692 693 for (ArgList::const_iterator it = Args.begin(), 694 ie = Args.end(); it != ie; ++it) { 695 Arg *A = *it; 696 697 if (A->getOption().matches(options::OPT_Xarch__)) { 698 // Skip this argument unless the architecture matches either the toolchain 699 // triple arch, or the arch being bound. 700 // 701 // FIXME: Canonicalize name. 702 StringRef XarchArch = A->getValue(Args, 0); 703 if (!(XarchArch == getArchName() || 704 (BoundArch && XarchArch == BoundArch))) 705 continue; 706 707 Arg *OriginalArg = A; 708 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); 709 unsigned Prev = Index; 710 Arg *XarchArg = Opts.ParseOneArg(Args, Index); 711 712 // If the argument parsing failed or more than one argument was 713 // consumed, the -Xarch_ argument's parameter tried to consume 714 // extra arguments. Emit an error and ignore. 715 // 716 // We also want to disallow any options which would alter the 717 // driver behavior; that isn't going to work in our model. We 718 // use isDriverOption() as an approximation, although things 719 // like -O4 are going to slip through. 720 if (!XarchArg || Index > Prev + 1) { 721 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) 722 << A->getAsString(Args); 723 continue; 724 } else if (XarchArg->getOption().isDriverOption()) { 725 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) 726 << A->getAsString(Args); 727 continue; 728 } 729 730 XarchArg->setBaseArg(A); 731 A = XarchArg; 732 733 DAL->AddSynthesizedArg(A); 734 735 // Linker input arguments require custom handling. The problem is that we 736 // have already constructed the phase actions, so we can not treat them as 737 // "input arguments". 738 if (A->getOption().isLinkerInput()) { 739 // Convert the argument into individual Zlinker_input_args. 740 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 741 DAL->AddSeparateArg(OriginalArg, 742 Opts.getOption(options::OPT_Zlinker_input), 743 A->getValue(Args, i)); 744 745 } 746 continue; 747 } 748 } 749 750 // Sob. These is strictly gcc compatible for the time being. Apple 751 // gcc translates options twice, which means that self-expanding 752 // options add duplicates. 753 switch ((options::ID) A->getOption().getID()) { 754 default: 755 DAL->append(A); 756 break; 757 758 case options::OPT_mkernel: 759 case options::OPT_fapple_kext: 760 DAL->append(A); 761 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 762 break; 763 764 case options::OPT_dependency_file: 765 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 766 A->getValue(Args)); 767 break; 768 769 case options::OPT_gfull: 770 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 771 DAL->AddFlagArg(A, 772 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 773 break; 774 775 case options::OPT_gused: 776 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 777 DAL->AddFlagArg(A, 778 Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 779 break; 780 781 case options::OPT_shared: 782 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 783 break; 784 785 case options::OPT_fconstant_cfstrings: 786 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 787 break; 788 789 case options::OPT_fno_constant_cfstrings: 790 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 791 break; 792 793 case options::OPT_Wnonportable_cfstrings: 794 DAL->AddFlagArg(A, 795 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 796 break; 797 798 case options::OPT_Wno_nonportable_cfstrings: 799 DAL->AddFlagArg(A, 800 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 801 break; 802 803 case options::OPT_fpascal_strings: 804 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 805 break; 806 807 case options::OPT_fno_pascal_strings: 808 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 809 break; 810 } 811 } 812 813 if (getTriple().getArch() == llvm::Triple::x86 || 814 getTriple().getArch() == llvm::Triple::x86_64) 815 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 816 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 817 818 // Add the arch options based on the particular spelling of -arch, to match 819 // how the driver driver works. 820 if (BoundArch) { 821 StringRef Name = BoundArch; 822 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 823 const Option *MArch = Opts.getOption(options::OPT_march_EQ); 824 825 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 826 // which defines the list of which architectures we accept. 827 if (Name == "ppc") 828 ; 829 else if (Name == "ppc601") 830 DAL->AddJoinedArg(0, MCpu, "601"); 831 else if (Name == "ppc603") 832 DAL->AddJoinedArg(0, MCpu, "603"); 833 else if (Name == "ppc604") 834 DAL->AddJoinedArg(0, MCpu, "604"); 835 else if (Name == "ppc604e") 836 DAL->AddJoinedArg(0, MCpu, "604e"); 837 else if (Name == "ppc750") 838 DAL->AddJoinedArg(0, MCpu, "750"); 839 else if (Name == "ppc7400") 840 DAL->AddJoinedArg(0, MCpu, "7400"); 841 else if (Name == "ppc7450") 842 DAL->AddJoinedArg(0, MCpu, "7450"); 843 else if (Name == "ppc970") 844 DAL->AddJoinedArg(0, MCpu, "970"); 845 846 else if (Name == "ppc64") 847 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 848 849 else if (Name == "i386") 850 ; 851 else if (Name == "i486") 852 DAL->AddJoinedArg(0, MArch, "i486"); 853 else if (Name == "i586") 854 DAL->AddJoinedArg(0, MArch, "i586"); 855 else if (Name == "i686") 856 DAL->AddJoinedArg(0, MArch, "i686"); 857 else if (Name == "pentium") 858 DAL->AddJoinedArg(0, MArch, "pentium"); 859 else if (Name == "pentium2") 860 DAL->AddJoinedArg(0, MArch, "pentium2"); 861 else if (Name == "pentpro") 862 DAL->AddJoinedArg(0, MArch, "pentiumpro"); 863 else if (Name == "pentIIm3") 864 DAL->AddJoinedArg(0, MArch, "pentium2"); 865 866 else if (Name == "x86_64") 867 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 868 869 else if (Name == "arm") 870 DAL->AddJoinedArg(0, MArch, "armv4t"); 871 else if (Name == "armv4t") 872 DAL->AddJoinedArg(0, MArch, "armv4t"); 873 else if (Name == "armv5") 874 DAL->AddJoinedArg(0, MArch, "armv5tej"); 875 else if (Name == "xscale") 876 DAL->AddJoinedArg(0, MArch, "xscale"); 877 else if (Name == "armv6") 878 DAL->AddJoinedArg(0, MArch, "armv6k"); 879 else if (Name == "armv7") 880 DAL->AddJoinedArg(0, MArch, "armv7a"); 881 882 else 883 llvm_unreachable("invalid Darwin arch"); 884 } 885 886 // Add an explicit version min argument for the deployment target. We do this 887 // after argument translation because -Xarch_ arguments may add a version min 888 // argument. 889 if (BoundArch) 890 AddDeploymentTarget(*DAL); 891 892 // Validate the C++ standard library choice. 893 CXXStdlibType Type = GetCXXStdlibType(*DAL); 894 if (Type == ToolChain::CST_Libcxx) { 895 // Check whether the target provides libc++. 896 StringRef where; 897 898 // Complain about targetting iOS < 5.0 in any way. 899 if (TargetSimulatorVersionFromDefines != VersionTuple()) { 900 if (TargetSimulatorVersionFromDefines < VersionTuple(5, 0)) 901 where = "iOS 5.0"; 902 } else if (isTargetIPhoneOS()) { 903 if (isIPhoneOSVersionLT(5, 0)) 904 where = "iOS 5.0"; 905 } 906 907 if (where != StringRef()) { 908 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) 909 << where; 910 } 911 } 912 913 return DAL; 914 } 915 IsUnwindTablesDefault() const916 bool Darwin::IsUnwindTablesDefault() const { 917 // FIXME: Gross; we should probably have some separate target 918 // definition, possibly even reusing the one in clang. 919 return getArchName() == "x86_64"; 920 } 921 UseDwarfDebugFlags() const922 bool Darwin::UseDwarfDebugFlags() const { 923 if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 924 return S[0] != '\0'; 925 return false; 926 } 927 UseSjLjExceptions() const928 bool Darwin::UseSjLjExceptions() const { 929 // Darwin uses SjLj exceptions on ARM. 930 return (getTriple().getArch() == llvm::Triple::arm || 931 getTriple().getArch() == llvm::Triple::thumb); 932 } 933 GetDefaultRelocationModel() const934 const char *Darwin::GetDefaultRelocationModel() const { 935 return "pic"; 936 } 937 GetForcedPicModel() const938 const char *Darwin::GetForcedPicModel() const { 939 if (getArchName() == "x86_64") 940 return "pic"; 941 return 0; 942 } 943 SupportsProfiling() const944 bool Darwin::SupportsProfiling() const { 945 // Profiling instrumentation is only supported on x86. 946 return getArchName() == "i386" || getArchName() == "x86_64"; 947 } 948 SupportsObjCGC() const949 bool Darwin::SupportsObjCGC() const { 950 // Garbage collection is supported everywhere except on iPhone OS. 951 return !isTargetIPhoneOS(); 952 } 953 CheckObjCARC() const954 void Darwin::CheckObjCARC() const { 955 if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6)) 956 return; 957 getDriver().Diag(diag::err_arc_unsupported_on_toolchain); 958 } 959 960 std::string ComputeEffectiveClangTriple(const ArgList & Args,types::ID InputType) const961 Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args, 962 types::ID InputType) const { 963 return ComputeLLVMTriple(Args, InputType); 964 } 965 966 /// Generic_GCC - A tool chain using the 'gcc' command to perform 967 /// all subcommands; this relies on gcc translating the majority of 968 /// command line options. 969 970 /// \brief Parse a GCCVersion object out of a string of text. 971 /// 972 /// This is the primary means of forming GCCVersion objects. 973 /*static*/ Parse(StringRef VersionText)974 Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) { 975 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" }; 976 std::pair<StringRef, StringRef> First = VersionText.split('.'); 977 std::pair<StringRef, StringRef> Second = First.second.split('.'); 978 979 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" }; 980 if (First.first.getAsInteger(10, GoodVersion.Major) || 981 GoodVersion.Major < 0) 982 return BadVersion; 983 if (Second.first.getAsInteger(10, GoodVersion.Minor) || 984 GoodVersion.Minor < 0) 985 return BadVersion; 986 987 // First look for a number prefix and parse that if present. Otherwise just 988 // stash the entire patch string in the suffix, and leave the number 989 // unspecified. This covers versions strings such as: 990 // 4.4 991 // 4.4.0 992 // 4.4.x 993 // 4.4.2-rc4 994 // 4.4.x-patched 995 // And retains any patch number it finds. 996 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str(); 997 if (!PatchText.empty()) { 998 if (unsigned EndNumber = PatchText.find_first_not_of("0123456789")) { 999 // Try to parse the number and any suffix. 1000 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) || 1001 GoodVersion.Patch < 0) 1002 return BadVersion; 1003 GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str(); 1004 } 1005 } 1006 1007 return GoodVersion; 1008 } 1009 1010 /// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering. operator <(const GCCVersion & RHS) const1011 bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const { 1012 if (Major < RHS.Major) return true; if (Major > RHS.Major) return false; 1013 if (Minor < RHS.Minor) return true; if (Minor > RHS.Minor) return false; 1014 1015 // Note that we rank versions with *no* patch specified is better than ones 1016 // hard-coding a patch version. Thus if the RHS has no patch, it always 1017 // wins, and the LHS only wins if it has no patch and the RHS does have 1018 // a patch. 1019 if (RHS.Patch == -1) return true; if (Patch == -1) return false; 1020 if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false; 1021 if (PatchSuffix == RHS.PatchSuffix) return false; 1022 1023 // Finally, between completely tied version numbers, the version with the 1024 // suffix loses as we prefer full releases. 1025 if (RHS.PatchSuffix.empty()) return true; 1026 return false; 1027 } 1028 getGCCToolchainDir(const ArgList & Args)1029 static StringRef getGCCToolchainDir(const ArgList &Args) { 1030 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain); 1031 if (A) 1032 return A->getValue(Args); 1033 return GCC_INSTALL_PREFIX; 1034 } 1035 1036 /// \brief Construct a GCCInstallationDetector from the driver. 1037 /// 1038 /// This performs all of the autodetection and sets up the various paths. 1039 /// Once constructed, a GCCInstallationDetector is essentially immutable. 1040 /// 1041 /// FIXME: We shouldn't need an explicit TargetTriple parameter here, and 1042 /// should instead pull the target out of the driver. This is currently 1043 /// necessary because the driver doesn't store the final version of the target 1044 /// triple. GCCInstallationDetector(const Driver & D,const llvm::Triple & TargetTriple,const ArgList & Args)1045 Generic_GCC::GCCInstallationDetector::GCCInstallationDetector( 1046 const Driver &D, 1047 const llvm::Triple &TargetTriple, 1048 const ArgList &Args) 1049 : IsValid(false) { 1050 llvm::Triple MultiarchTriple 1051 = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant() 1052 : TargetTriple.get32BitArchVariant(); 1053 llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); 1054 // The library directories which may contain GCC installations. 1055 SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs; 1056 // The compatible GCC triples for this particular architecture. 1057 SmallVector<StringRef, 10> CandidateTripleAliases; 1058 SmallVector<StringRef, 10> CandidateMultiarchTripleAliases; 1059 CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs, 1060 CandidateTripleAliases, 1061 CandidateMultiarchLibDirs, 1062 CandidateMultiarchTripleAliases); 1063 1064 // Compute the set of prefixes for our search. 1065 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), 1066 D.PrefixDirs.end()); 1067 1068 StringRef GCCToolchainDir = getGCCToolchainDir(Args); 1069 if (GCCToolchainDir != "") { 1070 if (GCCToolchainDir.back() == '/') 1071 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the / 1072 1073 Prefixes.push_back(GCCToolchainDir); 1074 } else { 1075 Prefixes.push_back(D.SysRoot); 1076 Prefixes.push_back(D.SysRoot + "/usr"); 1077 Prefixes.push_back(D.InstalledDir + "/.."); 1078 } 1079 1080 // Loop over the various components which exist and select the best GCC 1081 // installation available. GCC installs are ranked by version number. 1082 Version = GCCVersion::Parse("0.0.0"); 1083 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) { 1084 if (!llvm::sys::fs::exists(Prefixes[i])) 1085 continue; 1086 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) { 1087 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str(); 1088 if (!llvm::sys::fs::exists(LibDir)) 1089 continue; 1090 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k) 1091 ScanLibDirForGCCTriple(TargetArch, LibDir, CandidateTripleAliases[k]); 1092 } 1093 for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) { 1094 const std::string LibDir 1095 = Prefixes[i] + CandidateMultiarchLibDirs[j].str(); 1096 if (!llvm::sys::fs::exists(LibDir)) 1097 continue; 1098 for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke; 1099 ++k) 1100 ScanLibDirForGCCTriple(TargetArch, LibDir, 1101 CandidateMultiarchTripleAliases[k], 1102 /*NeedsMultiarchSuffix=*/true); 1103 } 1104 } 1105 } 1106 CollectLibDirsAndTriples(const llvm::Triple & TargetTriple,const llvm::Triple & MultiarchTriple,SmallVectorImpl<StringRef> & LibDirs,SmallVectorImpl<StringRef> & TripleAliases,SmallVectorImpl<StringRef> & MultiarchLibDirs,SmallVectorImpl<StringRef> & MultiarchTripleAliases)1107 /*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples( 1108 const llvm::Triple &TargetTriple, 1109 const llvm::Triple &MultiarchTriple, 1110 SmallVectorImpl<StringRef> &LibDirs, 1111 SmallVectorImpl<StringRef> &TripleAliases, 1112 SmallVectorImpl<StringRef> &MultiarchLibDirs, 1113 SmallVectorImpl<StringRef> &MultiarchTripleAliases) { 1114 // Declare a bunch of static data sets that we'll select between below. These 1115 // are specifically designed to always refer to string literals to avoid any 1116 // lifetime or initialization issues. 1117 static const char *const ARMLibDirs[] = { "/lib" }; 1118 static const char *const ARMTriples[] = { 1119 "arm-linux-gnueabi", 1120 "arm-linux-androideabi" 1121 }; 1122 static const char *const ARMHFTriples[] = { 1123 "arm-linux-gnueabihf", 1124 }; 1125 1126 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" }; 1127 static const char *const X86_64Triples[] = { 1128 "x86_64-linux-gnu", 1129 "x86_64-unknown-linux-gnu", 1130 "x86_64-pc-linux-gnu", 1131 "x86_64-redhat-linux6E", 1132 "x86_64-redhat-linux", 1133 "x86_64-suse-linux", 1134 "x86_64-manbo-linux-gnu", 1135 "x86_64-linux-gnu", 1136 "x86_64-slackware-linux" 1137 }; 1138 static const char *const X86LibDirs[] = { "/lib32", "/lib" }; 1139 static const char *const X86Triples[] = { 1140 "i686-linux-gnu", 1141 "i686-pc-linux-gnu", 1142 "i486-linux-gnu", 1143 "i386-linux-gnu", 1144 "i686-redhat-linux", 1145 "i586-redhat-linux", 1146 "i386-redhat-linux", 1147 "i586-suse-linux", 1148 "i486-slackware-linux", 1149 "i686-montavista-linux" 1150 }; 1151 1152 static const char *const MIPSLibDirs[] = { "/lib" }; 1153 static const char *const MIPSTriples[] = { "mips-linux-gnu" }; 1154 static const char *const MIPSELLibDirs[] = { "/lib" }; 1155 static const char *const MIPSELTriples[] = { "mipsel-linux-gnu" }; 1156 1157 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" }; 1158 static const char *const MIPS64Triples[] = { "mips64-linux-gnu" }; 1159 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" }; 1160 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" }; 1161 1162 static const char *const PPCLibDirs[] = { "/lib32", "/lib" }; 1163 static const char *const PPCTriples[] = { 1164 "powerpc-linux-gnu", 1165 "powerpc-unknown-linux-gnu", 1166 "powerpc-suse-linux", 1167 "powerpc-montavista-linuxspe" 1168 }; 1169 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" }; 1170 static const char *const PPC64Triples[] = { 1171 "powerpc64-linux-gnu", 1172 "powerpc64-unknown-linux-gnu", 1173 "powerpc64-suse-linux", 1174 "ppc64-redhat-linux" 1175 }; 1176 1177 switch (TargetTriple.getArch()) { 1178 case llvm::Triple::arm: 1179 case llvm::Triple::thumb: 1180 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs)); 1181 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 1182 TripleAliases.append( 1183 ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples)); 1184 } else { 1185 TripleAliases.append( 1186 ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples)); 1187 } 1188 break; 1189 case llvm::Triple::x86_64: 1190 LibDirs.append( 1191 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1192 TripleAliases.append( 1193 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1194 MultiarchLibDirs.append( 1195 X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1196 MultiarchTripleAliases.append( 1197 X86Triples, X86Triples + llvm::array_lengthof(X86Triples)); 1198 break; 1199 case llvm::Triple::x86: 1200 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1201 TripleAliases.append( 1202 X86Triples, X86Triples + llvm::array_lengthof(X86Triples)); 1203 MultiarchLibDirs.append( 1204 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1205 MultiarchTripleAliases.append( 1206 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1207 break; 1208 case llvm::Triple::mips: 1209 LibDirs.append( 1210 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1211 TripleAliases.append( 1212 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1213 MultiarchLibDirs.append( 1214 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1215 MultiarchTripleAliases.append( 1216 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 1217 break; 1218 case llvm::Triple::mipsel: 1219 LibDirs.append( 1220 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1221 TripleAliases.append( 1222 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 1223 MultiarchLibDirs.append( 1224 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1225 MultiarchTripleAliases.append( 1226 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1227 break; 1228 case llvm::Triple::mips64: 1229 LibDirs.append( 1230 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1231 TripleAliases.append( 1232 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 1233 MultiarchLibDirs.append( 1234 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1235 MultiarchTripleAliases.append( 1236 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1237 break; 1238 case llvm::Triple::mips64el: 1239 LibDirs.append( 1240 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1241 TripleAliases.append( 1242 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1243 MultiarchLibDirs.append( 1244 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1245 MultiarchTripleAliases.append( 1246 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 1247 break; 1248 case llvm::Triple::ppc: 1249 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1250 TripleAliases.append( 1251 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples)); 1252 MultiarchLibDirs.append( 1253 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1254 MultiarchTripleAliases.append( 1255 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1256 break; 1257 case llvm::Triple::ppc64: 1258 LibDirs.append( 1259 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1260 TripleAliases.append( 1261 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1262 MultiarchLibDirs.append( 1263 PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1264 MultiarchTripleAliases.append( 1265 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples)); 1266 break; 1267 1268 default: 1269 // By default, just rely on the standard lib directories and the original 1270 // triple. 1271 break; 1272 } 1273 1274 // Always append the drivers target triple to the end, in case it doesn't 1275 // match any of our aliases. 1276 TripleAliases.push_back(TargetTriple.str()); 1277 1278 // Also include the multiarch variant if it's different. 1279 if (TargetTriple.str() != MultiarchTriple.str()) 1280 MultiarchTripleAliases.push_back(MultiarchTriple.str()); 1281 } 1282 ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch,const std::string & LibDir,StringRef CandidateTriple,bool NeedsMultiarchSuffix)1283 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( 1284 llvm::Triple::ArchType TargetArch, const std::string &LibDir, 1285 StringRef CandidateTriple, bool NeedsMultiarchSuffix) { 1286 // There are various different suffixes involving the triple we 1287 // check for. We also record what is necessary to walk from each back 1288 // up to the lib directory. 1289 const std::string LibSuffixes[] = { 1290 "/gcc/" + CandidateTriple.str(), 1291 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), 1292 1293 // Ubuntu has a strange mis-matched pair of triples that this happens to 1294 // match. 1295 // FIXME: It may be worthwhile to generalize this and look for a second 1296 // triple. 1297 "/i386-linux-gnu/gcc/" + CandidateTriple.str() 1298 }; 1299 const std::string InstallSuffixes[] = { 1300 "/../../..", 1301 "/../../../..", 1302 "/../../../.." 1303 }; 1304 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu. 1305 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) - 1306 (TargetArch != llvm::Triple::x86)); 1307 for (unsigned i = 0; i < NumLibSuffixes; ++i) { 1308 StringRef LibSuffix = LibSuffixes[i]; 1309 llvm::error_code EC; 1310 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE; 1311 !EC && LI != LE; LI = LI.increment(EC)) { 1312 StringRef VersionText = llvm::sys::path::filename(LI->path()); 1313 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); 1314 static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" }; 1315 if (CandidateVersion < MinVersion) 1316 continue; 1317 if (CandidateVersion <= Version) 1318 continue; 1319 1320 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs 1321 // in what would normally be GCCInstallPath and put the 64-bit 1322 // libs in a subdirectory named 64. The simple logic we follow is that 1323 // *if* there is a subdirectory of the right name with crtbegin.o in it, 1324 // we use that. If not, and if not a multiarch triple, we look for 1325 // crtbegin.o without the subdirectory. 1326 StringRef MultiarchSuffix 1327 = (TargetArch == llvm::Triple::x86_64 || 1328 TargetArch == llvm::Triple::ppc64 || 1329 TargetArch == llvm::Triple::mips64 || 1330 TargetArch == llvm::Triple::mips64el) ? "/64" : "/32"; 1331 if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) { 1332 GCCMultiarchSuffix = MultiarchSuffix.str(); 1333 } else { 1334 if (NeedsMultiarchSuffix || 1335 !llvm::sys::fs::exists(LI->path() + "/crtbegin.o")) 1336 continue; 1337 GCCMultiarchSuffix.clear(); 1338 } 1339 1340 Version = CandidateVersion; 1341 GCCTriple.setTriple(CandidateTriple); 1342 // FIXME: We hack together the directory name here instead of 1343 // using LI to ensure stable path separators across Windows and 1344 // Linux. 1345 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str(); 1346 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i]; 1347 IsValid = true; 1348 } 1349 } 1350 } 1351 Generic_GCC(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1352 Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple, 1353 const ArgList &Args) 1354 : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) { 1355 getProgramPaths().push_back(getDriver().getInstalledDir()); 1356 if (getDriver().getInstalledDir() != getDriver().Dir) 1357 getProgramPaths().push_back(getDriver().Dir); 1358 } 1359 ~Generic_GCC()1360 Generic_GCC::~Generic_GCC() { 1361 // Free tool implementations. 1362 for (llvm::DenseMap<unsigned, Tool*>::iterator 1363 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1364 delete it->second; 1365 } 1366 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1367 Tool &Generic_GCC::SelectTool(const Compilation &C, 1368 const JobAction &JA, 1369 const ActionList &Inputs) const { 1370 Action::ActionClass Key; 1371 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1372 Key = Action::AnalyzeJobClass; 1373 else 1374 Key = JA.getKind(); 1375 1376 Tool *&T = Tools[Key]; 1377 if (!T) { 1378 switch (Key) { 1379 case Action::InputClass: 1380 case Action::BindArchClass: 1381 llvm_unreachable("Invalid tool kind."); 1382 case Action::PreprocessJobClass: 1383 T = new tools::gcc::Preprocess(*this); break; 1384 case Action::PrecompileJobClass: 1385 T = new tools::gcc::Precompile(*this); break; 1386 case Action::AnalyzeJobClass: 1387 case Action::MigrateJobClass: 1388 T = new tools::Clang(*this); break; 1389 case Action::CompileJobClass: 1390 T = new tools::gcc::Compile(*this); break; 1391 case Action::AssembleJobClass: 1392 T = new tools::gcc::Assemble(*this); break; 1393 case Action::LinkJobClass: 1394 T = new tools::gcc::Link(*this); break; 1395 1396 // This is a bit ungeneric, but the only platform using a driver 1397 // driver is Darwin. 1398 case Action::LipoJobClass: 1399 T = new tools::darwin::Lipo(*this); break; 1400 case Action::DsymutilJobClass: 1401 T = new tools::darwin::Dsymutil(*this); break; 1402 case Action::VerifyJobClass: 1403 T = new tools::darwin::VerifyDebug(*this); break; 1404 } 1405 } 1406 1407 return *T; 1408 } 1409 IsUnwindTablesDefault() const1410 bool Generic_GCC::IsUnwindTablesDefault() const { 1411 // FIXME: Gross; we should probably have some separate target 1412 // definition, possibly even reusing the one in clang. 1413 return getArchName() == "x86_64"; 1414 } 1415 GetDefaultRelocationModel() const1416 const char *Generic_GCC::GetDefaultRelocationModel() const { 1417 return "static"; 1418 } 1419 GetForcedPicModel() const1420 const char *Generic_GCC::GetForcedPicModel() const { 1421 return 0; 1422 } 1423 /// Hexagon Toolchain 1424 Hexagon_TC(const Driver & D,const llvm::Triple & Triple)1425 Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple) 1426 : ToolChain(D, Triple) { 1427 getProgramPaths().push_back(getDriver().getInstalledDir()); 1428 if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 1429 getProgramPaths().push_back(getDriver().Dir); 1430 } 1431 ~Hexagon_TC()1432 Hexagon_TC::~Hexagon_TC() { 1433 // Free tool implementations. 1434 for (llvm::DenseMap<unsigned, Tool*>::iterator 1435 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1436 delete it->second; 1437 } 1438 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1439 Tool &Hexagon_TC::SelectTool(const Compilation &C, 1440 const JobAction &JA, 1441 const ActionList &Inputs) const { 1442 Action::ActionClass Key; 1443 // if (JA.getKind () == Action::CompileJobClass) 1444 // Key = JA.getKind (); 1445 // else 1446 1447 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1448 Key = Action::AnalyzeJobClass; 1449 else 1450 Key = JA.getKind(); 1451 // if ((JA.getKind () == Action::CompileJobClass) 1452 // && (JA.getType () != types::TY_LTO_BC)) { 1453 // Key = JA.getKind (); 1454 // } 1455 1456 Tool *&T = Tools[Key]; 1457 if (!T) { 1458 switch (Key) { 1459 case Action::InputClass: 1460 case Action::BindArchClass: 1461 assert(0 && "Invalid tool kind."); 1462 case Action::AnalyzeJobClass: 1463 T = new tools::Clang(*this); break; 1464 case Action::AssembleJobClass: 1465 T = new tools::hexagon::Assemble(*this); break; 1466 case Action::LinkJobClass: 1467 T = new tools::hexagon::Link(*this); break; 1468 default: 1469 assert(false && "Unsupported action for Hexagon target."); 1470 } 1471 } 1472 1473 return *T; 1474 } 1475 IsUnwindTablesDefault() const1476 bool Hexagon_TC::IsUnwindTablesDefault() const { 1477 // FIXME: Gross; we should probably have some separate target 1478 // definition, possibly even reusing the one in clang. 1479 return getArchName() == "x86_64"; 1480 } 1481 GetDefaultRelocationModel() const1482 const char *Hexagon_TC::GetDefaultRelocationModel() const { 1483 return "static"; 1484 } 1485 GetForcedPicModel() const1486 const char *Hexagon_TC::GetForcedPicModel() const { 1487 return 0; 1488 } // End Hexagon 1489 1490 1491 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform 1492 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 1493 /// Currently does not support anything else but compilation. 1494 TCEToolChain(const Driver & D,const llvm::Triple & Triple)1495 TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple) 1496 : ToolChain(D, Triple) { 1497 // Path mangling to find libexec 1498 std::string Path(getDriver().Dir); 1499 1500 Path += "/../libexec"; 1501 getProgramPaths().push_back(Path); 1502 } 1503 ~TCEToolChain()1504 TCEToolChain::~TCEToolChain() { 1505 for (llvm::DenseMap<unsigned, Tool*>::iterator 1506 it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1507 delete it->second; 1508 } 1509 IsMathErrnoDefault() const1510 bool TCEToolChain::IsMathErrnoDefault() const { 1511 return true; 1512 } 1513 IsUnwindTablesDefault() const1514 bool TCEToolChain::IsUnwindTablesDefault() const { 1515 return false; 1516 } 1517 GetDefaultRelocationModel() const1518 const char *TCEToolChain::GetDefaultRelocationModel() const { 1519 return "static"; 1520 } 1521 GetForcedPicModel() const1522 const char *TCEToolChain::GetForcedPicModel() const { 1523 return 0; 1524 } 1525 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1526 Tool &TCEToolChain::SelectTool(const Compilation &C, 1527 const JobAction &JA, 1528 const ActionList &Inputs) const { 1529 Action::ActionClass Key; 1530 Key = Action::AnalyzeJobClass; 1531 1532 Tool *&T = Tools[Key]; 1533 if (!T) { 1534 switch (Key) { 1535 case Action::PreprocessJobClass: 1536 T = new tools::gcc::Preprocess(*this); break; 1537 case Action::AnalyzeJobClass: 1538 T = new tools::Clang(*this); break; 1539 default: 1540 llvm_unreachable("Unsupported action for TCE target."); 1541 } 1542 } 1543 return *T; 1544 } 1545 1546 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 1547 OpenBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1548 OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1549 : Generic_ELF(D, Triple, Args) { 1550 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1551 getFilePaths().push_back("/usr/lib"); 1552 } 1553 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1554 Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA, 1555 const ActionList &Inputs) const { 1556 Action::ActionClass Key; 1557 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1558 Key = Action::AnalyzeJobClass; 1559 else 1560 Key = JA.getKind(); 1561 1562 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1563 options::OPT_no_integrated_as, 1564 IsIntegratedAssemblerDefault()); 1565 1566 Tool *&T = Tools[Key]; 1567 if (!T) { 1568 switch (Key) { 1569 case Action::AssembleJobClass: { 1570 if (UseIntegratedAs) 1571 T = new tools::ClangAs(*this); 1572 else 1573 T = new tools::openbsd::Assemble(*this); 1574 break; 1575 } 1576 case Action::LinkJobClass: 1577 T = new tools::openbsd::Link(*this); break; 1578 default: 1579 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1580 } 1581 } 1582 1583 return *T; 1584 } 1585 1586 /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly. 1587 Bitrig(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1588 Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1589 : Generic_ELF(D, Triple, Args) { 1590 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1591 getFilePaths().push_back("/usr/lib"); 1592 } 1593 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1594 Tool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA, 1595 const ActionList &Inputs) const { 1596 Action::ActionClass Key; 1597 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1598 Key = Action::AnalyzeJobClass; 1599 else 1600 Key = JA.getKind(); 1601 1602 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1603 options::OPT_no_integrated_as, 1604 IsIntegratedAssemblerDefault()); 1605 1606 Tool *&T = Tools[Key]; 1607 if (!T) { 1608 switch (Key) { 1609 case Action::AssembleJobClass: { 1610 if (UseIntegratedAs) 1611 T = new tools::ClangAs(*this); 1612 else 1613 T = new tools::bitrig::Assemble(*this); 1614 break; 1615 } 1616 case Action::LinkJobClass: 1617 T = new tools::bitrig::Link(*this); break; 1618 default: 1619 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1620 } 1621 } 1622 1623 return *T; 1624 } 1625 AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const1626 void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 1627 ArgStringList &CC1Args) const { 1628 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 1629 DriverArgs.hasArg(options::OPT_nostdincxx)) 1630 return; 1631 1632 std::string Triple = getTriple().str(); 1633 if (Triple.substr(0, 5) == "amd64") 1634 Triple.replace(0, 5, "x86_64"); 1635 1636 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2"); 1637 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/backward"); 1638 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/4.6.2/" + Triple); 1639 1640 } 1641 AddCXXStdlibLibArgs(const ArgList & Args,ArgStringList & CmdArgs) const1642 void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args, 1643 ArgStringList &CmdArgs) const { 1644 CmdArgs.push_back("-lstdc++"); 1645 } 1646 1647 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 1648 FreeBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1649 FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1650 : Generic_ELF(D, Triple, Args) { 1651 1652 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall 1653 // back to '/usr/lib' if it doesn't exist. 1654 if ((Triple.getArch() == llvm::Triple::x86 || 1655 Triple.getArch() == llvm::Triple::ppc) && 1656 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) 1657 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); 1658 else 1659 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); 1660 } 1661 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1662 Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA, 1663 const ActionList &Inputs) const { 1664 Action::ActionClass Key; 1665 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1666 Key = Action::AnalyzeJobClass; 1667 else 1668 Key = JA.getKind(); 1669 1670 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1671 options::OPT_no_integrated_as, 1672 IsIntegratedAssemblerDefault()); 1673 1674 Tool *&T = Tools[Key]; 1675 if (!T) { 1676 switch (Key) { 1677 case Action::AssembleJobClass: 1678 if (UseIntegratedAs) 1679 T = new tools::ClangAs(*this); 1680 else 1681 T = new tools::freebsd::Assemble(*this); 1682 break; 1683 case Action::LinkJobClass: 1684 T = new tools::freebsd::Link(*this); break; 1685 default: 1686 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1687 } 1688 } 1689 1690 return *T; 1691 } 1692 1693 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly. 1694 NetBSD(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1695 NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1696 : Generic_ELF(D, Triple, Args) { 1697 1698 if (getDriver().UseStdLib) { 1699 // When targeting a 32-bit platform, try the special directory used on 1700 // 64-bit hosts, and only fall back to the main library directory if that 1701 // doesn't work. 1702 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure 1703 // what all logic is needed to emulate the '=' prefix here. 1704 if (Triple.getArch() == llvm::Triple::x86) 1705 getFilePaths().push_back("=/usr/lib/i386"); 1706 1707 getFilePaths().push_back("=/usr/lib"); 1708 } 1709 } 1710 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1711 Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA, 1712 const ActionList &Inputs) const { 1713 Action::ActionClass Key; 1714 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1715 Key = Action::AnalyzeJobClass; 1716 else 1717 Key = JA.getKind(); 1718 1719 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1720 options::OPT_no_integrated_as, 1721 IsIntegratedAssemblerDefault()); 1722 1723 Tool *&T = Tools[Key]; 1724 if (!T) { 1725 switch (Key) { 1726 case Action::AssembleJobClass: 1727 if (UseIntegratedAs) 1728 T = new tools::ClangAs(*this); 1729 else 1730 T = new tools::netbsd::Assemble(*this); 1731 break; 1732 case Action::LinkJobClass: 1733 T = new tools::netbsd::Link(*this); 1734 break; 1735 default: 1736 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1737 } 1738 } 1739 1740 return *T; 1741 } 1742 1743 /// Minix - Minix tool chain which can call as(1) and ld(1) directly. 1744 Minix(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1745 Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 1746 : Generic_ELF(D, Triple, Args) { 1747 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1748 getFilePaths().push_back("/usr/lib"); 1749 } 1750 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1751 Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA, 1752 const ActionList &Inputs) const { 1753 Action::ActionClass Key; 1754 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1755 Key = Action::AnalyzeJobClass; 1756 else 1757 Key = JA.getKind(); 1758 1759 Tool *&T = Tools[Key]; 1760 if (!T) { 1761 switch (Key) { 1762 case Action::AssembleJobClass: 1763 T = new tools::minix::Assemble(*this); break; 1764 case Action::LinkJobClass: 1765 T = new tools::minix::Link(*this); break; 1766 default: 1767 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1768 } 1769 } 1770 1771 return *T; 1772 } 1773 1774 /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 1775 AuroraUX(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1776 AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple, 1777 const ArgList &Args) 1778 : Generic_GCC(D, Triple, Args) { 1779 1780 getProgramPaths().push_back(getDriver().getInstalledDir()); 1781 if (getDriver().getInstalledDir() != getDriver().Dir) 1782 getProgramPaths().push_back(getDriver().Dir); 1783 1784 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1785 getFilePaths().push_back("/usr/lib"); 1786 getFilePaths().push_back("/usr/sfw/lib"); 1787 getFilePaths().push_back("/opt/gcc4/lib"); 1788 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 1789 1790 } 1791 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1792 Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA, 1793 const ActionList &Inputs) const { 1794 Action::ActionClass Key; 1795 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1796 Key = Action::AnalyzeJobClass; 1797 else 1798 Key = JA.getKind(); 1799 1800 Tool *&T = Tools[Key]; 1801 if (!T) { 1802 switch (Key) { 1803 case Action::AssembleJobClass: 1804 T = new tools::auroraux::Assemble(*this); break; 1805 case Action::LinkJobClass: 1806 T = new tools::auroraux::Link(*this); break; 1807 default: 1808 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1809 } 1810 } 1811 1812 return *T; 1813 } 1814 1815 /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly. 1816 Solaris(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)1817 Solaris::Solaris(const Driver &D, const llvm::Triple& Triple, 1818 const ArgList &Args) 1819 : Generic_GCC(D, Triple, Args) { 1820 1821 getProgramPaths().push_back(getDriver().getInstalledDir()); 1822 if (getDriver().getInstalledDir() != getDriver().Dir) 1823 getProgramPaths().push_back(getDriver().Dir); 1824 1825 getFilePaths().push_back(getDriver().Dir + "/../lib"); 1826 getFilePaths().push_back("/usr/lib"); 1827 } 1828 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const1829 Tool &Solaris::SelectTool(const Compilation &C, const JobAction &JA, 1830 const ActionList &Inputs) const { 1831 Action::ActionClass Key; 1832 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1833 Key = Action::AnalyzeJobClass; 1834 else 1835 Key = JA.getKind(); 1836 1837 Tool *&T = Tools[Key]; 1838 if (!T) { 1839 switch (Key) { 1840 case Action::AssembleJobClass: 1841 T = new tools::solaris::Assemble(*this); break; 1842 case Action::LinkJobClass: 1843 T = new tools::solaris::Link(*this); break; 1844 default: 1845 T = &Generic_GCC::SelectTool(C, JA, Inputs); 1846 } 1847 } 1848 1849 return *T; 1850 } 1851 1852 /// Linux toolchain (very bare-bones at the moment). 1853 1854 enum LinuxDistro { 1855 ArchLinux, 1856 DebianLenny, 1857 DebianSqueeze, 1858 DebianWheezy, 1859 Exherbo, 1860 RHEL4, 1861 RHEL5, 1862 RHEL6, 1863 Fedora13, 1864 Fedora14, 1865 Fedora15, 1866 Fedora16, 1867 FedoraRawhide, 1868 OpenSuse11_3, 1869 OpenSuse11_4, 1870 OpenSuse12_1, 1871 OpenSuse12_2, 1872 UbuntuHardy, 1873 UbuntuIntrepid, 1874 UbuntuJaunty, 1875 UbuntuKarmic, 1876 UbuntuLucid, 1877 UbuntuMaverick, 1878 UbuntuNatty, 1879 UbuntuOneiric, 1880 UbuntuPrecise, 1881 UnknownDistro 1882 }; 1883 IsRedhat(enum LinuxDistro Distro)1884 static bool IsRedhat(enum LinuxDistro Distro) { 1885 return (Distro >= Fedora13 && Distro <= FedoraRawhide) || 1886 (Distro >= RHEL4 && Distro <= RHEL6); 1887 } 1888 IsOpenSuse(enum LinuxDistro Distro)1889 static bool IsOpenSuse(enum LinuxDistro Distro) { 1890 return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2; 1891 } 1892 IsDebian(enum LinuxDistro Distro)1893 static bool IsDebian(enum LinuxDistro Distro) { 1894 return Distro >= DebianLenny && Distro <= DebianWheezy; 1895 } 1896 IsUbuntu(enum LinuxDistro Distro)1897 static bool IsUbuntu(enum LinuxDistro Distro) { 1898 return Distro >= UbuntuHardy && Distro <= UbuntuPrecise; 1899 } 1900 DetectLinuxDistro(llvm::Triple::ArchType Arch)1901 static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { 1902 OwningPtr<llvm::MemoryBuffer> File; 1903 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) { 1904 StringRef Data = File.get()->getBuffer(); 1905 SmallVector<StringRef, 8> Lines; 1906 Data.split(Lines, "\n"); 1907 LinuxDistro Version = UnknownDistro; 1908 for (unsigned i = 0, s = Lines.size(); i != s; ++i) 1909 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME=")) 1910 Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17)) 1911 .Case("hardy", UbuntuHardy) 1912 .Case("intrepid", UbuntuIntrepid) 1913 .Case("jaunty", UbuntuJaunty) 1914 .Case("karmic", UbuntuKarmic) 1915 .Case("lucid", UbuntuLucid) 1916 .Case("maverick", UbuntuMaverick) 1917 .Case("natty", UbuntuNatty) 1918 .Case("oneiric", UbuntuOneiric) 1919 .Case("precise", UbuntuPrecise) 1920 .Default(UnknownDistro); 1921 return Version; 1922 } 1923 1924 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) { 1925 StringRef Data = File.get()->getBuffer(); 1926 if (Data.startswith("Fedora release 16")) 1927 return Fedora16; 1928 else if (Data.startswith("Fedora release 15")) 1929 return Fedora15; 1930 else if (Data.startswith("Fedora release 14")) 1931 return Fedora14; 1932 else if (Data.startswith("Fedora release 13")) 1933 return Fedora13; 1934 else if (Data.startswith("Fedora release") && 1935 Data.find("Rawhide") != StringRef::npos) 1936 return FedoraRawhide; 1937 else if (Data.startswith("Red Hat Enterprise Linux") && 1938 Data.find("release 6") != StringRef::npos) 1939 return RHEL6; 1940 else if ((Data.startswith("Red Hat Enterprise Linux") || 1941 Data.startswith("CentOS")) && 1942 Data.find("release 5") != StringRef::npos) 1943 return RHEL5; 1944 else if ((Data.startswith("Red Hat Enterprise Linux") || 1945 Data.startswith("CentOS")) && 1946 Data.find("release 4") != StringRef::npos) 1947 return RHEL4; 1948 return UnknownDistro; 1949 } 1950 1951 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) { 1952 StringRef Data = File.get()->getBuffer(); 1953 if (Data[0] == '5') 1954 return DebianLenny; 1955 else if (Data.startswith("squeeze/sid") || Data[0] == '6') 1956 return DebianSqueeze; 1957 else if (Data.startswith("wheezy/sid") || Data[0] == '7') 1958 return DebianWheezy; 1959 return UnknownDistro; 1960 } 1961 1962 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) 1963 return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer()) 1964 .StartsWith("openSUSE 11.3", OpenSuse11_3) 1965 .StartsWith("openSUSE 11.4", OpenSuse11_4) 1966 .StartsWith("openSUSE 12.1", OpenSuse12_1) 1967 .StartsWith("openSUSE 12.2", OpenSuse12_2) 1968 .Default(UnknownDistro); 1969 1970 bool Exists; 1971 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists) 1972 return Exherbo; 1973 1974 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists) 1975 return ArchLinux; 1976 1977 return UnknownDistro; 1978 } 1979 1980 /// \brief Get our best guess at the multiarch triple for a target. 1981 /// 1982 /// Debian-based systems are starting to use a multiarch setup where they use 1983 /// a target-triple directory in the library and header search paths. 1984 /// Unfortunately, this triple does not align with the vanilla target triple, 1985 /// so we provide a rough mapping here. getMultiarchTriple(const llvm::Triple TargetTriple,StringRef SysRoot)1986 static std::string getMultiarchTriple(const llvm::Triple TargetTriple, 1987 StringRef SysRoot) { 1988 // For most architectures, just use whatever we have rather than trying to be 1989 // clever. 1990 switch (TargetTriple.getArch()) { 1991 default: 1992 return TargetTriple.str(); 1993 1994 // We use the existence of '/lib/<triple>' as a directory to detect some 1995 // common linux triples that don't quite match the Clang triple for both 1996 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these 1997 // regardless of what the actual target triple is. 1998 case llvm::Triple::arm: 1999 case llvm::Triple::thumb: 2000 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 2001 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf")) 2002 return "arm-linux-gnueabihf"; 2003 } else { 2004 if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi")) 2005 return "arm-linux-gnueabi"; 2006 } 2007 return TargetTriple.str(); 2008 case llvm::Triple::x86: 2009 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu")) 2010 return "i386-linux-gnu"; 2011 return TargetTriple.str(); 2012 case llvm::Triple::x86_64: 2013 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu")) 2014 return "x86_64-linux-gnu"; 2015 return TargetTriple.str(); 2016 case llvm::Triple::mips: 2017 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu")) 2018 return "mips-linux-gnu"; 2019 return TargetTriple.str(); 2020 case llvm::Triple::mipsel: 2021 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu")) 2022 return "mipsel-linux-gnu"; 2023 return TargetTriple.str(); 2024 case llvm::Triple::ppc: 2025 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu")) 2026 return "powerpc-linux-gnu"; 2027 return TargetTriple.str(); 2028 case llvm::Triple::ppc64: 2029 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu")) 2030 return "powerpc64-linux-gnu"; 2031 return TargetTriple.str(); 2032 } 2033 } 2034 addPathIfExists(Twine Path,ToolChain::path_list & Paths)2035 static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) { 2036 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str()); 2037 } 2038 Linux(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2039 Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) 2040 : Generic_ELF(D, Triple, Args) { 2041 llvm::Triple::ArchType Arch = Triple.getArch(); 2042 const std::string &SysRoot = getDriver().SysRoot; 2043 2044 // OpenSuse stores the linker with the compiler, add that to the search 2045 // path. 2046 ToolChain::path_list &PPaths = getProgramPaths(); 2047 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" + 2048 GCCInstallation.getTriple().str() + "/bin").str()); 2049 2050 Linker = GetProgramPath("ld"); 2051 2052 LinuxDistro Distro = DetectLinuxDistro(Arch); 2053 2054 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) { 2055 ExtraOpts.push_back("-z"); 2056 ExtraOpts.push_back("relro"); 2057 } 2058 2059 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) 2060 ExtraOpts.push_back("-X"); 2061 2062 const bool IsMips = Arch == llvm::Triple::mips || 2063 Arch == llvm::Triple::mipsel || 2064 Arch == llvm::Triple::mips64 || 2065 Arch == llvm::Triple::mips64el; 2066 2067 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android; 2068 2069 // Do not use 'gnu' hash style for Mips targets because .gnu.hash 2070 // and the MIPS ABI require .dynsym to be sorted in different ways. 2071 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS 2072 // ABI requires a mapping between the GOT and the symbol table. 2073 // Android loader does not support .gnu.hash. 2074 if (!IsMips && !IsAndroid) { 2075 if (IsRedhat(Distro) || IsOpenSuse(Distro) || 2076 (IsUbuntu(Distro) && Distro >= UbuntuMaverick)) 2077 ExtraOpts.push_back("--hash-style=gnu"); 2078 2079 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid || 2080 Distro == UbuntuJaunty || Distro == UbuntuKarmic) 2081 ExtraOpts.push_back("--hash-style=both"); 2082 } 2083 2084 if (IsRedhat(Distro)) 2085 ExtraOpts.push_back("--no-add-needed"); 2086 2087 if (Distro == DebianSqueeze || Distro == DebianWheezy || 2088 IsOpenSuse(Distro) || 2089 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) || 2090 (IsUbuntu(Distro) && Distro >= UbuntuKarmic)) 2091 ExtraOpts.push_back("--build-id"); 2092 2093 if (IsOpenSuse(Distro)) 2094 ExtraOpts.push_back("--enable-new-dtags"); 2095 2096 // The selection of paths to try here is designed to match the patterns which 2097 // the GCC driver itself uses, as this is part of the GCC-compatible driver. 2098 // This was determined by running GCC in a fake filesystem, creating all 2099 // possible permutations of these directories, and seeing which ones it added 2100 // to the link paths. 2101 path_list &Paths = getFilePaths(); 2102 2103 const std::string Multilib = Triple.isArch32Bit() ? "lib32" : "lib64"; 2104 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot); 2105 2106 // Add the multilib suffixed paths where they are available. 2107 if (GCCInstallation.isValid()) { 2108 const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 2109 const std::string &LibPath = GCCInstallation.getParentLibPath(); 2110 addPathIfExists((GCCInstallation.getInstallPath() + 2111 GCCInstallation.getMultiarchSuffix()), 2112 Paths); 2113 2114 // If the GCC installation we found is inside of the sysroot, we want to 2115 // prefer libraries installed in the parent prefix of the GCC installation. 2116 // It is important to *not* use these paths when the GCC installation is 2117 // outside of the system root as that can pick up unintended libraries. 2118 // This usually happens when there is an external cross compiler on the 2119 // host system, and a more minimal sysroot available that is the target of 2120 // the cross. 2121 if (StringRef(LibPath).startswith(SysRoot)) { 2122 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib, 2123 Paths); 2124 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths); 2125 addPathIfExists(LibPath + "/../" + Multilib, Paths); 2126 } 2127 // On Android, libraries in the parent prefix of the GCC installation are 2128 // preferred to the ones under sysroot. 2129 if (IsAndroid) { 2130 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths); 2131 } 2132 } 2133 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths); 2134 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths); 2135 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths); 2136 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths); 2137 2138 // Try walking via the GCC triple path in case of multiarch GCC 2139 // installations with strange symlinks. 2140 if (GCCInstallation.isValid()) 2141 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() + 2142 "/../../" + Multilib, Paths); 2143 2144 // Add the non-multilib suffixed paths (if potentially different). 2145 if (GCCInstallation.isValid()) { 2146 const std::string &LibPath = GCCInstallation.getParentLibPath(); 2147 const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 2148 if (!GCCInstallation.getMultiarchSuffix().empty()) 2149 addPathIfExists(GCCInstallation.getInstallPath(), Paths); 2150 2151 if (StringRef(LibPath).startswith(SysRoot)) { 2152 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths); 2153 addPathIfExists(LibPath, Paths); 2154 } 2155 } 2156 addPathIfExists(SysRoot + "/lib", Paths); 2157 addPathIfExists(SysRoot + "/usr/lib", Paths); 2158 } 2159 HasNativeLLVMSupport() const2160 bool Linux::HasNativeLLVMSupport() const { 2161 return true; 2162 } 2163 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const2164 Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA, 2165 const ActionList &Inputs) const { 2166 Action::ActionClass Key; 2167 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 2168 Key = Action::AnalyzeJobClass; 2169 else 2170 Key = JA.getKind(); 2171 2172 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 2173 options::OPT_no_integrated_as, 2174 IsIntegratedAssemblerDefault()); 2175 2176 Tool *&T = Tools[Key]; 2177 if (!T) { 2178 switch (Key) { 2179 case Action::AssembleJobClass: 2180 if (UseIntegratedAs) 2181 T = new tools::ClangAs(*this); 2182 else 2183 T = new tools::linuxtools::Assemble(*this); 2184 break; 2185 case Action::LinkJobClass: 2186 T = new tools::linuxtools::Link(*this); break; 2187 default: 2188 T = &Generic_GCC::SelectTool(C, JA, Inputs); 2189 } 2190 } 2191 2192 return *T; 2193 } 2194 addClangTargetOptions(ArgStringList & CC1Args) const2195 void Linux::addClangTargetOptions(ArgStringList &CC1Args) const { 2196 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion(); 2197 if (V >= Generic_GCC::GCCVersion::Parse("4.7.0")) 2198 CC1Args.push_back("-fuse-init-array"); 2199 } 2200 AddClangSystemIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2201 void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 2202 ArgStringList &CC1Args) const { 2203 const Driver &D = getDriver(); 2204 2205 if (DriverArgs.hasArg(options::OPT_nostdinc)) 2206 return; 2207 2208 if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) 2209 addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include"); 2210 2211 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { 2212 llvm::sys::Path P(D.ResourceDir); 2213 P.appendComponent("include"); 2214 addSystemInclude(DriverArgs, CC1Args, P.str()); 2215 } 2216 2217 if (DriverArgs.hasArg(options::OPT_nostdlibinc)) 2218 return; 2219 2220 // Check for configure-time C include directories. 2221 StringRef CIncludeDirs(C_INCLUDE_DIRS); 2222 if (CIncludeDirs != "") { 2223 SmallVector<StringRef, 5> dirs; 2224 CIncludeDirs.split(dirs, ":"); 2225 for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end(); 2226 I != E; ++I) { 2227 StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : ""; 2228 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I); 2229 } 2230 return; 2231 } 2232 2233 // Lacking those, try to detect the correct set of system includes for the 2234 // target triple. 2235 2236 // Implement generic Debian multiarch support. 2237 const StringRef X86_64MultiarchIncludeDirs[] = { 2238 "/usr/include/x86_64-linux-gnu", 2239 2240 // FIXME: These are older forms of multiarch. It's not clear that they're 2241 // in use in any released version of Debian, so we should consider 2242 // removing them. 2243 "/usr/include/i686-linux-gnu/64", 2244 "/usr/include/i486-linux-gnu/64" 2245 }; 2246 const StringRef X86MultiarchIncludeDirs[] = { 2247 "/usr/include/i386-linux-gnu", 2248 2249 // FIXME: These are older forms of multiarch. It's not clear that they're 2250 // in use in any released version of Debian, so we should consider 2251 // removing them. 2252 "/usr/include/x86_64-linux-gnu/32", 2253 "/usr/include/i686-linux-gnu", 2254 "/usr/include/i486-linux-gnu" 2255 }; 2256 const StringRef ARMMultiarchIncludeDirs[] = { 2257 "/usr/include/arm-linux-gnueabi" 2258 }; 2259 const StringRef ARMHFMultiarchIncludeDirs[] = { 2260 "/usr/include/arm-linux-gnueabihf" 2261 }; 2262 const StringRef MIPSMultiarchIncludeDirs[] = { 2263 "/usr/include/mips-linux-gnu" 2264 }; 2265 const StringRef MIPSELMultiarchIncludeDirs[] = { 2266 "/usr/include/mipsel-linux-gnu" 2267 }; 2268 const StringRef PPCMultiarchIncludeDirs[] = { 2269 "/usr/include/powerpc-linux-gnu" 2270 }; 2271 const StringRef PPC64MultiarchIncludeDirs[] = { 2272 "/usr/include/powerpc64-linux-gnu" 2273 }; 2274 ArrayRef<StringRef> MultiarchIncludeDirs; 2275 if (getTriple().getArch() == llvm::Triple::x86_64) { 2276 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; 2277 } else if (getTriple().getArch() == llvm::Triple::x86) { 2278 MultiarchIncludeDirs = X86MultiarchIncludeDirs; 2279 } else if (getTriple().getArch() == llvm::Triple::arm) { 2280 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) 2281 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs; 2282 else 2283 MultiarchIncludeDirs = ARMMultiarchIncludeDirs; 2284 } else if (getTriple().getArch() == llvm::Triple::mips) { 2285 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs; 2286 } else if (getTriple().getArch() == llvm::Triple::mipsel) { 2287 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs; 2288 } else if (getTriple().getArch() == llvm::Triple::ppc) { 2289 MultiarchIncludeDirs = PPCMultiarchIncludeDirs; 2290 } else if (getTriple().getArch() == llvm::Triple::ppc64) { 2291 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs; 2292 } 2293 for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(), 2294 E = MultiarchIncludeDirs.end(); 2295 I != E; ++I) { 2296 if (llvm::sys::fs::exists(D.SysRoot + *I)) { 2297 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I); 2298 break; 2299 } 2300 } 2301 2302 if (getTriple().getOS() == llvm::Triple::RTEMS) 2303 return; 2304 2305 // Add an include of '/include' directly. This isn't provided by default by 2306 // system GCCs, but is often used with cross-compiling GCCs, and harmless to 2307 // add even when Clang is acting as-if it were a system compiler. 2308 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include"); 2309 2310 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include"); 2311 } 2312 2313 /// \brief Helper to add the thre variant paths for a libstdc++ installation. addLibStdCXXIncludePaths(Twine Base,Twine TargetArchDir,const ArgList & DriverArgs,ArgStringList & CC1Args)2314 /*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 2315 const ArgList &DriverArgs, 2316 ArgStringList &CC1Args) { 2317 if (!llvm::sys::fs::exists(Base)) 2318 return false; 2319 addSystemInclude(DriverArgs, CC1Args, Base); 2320 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir); 2321 addSystemInclude(DriverArgs, CC1Args, Base + "/backward"); 2322 return true; 2323 } 2324 AddClangCXXStdlibIncludeArgs(const ArgList & DriverArgs,ArgStringList & CC1Args) const2325 void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2326 ArgStringList &CC1Args) const { 2327 if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 2328 DriverArgs.hasArg(options::OPT_nostdincxx)) 2329 return; 2330 2331 // Check if libc++ has been enabled and provide its include paths if so. 2332 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) { 2333 // libc++ is always installed at a fixed path on Linux currently. 2334 addSystemInclude(DriverArgs, CC1Args, 2335 getDriver().SysRoot + "/usr/include/c++/v1"); 2336 return; 2337 } 2338 2339 // We need a detected GCC installation on Linux to provide libstdc++'s 2340 // headers. We handled the libc++ case above. 2341 if (!GCCInstallation.isValid()) 2342 return; 2343 2344 // By default, look for the C++ headers in an include directory adjacent to 2345 // the lib directory of the GCC installation. Note that this is expect to be 2346 // equivalent to '/usr/include/c++/X.Y' in almost all cases. 2347 StringRef LibDir = GCCInstallation.getParentLibPath(); 2348 StringRef InstallDir = GCCInstallation.getInstallPath(); 2349 StringRef Version = GCCInstallation.getVersion().Text; 2350 StringRef TripleStr = GCCInstallation.getTriple().str(); 2351 2352 const std::string IncludePathCandidates[] = { 2353 LibDir.str() + "/../include/c++/" + Version.str(), 2354 // Gentoo is weird and places its headers inside the GCC install, so if the 2355 // first attempt to find the headers fails, try this pattern. 2356 InstallDir.str() + "/include/g++-v4", 2357 // Android standalone toolchain has C++ headers in yet another place. 2358 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(), 2359 }; 2360 2361 for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) { 2362 if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr + 2363 GCCInstallation.getMultiarchSuffix()), 2364 DriverArgs, CC1Args)) 2365 break; 2366 } 2367 } 2368 2369 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 2370 DragonFly(const Driver & D,const llvm::Triple & Triple,const ArgList & Args)2371 DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 2372 : Generic_ELF(D, Triple, Args) { 2373 2374 // Path mangling to find libexec 2375 getProgramPaths().push_back(getDriver().getInstalledDir()); 2376 if (getDriver().getInstalledDir() != getDriver().Dir) 2377 getProgramPaths().push_back(getDriver().Dir); 2378 2379 getFilePaths().push_back(getDriver().Dir + "/../lib"); 2380 getFilePaths().push_back("/usr/lib"); 2381 getFilePaths().push_back("/usr/lib/gcc41"); 2382 } 2383 SelectTool(const Compilation & C,const JobAction & JA,const ActionList & Inputs) const2384 Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA, 2385 const ActionList &Inputs) const { 2386 Action::ActionClass Key; 2387 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 2388 Key = Action::AnalyzeJobClass; 2389 else 2390 Key = JA.getKind(); 2391 2392 Tool *&T = Tools[Key]; 2393 if (!T) { 2394 switch (Key) { 2395 case Action::AssembleJobClass: 2396 T = new tools::dragonfly::Assemble(*this); break; 2397 case Action::LinkJobClass: 2398 T = new tools::dragonfly::Link(*this); break; 2399 default: 2400 T = &Generic_GCC::SelectTool(C, JA, Inputs); 2401 } 2402 } 2403 2404 return *T; 2405 } 2406