ToolChains.cpp revision 27fa2364b05ab26138c2ecf0eac1937b7fc6c037
13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
23917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
33917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//                     The LLVM Compiler Infrastructure
43917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
53917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// This file is distributed under the University of Illinois Open Source
63917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// License. See LICENSE.TXT for details.
73917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
83917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===----------------------------------------------------------------------===//
93917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar#include "ToolChains.h"
1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "SanitizerArgs.h"
1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h"
1355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/Version.h"
14f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/Arg.h"
15f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/ArgList.h"
160f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h"
17c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h"
184e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
1927e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h"
204e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h"
21265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/STLExtras.h"
2300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h"
24c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
25a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson#include "llvm/ADT/StringSwitch.h"
2684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
2732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
28c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h"
2903013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
3055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h"
313a321e23f66128dbb986343927456ff6702af617Michael J. Spencer#include "llvm/Support/system_error.h"
325542635a0fcfcd4b96eecf6f08e3648bd5bf739cNAKAMURA Takumi
335542635a0fcfcd4b96eecf6f08e3648bd5bf739cNAKAMURA Takumi// FIXME: This needs to be listed last until we fix the broken include guards
345542635a0fcfcd4b96eecf6f08e3648bd5bf739cNAKAMURA Takumi// in these files and the LLVM config.h files.
355542635a0fcfcd4b96eecf6f08e3648bd5bf739cNAKAMURA Takumi#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
365542635a0fcfcd4b96eecf6f08e3648bd5bf739cNAKAMURA Takumi
37f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
38f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
393917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
403917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
43f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
448eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
451d16f0f805c2a3e2198a87154990347b2759f6bdChandler CarruthDarwin::Darwin(const Driver &D, const llvm::Triple& Triple)
46260611a32535c851237926bfcf78869b13c07d5bJohn McCall  : ToolChain(D, Triple), TargetInitialized(false)
471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
481085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // Compute the initial Darwin version from the triple
491085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  unsigned Major, Minor, Micro;
504c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson  if (!Triple.getMacOSXVersion(Major, Minor, Micro))
514c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson    getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
524c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson      Triple.getOSName();
534c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson  llvm::raw_string_ostream(MacosxVersionMin)
544c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson    << Major << '.' << Minor << '.' << Micro;
554c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson
561085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // FIXME: DarwinVersion is only used to find GCC's libexec directory.
571085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // It should be removed when we stop supporting that.
581085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[0] = Minor + 4;
591085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[1] = Micro;
601085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[2] = 0;
61c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier
62c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier  // Compute the initial iOS version from the triple
638c990274ae17cf7c56048ee453b0566515633b7fChad Rosier  Triple.getiOSVersion(Major, Minor, Micro);
64c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier  llvm::raw_string_ostream(iOSVersionMin)
65c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier    << Major << '.' << Minor << '.' << Micro;
661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
684180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID Darwin::LookupTypeForExtension(const char *Ext) const {
694180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  types::ID Ty = types::lookupTypeForExtension(Ext);
704180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
714180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  // Darwin always preprocesses assembly files (unless -x is used explicitly).
724180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  if (Ty == types::TY_PP_Asm)
734180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar    return types::TY_Asm;
744180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
754180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return Ty;
764180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
774180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
78b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool Darwin::HasNativeLLVMSupport() const {
79b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return true;
80b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
81b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
829f084a3166b684573ba49df28fc5792bc37d92e1John McCall/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
83260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
84377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson  if (isTargetIPhoneOS())
85260611a32535c851237926bfcf78869b13c07d5bJohn McCall    return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
86377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson  if (isNonFragile)
87377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson    return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
88377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson  return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
899f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
909f084a3166b684573ba49df28fc5792bc37d92e1John McCall
9113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
9213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCallbool Darwin::hasBlocksRuntime() const {
9313db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  if (isTargetIPhoneOS())
9413db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isIPhoneOSVersionLT(3, 2);
9513db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  else
9613db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isMacosxVersionLT(10, 6);
9713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall}
9813db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall
995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMArch(StringRef Value) {
100a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char*>(Value)
101a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv6k", "armv6")
102a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv5tej", "armv5")
103a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
104a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv4t", "armv4t")
105a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv7", "armv7")
106a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7a", "armv7-a", "armv7")
107a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7r", "armv7-r", "armv7")
108a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7m", "armv7-m", "armv7")
109336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7f", "armv7-f", "armv7f")
110336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7k", "armv7-k", "armv7k")
111336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7s", "armv7-s", "armv7s")
112a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
113eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
114eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMCpu(StringRef Value) {
116a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char *>(Value)
117a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
118a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm10e", "arm10tdmi", "armv5")
119a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
120a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
121a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
122a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson           "arm1176jzf-s", "cortex-m0", "armv6")
1232df67ea86f64c2a94b973d8fda2e3c1fd53fc84dSilviu Baranga    .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "cortex-a15",
1242df67ea86f64c2a94b973d8fda2e3c1fd53fc84dSilviu Baranga           "armv7")
125336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("cortex-a9-mp", "armv7f")
126336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("swift", "armv7s")
127a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
128eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
129eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1305f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Darwin::getDarwinArchName(const ArgList &Args) const {
131eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
132eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
133eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
134304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
135f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  case llvm::Triple::thumb:
136eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
137eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1381d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMArch(A->getValue()))
139eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
140eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
141eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1421d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMCpu(A->getValue()))
143eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
144eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
145eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
146eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
147eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
148eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
149eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
150f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
1528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
1538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
1558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1568eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
15761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
15861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
15961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
16000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
16100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // If the target isn't initialized (e.g., an unknown Darwin platform, return
16200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // the default triple).
16300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetInitialized())
16400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
165304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
166f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<16> Str;
16709c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Str += isTargetIPhoneOS() ? "ios" : "macosx";
16809c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Str += getTargetVersion().getAsString();
16909c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Triple.setOSName(Str);
17000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
17100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return Triple.getTriple();
17200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
17300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
17499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid Generic_ELF::anchor() {}
17599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
176ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
177ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                         const ActionList &Inputs) const {
178d6277fb9e0353edffc0d6c8655a65542c08cf6f1Argyrios Kyrtzidis  Action::ActionClass Key = JA.getKind();
1795bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
1805bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
1815bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    // FIXME: This seems like a hacky way to choose clang frontend.
1825bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
1835bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  }
1845bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
1850f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1860f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             options::OPT_no_integrated_as,
1871a1764bd15406f86d53c51b4c7f8a54afee2a541Bob Wilson                                             IsIntegratedAssemblerDefault());
1880f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar
1898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
1918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
1928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
1938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
194b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
1958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
1968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
19730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    case Action::MigrateJobClass:
1989120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
1998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
20066b8a6671bb5df540dd7200a5286f7ed7a72c1ccBob Wilson      T = new tools::Clang(*this); break;
2010f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    case Action::AssembleJobClass: {
2020f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      if (UseIntegratedAs)
2030f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::ClangAs(*this);
2040f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      else
2050f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::darwin::Assemble(*this);
2060f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      break;
2070f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    }
2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
2098f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
2126e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
2136e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
214f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
215f857186fd1995b34185d063a29b11ad4f948519fEric Christopher      T = new tools::darwin::VerifyDebug(*this); break;
2168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
2178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2188eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2198eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
2208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2226cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2231d16f0f805c2a3e2198a87154990347b2759f6bdChandler CarruthDarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple)
2241d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  : Darwin(D, Triple)
2251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
2260e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
2270e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
2280e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2290e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
2301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
231edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
232edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
233edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
236f85e193739c953358c865005855253af4f68a497John McCallvoid DarwinClang::AddLinkARCArgs(const ArgList &Args,
237f85e193739c953358c865005855253af4f68a497John McCall                                 ArgStringList &CmdArgs) const {
238f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
239f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("-force_load");
240f85e193739c953358c865005855253af4f68a497John McCall  llvm::sys::Path P(getDriver().ClangExecutable);
241f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'clang'
242f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'bin'
243f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("lib");
244f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("arc");
245f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("libarclite_");
246f85e193739c953358c865005855253af4f68a497John McCall  std::string s = P.str();
247f85e193739c953358c865005855253af4f68a497John McCall  // Mash in the platform.
248c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  if (isTargetIOSSimulator())
249c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis    s += "iphonesimulator";
250c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  else if (isTargetIPhoneOS())
251f85e193739c953358c865005855253af4f68a497John McCall    s += "iphoneos";
252f85e193739c953358c865005855253af4f68a497John McCall  else
253f85e193739c953358c865005855253af4f68a497John McCall    s += "macosx";
254f85e193739c953358c865005855253af4f68a497John McCall  s += ".a";
255f85e193739c953358c865005855253af4f68a497John McCall
256f85e193739c953358c865005855253af4f68a497John McCall  CmdArgs.push_back(Args.MakeArgString(s));
257f85e193739c953358c865005855253af4f68a497John McCall}
258f85e193739c953358c865005855253af4f68a497John McCall
2593404fe7105ecc3baa58b7ea725773de4112259d6Eric Christophervoid DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
260f857186fd1995b34185d063a29b11ad4f948519fEric Christopher                                    ArgStringList &CmdArgs,
26169b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov                                    const char *DarwinStaticLib,
26269b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov                                    bool AlwaysLink) const {
2633404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  llvm::sys::Path P(getDriver().ResourceDir);
2643404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("lib");
2653404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("darwin");
2663404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent(DarwinStaticLib);
267f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
2683404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  // For now, allow missing resource libraries to support developers who may
26969b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // not have compiler-rt checked out or integrated into their build (unless
27069b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // we explicitly force linking with this library).
2713404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  bool Exists;
27269b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  if (AlwaysLink || (!llvm::sys::fs::exists(P.str(), Exists) && Exists))
2733404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    CmdArgs.push_back(Args.MakeArgString(P.str()));
2743404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher}
2753404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
2761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
2771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
278c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  // Darwin only supports the compiler-rt based runtime libraries.
279c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  switch (GetRuntimeLibType(Args)) {
280c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  case ToolChain::RLT_CompilerRT:
281c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    break;
282c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  default:
283c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
2841d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
285c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    return;
286c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
287c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
288eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
289eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
2907a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (Args.hasArg(options::OPT_static) ||
2917a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext) ||
2927a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_mkernel))
2931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
2941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
2961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
2971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
2981d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
2995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_unsupported_opt)
3001d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
3011d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
3031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
304f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  // If we are building profile support, link that library in.
305f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
306f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
307f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
308f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_coverage)) {
309f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    // Select the appropriate runtime library for the target.
310f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    if (isTargetIPhoneOS()) {
311f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
312f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    } else {
313f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
314f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    }
315f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  }
316f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar
317bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  SanitizerArgs Sanitize(getDriver(), Args);
318bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov
31975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  // Add Ubsan runtime library, if required.
32075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  if (Sanitize.needsUbsanRt()) {
32175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    if (Args.hasArg(options::OPT_dynamiclib) ||
32275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        Args.hasArg(options::OPT_bundle)) {
32375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // Assume the binary will provide the Ubsan runtime.
32475fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else if (isTargetIPhoneOS()) {
32575fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
32675fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        << "-fsanitize=undefined";
32775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else {
32869b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
32975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
33075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // The Ubsan runtime library requires C++.
33175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      AddCXXStdlibLibArgs(Args, CmdArgs);
33275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    }
33375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  }
33475fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
3357b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // Add ASAN runtime library, if required. Dynamic libraries and bundles
3367b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // should not be linked with the runtime library.
337bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  if (Sanitize.needsAsanRt()) {
3387b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    if (Args.hasArg(options::OPT_dynamiclib) ||
33975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        Args.hasArg(options::OPT_bundle)) {
34075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // Assume the binary will provide the ASan runtime.
34175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else if (isTargetIPhoneOS()) {
34294b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
343bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov        << "-fsanitize=address";
34494b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    } else {
34569b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx.a", true);
34694b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar
34794b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      // The ASAN runtime library requires C++ and CoreFoundation.
34894b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      AddCXXStdlibLibArgs(Args, CmdArgs);
34994b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      CmdArgs.push_back("-framework");
35094b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      CmdArgs.push_back("CoreFoundation");
35194b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    }
35294b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar  }
35394b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar
354eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
355eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
3561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
357eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
358eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
359251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
36087e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
36187e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // it never went into the SDK.
362163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    // Linking against libgcc_s.1 isn't needed for iOS 5.0+
363163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
364163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      CmdArgs.push_back("-lgcc_s.1");
365eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
3663cceec5e05d974f3993bd0a745325f76fb8e4efcDaniel Dunbar    // We currently always need a static runtime library for iOS.
3673404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
368eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
370eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
371ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
372eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
373ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
374eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
375eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
376885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // For OS X, we thought we would only need a static runtime library when
377fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner    // targeting 10.4, to provide versions of the static functions which were
378885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // omitted from 10.4.dylib.
379885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    //
380885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // Unfortunately, that turned out to not be true, because Darwin system
381885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // headers can still use eprintf on i386, and it is not exported from
382885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // libSystem. Therefore, we still must provide a runtime library just for
383885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // the tiny tiny handful of projects that *might* use that symbol.
384885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    if (isMacosxVersionLT(10, 5)) {
3853404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
386885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    } else {
387885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::x86)
3883404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher        AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
3893404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
390885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    }
391eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
3921d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
39460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
395ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
396ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
3979101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Support allowing the SDKROOT environment variable used by xcrun and other
3989101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Xcode tools to define the default sysroot, by making it the default for
3999101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // isysroot.
4009101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  if (!Args.hasArg(options::OPT_isysroot)) {
4019101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    if (char *env = ::getenv("SDKROOT")) {
4029101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      // We only use this value as the default if it is an absolute path and
4039101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      // exists.
4049101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env)) {
4059101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar        Args.append(Args.MakeSeparateArg(
4069101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar                      0, Opts.getOption(options::OPT_isysroot), env));
4079101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      }
4089101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    }
4099101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  }
4109101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar
4112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
4129d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
4139d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSSimVersion = Args.getLastArg(
4149d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    options::OPT_mios_simulator_version_min_EQ);
415983d835bead0134170a6646a8844926077c968d6Eli Friedman
4169d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
4175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
418ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
4199d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
4209d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSVersion = iOSSimVersion = 0;
4219d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (iOSVersion && iOSSimVersion) {
4225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
4239d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSVersion->getAsString(Args)
4249d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSSimVersion->getAsString(Args);
4259d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSSimVersion = 0;
4269d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
427a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // If no deployment target was specified on the command line, check for
428816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
429a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef OSXTarget;
430a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSTarget;
431a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSSimTarget;
432a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
433a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      OSXTarget = env;
434a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
435a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSTarget = env;
436a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
437a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSSimTarget = env;
438a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier
439a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi    // If no '-miphoneos-version-min' specified on the command line and
440a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
441241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // based on -isysroot.
442a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (iOSTarget.empty()) {
443a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
444a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef first, second;
4451d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef isysroot = A->getValue();
446a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
447a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        if (second != "")
448a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier          iOSTarget = second.substr(0,3);
449a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      }
450a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    }
451816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
4524f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // If no OSX or iOS target has been specified and we're compiling for armv7,
4534f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // go ahead as assume we're targeting iOS.
45449033207b75216a956f3dbf7d018fb3343a54ec1Chad Rosier    if (OSXTarget.empty() && iOSTarget.empty() &&
455336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson        (getDarwinArchName(Args) == "armv7" ||
456336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson         getDarwinArchName(Args) == "armv7s"))
45787ca5580302561c839b2cd12207902b9bf4ed117Chad Rosier        iOSTarget = iOSVersionMin;
4584f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier
4599d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Handle conflicting deployment targets
46039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
46139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
4629d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4639d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Do not allow conflicts with the iOS simulator target.
464a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
4655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
4669d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
467a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
4689d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar            "IPHONEOS_DEPLOYMENT_TARGET");
4699d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    }
4709d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4719d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Allow conflicts among OSX and iOS for historical reasons, but choose the
4729d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // default platform.
473a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty() && !iOSTarget.empty()) {
47439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
47539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
476a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        OSXTarget = "";
47739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
478a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        iOSTarget = "";
47939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
4801a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
481a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty()) {
482e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
48360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
48460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
485a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSTarget.empty()) {
486e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
4879d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
4889d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSVersion);
489a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSSimTarget.empty()) {
490e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(
4919d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        options::OPT_mios_simulator_version_min_EQ);
4929d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
4939d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSSimVersion);
494816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
4952bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
496e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
49760baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
49860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
49930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
500ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
5011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5023fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  // Reject invalid architecture combinations.
5033fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
5043fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar                        getTriple().getArch() != llvm::Triple::x86_64)) {
5055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
5063fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
5073fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  }
5083fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar
5092603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
5102603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
5112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
5122603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
5139d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
5141d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
5152603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
5168a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar        Major != 10 || Minor >= 100 || Micro >= 100)
5175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
5182603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
5192603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
5209d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
5219d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert(Version && "Unknown target platform!");
5221d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor,
523983d835bead0134170a6646a8844926077c968d6Eli Friedman                                   Micro, HadExtra) || HadExtra ||
524983d835bead0134170a6646a8844926077c968d6Eli Friedman        Major >= 10 || Minor >= 100 || Micro >= 100)
525983d835bead0134170a6646a8844926077c968d6Eli Friedman      getDriver().Diag(diag::err_drv_invalid_version_number)
526983d835bead0134170a6646a8844926077c968d6Eli Friedman        << Version->getAsString(Args);
5272603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
5289d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5295f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  bool IsIOSSim = bool(iOSSimVersion);
5305f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5315f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // In GCC, the simulator historically was treated as being OS X in some
5325f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // contexts, like determining the link logic, despite generally being called
5335f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // with an iOS deployment target. For compatibility, we detect the
5345f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // simulator as iOS + x86, and treat it differently in a few contexts.
5355f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
5365f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                     getTriple().getArch() == llvm::Triple::x86_64))
5375f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    IsIOSSim = true;
5385f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5395f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
540c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
541c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
542132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
543efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
544efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
545efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
546efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
547efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
548efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
549efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
550efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
551efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
552efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
553efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
554efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
555efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
556efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
557efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
55832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
559efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5601d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      llvm::sys::Path P(A->getValue());
561efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("usr");
562efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("lib");
563efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("libstdc++.dylib");
564efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
56532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
566efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.eraseComponent();
567efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.appendComponent("libstdc++.6.dylib");
56832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
569efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
570efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
571efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
572efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
573efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
574efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
575efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
5765a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // FIXME: This should be removed someday when we don't have to care about
5775a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
57832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
57932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
580efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
581efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
582efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
583efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
584efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
585efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
586efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
587efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
588efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
589efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
590efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
5917433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
5927433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
5937433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
5947433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
5957433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
5967433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
5977433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
5987433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  llvm::sys::Path P(getDriver().ResourceDir);
5997433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("lib");
6007433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("darwin");
6017a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
6027a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // Use the newer cc_kext for iOS ARM after 6.0.
6037a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
6047a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      !isIPhoneOSVersionLT(6, 0)) {
6057a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext.a");
6067a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  } else {
6077a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext_ios5.a");
6087a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
609304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6107433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
6117433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
61232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
61332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
6147433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
6157433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
6167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
617c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
618c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar                                      const char *BoundArch) const {
619c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
620c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
621c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
622c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
623c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
624c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
625c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
626c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
627c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
6282603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
629279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
630279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
6314e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
6324e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6334e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
6342a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // Skip this argument unless the architecture matches either the toolchain
6352a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // triple arch, or the arch being bound.
63664f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      llvm::Triple::ArchType XarchArch =
6371d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        tools::darwin::getArchTypeForDarwinArchName(A->getValue(0));
63864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      if (!(XarchArch == getArch()  ||
63964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola            (BoundArch && XarchArch ==
640cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola             tools::darwin::getArchTypeForDarwinArchName(BoundArch))))
6414e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6424e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6438ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      Arg *OriginalArg = A;
6441d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
6450e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
646ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
6494e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
6504e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
6514e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
6524e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
6534e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
6544e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
6554e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
6560e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar      if (!XarchArg || Index > Prev + 1) {
6575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
6587e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar          << A->getAsString(Args);
6597e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar        continue;
66091e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
6615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
6624e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
6634e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6644e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
6654e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
666478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
6674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
6680e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
6690e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
6708ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
6718ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // Linker input arguments require custom handling. The problem is that we
6728ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // have already constructed the phase actions, so we can not treat them as
6738ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // "input arguments".
67491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      if (A->getOption().hasFlag(options::LinkerInput)) {
6758ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        // Convert the argument into individual Zlinker_input_args.
6768ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
6778ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar          DAL->AddSeparateArg(OriginalArg,
6788ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              Opts.getOption(options::OPT_Zlinker_input),
6791d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                              A->getValue(i));
680304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6818ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        }
6828ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        continue;
6838ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      }
6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
6854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
686ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
687ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
688ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
6899e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
690ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
691ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
692ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
693ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
694ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
695ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
696ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
6979d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
698ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
700ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
7019d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
7021d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                          A->getValue());
703ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
704ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
705ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
7069d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7089d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
709ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
710ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
711ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
7129d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7149d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
715ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
716ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
717ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
7189d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
719ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
720ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
721ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
7229d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
723ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
724ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
725ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
7269d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
727ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
728ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
729ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
7309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
732ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
733ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
734ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
7359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7369d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
737ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
739ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
7409d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
741ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
742ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
7449d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
745ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
746ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
7474e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
7484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
74984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
75084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
751e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
7529d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
75384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
75484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
755c97e96a61fca41e84d5af3027b91cc1db32f1654Chad Rosier  // how the driver driver works.
75684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
7575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = BoundArch;
758e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
759e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MArch = Opts.getOption(options::OPT_march_EQ);
76084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
76184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
76284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
76384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
76484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
76584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
7669d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
76784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
7689d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
76984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
7709d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
77184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
7729d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
77384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
7749d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
77584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
7769d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
77784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
7789d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
77984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
7809d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
78184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
78284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
7839d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
78484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
78584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
78684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
78784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
7889d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
78984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
7909d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
79184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
7929d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
79384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
7949d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
79584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
7969d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
79784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
7989d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
8009d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
80184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
80284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
8039d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
804ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
80584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
8069d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
80784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
8089d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
80984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
8109d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
81184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
8129d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
81384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
8149d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
81584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
8169d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
817336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7f")
818336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7f");
819336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7k")
820336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7k");
821336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7s")
822336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7s");
82384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
82484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
8259f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
82684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
827ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
82860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
82960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
83060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
8318202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier  if (BoundArch)
8328202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier    AddDeploymentTarget(*DAL);
83360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
8347a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
8357a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // FIXME: It would be far better to avoid inserting those -static arguments,
8367a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // but we can't check the deployment target in the translation code until
8377a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // it is set here.
8387a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) {
8397a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
8407a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Arg *A = *it;
8417a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      ++it;
8427a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      if (A->getOption().getID() != options::OPT_mkernel &&
8437a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar          A->getOption().getID() != options::OPT_fapple_kext)
8447a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar        continue;
8457a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(it != ie && "unexpected argument translation");
8467a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      A = *it;
8477a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(A->getOption().getID() == options::OPT_static &&
8487a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar             "missing expected -static argument");
8497a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      it = DAL->getArgs().erase(it);
8507a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    }
8517a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
8527a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
853163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  // Validate the C++ standard library choice.
854163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  CXXStdlibType Type = GetCXXStdlibType(*DAL);
855163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  if (Type == ToolChain::CST_Libcxx) {
856260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Check whether the target provides libc++.
857260611a32535c851237926bfcf78869b13c07d5bJohn McCall    StringRef where;
858260611a32535c851237926bfcf78869b13c07d5bJohn McCall
859260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Complain about targetting iOS < 5.0 in any way.
860377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson    if (isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0))
861377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson      where = "iOS 5.0";
862260611a32535c851237926bfcf78869b13c07d5bJohn McCall
863260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (where != StringRef()) {
864163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
865260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << where;
866163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    }
867163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  }
868163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
8694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
8718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
872f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
873a4a809e23ef17bef21afc50e70412a77567807aeRafael Espindola  return getArch() == llvm::Triple::x86_64;
8748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8758eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
876f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
877f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
878f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
879f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
880f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
881f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
882b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
883b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
884b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
885b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
886b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
887b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
8887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefault() const {
8897ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return true;
8908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
8927ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefaultForced() const {
8937ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return getArch() == llvm::Triple::x86_64;
8948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
896bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbarbool Darwin::SupportsProfiling() const {
897bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  // Profiling instrumentation is only supported on x86.
89864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
899bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar}
900bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
90143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
90243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
90343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
90443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
90543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
9060a7dd788dbef975f35f273c7ab913f480f7edd60John McCallvoid Darwin::CheckObjCARC() const {
9070a7dd788dbef975f35f273c7ab913f480f7edd60John McCall  if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
9080a7dd788dbef975f35f273c7ab913f480f7edd60John McCall    return;
90980fd37a57176433d05854dff27b9c5fa869fadd2John McCall  getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
9105840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis}
9115840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
91200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string
91361ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad RosierDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
91461ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
91561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
91600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
91700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
9183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
9193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
9203917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
9213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
92219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text.
92319347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
92419347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects.
92519347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/
92619347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
92719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
92819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> First = VersionText.split('.');
92919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> Second = First.second.split('.');
93019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
93119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
93219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (First.first.getAsInteger(10, GoodVersion.Major) ||
93319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Major < 0)
93419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
93519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
93619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Minor < 0)
93719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
93819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
93919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // First look for a number prefix and parse that if present. Otherwise just
94019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // stash the entire patch string in the suffix, and leave the number
94119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // unspecified. This covers versions strings such as:
94219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4
94319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.0
94419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x
94519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.2-rc4
94619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x-patched
94719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // And retains any patch number it finds.
94819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
94919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (!PatchText.empty()) {
95019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (unsigned EndNumber = PatchText.find_first_not_of("0123456789")) {
95119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Try to parse the number and any suffix.
95219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
95319347edf7809866350750a1997ec4db009832fa4Chandler Carruth          GoodVersion.Patch < 0)
95419347edf7809866350750a1997ec4db009832fa4Chandler Carruth        return BadVersion;
95519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
95619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
95719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
95819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
95919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return GoodVersion;
96019347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
96119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
96219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
96319347edf7809866350750a1997ec4db009832fa4Chandler Carruthbool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
96419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Major < RHS.Major) return true; if (Major > RHS.Major) return false;
96519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Minor < RHS.Minor) return true; if (Minor > RHS.Minor) return false;
96619347edf7809866350750a1997ec4db009832fa4Chandler Carruth
96719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Note that we rank versions with *no* patch specified is better than ones
96819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // hard-coding a patch version. Thus if the RHS has no patch, it always
96919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // wins, and the LHS only wins if it has no patch and the RHS does have
97019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // a patch.
97119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (RHS.Patch == -1) return true;   if (Patch == -1) return false;
97219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false;
973241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif  if (PatchSuffix == RHS.PatchSuffix) return false;
97419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
97519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Finally, between completely tied version numbers, the version with the
97619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // suffix loses as we prefer full releases.
97719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (RHS.PatchSuffix.empty()) return true;
97819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return false;
97919347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
98019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
9810e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindolastatic StringRef getGCCToolchainDir(const ArgList &Args) {
9820e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
9830e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (A)
9841d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    return A->getValue();
9850e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  return GCC_INSTALL_PREFIX;
9860e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola}
9870e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola
98819347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Construct a GCCInstallationDetector from the driver.
98919347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
99019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths.
9910407a04049016bdd6fe4fda462aa199d82c750d4Gabor Greif/// Once constructed, a GCCInstallationDetector is essentially immutable.
9921c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth///
9931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
9941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// should instead pull the target out of the driver. This is currently
9951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// necessary because the driver doesn't store the final version of the target
9961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// triple.
9971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler CarruthGeneric_GCC::GCCInstallationDetector::GCCInstallationDetector(
9981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const Driver &D,
9990e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const llvm::Triple &TargetTriple,
10000e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const ArgList &Args)
10011c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    : IsValid(false) {
10029b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth  llvm::Triple MultiarchTriple
10039b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth    = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
10049b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth                                 : TargetTriple.get32BitArchVariant();
10051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
100619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The library directories which may contain GCC installations.
10071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
100819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The compatible GCC triples for this particular architecture.
10091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateTripleAliases;
10101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
10111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
10121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateTripleAliases,
10131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchLibDirs,
10141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchTripleAliases);
101519347edf7809866350750a1997ec4db009832fa4Chandler Carruth
101619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Compute the set of prefixes for our search.
101719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
101819347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                       D.PrefixDirs.end());
1019353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10200e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  StringRef GCCToolchainDir = getGCCToolchainDir(Args);
10210e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (GCCToolchainDir != "") {
10220e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    if (GCCToolchainDir.back() == '/')
10230e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola      GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1024353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10250e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    Prefixes.push_back(GCCToolchainDir);
1026353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  } else {
1027353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot);
1028353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot + "/usr");
1029353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.InstalledDir + "/..");
1030353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  }
103119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
103219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Loop over the various components which exist and select the best GCC
103319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // installation available. GCC installs are ranked by version number.
103419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Version = GCCVersion::Parse("0.0.0");
103519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
103619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (!llvm::sys::fs::exists(Prefixes[i]))
103719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      continue;
103819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
103919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
104019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
104119347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
10421c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1043f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1044f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                               CandidateTripleAliases[k]);
10451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    }
10461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
10471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      const std::string LibDir
10481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
10491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
10501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        continue;
10511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
10521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth           ++k)
1053f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
10541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               CandidateMultiarchTripleAliases[k],
10551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               /*NeedsMultiarchSuffix=*/true);
105619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
105719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
105819347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
105919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
106019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
10611c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &TargetTriple,
10621c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &MultiarchTriple,
10631c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &LibDirs,
10641c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &TripleAliases,
10651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchLibDirs,
10661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
10671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Declare a bunch of static data sets that we'll select between below. These
10681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // are specifically designed to always refer to string literals to avoid any
10691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // lifetime or initialization issues.
10701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMLibDirs[] = { "/lib" };
10711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMTriples[] = {
10721c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-gnueabi",
10731c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-androideabi"
10741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
1075ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  static const char *const ARMHFTriples[] = {
1076ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "arm-linux-gnueabihf",
1077ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
10781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
10791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
10801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64Triples[] = {
10811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
10821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-unknown-linux-gnu",
10831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-pc-linux-gnu",
10841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux6E",
10851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux",
10861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-suse-linux",
10871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-manbo-linux-gnu",
10881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
10891c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-slackware-linux"
10901c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
10911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86LibDirs[] = { "/lib32", "/lib" };
10921c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86Triples[] = {
10931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-linux-gnu",
10941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-pc-linux-gnu",
10951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i486-linux-gnu",
10961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-linux-gnu",
10972a907f8735cee8ae145ffded6d8dfb1e8cf29b28NAKAMURA Takumi    "i386-redhat-linux6E",
10981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-redhat-linux",
10991c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-redhat-linux",
11001c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-redhat-linux",
11011c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-suse-linux",
110291720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i486-slackware-linux",
110391720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i686-montavista-linux"
11041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11061c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSLibDirs[] = { "/lib" };
11071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSTriples[] = { "mips-linux-gnu" };
11081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSELLibDirs[] = { "/lib" };
1109f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  static const char *const MIPSELTriples[] = {
1110f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-gnu",
1111f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-android"
1112f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  };
11131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1114b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1115b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1116b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1117b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1118b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan
11191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
11201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCTriples[] = {
11211c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-linux-gnu",
11221c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-unknown-linux-gnu",
112391720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-suse-linux",
112491720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-montavista-linuxspe"
11251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11261c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
11271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64Triples[] = {
1128155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    "powerpc64-linux-gnu",
11291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-unknown-linux-gnu",
11301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-suse-linux",
11311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "ppc64-redhat-linux"
11321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  switch (TargetTriple.getArch()) {
11351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::arm:
11361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::thumb:
113719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1138ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1139ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1140ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1141ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
1142ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1143ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1144ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
11451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86_64:
11471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11561c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86:
115719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11581c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11591c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11601c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11611c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11621c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11631c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11641c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mips:
11661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
11681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1170b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1171b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1172b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1173b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
11741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11751c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mipsel:
11761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
11781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1180b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1181b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1182b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1183b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1184b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1185b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64:
1186b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1187b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1188b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1189b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1190b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1191b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1192b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1193b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1194b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1195b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64el:
1196b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1197b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1198b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1199b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1200b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1201b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1202b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1203b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
12041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc:
120619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc64:
12151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
12161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12211c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12221c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12231c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  default:
12261c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // By default, just rely on the standard lib directories and the original
12271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // triple.
12281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
122919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
12301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Always append the drivers target triple to the end, in case it doesn't
12321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // match any of our aliases.
12331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  TripleAliases.push_back(TargetTriple.str());
12341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Also include the multiarch variant if it's different.
12361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  if (TargetTriple.str() != MultiarchTriple.str())
12371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.push_back(MultiarchTriple.str());
123819347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
123919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1240f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan// FIXME: There is the same routine in the Tools.cpp.
1241f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic bool hasMipsN32ABIArg(const ArgList &Args) {
1242f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
12431d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A && (A->getValue() == StringRef("n32"));
1244f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1245f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1246f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic StringRef getTargetMultiarchSuffix(llvm::Triple::ArchType TargetArch,
1247f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                                          const ArgList &Args) {
1248f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::x86_64 ||
1249f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::ppc64)
1250f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    return "/64";
1251f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1252f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::mips64 ||
1253f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::mips64el) {
1254f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    if (hasMipsN32ABIArg(Args))
1255f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/n32";
1256f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    else
1257f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/64";
1258f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  }
1259f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1260f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  return "/32";
1261f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1262f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
126319347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1264f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    llvm::Triple::ArchType TargetArch, const ArgList &Args,
1265f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    const std::string &LibDir,
12661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
126719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // There are various different suffixes involving the triple we
126819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // check for. We also record what is necessary to walk from each back
126919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // up to the lib directory.
12701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const std::string LibSuffixes[] = {
127119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/gcc/" + CandidateTriple.str(),
127219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
127319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
127402014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // The Freescale PPC SDK has the gcc libraries in
127502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
127602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/" + CandidateTriple.str(),
127702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel
127819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // Ubuntu has a strange mis-matched pair of triples that this happens to
127919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // match.
128019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: It may be worthwhile to generalize this and look for a second
128119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // triple.
1282d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
128319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
128419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const std::string InstallSuffixes[] = {
128519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../..",
128619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../..",
128702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/../..",
128819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../.."
128919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
129019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
12911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
12921c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                                   (TargetArch != llvm::Triple::x86));
12931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
12941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef LibSuffix = LibSuffixes[i];
129519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::error_code EC;
12961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
129719347edf7809866350750a1997ec4db009832fa4Chandler Carruth         !EC && LI != LE; LI = LI.increment(EC)) {
129819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      StringRef VersionText = llvm::sys::path::filename(LI->path());
129919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
130019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
130119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion < MinVersion)
130219347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
130319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion <= Version)
130419347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
13052e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel
13062e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel      // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
13075d84bb418405e1256020a66895d163756886b102Chandler Carruth      // in what would normally be GCCInstallPath and put the 64-bit
13081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // libs in a subdirectory named 64. The simple logic we follow is that
13091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // *if* there is a subdirectory of the right name with crtbegin.o in it,
13101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // we use that. If not, and if not a multiarch triple, we look for
13111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // crtbegin.o without the subdirectory.
1312f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      StringRef MultiarchSuffix = getTargetMultiarchSuffix(TargetArch, Args);
13131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
13141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix = MultiarchSuffix.str();
13151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      } else {
13161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        if (NeedsMultiarchSuffix ||
13171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth            !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
13181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth          continue;
13191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix.clear();
13201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      }
132119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
132219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      Version = CandidateVersion;
1323fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth      GCCTriple.setTriple(CandidateTriple);
132419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // FIXME: We hack together the directory name here instead of
132519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // using LI to ensure stable path separators across Windows and
132619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Linux.
13271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
13285d84bb418405e1256020a66895d163756886b102Chandler Carruth      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
132919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      IsValid = true;
133019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
133119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
133219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
133319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
13340e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaGeneric_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
13350e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                         const ArgList &Args)
13360e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) {
1337edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
133886643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1339edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1340c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
1341c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
13423917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
13433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
13443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
13453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
13463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
13473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13483917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
1350ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const JobAction &JA,
1351ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const ActionList &Inputs) const {
13525bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
13535bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
13545bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
13555bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
13565bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
13573917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13583917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
13593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
13603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
13618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
13628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
1363b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
13643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
13655bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Preprocess(*this); break;
13663917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
13675bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Precompile(*this); break;
13683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
136930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    case Action::MigrateJobClass:
137085b7f7ddf2f09778ec303f5a39f9e67e3aae1115Bob Wilson      T = new tools::Clang(*this); break;
13715bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    case Action::CompileJobClass:
13725bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Compile(*this); break;
13733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
13743917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
13753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
13763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
13798eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
13808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
13818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
13826e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
13836e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
1384f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
1385f857186fd1995b34185d063a29b11ad4f948519fEric Christopher      T = new tools::darwin::VerifyDebug(*this); break;
13863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
13873917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
13883917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
13903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13913917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13923917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
13936f009b68b9f7aaf280144b0cd81d6a0b23c733a6Rafael Espindola  return getArch() == llvm::Triple::x86_64;
13943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13967ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefault() const {
13977ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
13983917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13993917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14007ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefaultForced() const {
14017ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
14023917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14037ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
14049631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum/// Hexagon Toolchain
14059631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1406b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisstd::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1407b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1408b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Locate the rest of the toolchain ...
1409b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (strlen(GCC_INSTALL_PREFIX))
1410b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return std::string(GCC_INSTALL_PREFIX);
1411b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1412b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string InstallRelDir = InstalledDir + "/../../gnu";
1413b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(InstallRelDir))
1414b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return InstallRelDir;
1415b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1416b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1417b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(PrefixRelDir))
1418b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return PrefixRelDir;
1419b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1420b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  return InstallRelDir;
1421b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis}
1422b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
14235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic void GetHexagonLibraryPaths(
14245fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const ArgList &Args,
14255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string Ver,
14265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchString,
14275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string &InstalledDir,
14285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths)
14295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis{
14305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool buildingLib = Args.hasArg(options::OPT_shared);
14315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // -L Args
14345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (arg_iterator
14365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         it = Args.filtered_begin(options::OPT_L),
14375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         ie = Args.filtered_end();
14385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       it != ie;
14395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       ++it) {
14405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
14415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      LibPaths->push_back((*it)->getValue(i));
14425fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Other standard paths
14465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchSuffix = "/" + MarchString;
14485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string G0Suffix = "/G0";
14495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
14505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
14515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/hexagon/...
14535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
14545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
14565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
14575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
14595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver);
14605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/...
14625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(RootDir + "lib/gcc");
14635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // hexagon/lib/...
14655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string HexagonLibDir = RootDir + "hexagon/lib";
14665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
14685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + G0Suffix);
14695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir + MarchSuffix);
14715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir);
14725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
14735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
1474b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew CurtisHexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1475b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                       const ArgList &Args)
1476b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  : Linux(D, Triple, Args) {
1477b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string InstalledDir(getDriver().getInstalledDir());
1478b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1479b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1480b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1481b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // program paths
1482b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string BinDir(GnuDir + "/bin");
1483b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(BinDir))
1484b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    getProgramPaths().push_back(BinDir);
1485b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1486b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Determine version of GCC libraries and headers to use.
1487b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1488b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::error_code ec;
1489b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1490b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1491b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis       !ec && di != de; di = di.increment(ec)) {
1492b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1493b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    if (MaxVersion < cv)
1494b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      MaxVersion = cv;
1495b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  }
1496b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCLibAndIncVersion = MaxVersion;
14975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths= &getFilePaths();
14995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15005fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
15015fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
15025fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // support 'linux' we'll need to fix this up
15035fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->clear();
15045fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15055fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  GetHexagonLibraryPaths(
15065fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    Args,
15075fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetGCCLibAndIncVersion(),
15085fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetTargetCPU(Args),
15095fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    InstalledDir,
15105fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths);
15119631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15129631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15139631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumHexagon_TC::~Hexagon_TC() {
15149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // Free tool implementations.
15159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (llvm::DenseMap<unsigned, Tool*>::iterator
15169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
15179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    delete it->second;
15189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15199631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15209631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumTool &Hexagon_TC::SelectTool(const Compilation &C,
15219631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                             const JobAction &JA,
15229631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                             const ActionList &Inputs) const {
15235bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
15245bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   if (JA.getKind () == Action::CompileJobClass)
15255bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     Key = JA.getKind ();
15265bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     else
15275bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
15285bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
15295bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
15305bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
15315bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
15325bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   if ((JA.getKind () == Action::CompileJobClass)
15335bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     && (JA.getType () != types::TY_LTO_BC)) {
15345bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     Key = JA.getKind ();
15355bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   }
15365bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
15379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Tool *&T = Tools[Key];
15389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (!T) {
15399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    switch (Key) {
15409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::InputClass:
15419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::BindArchClass:
15429631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      assert(0 && "Invalid tool kind.");
15439631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::AnalyzeJobClass:
15449631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::Clang(*this); break;
15459631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::AssembleJobClass:
15469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::hexagon::Assemble(*this); break;
15479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::LinkJobClass:
15489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::hexagon::Link(*this); break;
15499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    default:
15509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      assert(false && "Unsupported action for Hexagon target.");
15519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    }
15529631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
15539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  return *T;
15559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1557b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1558b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                           ArgStringList &CC1Args) const {
1559b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1560b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1561b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1562b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdlibinc))
1563b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1564b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1565b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path InstallDir(D.InstalledDir);
1566b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1567b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1568b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1569b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1570b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1571b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
15729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1574b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1575b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                              ArgStringList &CC1Args) const {
1576b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1577b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1578b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdincxx))
1579b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1580b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1581b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1582b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1583b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1584b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1585b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent("hexagon/include/c++/");
1586b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent(Ver);
1587b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
15887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth}
15896781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
15905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisToolChain::CXXStdlibType
15915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisHexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
15925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
15935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (!A)
15945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    return ToolChain::CST_Libstdcxx;
15955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  StringRef Value = A->getValue();
15975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (Value != "libstdc++") {
15985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
15995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      << A->getAsString(Args);
16005fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
16015fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
16025fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  return ToolChain::CST_Libstdcxx;
16035fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
16045fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
16055fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic Arg *GetLastHexagonArchArg(const ArgList &Args)
16066781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
16076781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = NULL;
16086781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16096781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
16106781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis       it != ie; ++it) {
16116781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if ((*it)->getOption().matches(options::OPT_march_EQ) ||
16126781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
16136781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A = *it;
16146781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A->claim();
16156781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    } else if ((*it)->getOption().matches(options::OPT_m_Joined)) {
16166781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      StringRef Value = (*it)->getValue(0);
16176781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      if (Value.startswith("v")) {
16186781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A = *it;
16196781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A->claim();
16206781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      }
16216781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    }
16226781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
16236781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return A;
16246781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
16256781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16266781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew CurtisStringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
16276781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
16286781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  // Select the default CPU (v4) if none was given or detection failed.
16296781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = GetLastHexagonArchArg (Args);
16306781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  if (A) {
16316781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    llvm::StringRef WhichHexagon = A->getValue();
16326781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon.startswith("hexagon"))
16336781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon.substr(sizeof("hexagon") - 1);
16346781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon != "")
16356781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon;
16366781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
16376781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16386781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return "v4";
16396781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
1640b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis// End Hexagon
1641f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
16423a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
16433a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
16443a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
16453a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16461d16f0f805c2a3e2198a87154990347b2759f6bdChandler CarruthTCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple)
16471d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  : ToolChain(D, Triple) {
16483a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
16493a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
16503a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16513a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
16523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
16533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
16563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
16573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
16583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
16593a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1661304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const {
1662304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  return true;
16633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16657ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefault() const {
16667ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16697ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefaultForced() const {
16707ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1673304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA TakumiTool &TCEToolChain::SelectTool(const Compilation &C,
1674ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const JobAction &JA,
1675ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                               const ActionList &Inputs) const {
16763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
16773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
16783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
16803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
16813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
16823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
16833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
16843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
16853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
16863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
1687b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie     llvm_unreachable("Unsupported action for TCE target.");
16883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
16893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
16903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
16913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1693f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1694f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
16950e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaOpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
16960e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1697ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1698f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
1699f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1700f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1701ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1702ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
17035bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
17045bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
17055bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
17065bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
17075bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
17085bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
1709dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1710dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1711dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1712dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1713f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
1714f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
1715f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
1716dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    case Action::AssembleJobClass: {
1717dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1718dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1719dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1720dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::openbsd::Assemble(*this);
1721dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1722dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    }
1723f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
1724f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
1725f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
1726ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1727f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
1728f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
1729f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1730f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
1731f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1732f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
173342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
173442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
173542f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanBitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
173642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  : Generic_ELF(D, Triple, Args) {
173742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back(getDriver().Dir + "/../lib");
173842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back("/usr/lib");
173942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
174042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
174142f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanTool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA,
174242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                         const ActionList &Inputs) const {
17435bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
17445bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
17455bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
17465bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
17475bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
17485bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
174942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
175042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                             options::OPT_no_integrated_as,
175142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                             IsIntegratedAssemblerDefault());
175242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
175342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Tool *&T = Tools[Key];
175442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (!T) {
175542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    switch (Key) {
175642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    case Action::AssembleJobClass: {
175742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      if (UseIntegratedAs)
175842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        T = new tools::ClangAs(*this);
175942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      else
176042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        T = new tools::bitrig::Assemble(*this);
176142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      break;
176242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
176342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    case Action::LinkJobClass:
176442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      T = new tools::bitrig::Link(*this); break;
176542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    default:
176642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      T = &Generic_GCC::SelectTool(C, JA, Inputs);
176742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
176842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
176942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
177042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  return *T;
177142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
177242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
177342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
177442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                          ArgStringList &CC1Args) const {
177542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
177642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      DriverArgs.hasArg(options::OPT_nostdincxx))
177742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    return;
177842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
17798e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(DriverArgs)) {
17808e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
17818e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17828e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/");
17838e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
17848e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
17858e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17868e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++");
17878e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17888e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
17898e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth
17908e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    StringRef Triple = getTriple().str();
17918e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    if (Triple.startswith("amd64"))
17928e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
17938e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
17948e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple.substr(5));
17958e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    else
17968e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
17978e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/" +
17988e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple);
17998e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18008e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
180142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
180242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
180342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
180442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                 ArgStringList &CmdArgs) const {
18058e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(Args)) {
18068e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
18078e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lc++");
18088e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lcxxrt");
18098e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    // Include supc++ to provide Unwind until provided by libcxx.
18108e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lgcc");
18118e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18128e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
18138e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lstdc++");
18148e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18158e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
181642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
181742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
181875358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
181975358d267256022475371416654b056ad8531cb3Daniel Dunbar
18200e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaFreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
18210e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1822214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
182324248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
182424248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // back to '/usr/lib' if it doesn't exist.
182500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if ((Triple.getArch() == llvm::Triple::x86 ||
182600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth       Triple.getArch() == llvm::Triple::ppc) &&
182724248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
182800646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
182900646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  else
183000646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
183175358d267256022475371416654b056ad8531cb3Daniel Dunbar}
183275358d267256022475371416654b056ad8531cb3Daniel Dunbar
1833ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1834ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
18355bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
18365bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
18375bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
18385bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
18395bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
18405bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
184167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
184267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             options::OPT_no_integrated_as,
184367dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             IsIntegratedAssemblerDefault());
184467dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky
184575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
184675358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
184775358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
184868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
184967dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      if (UseIntegratedAs)
185067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::ClangAs(*this);
185167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      else
185267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::freebsd::Assemble(*this);
1853fe3a7ea7f2132ec5cd0510cc21d2677614a6ab3aRoman Divacky      break;
1854008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
1855008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
185675358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
1857ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
18588e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
18598e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
18608e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
18618e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  return *T;
18628e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
18638e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
186427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindolabool FreeBSD::UseSjLjExceptions() const {
186527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  // FreeBSD uses SjLj exceptions on ARM oabi.
186627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  switch (getTriple().getEnvironment()) {
186727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::GNUEABI:
186827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::EABI:
186927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return false;
187027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
187127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  default:
187227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return (getTriple().getArch() == llvm::Triple::arm ||
187327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola            getTriple().getArch() == llvm::Triple::thumb);
187427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  }
187527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola}
187627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
18778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
18788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
18790e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaNetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
18800e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
18818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
188205e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (getDriver().UseStdLib) {
188332f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // When targeting a 32-bit platform, try the special directory used on
188432f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // 64-bit hosts, and only fall back to the main library directory if that
188532f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // doesn't work.
188632f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
188732f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // what all logic is needed to emulate the '=' prefix here.
188866de97fcc368ff7e9ea50337177d007c108cfd73Joerg Sonnenberger    if (Triple.getArch() == llvm::Triple::x86)
188905e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib/i386");
189032f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth
189132f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    getFilePaths().push_back("=/usr/lib");
18928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
18938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
18948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
1895ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1896ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                         const ActionList &Inputs) const {
18975bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
18985bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
18995bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
19005bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
19015bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
19025bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
19038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
19048e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             options::OPT_no_integrated_as,
19058e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             IsIntegratedAssemblerDefault());
19068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
19078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Tool *&T = Tools[Key];
19088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!T) {
19098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    switch (Key) {
19108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::AssembleJobClass:
19118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      if (UseIntegratedAs)
19128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        T = new tools::ClangAs(*this);
19138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      else
19141bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger        T = new tools::netbsd::Assemble(*this);
19158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      break;
19168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::LinkJobClass:
19171bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      T = new tools::netbsd::Link(*this);
1918182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger      break;
19198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    default:
1920ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
192175358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
192275358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
192375358d267256022475371416654b056ad8531cb3Daniel Dunbar
192475358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
192575358d267256022475371416654b056ad8531cb3Daniel Dunbar}
192611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
192738e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
192838e317d6dce161b249508686cc67eb7176958762Chris Lattner
19290e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaMinix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
19300e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
193138e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
193238e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
193338e317d6dce161b249508686cc67eb7176958762Chris Lattner}
193438e317d6dce161b249508686cc67eb7176958762Chris Lattner
1935ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1936ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
19375bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
19385bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
19395bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
19405bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
19415bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
194238e317d6dce161b249508686cc67eb7176958762Chris Lattner
194338e317d6dce161b249508686cc67eb7176958762Chris Lattner  Tool *&T = Tools[Key];
194438e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!T) {
194538e317d6dce161b249508686cc67eb7176958762Chris Lattner    switch (Key) {
194638e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::AssembleJobClass:
194738e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Assemble(*this); break;
194838e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::LinkJobClass:
194938e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Link(*this); break;
195038e317d6dce161b249508686cc67eb7176958762Chris Lattner    default:
1951ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
195238e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
195338e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
195438e317d6dce161b249508686cc67eb7176958762Chris Lattner
195538e317d6dce161b249508686cc67eb7176958762Chris Lattner  return *T;
195638e317d6dce161b249508686cc67eb7176958762Chris Lattner}
195738e317d6dce161b249508686cc67eb7176958762Chris Lattner
1958e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1959e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
19600e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaAuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
19610e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                   const ArgList &Args)
19620e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
1963e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1964edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
196586643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1966edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1967e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1968ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1969e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
1970e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
1971e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
19727adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1973e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1974e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1975e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1976ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1977ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const {
19785bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
19795bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
19805bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
19815bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
19825bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
1983e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1984e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
1985e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
1986e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
1987e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
1988e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
1989e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
1990e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
1991e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
1992ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1993e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
1994e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
1995e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1996e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
1997e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1998e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
199931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
200031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
20010e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaSolaris::Solaris(const Driver &D, const llvm::Triple& Triple,
20020e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                 const ArgList &Args)
20030e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
200431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
200531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getProgramPaths().push_back(getDriver().getInstalledDir());
200631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (getDriver().getInstalledDir() != getDriver().Dir)
200731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    getProgramPaths().push_back(getDriver().Dir);
200831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
200931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back(getDriver().Dir + "/../lib");
201031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back("/usr/lib");
201131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
201231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
201331c4690047f5f362ecf886f1586844b1aef0c4d2David ChisnallTool &Solaris::SelectTool(const Compilation &C, const JobAction &JA,
201431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                           const ActionList &Inputs) const {
20155bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
20165bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
20175bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
20185bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
20195bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
202031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
202131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Tool *&T = Tools[Key];
202231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!T) {
202331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    switch (Key) {
202431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    case Action::AssembleJobClass:
202531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = new tools::solaris::Assemble(*this); break;
202631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    case Action::LinkJobClass:
202731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = new tools::solaris::Link(*this); break;
202831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    default:
202931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = &Generic_GCC::SelectTool(C, JA, Inputs);
203031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
203131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
203231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
203331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  return *T;
203431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
2035e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
20366b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
20376b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2038c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro {
20393fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  ArchLinux,
2040c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
2041c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
20420b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  DebianWheezy,
20430a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
2044d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL4,
2045d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL5,
2046d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL6,
2047c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora13,
2048c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora14,
20498f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  Fedora15,
2050afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  Fedora16,
20518f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  FedoraRawhide,
2052c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  OpenSuse11_3,
2053de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse11_4,
2054de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse12_1,
20554e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  OpenSuse12_2,
2056814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuHardy,
2057814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuIntrepid,
2058021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
20595ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu  UbuntuKarmic,
2060c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
2061c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
206243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  UbuntuNatty,
206325a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer  UbuntuOneiric,
2064668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer  UbuntuPrecise,
2065c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
2066c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
2067c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2068d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattnerstatic bool IsRedhat(enum LinuxDistro Distro) {
2069afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
2070afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer         (Distro >= RHEL4    && Distro <= RHEL6);
2071c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2072c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2073c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) {
20744e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
2075c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2076c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2077c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) {
2078afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  return Distro >= DebianLenny && Distro <= DebianWheezy;
2079c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2080c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2081c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) {
2082668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer  return Distro >= UbuntuHardy && Distro <= UbuntuPrecise;
2083c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2084c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2085c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
20866f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith  OwningPtr<llvm::MemoryBuffer> File;
20874eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
20885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
20895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8> Lines;
2090c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
2091668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    LinuxDistro Version = UnknownDistro;
2092668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2093668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2094668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17))
2095668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("hardy", UbuntuHardy)
2096668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("intrepid", UbuntuIntrepid)
2097668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("jaunty", UbuntuJaunty)
2098668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("karmic", UbuntuKarmic)
2099668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("lucid", UbuntuLucid)
2100668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("maverick", UbuntuMaverick)
2101668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("natty", UbuntuNatty)
2102668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("oneiric", UbuntuOneiric)
2103668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("precise", UbuntuPrecise)
2104668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Default(UnknownDistro);
2105668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    return Version;
2106c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2107c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
21084eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
21095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2110afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    if (Data.startswith("Fedora release 16"))
2111afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      return Fedora16;
2112afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    else if (Data.startswith("Fedora release 15"))
21138f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return Fedora15;
21148f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 14"))
2115c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora14;
21168f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 13"))
2117c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora13;
21188f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release") &&
21195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("Rawhide") != StringRef::npos)
21208f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return FedoraRawhide;
2121d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner    else if (Data.startswith("Red Hat Enterprise Linux") &&
21225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 6") != StringRef::npos)
2123d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL6;
21245a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
21255a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
21265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 5") != StringRef::npos)
2127d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL5;
21285a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
21295a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
21305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 4") != StringRef::npos)
2131d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL4;
2132c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2133c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2134c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
21354eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
21365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2137c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
2138c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
21390e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2140c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
21410e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
21420b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      return DebianWheezy;
2143c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2144c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2145c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2146afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
2147afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer())
2148afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.3", OpenSuse11_3)
2149afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.4", OpenSuse11_4)
2150afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 12.1", OpenSuse12_1)
21514e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor      .StartsWith("openSUSE 12.2", OpenSuse12_2)
2152afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .Default(UnknownDistro);
2153c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
215432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
215532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
21560a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
21570a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
21583fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
21593fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth    return ArchLinux;
21603fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2161c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
2162c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2163c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2164deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target.
2165deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth///
2166deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use
2167deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths.
2168deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple,
2169deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here.
2170deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruthstatic std::string getMultiarchTriple(const llvm::Triple TargetTriple,
2171deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth                                      StringRef SysRoot) {
2172deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // For most architectures, just use whatever we have rather than trying to be
2173deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // clever.
2174deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  switch (TargetTriple.getArch()) {
2175deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  default:
2176deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2177deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
2178deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // We use the existence of '/lib/<triple>' as a directory to detect some
2179deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // common linux triples that don't quite match the Clang triple for both
2180236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2181236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // regardless of what the actual target triple is.
21820337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::arm:
21830337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::thumb:
2184ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2185ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2186ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabihf";
2187ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
2188ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2189ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabi";
2190ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
21910337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier    return TargetTriple.str();
2192deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86:
2193deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2194deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "i386-linux-gnu";
2195deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2196deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86_64:
2197deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2198deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "x86_64-linux-gnu";
2199deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
22005bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mips:
22015bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
22025bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mips-linux-gnu";
22035bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
22045bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mipsel:
22055bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
22065bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mipsel-linux-gnu";
22075bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
2208155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc:
2209155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2210155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc-linux-gnu";
2211155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2212155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc64:
2213155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2214155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc64-linux-gnu";
2215155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2216deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  }
2217deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth}
2218deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
221900646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
222000646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
222100646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth}
222200646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth
22237a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic bool isMipsArch(llvm::Triple::ArchType Arch) {
22247a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Arch == llvm::Triple::mips ||
22257a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mipsel ||
22267a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64 ||
22277a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64el;
22287a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
22297a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
2230f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyanstatic bool isMipsR2Arch(llvm::Triple::ArchType Arch,
2231f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                         const ArgList &Args) {
2232f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (Arch != llvm::Triple::mips &&
2233f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      Arch != llvm::Triple::mipsel)
2234f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2235f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2236f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  Arg *A = Args.getLastArg(options::OPT_march_EQ,
2237f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mcpu_EQ,
2238f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mips_CPUs_Group);
2239f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2240f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (!A)
2241f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2242f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2243f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (A->getOption().matches(options::OPT_mips_CPUs_Group))
2244f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return A->getOption().matches(options::OPT_mips32r2);
2245f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
22461d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A->getValue() == StringRef("mips32r2");
2247f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan}
2248f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
22497a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic StringRef getMultilibDir(const llvm::Triple &Triple,
22507a9188833a6a09d574144334c9584c417b809007Simon Atanasyan                                const ArgList &Args) {
22517a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Triple.getArch()))
22527a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return Triple.isArch32Bit() ? "lib32" : "lib64";
22537a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22547a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // lib32 directory has a special meaning on MIPS targets.
22557a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // It contains N32 ABI binaries. Use this folder if produce
22567a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // code for N32 ABI only.
2257f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (hasMipsN32ABIArg(Args))
22587a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return "lib32";
22597a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22607a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Triple.isArch32Bit() ? "lib" : "lib64";
22617a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
22627a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22630e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaLinux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
22640e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
226589088797876bddb866ce821f050a4395b7514dc2Chandler Carruth  llvm::Triple::ArchType Arch = Triple.getArch();
2266fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  const std::string &SysRoot = getDriver().SysRoot;
2267c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2268ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // OpenSuse stores the linker with the compiler, add that to the search
2269ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // path.
2270ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  ToolChain::path_list &PPaths = getProgramPaths();
2271fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2272fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth                         GCCInstallation.getTriple().str() + "/bin").str());
2273ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola
2274ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  Linker = GetProgramPath("ld");
2275c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2276c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  LinuxDistro Distro = DetectLinuxDistro(Arch);
2277c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
227864a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
227994c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
228094c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
228194c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
2282c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2283f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2284c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
2285c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
228694a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2287704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov
2288d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2289d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // and the MIPS ABI require .dynsym to be sorted in different ways.
2290d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2291d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // ABI requires a mapping between the GOT and the symbol table.
2292704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov  // Android loader does not support .gnu.hash.
22937a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Arch) && !IsAndroid) {
2294668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2295668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2296d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=gnu");
2297d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth
2298d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth    if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2299d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2300d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=both");
2301d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  }
2302c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2303d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  if (IsRedhat(Distro))
2304c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
2305c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
23060b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
23075a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      IsOpenSuse(Distro) ||
23085a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2309668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2310c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
2311c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
231264a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro))
2313f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth    ExtraOpts.push_back("--enable-new-dtags");
231464a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner
2315d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // The selection of paths to try here is designed to match the patterns which
2316d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2317d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // This was determined by running GCC in a fake filesystem, creating all
2318d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // possible permutations of these directories, and seeing which ones it added
2319d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // to the link paths.
2320d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  path_list &Paths = getFilePaths();
232189088797876bddb866ce821f050a4395b7514dc2Chandler Carruth
23227a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  const std::string Multilib = getMultilibDir(Triple, Args);
2323deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
23243fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2325d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Add the multilib suffixed paths where they are available.
2326d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid()) {
2327fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
232889088797876bddb866ce821f050a4395b7514dc2Chandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2329f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2330f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    if (IsAndroid && isMipsR2Arch(Triple.getArch(), Args))
2331f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists(GCCInstallation.getInstallPath() +
2332f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      GCCInstallation.getMultiarchSuffix() +
2333f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      "/mips-r2",
2334f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
2335f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    else
2336f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists((GCCInstallation.getInstallPath() +
2337f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                       GCCInstallation.getMultiarchSuffix()),
2338f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
23399f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
23409f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // If the GCC installation we found is inside of the sysroot, we want to
23419f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // prefer libraries installed in the parent prefix of the GCC installation.
23429f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // It is important to *not* use these paths when the GCC installation is
2343241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // outside of the system root as that can pick up unintended libraries.
23449f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // This usually happens when there is an external cross compiler on the
23459f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // host system, and a more minimal sysroot available that is the target of
23469f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // the cross.
23479f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
23489f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
23499f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth                      Paths);
23509f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
23519f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + Multilib, Paths);
23529f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
23531d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // On Android, libraries in the parent prefix of the GCC installation are
23541d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // preferred to the ones under sysroot.
23551d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (IsAndroid) {
23561d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
23571d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    }
2358c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2359d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2360d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2361d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2362d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2363d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth
2364d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Try walking via the GCC triple path in case of multiarch GCC
2365d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // installations with strange symlinks.
2366d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid())
2367fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2368d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth                    "/../../" + Multilib, Paths);
2369c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola
23707a09d012f6d52c8a7ba257df85d13149e6aa7cb2Chandler Carruth  // Add the non-multilib suffixed paths (if potentially different).
2371048e6490704d0a4e095e033786230c584b52d82cChandler Carruth  if (GCCInstallation.isValid()) {
2372048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2373fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
23741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    if (!GCCInstallation.getMultiarchSuffix().empty())
2375048e6490704d0a4e095e033786230c584b52d82cChandler Carruth      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
23769f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
23779f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
23789f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
23799f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath, Paths);
23809f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
2381d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  }
2382fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/lib", Paths);
2383fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib", Paths);
2384c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2385c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2386c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
2387c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
23886b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
23896b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2390ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
2391ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
23925bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
23935bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
23945bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
23955bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
23965bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
23975bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
2398dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2399dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
2400dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
2401dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
2402ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Tool *&T = Tools[Key];
2403ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (!T) {
2404ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    switch (Key) {
2405ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    case Action::AssembleJobClass:
2406dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
2407dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
2408dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
2409dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::linuxtools::Assemble(*this);
2410dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
2411c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    case Action::LinkJobClass:
2412c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      T = new tools::linuxtools::Link(*this); break;
2413ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    default:
2414ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
2415ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    }
2416ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
2417ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
2418ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  return *T;
2419ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
2420ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
2421a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid Linux::addClangTargetOptions(const ArgList &DriverArgs,
2422a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                  ArgStringList &CC1Args) const {
24238af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2424a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  bool UseInitArrayDefault
2425a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth    = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
2426a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth      getTriple().getEnvironment() == llvm::Triple::Android;
2427a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2428a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         options::OPT_fno_use_init_array,
2429a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         UseInitArrayDefault))
24308af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola    CC1Args.push_back("-fuse-init-array");
24318af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
24328af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
24337d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
24347d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                      ArgStringList &CC1Args) const {
24357d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  const Driver &D = getDriver();
24367d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
24387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24407d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
24417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
24427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24437d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
24447d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    llvm::sys::Path P(D.ResourceDir);
24457d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    P.appendComponent("include");
244607643086c6460095855573902d66aae1b08a6182Chandler Carruth    addSystemInclude(DriverArgs, CC1Args, P.str());
24477d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
24487d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24497d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
24507d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24517d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24527d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Check for configure-time C include directories.
24537d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CIncludeDirs(C_INCLUDE_DIRS);
24547d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (CIncludeDirs != "") {
24557d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    SmallVector<StringRef, 5> dirs;
24567d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CIncludeDirs.split(dirs, ":");
24577d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
24587d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth         I != E; ++I) {
24597d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
24607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
24617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    }
24627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24637d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
24647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24657d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Lacking those, try to detect the correct set of system includes for the
24667d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // target triple.
24677d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2468a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  // Implement generic Debian multiarch support.
2469a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86_64MultiarchIncludeDirs[] = {
2470a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu",
2471a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2472a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2473a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2474a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2475a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu/64",
2476a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu/64"
2477a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2478a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86MultiarchIncludeDirs[] = {
2479a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i386-linux-gnu",
2480a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2481a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2482a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2483a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2484a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu/32",
2485a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu",
2486a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu"
2487a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2488a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef ARMMultiarchIncludeDirs[] = {
2489a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/arm-linux-gnueabi"
2490a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2491ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  const StringRef ARMHFMultiarchIncludeDirs[] = {
2492ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "/usr/include/arm-linux-gnueabihf"
2493ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
2494d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSMultiarchIncludeDirs[] = {
2495d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mips-linux-gnu"
2496d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2497d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSELMultiarchIncludeDirs[] = {
2498d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mipsel-linux-gnu"
2499d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2500079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPCMultiarchIncludeDirs[] = {
2501079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc-linux-gnu"
2502079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2503079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPC64MultiarchIncludeDirs[] = {
2504079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc64-linux-gnu"
2505079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2506a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  ArrayRef<StringRef> MultiarchIncludeDirs;
25077d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getArch() == llvm::Triple::x86_64) {
2508a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
25097d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::x86) {
2510a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
25117d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::arm) {
2512ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2513ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2514ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    else
2515ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2516d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mips) {
2517d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2518d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2519d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2520079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc) {
2521079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2522079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2523079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2524a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  }
2525a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2526a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth                                     E = MultiarchIncludeDirs.end();
2527a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth       I != E; ++I) {
2528d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    if (llvm::sys::fs::exists(D.SysRoot + *I)) {
2529a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2530a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      break;
2531a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    }
25327d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
25337d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
25347d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getOS() == llvm::Triple::RTEMS)
25357d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
25367d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2537c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // Add an include of '/include' directly. This isn't provided by default by
2538c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2539c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // add even when Clang is acting as-if it were a system compiler.
2540c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2541c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth
25427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
25437d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
25447d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
254579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Helper to add the thre variant paths for a libstdc++ installation.
254679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
254779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                const ArgList &DriverArgs,
254879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                ArgStringList &CC1Args) {
2549abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!llvm::sys::fs::exists(Base))
2550abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    return false;
25517d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base);
2552abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
25537d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2554abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  return true;
25557d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
25567d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
25577d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
25587d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const {
25597d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
25607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      DriverArgs.hasArg(options::OPT_nostdincxx))
25617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
25627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2563eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  // Check if libc++ has been enabled and provide its include paths if so.
2564eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2565eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    // libc++ is always installed at a fixed path on Linux currently.
2566eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
2567eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/v1");
2568eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    return;
2569eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  }
2570eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth
2571fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // We need a detected GCC installation on Linux to provide libstdc++'s
2572fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // headers. We handled the libc++ case above.
2573fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  if (!GCCInstallation.isValid())
2574fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth    return;
2575abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2576abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // By default, look for the C++ headers in an include directory adjacent to
2577abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // the lib directory of the GCC installation. Note that this is expect to be
2578abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2579abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef LibDir = GCCInstallation.getParentLibPath();
2580abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef InstallDir = GCCInstallation.getInstallPath();
25818af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  StringRef Version = GCCInstallation.getVersion().Text;
25821d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  StringRef TripleStr = GCCInstallation.getTriple().str();
25831d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
25841d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  const std::string IncludePathCandidates[] = {
25851d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    LibDir.str() + "/../include/c++/" + Version.str(),
2586abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // Gentoo is weird and places its headers inside the GCC install, so if the
2587abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // first attempt to find the headers fails, try this pattern.
25881d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    InstallDir.str() + "/include/g++-v4",
25891d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // Android standalone toolchain has C++ headers in yet another place.
25901d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
259102014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
259202014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // without a subdirectory corresponding to the gcc version.
259302014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    LibDir.str() + "/../include/c++",
25941d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  };
25951d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
25961d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
25971d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
25981d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov                GCCInstallation.getMultiarchSuffix()),
25991d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov            DriverArgs, CC1Args))
26001d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      break;
2601abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  }
26027d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
26037d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
260411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
260511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
26060e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaDragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
26070e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
260811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
260911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
2610edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
261186643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2612edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
261311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2614ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
261511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
261611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
261711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
261811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2619ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
2620ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const ActionList &Inputs) const {
26215bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
26225bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
26235bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
26245bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
26255bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
262611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
262711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
262811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
262911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
263211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
263311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
2635ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
263611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
263711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
263811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
263911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
264011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2641