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