Home | History | Annotate | Download | only in Driver
      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 #ifdef HAVE_CLANG_CONFIG_H
     13 # include "clang/Config/config.h"
     14 #endif
     15 
     16 #include "clang/Driver/Arg.h"
     17 #include "clang/Driver/ArgList.h"
     18 #include "clang/Driver/Compilation.h"
     19 #include "clang/Driver/Driver.h"
     20 #include "clang/Driver/DriverDiagnostic.h"
     21 #include "clang/Driver/HostInfo.h"
     22 #include "clang/Driver/ObjCRuntime.h"
     23 #include "clang/Driver/OptTable.h"
     24 #include "clang/Driver/Option.h"
     25 #include "clang/Driver/Options.h"
     26 #include "clang/Basic/Version.h"
     27 
     28 #include "llvm/ADT/SmallString.h"
     29 #include "llvm/ADT/StringExtras.h"
     30 #include "llvm/ADT/StringSwitch.h"
     31 #include "llvm/ADT/STLExtras.h"
     32 #include "llvm/Support/ErrorHandling.h"
     33 #include "llvm/Support/FileSystem.h"
     34 #include "llvm/Support/MemoryBuffer.h"
     35 #include "llvm/Support/raw_ostream.h"
     36 #include "llvm/Support/Path.h"
     37 #include "llvm/Support/system_error.h"
     38 
     39 #include <cstdlib> // ::getenv
     40 
     41 #include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
     42 
     43 using namespace clang::driver;
     44 using namespace clang::driver::toolchains;
     45 using namespace clang;
     46 
     47 /// Darwin - Darwin tool chain for i386 and x86_64.
     48 
     49 Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
     50   : ToolChain(Host, Triple), TargetInitialized(false),
     51     ARCRuntimeForSimulator(ARCSimulator_None),
     52     LibCXXForSimulator(LibCXXSimulator_None)
     53 {
     54   // Compute the initial Darwin version based on the host.
     55   bool HadExtra;
     56   std::string OSName = Triple.getOSName();
     57   if (!Driver::GetReleaseVersion(&OSName.c_str()[6],
     58                                  DarwinVersion[0], DarwinVersion[1],
     59                                  DarwinVersion[2], HadExtra))
     60     getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName;
     61 
     62   llvm::raw_string_ostream(MacosxVersionMin)
     63     << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
     64     << DarwinVersion[1];
     65 }
     66 
     67 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 
     77 bool Darwin::HasNativeLLVMSupport() const {
     78   return true;
     79 }
     80 
     81 bool Darwin::hasARCRuntime() const {
     82   // FIXME: Remove this once there is a proper way to detect an ARC runtime
     83   // for the simulator.
     84   switch (ARCRuntimeForSimulator) {
     85   case ARCSimulator_None:
     86     break;
     87   case ARCSimulator_HasARCRuntime:
     88     return true;
     89   case ARCSimulator_NoARCRuntime:
     90     return false;
     91   }
     92 
     93   if (isTargetIPhoneOS())
     94     return !isIPhoneOSVersionLT(5);
     95   else
     96     return !isMacosxVersionLT(10, 7);
     97 }
     98 
     99 /// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
    100 void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
    101   if (runtime.getKind() != ObjCRuntime::NeXT)
    102     return ToolChain::configureObjCRuntime(runtime);
    103 
    104   runtime.HasARC = runtime.HasWeak = hasARCRuntime();
    105 
    106   // So far, objc_terminate is only available in iOS 5.
    107   // FIXME: do the simulator logic properly.
    108   if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
    109     runtime.HasTerminate = !isIPhoneOSVersionLT(5);
    110   else
    111     runtime.HasTerminate = false;
    112 }
    113 
    114 /// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
    115 bool Darwin::hasBlocksRuntime() const {
    116   if (isTargetIPhoneOS())
    117     return !isIPhoneOSVersionLT(3, 2);
    118   else
    119     return !isMacosxVersionLT(10, 6);
    120 }
    121 
    122 static const char *GetArmArchForMArch(StringRef Value) {
    123   return llvm::StringSwitch<const char*>(Value)
    124     .Case("armv6k", "armv6")
    125     .Case("armv5tej", "armv5")
    126     .Case("xscale", "xscale")
    127     .Case("armv4t", "armv4t")
    128     .Case("armv7", "armv7")
    129     .Cases("armv7a", "armv7-a", "armv7")
    130     .Cases("armv7r", "armv7-r", "armv7")
    131     .Cases("armv7m", "armv7-m", "armv7")
    132     .Default(0);
    133 }
    134 
    135 static const char *GetArmArchForMCpu(StringRef Value) {
    136   return llvm::StringSwitch<const char *>(Value)
    137     .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
    138     .Cases("arm10e", "arm10tdmi", "armv5")
    139     .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
    140     .Case("xscale", "xscale")
    141     .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
    142            "arm1176jzf-s", "cortex-m0", "armv6")
    143     .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7")
    144     .Default(0);
    145 }
    146 
    147 StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
    148   switch (getTriple().getArch()) {
    149   default:
    150     return getArchName();
    151 
    152   case llvm::Triple::thumb:
    153   case llvm::Triple::arm: {
    154     if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
    155       if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
    156         return Arch;
    157 
    158     if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
    159       if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
    160         return Arch;
    161 
    162     return "arm";
    163   }
    164   }
    165 }
    166 
    167 Darwin::~Darwin() {
    168   // Free tool implementations.
    169   for (llvm::DenseMap<unsigned, Tool*>::iterator
    170          it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
    171     delete it->second;
    172 }
    173 
    174 std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
    175                                                 types::ID InputType) const {
    176   llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
    177 
    178   // If the target isn't initialized (e.g., an unknown Darwin platform, return
    179   // the default triple).
    180   if (!isTargetInitialized())
    181     return Triple.getTriple();
    182 
    183   unsigned Version[3];
    184   getTargetVersion(Version);
    185 
    186   llvm::SmallString<16> Str;
    187   llvm::raw_svector_ostream(Str)
    188     << (isTargetIPhoneOS() ? "ios" : "macosx")
    189     << Version[0] << "." << Version[1] << "." << Version[2];
    190   Triple.setOSName(Str.str());
    191 
    192   return Triple.getTriple();
    193 }
    194 
    195 Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
    196                          const ActionList &Inputs) const {
    197   Action::ActionClass Key;
    198 
    199   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
    200     // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
    201     if (Inputs.size() == 1 &&
    202         types::isCXX(Inputs[0]->getType()) &&
    203         getTriple().isOSDarwin() &&
    204         getTriple().getArch() == llvm::Triple::x86 &&
    205         (C.getArgs().getLastArg(options::OPT_fapple_kext) ||
    206          C.getArgs().getLastArg(options::OPT_mkernel)))
    207       Key = JA.getKind();
    208     else
    209       Key = Action::AnalyzeJobClass;
    210   } else
    211     Key = JA.getKind();
    212 
    213   // FIXME: This doesn't belong here, but ideally we will support static soon
    214   // anyway.
    215   bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
    216                     C.getArgs().hasArg(options::OPT_static) ||
    217                     C.getArgs().hasArg(options::OPT_fapple_kext));
    218   bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
    219   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
    220                                              options::OPT_no_integrated_as,
    221                                              IsIADefault);
    222 
    223   Tool *&T = Tools[Key];
    224   if (!T) {
    225     switch (Key) {
    226     case Action::InputClass:
    227     case Action::BindArchClass:
    228       llvm_unreachable("Invalid tool kind.");
    229     case Action::PreprocessJobClass:
    230       T = new tools::darwin::Preprocess(*this); break;
    231     case Action::AnalyzeJobClass:
    232       T = new tools::Clang(*this); break;
    233     case Action::PrecompileJobClass:
    234     case Action::CompileJobClass:
    235       T = new tools::darwin::Compile(*this); break;
    236     case Action::AssembleJobClass: {
    237       if (UseIntegratedAs)
    238         T = new tools::ClangAs(*this);
    239       else
    240         T = new tools::darwin::Assemble(*this);
    241       break;
    242     }
    243     case Action::LinkJobClass:
    244       T = new tools::darwin::Link(*this); break;
    245     case Action::LipoJobClass:
    246       T = new tools::darwin::Lipo(*this); break;
    247     case Action::DsymutilJobClass:
    248       T = new tools::darwin::Dsymutil(*this); break;
    249     case Action::VerifyJobClass:
    250       T = new tools::darwin::VerifyDebug(*this); break;
    251     }
    252   }
    253 
    254   return *T;
    255 }
    256 
    257 
    258 DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
    259   : Darwin(Host, Triple)
    260 {
    261   getProgramPaths().push_back(getDriver().getInstalledDir());
    262   if (getDriver().getInstalledDir() != getDriver().Dir)
    263     getProgramPaths().push_back(getDriver().Dir);
    264 
    265   // We expect 'as', 'ld', etc. to be adjacent to our install dir.
    266   getProgramPaths().push_back(getDriver().getInstalledDir());
    267   if (getDriver().getInstalledDir() != getDriver().Dir)
    268     getProgramPaths().push_back(getDriver().Dir);
    269 
    270   // For fallback, we need to know how to find the GCC cc1 executables, so we
    271   // also add the GCC libexec paths. This is legacy code that can be removed
    272   // once fallback is no longer useful.
    273   AddGCCLibexecPath(DarwinVersion[0]);
    274   AddGCCLibexecPath(DarwinVersion[0] - 2);
    275   AddGCCLibexecPath(DarwinVersion[0] - 1);
    276   AddGCCLibexecPath(DarwinVersion[0] + 1);
    277   AddGCCLibexecPath(DarwinVersion[0] + 2);
    278 }
    279 
    280 void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) {
    281   std::string ToolChainDir = "i686-apple-darwin";
    282   ToolChainDir += llvm::utostr(darwinVersion);
    283   ToolChainDir += "/4.2.1";
    284 
    285   std::string Path = getDriver().Dir;
    286   Path += "/../llvm-gcc-4.2/libexec/gcc/";
    287   Path += ToolChainDir;
    288   getProgramPaths().push_back(Path);
    289 
    290   Path = "/usr/llvm-gcc-4.2/libexec/gcc/";
    291   Path += ToolChainDir;
    292   getProgramPaths().push_back(Path);
    293 }
    294 
    295 void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
    296                                        ArgStringList &CmdArgs) const {
    297   // The Clang toolchain uses explicit paths for internal libraries.
    298 
    299   // Unfortunately, we still might depend on a few of the libraries that are
    300   // only available in the gcc library directory (in particular
    301   // libstdc++.dylib). For now, hardcode the path to the known install location.
    302   llvm::sys::Path P(getDriver().Dir);
    303   P.eraseComponent(); // .../usr/bin -> ../usr
    304   P.appendComponent("lib");
    305   P.appendComponent("gcc");
    306   switch (getTriple().getArch()) {
    307   default:
    308     llvm_unreachable("Invalid Darwin arch!");
    309   case llvm::Triple::x86:
    310   case llvm::Triple::x86_64:
    311     P.appendComponent("i686-apple-darwin10");
    312     break;
    313   case llvm::Triple::arm:
    314   case llvm::Triple::thumb:
    315     P.appendComponent("arm-apple-darwin10");
    316     break;
    317   case llvm::Triple::ppc:
    318   case llvm::Triple::ppc64:
    319     P.appendComponent("powerpc-apple-darwin10");
    320     break;
    321   }
    322   P.appendComponent("4.2.1");
    323 
    324   // Determine the arch specific GCC subdirectory.
    325   const char *ArchSpecificDir = 0;
    326   switch (getTriple().getArch()) {
    327   default:
    328     break;
    329   case llvm::Triple::arm:
    330   case llvm::Triple::thumb: {
    331     std::string Triple = ComputeLLVMTriple(Args);
    332     StringRef TripleStr = Triple;
    333     if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
    334       ArchSpecificDir = "v5";
    335     else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
    336       ArchSpecificDir = "v6";
    337     else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
    338       ArchSpecificDir = "v7";
    339     break;
    340   }
    341   case llvm::Triple::ppc64:
    342     ArchSpecificDir = "ppc64";
    343     break;
    344   case llvm::Triple::x86_64:
    345     ArchSpecificDir = "x86_64";
    346     break;
    347   }
    348 
    349   if (ArchSpecificDir) {
    350     P.appendComponent(ArchSpecificDir);
    351     bool Exists;
    352     if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    353       CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
    354     P.eraseComponent();
    355   }
    356 
    357   bool Exists;
    358   if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    359     CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
    360 }
    361 
    362 void DarwinClang::AddLinkARCArgs(const ArgList &Args,
    363                                  ArgStringList &CmdArgs) const {
    364 
    365   CmdArgs.push_back("-force_load");
    366   llvm::sys::Path P(getDriver().ClangExecutable);
    367   P.eraseComponent(); // 'clang'
    368   P.eraseComponent(); // 'bin'
    369   P.appendComponent("lib");
    370   P.appendComponent("arc");
    371   P.appendComponent("libarclite_");
    372   std::string s = P.str();
    373   // Mash in the platform.
    374   if (isTargetIOSSimulator())
    375     s += "iphonesimulator";
    376   else if (isTargetIPhoneOS())
    377     s += "iphoneos";
    378   // FIXME: Remove this once we depend fully on -mios-simulator-version-min.
    379   else if (ARCRuntimeForSimulator != ARCSimulator_None)
    380     s += "iphonesimulator";
    381   else
    382     s += "macosx";
    383   s += ".a";
    384 
    385   CmdArgs.push_back(Args.MakeArgString(s));
    386 }
    387 
    388 void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
    389                                     ArgStringList &CmdArgs,
    390                                     const char *DarwinStaticLib) const {
    391   llvm::sys::Path P(getDriver().ResourceDir);
    392   P.appendComponent("lib");
    393   P.appendComponent("darwin");
    394   P.appendComponent(DarwinStaticLib);
    395 
    396   // For now, allow missing resource libraries to support developers who may
    397   // not have compiler-rt checked out or integrated into their build.
    398   bool Exists;
    399   if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    400     CmdArgs.push_back(Args.MakeArgString(P.str()));
    401 }
    402 
    403 void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
    404                                         ArgStringList &CmdArgs) const {
    405   // Darwin doesn't support real static executables, don't link any runtime
    406   // libraries with -static.
    407   if (Args.hasArg(options::OPT_static))
    408     return;
    409 
    410   // Reject -static-libgcc for now, we can deal with this when and if someone
    411   // cares. This is useful in situations where someone wants to statically link
    412   // something like libstdc++, and needs its runtime support routines.
    413   if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
    414     getDriver().Diag(diag::err_drv_unsupported_opt)
    415       << A->getAsString(Args);
    416     return;
    417   }
    418 
    419   // Otherwise link libSystem, then the dynamic runtime library, and finally any
    420   // target specific static runtime library.
    421   CmdArgs.push_back("-lSystem");
    422 
    423   // Select the dynamic runtime library and the target specific static library.
    424   if (isTargetIPhoneOS()) {
    425     // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
    426     // it never went into the SDK.
    427     // Linking against libgcc_s.1 isn't needed for iOS 5.0+
    428     if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
    429       CmdArgs.push_back("-lgcc_s.1");
    430 
    431     // We currently always need a static runtime library for iOS.
    432     AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
    433   } else {
    434     // The dynamic runtime library was merged with libSystem for 10.6 and
    435     // beyond; only 10.4 and 10.5 need an additional runtime library.
    436     if (isMacosxVersionLT(10, 5))
    437       CmdArgs.push_back("-lgcc_s.10.4");
    438     else if (isMacosxVersionLT(10, 6))
    439       CmdArgs.push_back("-lgcc_s.10.5");
    440 
    441     // For OS X, we thought we would only need a static runtime library when
    442     // targeting 10.4, to provide versions of the static functions which were
    443     // omitted from 10.4.dylib.
    444     //
    445     // Unfortunately, that turned out to not be true, because Darwin system
    446     // headers can still use eprintf on i386, and it is not exported from
    447     // libSystem. Therefore, we still must provide a runtime library just for
    448     // the tiny tiny handful of projects that *might* use that symbol.
    449     if (isMacosxVersionLT(10, 5)) {
    450       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
    451     } else {
    452       if (getTriple().getArch() == llvm::Triple::x86)
    453         AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
    454       AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
    455     }
    456   }
    457 }
    458 
    459 static inline StringRef SimulatorVersionDefineName() {
    460   return "__IPHONE_OS_VERSION_MIN_REQUIRED";
    461 }
    462 
    463 /// \brief Parse the simulator version define:
    464 /// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
    465 // and return the grouped values as integers, e.g:
    466 //   __IPHONE_OS_VERSION_MIN_REQUIRED=40201
    467 // will return Major=4, Minor=2, Micro=1.
    468 static bool GetVersionFromSimulatorDefine(StringRef define,
    469                                           unsigned &Major, unsigned &Minor,
    470                                           unsigned &Micro) {
    471   assert(define.startswith(SimulatorVersionDefineName()));
    472   StringRef name, version;
    473   llvm::tie(name, version) = define.split('=');
    474   if (version.empty())
    475     return false;
    476   std::string verstr = version.str();
    477   char *end;
    478   unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
    479   if (*end != '\0')
    480     return false;
    481   Major = num / 10000;
    482   num = num % 10000;
    483   Minor = num / 100;
    484   Micro = num % 100;
    485   return true;
    486 }
    487 
    488 void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
    489   const OptTable &Opts = getDriver().getOpts();
    490 
    491   Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
    492   Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
    493   Arg *iOSSimVersion = Args.getLastArg(
    494     options::OPT_mios_simulator_version_min_EQ);
    495 
    496   // FIXME: HACK! When compiling for the simulator we don't get a
    497   // '-miphoneos-version-min' to help us know whether there is an ARC runtime
    498   // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
    499   // define passed in command-line.
    500   if (!iOSVersion && !iOSSimVersion) {
    501     for (arg_iterator it = Args.filtered_begin(options::OPT_D),
    502            ie = Args.filtered_end(); it != ie; ++it) {
    503       StringRef define = (*it)->getValue(Args);
    504       if (define.startswith(SimulatorVersionDefineName())) {
    505         unsigned Major = 0, Minor = 0, Micro = 0;
    506         if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
    507             Major < 10 && Minor < 100 && Micro < 100) {
    508           ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
    509                                              : ARCSimulator_HasARCRuntime;
    510           LibCXXForSimulator = Major < 5 ? LibCXXSimulator_NotAvailable
    511                                          : LibCXXSimulator_Available;
    512         }
    513         break;
    514       }
    515     }
    516   }
    517 
    518   if (OSXVersion && (iOSVersion || iOSSimVersion)) {
    519     getDriver().Diag(diag::err_drv_argument_not_allowed_with)
    520           << OSXVersion->getAsString(Args)
    521           << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
    522     iOSVersion = iOSSimVersion = 0;
    523   } else if (iOSVersion && iOSSimVersion) {
    524     getDriver().Diag(diag::err_drv_argument_not_allowed_with)
    525           << iOSVersion->getAsString(Args)
    526           << iOSSimVersion->getAsString(Args);
    527     iOSSimVersion = 0;
    528   } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
    529     // If no deployment target was specified on the command line, check for
    530     // environment defines.
    531     StringRef OSXTarget;
    532     StringRef iOSTarget;
    533     StringRef iOSSimTarget;
    534     if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
    535       OSXTarget = env;
    536     if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
    537       iOSTarget = env;
    538     if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
    539       iOSSimTarget = env;
    540 
    541     // If no '-miphoneos-version-min' specified on the command line and
    542     // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
    543     // based on isysroot.
    544     if (iOSTarget.empty()) {
    545       if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
    546         StringRef first, second;
    547         StringRef isysroot = A->getValue(Args);
    548         llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
    549         if (second != "")
    550           iOSTarget = second.substr(0,3);
    551       }
    552     }
    553 
    554     // If no OSX or iOS target has been specified and we're compiling for armv7,
    555     // go ahead as assume we're targeting iOS.
    556     if (OSXTarget.empty() && iOSTarget.empty())
    557       if (getDarwinArchName(Args) == "armv7")
    558         iOSTarget = "0.0";
    559 
    560     // Handle conflicting deployment targets
    561     //
    562     // FIXME: Don't hardcode default here.
    563 
    564     // Do not allow conflicts with the iOS simulator target.
    565     if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
    566       getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
    567         << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
    568         << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
    569             "IPHONEOS_DEPLOYMENT_TARGET");
    570     }
    571 
    572     // Allow conflicts among OSX and iOS for historical reasons, but choose the
    573     // default platform.
    574     if (!OSXTarget.empty() && !iOSTarget.empty()) {
    575       if (getTriple().getArch() == llvm::Triple::arm ||
    576           getTriple().getArch() == llvm::Triple::thumb)
    577         OSXTarget = "";
    578       else
    579         iOSTarget = "";
    580     }
    581 
    582     if (!OSXTarget.empty()) {
    583       const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
    584       OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
    585       Args.append(OSXVersion);
    586     } else if (!iOSTarget.empty()) {
    587       const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
    588       iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
    589       Args.append(iOSVersion);
    590     } else if (!iOSSimTarget.empty()) {
    591       const Option *O = Opts.getOption(
    592         options::OPT_mios_simulator_version_min_EQ);
    593       iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
    594       Args.append(iOSSimVersion);
    595     } else {
    596       // Otherwise, assume we are targeting OS X.
    597       const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
    598       OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
    599       Args.append(OSXVersion);
    600     }
    601   }
    602 
    603   // Reject invalid architecture combinations.
    604   if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
    605                         getTriple().getArch() != llvm::Triple::x86_64)) {
    606     getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
    607       << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
    608   }
    609 
    610   // Set the tool chain target information.
    611   unsigned Major, Minor, Micro;
    612   bool HadExtra;
    613   if (OSXVersion) {
    614     assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
    615     if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
    616                                    Micro, HadExtra) || HadExtra ||
    617         Major != 10 || Minor >= 100 || Micro >= 100)
    618       getDriver().Diag(diag::err_drv_invalid_version_number)
    619         << OSXVersion->getAsString(Args);
    620   } else {
    621     const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
    622     assert(Version && "Unknown target platform!");
    623     if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
    624                                    Micro, HadExtra) || HadExtra ||
    625         Major >= 10 || Minor >= 100 || Micro >= 100)
    626       getDriver().Diag(diag::err_drv_invalid_version_number)
    627         << Version->getAsString(Args);
    628   }
    629 
    630   bool IsIOSSim = bool(iOSSimVersion);
    631 
    632   // In GCC, the simulator historically was treated as being OS X in some
    633   // contexts, like determining the link logic, despite generally being called
    634   // with an iOS deployment target. For compatibility, we detect the
    635   // simulator as iOS + x86, and treat it differently in a few contexts.
    636   if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
    637                      getTriple().getArch() == llvm::Triple::x86_64))
    638     IsIOSSim = true;
    639 
    640   setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
    641 }
    642 
    643 void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
    644                                       ArgStringList &CmdArgs) const {
    645   CXXStdlibType Type = GetCXXStdlibType(Args);
    646 
    647   switch (Type) {
    648   case ToolChain::CST_Libcxx:
    649     CmdArgs.push_back("-lc++");
    650     break;
    651 
    652   case ToolChain::CST_Libstdcxx: {
    653     // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
    654     // it was previously found in the gcc lib dir. However, for all the Darwin
    655     // platforms we care about it was -lstdc++.6, so we search for that
    656     // explicitly if we can't see an obvious -lstdc++ candidate.
    657 
    658     // Check in the sysroot first.
    659     bool Exists;
    660     if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
    661       llvm::sys::Path P(A->getValue(Args));
    662       P.appendComponent("usr");
    663       P.appendComponent("lib");
    664       P.appendComponent("libstdc++.dylib");
    665 
    666       if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
    667         P.eraseComponent();
    668         P.appendComponent("libstdc++.6.dylib");
    669         if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
    670           CmdArgs.push_back(Args.MakeArgString(P.str()));
    671           return;
    672         }
    673       }
    674     }
    675 
    676     // Otherwise, look in the root.
    677     if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
    678       (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
    679       CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
    680       return;
    681     }
    682 
    683     // Otherwise, let the linker search.
    684     CmdArgs.push_back("-lstdc++");
    685     break;
    686   }
    687   }
    688 }
    689 
    690 void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
    691                                    ArgStringList &CmdArgs) const {
    692 
    693   // For Darwin platforms, use the compiler-rt-based support library
    694   // instead of the gcc-provided one (which is also incidentally
    695   // only present in the gcc lib dir, which makes it hard to find).
    696 
    697   llvm::sys::Path P(getDriver().ResourceDir);
    698   P.appendComponent("lib");
    699   P.appendComponent("darwin");
    700   P.appendComponent("libclang_rt.cc_kext.a");
    701 
    702   // For now, allow missing resource libraries to support developers who may
    703   // not have compiler-rt checked out or integrated into their build.
    704   bool Exists;
    705   if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
    706     CmdArgs.push_back(Args.MakeArgString(P.str()));
    707 }
    708 
    709 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
    710                                       const char *BoundArch) const {
    711   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
    712   const OptTable &Opts = getDriver().getOpts();
    713 
    714   // FIXME: We really want to get out of the tool chain level argument
    715   // translation business, as it makes the driver functionality much
    716   // more opaque. For now, we follow gcc closely solely for the
    717   // purpose of easily achieving feature parity & testability. Once we
    718   // have something that works, we should reevaluate each translation
    719   // and try to push it down into tool specific logic.
    720 
    721   for (ArgList::const_iterator it = Args.begin(),
    722          ie = Args.end(); it != ie; ++it) {
    723     Arg *A = *it;
    724 
    725     if (A->getOption().matches(options::OPT_Xarch__)) {
    726       // Skip this argument unless the architecture matches either the toolchain
    727       // triple arch, or the arch being bound.
    728       //
    729       // FIXME: Canonicalize name.
    730       StringRef XarchArch = A->getValue(Args, 0);
    731       if (!(XarchArch == getArchName()  ||
    732             (BoundArch && XarchArch == BoundArch)))
    733         continue;
    734 
    735       Arg *OriginalArg = A;
    736       unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
    737       unsigned Prev = Index;
    738       Arg *XarchArg = Opts.ParseOneArg(Args, Index);
    739 
    740       // If the argument parsing failed or more than one argument was
    741       // consumed, the -Xarch_ argument's parameter tried to consume
    742       // extra arguments. Emit an error and ignore.
    743       //
    744       // We also want to disallow any options which would alter the
    745       // driver behavior; that isn't going to work in our model. We
    746       // use isDriverOption() as an approximation, although things
    747       // like -O4 are going to slip through.
    748       if (!XarchArg || Index > Prev + 1) {
    749         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
    750           << A->getAsString(Args);
    751         continue;
    752       } else if (XarchArg->getOption().isDriverOption()) {
    753         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
    754           << A->getAsString(Args);
    755         continue;
    756       }
    757 
    758       XarchArg->setBaseArg(A);
    759       A = XarchArg;
    760 
    761       DAL->AddSynthesizedArg(A);
    762 
    763       // Linker input arguments require custom handling. The problem is that we
    764       // have already constructed the phase actions, so we can not treat them as
    765       // "input arguments".
    766       if (A->getOption().isLinkerInput()) {
    767         // Convert the argument into individual Zlinker_input_args.
    768         for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
    769           DAL->AddSeparateArg(OriginalArg,
    770                               Opts.getOption(options::OPT_Zlinker_input),
    771                               A->getValue(Args, i));
    772 
    773         }
    774         continue;
    775       }
    776     }
    777 
    778     // Sob. These is strictly gcc compatible for the time being. Apple
    779     // gcc translates options twice, which means that self-expanding
    780     // options add duplicates.
    781     switch ((options::ID) A->getOption().getID()) {
    782     default:
    783       DAL->append(A);
    784       break;
    785 
    786     case options::OPT_mkernel:
    787     case options::OPT_fapple_kext:
    788       DAL->append(A);
    789       DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
    790       break;
    791 
    792     case options::OPT_dependency_file:
    793       DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
    794                           A->getValue(Args));
    795       break;
    796 
    797     case options::OPT_gfull:
    798       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
    799       DAL->AddFlagArg(A,
    800                Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
    801       break;
    802 
    803     case options::OPT_gused:
    804       DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
    805       DAL->AddFlagArg(A,
    806              Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
    807       break;
    808 
    809     case options::OPT_shared:
    810       DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
    811       break;
    812 
    813     case options::OPT_fconstant_cfstrings:
    814       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
    815       break;
    816 
    817     case options::OPT_fno_constant_cfstrings:
    818       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
    819       break;
    820 
    821     case options::OPT_Wnonportable_cfstrings:
    822       DAL->AddFlagArg(A,
    823                       Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
    824       break;
    825 
    826     case options::OPT_Wno_nonportable_cfstrings:
    827       DAL->AddFlagArg(A,
    828                    Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
    829       break;
    830 
    831     case options::OPT_fpascal_strings:
    832       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
    833       break;
    834 
    835     case options::OPT_fno_pascal_strings:
    836       DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
    837       break;
    838     }
    839   }
    840 
    841   if (getTriple().getArch() == llvm::Triple::x86 ||
    842       getTriple().getArch() == llvm::Triple::x86_64)
    843     if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
    844       DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
    845 
    846   // Add the arch options based on the particular spelling of -arch, to match
    847   // how the driver driver works.
    848   if (BoundArch) {
    849     StringRef Name = BoundArch;
    850     const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
    851     const Option *MArch = Opts.getOption(options::OPT_march_EQ);
    852 
    853     // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
    854     // which defines the list of which architectures we accept.
    855     if (Name == "ppc")
    856       ;
    857     else if (Name == "ppc601")
    858       DAL->AddJoinedArg(0, MCpu, "601");
    859     else if (Name == "ppc603")
    860       DAL->AddJoinedArg(0, MCpu, "603");
    861     else if (Name == "ppc604")
    862       DAL->AddJoinedArg(0, MCpu, "604");
    863     else if (Name == "ppc604e")
    864       DAL->AddJoinedArg(0, MCpu, "604e");
    865     else if (Name == "ppc750")
    866       DAL->AddJoinedArg(0, MCpu, "750");
    867     else if (Name == "ppc7400")
    868       DAL->AddJoinedArg(0, MCpu, "7400");
    869     else if (Name == "ppc7450")
    870       DAL->AddJoinedArg(0, MCpu, "7450");
    871     else if (Name == "ppc970")
    872       DAL->AddJoinedArg(0, MCpu, "970");
    873 
    874     else if (Name == "ppc64")
    875       DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
    876 
    877     else if (Name == "i386")
    878       ;
    879     else if (Name == "i486")
    880       DAL->AddJoinedArg(0, MArch, "i486");
    881     else if (Name == "i586")
    882       DAL->AddJoinedArg(0, MArch, "i586");
    883     else if (Name == "i686")
    884       DAL->AddJoinedArg(0, MArch, "i686");
    885     else if (Name == "pentium")
    886       DAL->AddJoinedArg(0, MArch, "pentium");
    887     else if (Name == "pentium2")
    888       DAL->AddJoinedArg(0, MArch, "pentium2");
    889     else if (Name == "pentpro")
    890       DAL->AddJoinedArg(0, MArch, "pentiumpro");
    891     else if (Name == "pentIIm3")
    892       DAL->AddJoinedArg(0, MArch, "pentium2");
    893 
    894     else if (Name == "x86_64")
    895       DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
    896 
    897     else if (Name == "arm")
    898       DAL->AddJoinedArg(0, MArch, "armv4t");
    899     else if (Name == "armv4t")
    900       DAL->AddJoinedArg(0, MArch, "armv4t");
    901     else if (Name == "armv5")
    902       DAL->AddJoinedArg(0, MArch, "armv5tej");
    903     else if (Name == "xscale")
    904       DAL->AddJoinedArg(0, MArch, "xscale");
    905     else if (Name == "armv6")
    906       DAL->AddJoinedArg(0, MArch, "armv6k");
    907     else if (Name == "armv7")
    908       DAL->AddJoinedArg(0, MArch, "armv7a");
    909 
    910     else
    911       llvm_unreachable("invalid Darwin arch");
    912   }
    913 
    914   // Add an explicit version min argument for the deployment target. We do this
    915   // after argument translation because -Xarch_ arguments may add a version min
    916   // argument.
    917   AddDeploymentTarget(*DAL);
    918 
    919   // Validate the C++ standard library choice.
    920   CXXStdlibType Type = GetCXXStdlibType(*DAL);
    921   if (Type == ToolChain::CST_Libcxx) {
    922     switch (LibCXXForSimulator) {
    923     case LibCXXSimulator_None:
    924       // Handle non-simulator cases.
    925       if (isTargetIPhoneOS()) {
    926         if (isIPhoneOSVersionLT(5, 0)) {
    927           getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
    928             << "iOS 5.0";
    929         }
    930       }
    931       break;
    932     case LibCXXSimulator_NotAvailable:
    933       getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
    934         << "iOS 5.0";
    935       break;
    936     case LibCXXSimulator_Available:
    937       break;
    938     }
    939   }
    940 
    941   return DAL;
    942 }
    943 
    944 bool Darwin::IsUnwindTablesDefault() const {
    945   // FIXME: Gross; we should probably have some separate target
    946   // definition, possibly even reusing the one in clang.
    947   return getArchName() == "x86_64";
    948 }
    949 
    950 bool Darwin::UseDwarfDebugFlags() const {
    951   if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
    952     return S[0] != '\0';
    953   return false;
    954 }
    955 
    956 bool Darwin::UseSjLjExceptions() const {
    957   // Darwin uses SjLj exceptions on ARM.
    958   return (getTriple().getArch() == llvm::Triple::arm ||
    959           getTriple().getArch() == llvm::Triple::thumb);
    960 }
    961 
    962 const char *Darwin::GetDefaultRelocationModel() const {
    963   return "pic";
    964 }
    965 
    966 const char *Darwin::GetForcedPicModel() const {
    967   if (getArchName() == "x86_64")
    968     return "pic";
    969   return 0;
    970 }
    971 
    972 bool Darwin::SupportsProfiling() const {
    973   // Profiling instrumentation is only supported on x86.
    974   return getArchName() == "i386" || getArchName() == "x86_64";
    975 }
    976 
    977 bool Darwin::SupportsObjCGC() const {
    978   // Garbage collection is supported everywhere except on iPhone OS.
    979   return !isTargetIPhoneOS();
    980 }
    981 
    982 std::string
    983 Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
    984                                                 types::ID InputType) const {
    985   return ComputeLLVMTriple(Args, InputType);
    986 }
    987 
    988 /// Generic_GCC - A tool chain using the 'gcc' command to perform
    989 /// all subcommands; this relies on gcc translating the majority of
    990 /// command line options.
    991 
    992 Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
    993   : ToolChain(Host, Triple) {
    994   getProgramPaths().push_back(getDriver().getInstalledDir());
    995   if (getDriver().getInstalledDir() != getDriver().Dir)
    996     getProgramPaths().push_back(getDriver().Dir);
    997 }
    998 
    999 Generic_GCC::~Generic_GCC() {
   1000   // Free tool implementations.
   1001   for (llvm::DenseMap<unsigned, Tool*>::iterator
   1002          it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
   1003     delete it->second;
   1004 }
   1005 
   1006 Tool &Generic_GCC::SelectTool(const Compilation &C,
   1007                               const JobAction &JA,
   1008                               const ActionList &Inputs) const {
   1009   Action::ActionClass Key;
   1010   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1011     Key = Action::AnalyzeJobClass;
   1012   else
   1013     Key = JA.getKind();
   1014 
   1015   Tool *&T = Tools[Key];
   1016   if (!T) {
   1017     switch (Key) {
   1018     case Action::InputClass:
   1019     case Action::BindArchClass:
   1020       llvm_unreachable("Invalid tool kind.");
   1021     case Action::PreprocessJobClass:
   1022       T = new tools::gcc::Preprocess(*this); break;
   1023     case Action::PrecompileJobClass:
   1024       T = new tools::gcc::Precompile(*this); break;
   1025     case Action::AnalyzeJobClass:
   1026       T = new tools::Clang(*this); break;
   1027     case Action::CompileJobClass:
   1028       T = new tools::gcc::Compile(*this); break;
   1029     case Action::AssembleJobClass:
   1030       T = new tools::gcc::Assemble(*this); break;
   1031     case Action::LinkJobClass:
   1032       T = new tools::gcc::Link(*this); break;
   1033 
   1034       // This is a bit ungeneric, but the only platform using a driver
   1035       // driver is Darwin.
   1036     case Action::LipoJobClass:
   1037       T = new tools::darwin::Lipo(*this); break;
   1038     case Action::DsymutilJobClass:
   1039       T = new tools::darwin::Dsymutil(*this); break;
   1040     case Action::VerifyJobClass:
   1041       T = new tools::darwin::VerifyDebug(*this); break;
   1042     }
   1043   }
   1044 
   1045   return *T;
   1046 }
   1047 
   1048 bool Generic_GCC::IsUnwindTablesDefault() const {
   1049   // FIXME: Gross; we should probably have some separate target
   1050   // definition, possibly even reusing the one in clang.
   1051   return getArchName() == "x86_64";
   1052 }
   1053 
   1054 const char *Generic_GCC::GetDefaultRelocationModel() const {
   1055   return "static";
   1056 }
   1057 
   1058 const char *Generic_GCC::GetForcedPicModel() const {
   1059   return 0;
   1060 }
   1061 
   1062 /// TCEToolChain - A tool chain using the llvm bitcode tools to perform
   1063 /// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
   1064 /// Currently does not support anything else but compilation.
   1065 
   1066 TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
   1067   : ToolChain(Host, Triple) {
   1068   // Path mangling to find libexec
   1069   std::string Path(getDriver().Dir);
   1070 
   1071   Path += "/../libexec";
   1072   getProgramPaths().push_back(Path);
   1073 }
   1074 
   1075 TCEToolChain::~TCEToolChain() {
   1076   for (llvm::DenseMap<unsigned, Tool*>::iterator
   1077            it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
   1078       delete it->second;
   1079 }
   1080 
   1081 bool TCEToolChain::IsMathErrnoDefault() const {
   1082   return true;
   1083 }
   1084 
   1085 bool TCEToolChain::IsUnwindTablesDefault() const {
   1086   return false;
   1087 }
   1088 
   1089 const char *TCEToolChain::GetDefaultRelocationModel() const {
   1090   return "static";
   1091 }
   1092 
   1093 const char *TCEToolChain::GetForcedPicModel() const {
   1094   return 0;
   1095 }
   1096 
   1097 Tool &TCEToolChain::SelectTool(const Compilation &C,
   1098                             const JobAction &JA,
   1099                                const ActionList &Inputs) const {
   1100   Action::ActionClass Key;
   1101   Key = Action::AnalyzeJobClass;
   1102 
   1103   Tool *&T = Tools[Key];
   1104   if (!T) {
   1105     switch (Key) {
   1106     case Action::PreprocessJobClass:
   1107       T = new tools::gcc::Preprocess(*this); break;
   1108     case Action::AnalyzeJobClass:
   1109       T = new tools::Clang(*this); break;
   1110     default:
   1111      llvm_unreachable("Unsupported action for TCE target.");
   1112     }
   1113   }
   1114   return *T;
   1115 }
   1116 
   1117 /// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
   1118 
   1119 OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
   1120   : Generic_ELF(Host, Triple) {
   1121   getFilePaths().push_back(getDriver().Dir + "/../lib");
   1122   getFilePaths().push_back("/usr/lib");
   1123 }
   1124 
   1125 Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
   1126                           const ActionList &Inputs) const {
   1127   Action::ActionClass Key;
   1128   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1129     Key = Action::AnalyzeJobClass;
   1130   else
   1131     Key = JA.getKind();
   1132 
   1133   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
   1134                                              options::OPT_no_integrated_as,
   1135                                              IsIntegratedAssemblerDefault());
   1136 
   1137   Tool *&T = Tools[Key];
   1138   if (!T) {
   1139     switch (Key) {
   1140     case Action::AssembleJobClass: {
   1141       if (UseIntegratedAs)
   1142         T = new tools::ClangAs(*this);
   1143       else
   1144         T = new tools::openbsd::Assemble(*this);
   1145       break;
   1146     }
   1147     case Action::LinkJobClass:
   1148       T = new tools::openbsd::Link(*this); break;
   1149     default:
   1150       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1151     }
   1152   }
   1153 
   1154   return *T;
   1155 }
   1156 
   1157 /// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
   1158 
   1159 FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
   1160   : Generic_ELF(Host, Triple) {
   1161 
   1162   // Determine if we are compiling 32-bit code on an x86_64 platform.
   1163   bool Lib32 = false;
   1164   if (Triple.getArch() == llvm::Triple::x86 &&
   1165       llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
   1166         llvm::Triple::x86_64)
   1167     Lib32 = true;
   1168 
   1169   if (Triple.getArch() == llvm::Triple::ppc &&
   1170       llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
   1171         llvm::Triple::ppc64)
   1172     Lib32 = true;
   1173 
   1174   if (Lib32) {
   1175     getFilePaths().push_back("/usr/lib32");
   1176   } else {
   1177     getFilePaths().push_back("/usr/lib");
   1178   }
   1179 }
   1180 
   1181 Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
   1182                           const ActionList &Inputs) const {
   1183   Action::ActionClass Key;
   1184   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1185     Key = Action::AnalyzeJobClass;
   1186   else
   1187     Key = JA.getKind();
   1188 
   1189   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
   1190                                              options::OPT_no_integrated_as,
   1191                                              IsIntegratedAssemblerDefault());
   1192 
   1193   Tool *&T = Tools[Key];
   1194   if (!T) {
   1195     switch (Key) {
   1196     case Action::AssembleJobClass:
   1197       if (UseIntegratedAs)
   1198         T = new tools::ClangAs(*this);
   1199       else
   1200         T = new tools::freebsd::Assemble(*this);
   1201       break;
   1202     case Action::LinkJobClass:
   1203       T = new tools::freebsd::Link(*this); break;
   1204     default:
   1205       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1206     }
   1207   }
   1208 
   1209   return *T;
   1210 }
   1211 
   1212 /// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
   1213 
   1214 NetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
   1215                const llvm::Triple& ToolTriple)
   1216   : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
   1217 
   1218   // Determine if we are compiling 32-bit code on an x86_64 platform.
   1219   bool Lib32 = false;
   1220   if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
   1221       Triple.getArch() == llvm::Triple::x86)
   1222     Lib32 = true;
   1223 
   1224   if (getDriver().UseStdLib) {
   1225     if (Lib32)
   1226       getFilePaths().push_back("=/usr/lib/i386");
   1227     else
   1228       getFilePaths().push_back("=/usr/lib");
   1229   }
   1230 }
   1231 
   1232 Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
   1233                          const ActionList &Inputs) const {
   1234   Action::ActionClass Key;
   1235   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1236     Key = Action::AnalyzeJobClass;
   1237   else
   1238     Key = JA.getKind();
   1239 
   1240   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
   1241                                              options::OPT_no_integrated_as,
   1242                                              IsIntegratedAssemblerDefault());
   1243 
   1244   Tool *&T = Tools[Key];
   1245   if (!T) {
   1246     switch (Key) {
   1247     case Action::AssembleJobClass:
   1248       if (UseIntegratedAs)
   1249         T = new tools::ClangAs(*this);
   1250       else
   1251         T = new tools::netbsd::Assemble(*this, ToolTriple);
   1252       break;
   1253     case Action::LinkJobClass:
   1254       T = new tools::netbsd::Link(*this, ToolTriple);
   1255       break;
   1256     default:
   1257       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1258     }
   1259   }
   1260 
   1261   return *T;
   1262 }
   1263 
   1264 /// Minix - Minix tool chain which can call as(1) and ld(1) directly.
   1265 
   1266 Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
   1267   : Generic_GCC(Host, Triple) {
   1268   getFilePaths().push_back(getDriver().Dir + "/../lib");
   1269   getFilePaths().push_back("/usr/lib");
   1270   getFilePaths().push_back("/usr/gnu/lib");
   1271   getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
   1272 }
   1273 
   1274 Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
   1275                         const ActionList &Inputs) const {
   1276   Action::ActionClass Key;
   1277   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1278     Key = Action::AnalyzeJobClass;
   1279   else
   1280     Key = JA.getKind();
   1281 
   1282   Tool *&T = Tools[Key];
   1283   if (!T) {
   1284     switch (Key) {
   1285     case Action::AssembleJobClass:
   1286       T = new tools::minix::Assemble(*this); break;
   1287     case Action::LinkJobClass:
   1288       T = new tools::minix::Link(*this); break;
   1289     default:
   1290       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1291     }
   1292   }
   1293 
   1294   return *T;
   1295 }
   1296 
   1297 /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
   1298 
   1299 AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
   1300   : Generic_GCC(Host, Triple) {
   1301 
   1302   getProgramPaths().push_back(getDriver().getInstalledDir());
   1303   if (getDriver().getInstalledDir() != getDriver().Dir)
   1304     getProgramPaths().push_back(getDriver().Dir);
   1305 
   1306   getFilePaths().push_back(getDriver().Dir + "/../lib");
   1307   getFilePaths().push_back("/usr/lib");
   1308   getFilePaths().push_back("/usr/sfw/lib");
   1309   getFilePaths().push_back("/opt/gcc4/lib");
   1310   getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
   1311 
   1312 }
   1313 
   1314 Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
   1315                            const ActionList &Inputs) const {
   1316   Action::ActionClass Key;
   1317   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1318     Key = Action::AnalyzeJobClass;
   1319   else
   1320     Key = JA.getKind();
   1321 
   1322   Tool *&T = Tools[Key];
   1323   if (!T) {
   1324     switch (Key) {
   1325     case Action::AssembleJobClass:
   1326       T = new tools::auroraux::Assemble(*this); break;
   1327     case Action::LinkJobClass:
   1328       T = new tools::auroraux::Link(*this); break;
   1329     default:
   1330       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1331     }
   1332   }
   1333 
   1334   return *T;
   1335 }
   1336 
   1337 
   1338 /// Linux toolchain (very bare-bones at the moment).
   1339 
   1340 enum LinuxDistro {
   1341   ArchLinux,
   1342   DebianLenny,
   1343   DebianSqueeze,
   1344   DebianWheezy,
   1345   Exherbo,
   1346   RHEL4,
   1347   RHEL5,
   1348   RHEL6,
   1349   Fedora13,
   1350   Fedora14,
   1351   Fedora15,
   1352   FedoraRawhide,
   1353   OpenSuse11_3,
   1354   OpenSuse11_4,
   1355   OpenSuse12_1,
   1356   UbuntuHardy,
   1357   UbuntuIntrepid,
   1358   UbuntuJaunty,
   1359   UbuntuKarmic,
   1360   UbuntuLucid,
   1361   UbuntuMaverick,
   1362   UbuntuNatty,
   1363   UbuntuOneiric,
   1364   UnknownDistro
   1365 };
   1366 
   1367 static bool IsRedhat(enum LinuxDistro Distro) {
   1368   return Distro == Fedora13 || Distro == Fedora14 ||
   1369          Distro == Fedora15 || Distro == FedoraRawhide ||
   1370          Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6;
   1371 }
   1372 
   1373 static bool IsOpenSuse(enum LinuxDistro Distro) {
   1374   return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 ||
   1375          Distro == OpenSuse12_1;
   1376 }
   1377 
   1378 static bool IsDebian(enum LinuxDistro Distro) {
   1379   return Distro == DebianLenny || Distro == DebianSqueeze ||
   1380          Distro == DebianWheezy;
   1381 }
   1382 
   1383 static bool IsUbuntu(enum LinuxDistro Distro) {
   1384   return Distro == UbuntuHardy  || Distro == UbuntuIntrepid ||
   1385          Distro == UbuntuLucid  || Distro == UbuntuMaverick ||
   1386          Distro == UbuntuJaunty || Distro == UbuntuKarmic ||
   1387          Distro == UbuntuNatty  || Distro == UbuntuOneiric;
   1388 }
   1389 
   1390 // FIXME: This should be deleted. We should assume a multilib environment, and
   1391 // fallback gracefully if any parts of it are absent.
   1392 static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) {
   1393   if (Arch == llvm::Triple::x86_64) {
   1394     bool Exists;
   1395     if (Distro == Exherbo &&
   1396         (llvm::sys::fs::exists("/usr/lib32/libc.so", Exists) || !Exists))
   1397       return false;
   1398   }
   1399 
   1400   return true;
   1401 }
   1402 
   1403 static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
   1404   llvm::OwningPtr<llvm::MemoryBuffer> File;
   1405   if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
   1406     StringRef Data = File.get()->getBuffer();
   1407     SmallVector<StringRef, 8> Lines;
   1408     Data.split(Lines, "\n");
   1409     for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
   1410       if (Lines[i] == "DISTRIB_CODENAME=hardy")
   1411         return UbuntuHardy;
   1412       else if (Lines[i] == "DISTRIB_CODENAME=intrepid")
   1413         return UbuntuIntrepid;
   1414       else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
   1415         return UbuntuJaunty;
   1416       else if (Lines[i] == "DISTRIB_CODENAME=karmic")
   1417         return UbuntuKarmic;
   1418       else if (Lines[i] == "DISTRIB_CODENAME=lucid")
   1419         return UbuntuLucid;
   1420       else if (Lines[i] == "DISTRIB_CODENAME=maverick")
   1421         return UbuntuMaverick;
   1422       else if (Lines[i] == "DISTRIB_CODENAME=natty")
   1423         return UbuntuNatty;
   1424       else if (Lines[i] == "DISTRIB_CODENAME=oneiric")
   1425         return UbuntuOneiric;
   1426     }
   1427     return UnknownDistro;
   1428   }
   1429 
   1430   if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
   1431     StringRef Data = File.get()->getBuffer();
   1432     if (Data.startswith("Fedora release 15"))
   1433       return Fedora15;
   1434     else if (Data.startswith("Fedora release 14"))
   1435       return Fedora14;
   1436     else if (Data.startswith("Fedora release 13"))
   1437       return Fedora13;
   1438     else if (Data.startswith("Fedora release") &&
   1439              Data.find("Rawhide") != StringRef::npos)
   1440       return FedoraRawhide;
   1441     else if (Data.startswith("Red Hat Enterprise Linux") &&
   1442              Data.find("release 6") != StringRef::npos)
   1443       return RHEL6;
   1444     else if ((Data.startswith("Red Hat Enterprise Linux") ||
   1445 	      Data.startswith("CentOS")) &&
   1446              Data.find("release 5") != StringRef::npos)
   1447       return RHEL5;
   1448     else if ((Data.startswith("Red Hat Enterprise Linux") ||
   1449 	      Data.startswith("CentOS")) &&
   1450              Data.find("release 4") != StringRef::npos)
   1451       return RHEL4;
   1452     return UnknownDistro;
   1453   }
   1454 
   1455   if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
   1456     StringRef Data = File.get()->getBuffer();
   1457     if (Data[0] == '5')
   1458       return DebianLenny;
   1459     else if (Data.startswith("squeeze/sid"))
   1460       return DebianSqueeze;
   1461     else if (Data.startswith("wheezy/sid"))
   1462       return DebianWheezy;
   1463     return UnknownDistro;
   1464   }
   1465 
   1466   if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) {
   1467     StringRef Data = File.get()->getBuffer();
   1468     if (Data.startswith("openSUSE 11.3"))
   1469       return OpenSuse11_3;
   1470     else if (Data.startswith("openSUSE 11.4"))
   1471       return OpenSuse11_4;
   1472     else if (Data.startswith("openSUSE 12.1"))
   1473       return OpenSuse12_1;
   1474     return UnknownDistro;
   1475   }
   1476 
   1477   bool Exists;
   1478   if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
   1479     return Exherbo;
   1480 
   1481   if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
   1482     return ArchLinux;
   1483 
   1484   return UnknownDistro;
   1485 }
   1486 
   1487 /// \brief Trivial helper function to simplify code checking path existence.
   1488 static bool PathExists(StringRef Path) {
   1489   bool Exists;
   1490   if (!llvm::sys::fs::exists(Path, Exists))
   1491     return Exists;
   1492   return false;
   1493 }
   1494 
   1495 namespace {
   1496 /// \brief This is a class to find a viable GCC installation for Clang to use.
   1497 ///
   1498 /// This class tries to find a GCC installation on the system, and report
   1499 /// information about it. It starts from the host information provided to the
   1500 /// Driver, and has logic for fuzzing that where appropriate.
   1501 class GCCInstallationDetector {
   1502   /// \brief Struct to store and manipulate GCC versions.
   1503   ///
   1504   /// We rely on assumptions about the form and structure of GCC version
   1505   /// numbers: they consist of at most three '.'-separated components, and each
   1506   /// component is a non-negative integer.
   1507   struct GCCVersion {
   1508     unsigned Major, Minor, Patch;
   1509 
   1510     static GCCVersion Parse(StringRef VersionText) {
   1511       const GCCVersion BadVersion = {0, 0, 0};
   1512       std::pair<StringRef, StringRef> First = VersionText.split('.');
   1513       std::pair<StringRef, StringRef> Second = First.second.split('.');
   1514 
   1515       GCCVersion GoodVersion = {0, 0, 0};
   1516       if (First.first.getAsInteger(10, GoodVersion.Major))
   1517         return BadVersion;
   1518       if (Second.first.getAsInteger(10, GoodVersion.Minor))
   1519         return BadVersion;
   1520       // We accept a number, or a string for the patch version, in case there
   1521       // is a strang suffix, or other mangling: '4.1.x', '4.1.2-rc3'. When it
   1522       // isn't a number, we just use '0' as the number but accept it.
   1523       if (Second.first.getAsInteger(10, GoodVersion.Patch))
   1524         GoodVersion.Patch = 0;
   1525       return GoodVersion;
   1526     }
   1527 
   1528     bool operator<(const GCCVersion &RHS) const {
   1529       if (Major < RHS.Major) return true;
   1530       if (Major > RHS.Major) return false;
   1531       if (Minor < RHS.Minor) return true;
   1532       if (Minor > RHS.Minor) return false;
   1533       return Patch < RHS.Patch;
   1534     }
   1535     bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
   1536     bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
   1537     bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
   1538   };
   1539 
   1540   bool IsValid;
   1541   std::string GccTriple;
   1542 
   1543   // FIXME: These might be better as path objects.
   1544   std::string GccInstallPath;
   1545   std::string GccParentLibPath;
   1546 
   1547   llvm::SmallString<128> CxxIncludeRoot;
   1548 
   1549 public:
   1550   /// \brief Construct a GCCInstallationDetector from the driver.
   1551   ///
   1552   /// This performs all of the autodetection and sets up the various paths.
   1553   /// Once constructed, a GCCInstallation is esentially immutable.
   1554   GCCInstallationDetector(const Driver &D)
   1555     : IsValid(false),
   1556       GccTriple(D.DefaultHostTriple),
   1557       CxxIncludeRoot(CXX_INCLUDE_ROOT) {
   1558     // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
   1559     // avoids adding yet another option to configure/cmake.
   1560     // It would probably be cleaner to break it in two variables
   1561     // CXX_GCC_ROOT with just /foo/bar
   1562     // CXX_GCC_VER with 4.5.2
   1563     // Then we would have
   1564     // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER
   1565     // and this function would return
   1566     // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER
   1567     if (CxxIncludeRoot != "") {
   1568       // This is of the form /foo/bar/include/c++/4.5.2/
   1569       if (CxxIncludeRoot.back() == '/')
   1570         llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the /
   1571       StringRef Version = llvm::sys::path::filename(CxxIncludeRoot);
   1572       llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version
   1573       llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++
   1574       llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include
   1575       GccInstallPath = CxxIncludeRoot.str();
   1576       GccInstallPath.append("/lib/gcc/");
   1577       GccInstallPath.append(CXX_INCLUDE_ARCH);
   1578       GccInstallPath.append("/");
   1579       GccInstallPath.append(Version);
   1580       GccParentLibPath = GccInstallPath + "/../../..";
   1581       IsValid = true;
   1582       return;
   1583     }
   1584 
   1585     llvm::Triple::ArchType HostArch = llvm::Triple(GccTriple).getArch();
   1586     // The library directories which may contain GCC installations.
   1587     SmallVector<StringRef, 4> CandidateLibDirs;
   1588     // The compatible GCC triples for this particular architecture.
   1589     SmallVector<StringRef, 10> CandidateTriples;
   1590     CollectLibDirsAndTriples(HostArch, CandidateLibDirs, CandidateTriples);
   1591 
   1592     // Always include the default host triple as the final fallback if no
   1593     // specific triple is detected.
   1594     CandidateTriples.push_back(D.DefaultHostTriple);
   1595 
   1596     // Compute the set of prefixes for our search.
   1597     SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
   1598                                          D.PrefixDirs.end());
   1599     Prefixes.push_back(D.SysRoot);
   1600     Prefixes.push_back(D.SysRoot + "/usr");
   1601     Prefixes.push_back(D.InstalledDir + "/..");
   1602 
   1603     // Loop over the various components which exist and select the best GCC
   1604     // installation available. GCC installs are ranked by version number.
   1605     GCCVersion BestVersion = {0, 0, 0};
   1606     for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
   1607       if (!PathExists(Prefixes[i]))
   1608         continue;
   1609       for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
   1610         const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
   1611         if (!PathExists(LibDir))
   1612           continue;
   1613         for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k)
   1614           ScanLibDirForGCCTriple(LibDir, CandidateTriples[k], BestVersion);
   1615       }
   1616     }
   1617   }
   1618 
   1619   /// \brief Check whether we detected a valid GCC install.
   1620   bool isValid() const { return IsValid; }
   1621 
   1622   /// \brief Get the GCC triple for the detected install.
   1623   const std::string &getTriple() const { return GccTriple; }
   1624 
   1625   /// \brief Get the detected GCC installation path.
   1626   const std::string &getInstallPath() const { return GccInstallPath; }
   1627 
   1628   /// \brief Get the detected GCC parent lib path.
   1629   const std::string &getParentLibPath() const { return GccParentLibPath; }
   1630 
   1631 private:
   1632   static void CollectLibDirsAndTriples(llvm::Triple::ArchType HostArch,
   1633                                        SmallVectorImpl<StringRef> &LibDirs,
   1634                                        SmallVectorImpl<StringRef> &Triples) {
   1635     if (HostArch == llvm::Triple::arm || HostArch == llvm::Triple::thumb) {
   1636       static const char *const ARMLibDirs[] = { "/lib" };
   1637       static const char *const ARMTriples[] = { "arm-linux-gnueabi" };
   1638       LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
   1639       Triples.append(ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
   1640     } else if (HostArch == llvm::Triple::x86_64) {
   1641       static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
   1642       static const char *const X86_64Triples[] = {
   1643         "x86_64-linux-gnu",
   1644         "x86_64-unknown-linux-gnu",
   1645         "x86_64-pc-linux-gnu",
   1646         "x86_64-redhat-linux6E",
   1647         "x86_64-redhat-linux",
   1648         "x86_64-suse-linux",
   1649         "x86_64-manbo-linux-gnu",
   1650         "x86_64-linux-gnu",
   1651         "x86_64-slackware-linux"
   1652       };
   1653       LibDirs.append(X86_64LibDirs,
   1654                      X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
   1655       Triples.append(X86_64Triples,
   1656                      X86_64Triples + llvm::array_lengthof(X86_64Triples));
   1657     } else if (HostArch == llvm::Triple::x86) {
   1658       static const char *const X86LibDirs[] = { "/lib32", "/lib" };
   1659       static const char *const X86Triples[] = {
   1660         "i686-linux-gnu",
   1661         "i386-linux-gnu",
   1662         "i686-pc-linux-gnu",
   1663         "i486-linux-gnu",
   1664         "i686-redhat-linux",
   1665         "i386-redhat-linux",
   1666         "i586-suse-linux",
   1667         "i486-slackware-linux"
   1668       };
   1669       LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
   1670       Triples.append(X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
   1671     } else if (HostArch == llvm::Triple::ppc) {
   1672       static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
   1673       static const char *const PPCTriples[] = {
   1674         "powerpc-linux-gnu",
   1675         "powerpc-unknown-linux-gnu"
   1676       };
   1677       LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
   1678       Triples.append(PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
   1679     } else if (HostArch == llvm::Triple::ppc64) {
   1680       static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
   1681       static const char *const PPC64Triples[] = {
   1682         "powerpc64-unknown-linux-gnu"
   1683       };
   1684       LibDirs.append(PPC64LibDirs,
   1685                      PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
   1686       Triples.append(PPC64Triples,
   1687                      PPC64Triples + llvm::array_lengthof(PPC64Triples));
   1688     }
   1689   }
   1690 
   1691   void ScanLibDirForGCCTriple(const std::string &LibDir,
   1692                               StringRef CandidateTriple,
   1693                               GCCVersion &BestVersion) {
   1694     // There are various different suffixes involving the triple we
   1695     // check for. We also record what is necessary to walk from each back
   1696     // up to the lib directory.
   1697     const std::string Suffixes[] = {
   1698       "/gcc/" + CandidateTriple.str(),
   1699       "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
   1700 
   1701       // Ubuntu has a strange mis-matched pair of triples that this happens to
   1702       // match.
   1703       // FIXME: It may be worthwhile to generalize this and look for a second
   1704       // triple.
   1705       "/" + CandidateTriple.str() + "/gcc/i686-linux-gnu"
   1706     };
   1707     const std::string InstallSuffixes[] = {
   1708       "/../../..",
   1709       "/../../../..",
   1710       "/../../../.."
   1711     };
   1712     // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
   1713     const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -
   1714                                   (CandidateTriple != "i386-linux-gnu"));
   1715     for (unsigned i = 0; i < NumSuffixes; ++i) {
   1716       StringRef Suffix = Suffixes[i];
   1717       llvm::error_code EC;
   1718       for (llvm::sys::fs::directory_iterator LI(LibDir + Suffix, EC), LE;
   1719            !EC && LI != LE; LI = LI.increment(EC)) {
   1720         StringRef VersionText = llvm::sys::path::filename(LI->path());
   1721         GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
   1722         static const GCCVersion MinVersion = { 4, 1, 1 };
   1723         if (CandidateVersion < MinVersion)
   1724           continue;
   1725         if (CandidateVersion <= BestVersion)
   1726           continue;
   1727         if (!PathExists(LI->path() + "/crtbegin.o"))
   1728           continue;
   1729 
   1730         BestVersion = CandidateVersion;
   1731         GccTriple = CandidateTriple.str();
   1732         // FIXME: We hack together the directory name here instead of
   1733         // using LI to ensure stable path separators across Windows and
   1734         // Linux.
   1735         GccInstallPath = LibDir + Suffixes[i] + "/" + VersionText.str();
   1736         GccParentLibPath = GccInstallPath + InstallSuffixes[i];
   1737         IsValid = true;
   1738       }
   1739     }
   1740   }
   1741 };
   1742 }
   1743 
   1744 static void addPathIfExists(const std::string &Path,
   1745                             ToolChain::path_list &Paths) {
   1746   if (PathExists(Path)) Paths.push_back(Path);
   1747 }
   1748 
   1749 Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
   1750   : Generic_ELF(Host, Triple) {
   1751   llvm::Triple::ArchType Arch =
   1752     llvm::Triple(getDriver().DefaultHostTriple).getArch();
   1753   const std::string &SysRoot = getDriver().SysRoot;
   1754   GCCInstallationDetector GCCInstallation(getDriver());
   1755 
   1756   // OpenSuse stores the linker with the compiler, add that to the search
   1757   // path.
   1758   ToolChain::path_list &PPaths = getProgramPaths();
   1759   PPaths.push_back(GCCInstallation.getParentLibPath() + "/../" +
   1760                    GCCInstallation.getTriple() + "/bin");
   1761 
   1762   Linker = GetProgramPath("ld");
   1763 
   1764   LinuxDistro Distro = DetectLinuxDistro(Arch);
   1765 
   1766   if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
   1767     ExtraOpts.push_back("-z");
   1768     ExtraOpts.push_back("relro");
   1769   }
   1770 
   1771   if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
   1772     ExtraOpts.push_back("-X");
   1773 
   1774   if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick ||
   1775       Distro == UbuntuNatty || Distro == UbuntuOneiric)
   1776     ExtraOpts.push_back("--hash-style=gnu");
   1777 
   1778   if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
   1779       Distro == UbuntuJaunty || Distro == UbuntuKarmic)
   1780     ExtraOpts.push_back("--hash-style=both");
   1781 
   1782   if (IsRedhat(Distro))
   1783     ExtraOpts.push_back("--no-add-needed");
   1784 
   1785   if (Distro == DebianSqueeze || Distro == DebianWheezy ||
   1786       IsOpenSuse(Distro) ||
   1787       (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
   1788       Distro == UbuntuLucid ||
   1789       Distro == UbuntuMaverick || Distro == UbuntuKarmic ||
   1790       Distro == UbuntuNatty || Distro == UbuntuOneiric)
   1791     ExtraOpts.push_back("--build-id");
   1792 
   1793   if (IsOpenSuse(Distro))
   1794     ExtraOpts.push_back("--enable-new-dtags");
   1795 
   1796   // The selection of paths to try here is designed to match the patterns which
   1797   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
   1798   // This was determined by running GCC in a fake filesystem, creating all
   1799   // possible permutations of these directories, and seeing which ones it added
   1800   // to the link paths.
   1801   path_list &Paths = getFilePaths();
   1802   const bool Is32Bits = (getArch() == llvm::Triple::x86 ||
   1803                          getArch() == llvm::Triple::ppc);
   1804 
   1805   const std::string Suffix32 = Arch == llvm::Triple::x86_64 ? "/32" : "";
   1806   const std::string Suffix64 = Arch == llvm::Triple::x86_64 ? "" : "/64";
   1807   const std::string Suffix = Is32Bits ? Suffix32 : Suffix64;
   1808   const std::string Multilib = Is32Bits ? "lib32" : "lib64";
   1809 
   1810   // FIXME: Because we add paths only when they exist on the system, I think we
   1811   // should remove the concept of 'HasMultilib'. It's more likely to break the
   1812   // behavior than to preserve any useful invariant on the system.
   1813   if (HasMultilib(Arch, Distro)) {
   1814     // Add the multilib suffixed paths.
   1815     if (GCCInstallation.isValid()) {
   1816       const std::string &LibPath = GCCInstallation.getParentLibPath();
   1817       const std::string &GccTriple = GCCInstallation.getTriple();
   1818       // FIXME: This OpenSuse-specific path shouldn't be needed any more, but
   1819       // I don't want to remove it without finding someone to test.
   1820       if (IsOpenSuse(Distro) && Is32Bits)
   1821         Paths.push_back(LibPath + "/../" + GccTriple + "/lib/../lib");
   1822 
   1823       addPathIfExists(GCCInstallation.getInstallPath() + Suffix, Paths);
   1824       addPathIfExists(LibPath + "/../" + GccTriple + "/lib/../" + Multilib,
   1825                       Paths);
   1826       addPathIfExists(LibPath + "/../" + Multilib, Paths);
   1827     }
   1828     addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
   1829     addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
   1830 
   1831     // Try walking via the GCC triple path in case of multiarch GCC
   1832     // installations with strange symlinks.
   1833     if (GCCInstallation.isValid())
   1834       addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple() +
   1835                       "/../../" + Multilib, Paths);
   1836   }
   1837 
   1838   // Add the non-multilib suffixed paths (if potentially different).
   1839   if (GCCInstallation.isValid()) {
   1840     const std::string &LibPath = GCCInstallation.getParentLibPath();
   1841     const std::string &GccTriple = GCCInstallation.getTriple();
   1842     if (!Suffix.empty() || !HasMultilib(Arch, Distro))
   1843       addPathIfExists(GCCInstallation.getInstallPath(), Paths);
   1844     addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths);
   1845     addPathIfExists(LibPath, Paths);
   1846   }
   1847   addPathIfExists(SysRoot + "/lib", Paths);
   1848   addPathIfExists(SysRoot + "/usr/lib", Paths);
   1849 
   1850   // Add a multiarch lib directory whenever it exists and is plausible.
   1851   if (GCCInstallation.isValid() && Arch == getArch())
   1852     addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple(), Paths);
   1853 }
   1854 
   1855 bool Linux::HasNativeLLVMSupport() const {
   1856   return true;
   1857 }
   1858 
   1859 Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
   1860                         const ActionList &Inputs) const {
   1861   Action::ActionClass Key;
   1862   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1863     Key = Action::AnalyzeJobClass;
   1864   else
   1865     Key = JA.getKind();
   1866 
   1867   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
   1868                                              options::OPT_no_integrated_as,
   1869                                              IsIntegratedAssemblerDefault());
   1870 
   1871   Tool *&T = Tools[Key];
   1872   if (!T) {
   1873     switch (Key) {
   1874     case Action::AssembleJobClass:
   1875       if (UseIntegratedAs)
   1876         T = new tools::ClangAs(*this);
   1877       else
   1878         T = new tools::linuxtools::Assemble(*this);
   1879       break;
   1880     case Action::LinkJobClass:
   1881       T = new tools::linuxtools::Link(*this); break;
   1882     default:
   1883       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1884     }
   1885   }
   1886 
   1887   return *T;
   1888 }
   1889 
   1890 /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
   1891 
   1892 DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
   1893   : Generic_ELF(Host, Triple) {
   1894 
   1895   // Path mangling to find libexec
   1896   getProgramPaths().push_back(getDriver().getInstalledDir());
   1897   if (getDriver().getInstalledDir() != getDriver().Dir)
   1898     getProgramPaths().push_back(getDriver().Dir);
   1899 
   1900   getFilePaths().push_back(getDriver().Dir + "/../lib");
   1901   getFilePaths().push_back("/usr/lib");
   1902   getFilePaths().push_back("/usr/lib/gcc41");
   1903 }
   1904 
   1905 Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
   1906                             const ActionList &Inputs) const {
   1907   Action::ActionClass Key;
   1908   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1909     Key = Action::AnalyzeJobClass;
   1910   else
   1911     Key = JA.getKind();
   1912 
   1913   Tool *&T = Tools[Key];
   1914   if (!T) {
   1915     switch (Key) {
   1916     case Action::AssembleJobClass:
   1917       T = new tools::dragonfly::Assemble(*this); break;
   1918     case Action::LinkJobClass:
   1919       T = new tools::dragonfly::Link(*this); break;
   1920     default:
   1921       T = &Generic_GCC::SelectTool(C, JA, Inputs);
   1922     }
   1923   }
   1924 
   1925   return *T;
   1926 }
   1927 
   1928 Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
   1929   : ToolChain(Host, Triple) {
   1930 }
   1931 
   1932 Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
   1933                           const ActionList &Inputs) const {
   1934   Action::ActionClass Key;
   1935   if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
   1936     Key = Action::AnalyzeJobClass;
   1937   else
   1938     Key = JA.getKind();
   1939 
   1940   bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
   1941                                              options::OPT_no_integrated_as,
   1942                                              IsIntegratedAssemblerDefault());
   1943 
   1944   Tool *&T = Tools[Key];
   1945   if (!T) {
   1946     switch (Key) {
   1947     case Action::InputClass:
   1948     case Action::BindArchClass:
   1949     case Action::LipoJobClass:
   1950     case Action::DsymutilJobClass:
   1951     case Action::VerifyJobClass:
   1952       llvm_unreachable("Invalid tool kind.");
   1953     case Action::PreprocessJobClass:
   1954     case Action::PrecompileJobClass:
   1955     case Action::AnalyzeJobClass:
   1956     case Action::CompileJobClass:
   1957       T = new tools::Clang(*this); break;
   1958     case Action::AssembleJobClass:
   1959       if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO)
   1960         T = new tools::darwin::Assemble(*this);
   1961       else
   1962         T = new tools::ClangAs(*this);
   1963       break;
   1964     case Action::LinkJobClass:
   1965       T = new tools::visualstudio::Link(*this); break;
   1966     }
   1967   }
   1968 
   1969   return *T;
   1970 }
   1971 
   1972 bool Windows::IsIntegratedAssemblerDefault() const {
   1973   return true;
   1974 }
   1975 
   1976 bool Windows::IsUnwindTablesDefault() const {
   1977   // FIXME: Gross; we should probably have some separate target
   1978   // definition, possibly even reusing the one in clang.
   1979   return getArchName() == "x86_64";
   1980 }
   1981 
   1982 const char *Windows::GetDefaultRelocationModel() const {
   1983   return "static";
   1984 }
   1985 
   1986 const char *Windows::GetForcedPicModel() const {
   1987   if (getArchName() == "x86_64")
   1988     return "pic";
   1989   return 0;
   1990 }
   1991