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