ToolChains.cpp revision 321425445f4ce31ccf477bea3240d05e0b1625b2
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.
400d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
401d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    // Warn if the path does not exist.
402d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    bool Exists;
403d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    if (llvm::sys::fs::exists(A->getValue(), Exists) || !Exists)
404d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier      getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
405d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  } else {
4069101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    if (char *env = ::getenv("SDKROOT")) {
407321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // We only use this value as the default if it is an absolute path,
408321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // exists, and it is not the root path.
409321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
410321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar          StringRef(env) != "/") {
4119101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar        Args.append(Args.MakeSeparateArg(
4129101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar                      0, Opts.getOption(options::OPT_isysroot), env));
4139101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      }
4149101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    }
4159101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  }
4169101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar
4172603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
4189d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
4199d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSSimVersion = Args.getLastArg(
4209d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    options::OPT_mios_simulator_version_min_EQ);
421983d835bead0134170a6646a8844926077c968d6Eli Friedman
4229d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
4235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
424ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
4259d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
4269d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSVersion = iOSSimVersion = 0;
4279d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (iOSVersion && iOSSimVersion) {
4285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
4299d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSVersion->getAsString(Args)
4309d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSSimVersion->getAsString(Args);
4319d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSSimVersion = 0;
4329d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
433a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // If no deployment target was specified on the command line, check for
434816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
435a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef OSXTarget;
436a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSTarget;
437a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSSimTarget;
438a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
439a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      OSXTarget = env;
440a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
441a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSTarget = env;
442a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
443a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSSimTarget = env;
444a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier
445a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi    // If no '-miphoneos-version-min' specified on the command line and
446a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
447241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // based on -isysroot.
448a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (iOSTarget.empty()) {
449a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
450a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef first, second;
4511d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef isysroot = A->getValue();
452a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
453a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        if (second != "")
454a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier          iOSTarget = second.substr(0,3);
455a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      }
456a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    }
457816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
4584f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // If no OSX or iOS target has been specified and we're compiling for armv7,
4594f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // go ahead as assume we're targeting iOS.
46049033207b75216a956f3dbf7d018fb3343a54ec1Chad Rosier    if (OSXTarget.empty() && iOSTarget.empty() &&
461336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson        (getDarwinArchName(Args) == "armv7" ||
462336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson         getDarwinArchName(Args) == "armv7s"))
46387ca5580302561c839b2cd12207902b9bf4ed117Chad Rosier        iOSTarget = iOSVersionMin;
4644f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier
4659d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Handle conflicting deployment targets
46639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
46739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
4689d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4699d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Do not allow conflicts with the iOS simulator target.
470a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
4715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
4729d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
473a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
4749d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar            "IPHONEOS_DEPLOYMENT_TARGET");
4759d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    }
4769d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4779d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Allow conflicts among OSX and iOS for historical reasons, but choose the
4789d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // default platform.
479a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty() && !iOSTarget.empty()) {
48039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
48139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
482a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        OSXTarget = "";
48339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
484a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        iOSTarget = "";
48539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
4861a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
487a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty()) {
488e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
48960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
49060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
491a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSTarget.empty()) {
492e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
4939d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
4949d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSVersion);
495a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSSimTarget.empty()) {
496e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(
4979d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        options::OPT_mios_simulator_version_min_EQ);
4989d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
4999d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSSimVersion);
500816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
5012bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
502e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
50360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
50460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
50530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
506ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
5071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5083fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  // Reject invalid architecture combinations.
5093fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
5103fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar                        getTriple().getArch() != llvm::Triple::x86_64)) {
5115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
5123fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
5133fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  }
5143fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar
5152603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
5162603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
5172603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
5182603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
5199d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
5201d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
5212603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
5228a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar        Major != 10 || Minor >= 100 || Micro >= 100)
5235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
5242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
5252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
5269d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
5279d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert(Version && "Unknown target platform!");
5281d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor,
529983d835bead0134170a6646a8844926077c968d6Eli Friedman                                   Micro, HadExtra) || HadExtra ||
530983d835bead0134170a6646a8844926077c968d6Eli Friedman        Major >= 10 || Minor >= 100 || Micro >= 100)
531983d835bead0134170a6646a8844926077c968d6Eli Friedman      getDriver().Diag(diag::err_drv_invalid_version_number)
532983d835bead0134170a6646a8844926077c968d6Eli Friedman        << Version->getAsString(Args);
5332603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
5349d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5355f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  bool IsIOSSim = bool(iOSSimVersion);
5365f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5375f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // In GCC, the simulator historically was treated as being OS X in some
5385f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // contexts, like determining the link logic, despite generally being called
5395f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // with an iOS deployment target. For compatibility, we detect the
5405f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // simulator as iOS + x86, and treat it differently in a few contexts.
5415f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
5425f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                     getTriple().getArch() == llvm::Triple::x86_64))
5435f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    IsIOSSim = true;
5445f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5455f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
546c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
547c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
548132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
549efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
550efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
551efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
552efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
553efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
554efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
555efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
556efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
557efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
558efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
559efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
560efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
561efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
562efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
563efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
56432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
565efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5661d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      llvm::sys::Path P(A->getValue());
567efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("usr");
568efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("lib");
569efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("libstdc++.dylib");
570efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
57132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
572efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.eraseComponent();
573efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.appendComponent("libstdc++.6.dylib");
57432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
575efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
576efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
577efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
578efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
579efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
580efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
581efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
5825a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // FIXME: This should be removed someday when we don't have to care about
5835a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
58432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
58532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
586efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
587efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
588efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
589efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
590efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
591efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
592efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
593efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
594efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
595efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
596efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
5977433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
5987433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
5997433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6007433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
6017433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
6027433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
6037433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6047433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  llvm::sys::Path P(getDriver().ResourceDir);
6057433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("lib");
6067433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("darwin");
6077a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
6087a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // Use the newer cc_kext for iOS ARM after 6.0.
6097a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
6107a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      !isIPhoneOSVersionLT(6, 0)) {
6117a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext.a");
6127a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  } else {
6137a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext_ios5.a");
6147a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
615304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6167433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
6177433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
61832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
61932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
6207433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
6217433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
6227433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
623c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
624c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar                                      const char *BoundArch) const {
625c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
626c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
627c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
628c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
629c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
630c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
631c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
632c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
633c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
6342603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
635279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
636279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
6374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
6384e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6394e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
6402a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // Skip this argument unless the architecture matches either the toolchain
6412a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // triple arch, or the arch being bound.
64264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      llvm::Triple::ArchType XarchArch =
6431d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        tools::darwin::getArchTypeForDarwinArchName(A->getValue(0));
64464f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      if (!(XarchArch == getArch()  ||
64564f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola            (BoundArch && XarchArch ==
646cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola             tools::darwin::getArchTypeForDarwinArchName(BoundArch))))
6474e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6498ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      Arg *OriginalArg = A;
6501d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
6510e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
652ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6544e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
6554e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
6564e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
6574e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
6584e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
6594e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
6604e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
6614e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
6620e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar      if (!XarchArg || Index > Prev + 1) {
6635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
6647e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar          << A->getAsString(Args);
6657e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar        continue;
66691e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
6675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
6684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
6694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6704e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
6714e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
672478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
6734e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
6740e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
6750e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
6768ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
6778ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // Linker input arguments require custom handling. The problem is that we
6788ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // have already constructed the phase actions, so we can not treat them as
6798ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // "input arguments".
68091e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      if (A->getOption().hasFlag(options::LinkerInput)) {
6818ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        // Convert the argument into individual Zlinker_input_args.
6828ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
6838ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar          DAL->AddSeparateArg(OriginalArg,
6848ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              Opts.getOption(options::OPT_Zlinker_input),
6851d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                              A->getValue(i));
686304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6878ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        }
6888ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        continue;
6898ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      }
6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
6914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
692ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
693ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
694ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
6959e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
696ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
697ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
698ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
699ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
700ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
701ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
702ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
7039d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
704ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
706ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
7079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
7081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                          A->getValue());
709ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
710ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
711ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
7129d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7149d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
715ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
716ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
717ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
7189d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7199d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7209d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
721ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
722ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
723ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
7249d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
725ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
726ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
727ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
7289d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
729ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
730ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
731ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
7329d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
733ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
734ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
735ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
7369d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
739ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
740ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
7419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7429d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
744ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
745ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
7469d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
747ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
748ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
749ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
7509d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
751ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
752ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
7534e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
7544e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
75584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
75684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
757e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
7589d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
75984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
76084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
761c97e96a61fca41e84d5af3027b91cc1db32f1654Chad Rosier  // how the driver driver works.
76284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
7635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = BoundArch;
764e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
765e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MArch = Opts.getOption(options::OPT_march_EQ);
76684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
76784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
76884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
76984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
77084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
77184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
7729d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
77384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
7749d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
77584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
7769d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
77784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
7789d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
77984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
7809d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
78184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
7829d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
78384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
7849d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
78584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
7869d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
78784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
78884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
7899d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
79084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
79184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
79284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
79384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
7949d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
79584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
7969d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
79784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
7989d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
8009d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
80184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
8029d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
80384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
8049d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
80584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
8069d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
80784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
80884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
8099d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
810ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
81184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
8129d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
81384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
8149d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
81584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
8169d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
81784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
8189d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
81984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
8209d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
82184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
8229d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
823336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7f")
824336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7f");
825336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7k")
826336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7k");
827336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7s")
828336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7s");
82984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
83084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
8319f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
83284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
833ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
83460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
83560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
83660baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
8378202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier  if (BoundArch)
8388202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier    AddDeploymentTarget(*DAL);
83960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
8407a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
8417a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // FIXME: It would be far better to avoid inserting those -static arguments,
8427a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // but we can't check the deployment target in the translation code until
8437a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // it is set here.
8447a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) {
8457a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
8467a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Arg *A = *it;
8477a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      ++it;
8487a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      if (A->getOption().getID() != options::OPT_mkernel &&
8497a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar          A->getOption().getID() != options::OPT_fapple_kext)
8507a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar        continue;
8517a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(it != ie && "unexpected argument translation");
8527a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      A = *it;
8537a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(A->getOption().getID() == options::OPT_static &&
8547a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar             "missing expected -static argument");
8557a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      it = DAL->getArgs().erase(it);
8567a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    }
8577a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
8587a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
859163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  // Validate the C++ standard library choice.
860163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  CXXStdlibType Type = GetCXXStdlibType(*DAL);
861163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  if (Type == ToolChain::CST_Libcxx) {
862260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Check whether the target provides libc++.
863260611a32535c851237926bfcf78869b13c07d5bJohn McCall    StringRef where;
864260611a32535c851237926bfcf78869b13c07d5bJohn McCall
865260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Complain about targetting iOS < 5.0 in any way.
866377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson    if (isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0))
867377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson      where = "iOS 5.0";
868260611a32535c851237926bfcf78869b13c07d5bJohn McCall
869260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (where != StringRef()) {
870163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
871260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << where;
872163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    }
873163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  }
874163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
8754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
8761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
8778eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
878f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
879a4a809e23ef17bef21afc50e70412a77567807aeRafael Espindola  return getArch() == llvm::Triple::x86_64;
8808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
882f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
883f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
884f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
885f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
886f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
887f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
888b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
889b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
890b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
891b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
892b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
893b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
8947ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefault() const {
8957ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return true;
8968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
8987ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefaultForced() const {
8997ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return getArch() == llvm::Triple::x86_64;
9008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
9018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
902bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbarbool Darwin::SupportsProfiling() const {
903bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  // Profiling instrumentation is only supported on x86.
90464f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
905bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar}
906bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
90743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
90843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
90943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
91043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
91143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
9120a7dd788dbef975f35f273c7ab913f480f7edd60John McCallvoid Darwin::CheckObjCARC() const {
9130a7dd788dbef975f35f273c7ab913f480f7edd60John McCall  if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
9140a7dd788dbef975f35f273c7ab913f480f7edd60John McCall    return;
91580fd37a57176433d05854dff27b9c5fa869fadd2John McCall  getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
9165840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis}
9175840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
91800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string
91961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad RosierDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
92061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
92161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
92200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
92300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
9243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
9253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
9263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
9273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
92819347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text.
92919347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
93019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects.
93119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/
93219347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
93319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
93419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> First = VersionText.split('.');
93519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> Second = First.second.split('.');
93619347edf7809866350750a1997ec4db009832fa4Chandler Carruth
93719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
93819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (First.first.getAsInteger(10, GoodVersion.Major) ||
93919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Major < 0)
94019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
94119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
94219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Minor < 0)
94319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
94419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
94519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // First look for a number prefix and parse that if present. Otherwise just
94619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // stash the entire patch string in the suffix, and leave the number
94719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // unspecified. This covers versions strings such as:
94819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4
94919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.0
95019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x
95119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.2-rc4
95219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x-patched
95319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // And retains any patch number it finds.
95419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
95519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (!PatchText.empty()) {
956ca1ad5018da214b9ff584f57288258424eb76089Will Dietz    if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
95719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Try to parse the number and any suffix.
95819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
95919347edf7809866350750a1997ec4db009832fa4Chandler Carruth          GoodVersion.Patch < 0)
96019347edf7809866350750a1997ec4db009832fa4Chandler Carruth        return BadVersion;
96119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
96219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
96319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
96419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
96519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return GoodVersion;
96619347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
96719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
96819347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
96919347edf7809866350750a1997ec4db009832fa4Chandler Carruthbool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
970f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Major != RHS.Major)
971f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Major < RHS.Major;
972f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Minor != RHS.Minor)
973f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Minor < RHS.Minor;
974f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Patch != RHS.Patch) {
975f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Note that versions without a specified patch sort higher than those with
976f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // a patch.
977f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (RHS.Patch == -1)
978f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
979f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (Patch == -1)
980f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return false;
981f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
982f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Otherwise just sort on the patch itself.
983f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Patch < RHS.Patch;
984f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
985f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (PatchSuffix != RHS.PatchSuffix) {
986f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Sort empty suffixes higher.
987f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (RHS.PatchSuffix.empty())
988f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
989f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (PatchSuffix.empty())
9905ba0c8e4077902f53e5f3e8271e470a1d8c1c074Chandler Carruth      return false;
991f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
992f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Provide a lexicographic sort to make this a total ordering.
993f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return PatchSuffix < RHS.PatchSuffix;
994f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
995f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
996f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  // The versions are equal.
99719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return false;
99819347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
99919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
10000e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindolastatic StringRef getGCCToolchainDir(const ArgList &Args) {
10010e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
10020e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (A)
10031d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    return A->getValue();
10040e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  return GCC_INSTALL_PREFIX;
10050e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola}
10060e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola
100719347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Construct a GCCInstallationDetector from the driver.
100819347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
100919347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths.
10100407a04049016bdd6fe4fda462aa199d82c750d4Gabor Greif/// Once constructed, a GCCInstallationDetector is essentially immutable.
10111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth///
10121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
10131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// should instead pull the target out of the driver. This is currently
10141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// necessary because the driver doesn't store the final version of the target
10151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// triple.
10161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler CarruthGeneric_GCC::GCCInstallationDetector::GCCInstallationDetector(
10171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const Driver &D,
10180e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const llvm::Triple &TargetTriple,
10190e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const ArgList &Args)
10201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    : IsValid(false) {
10219b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth  llvm::Triple MultiarchTriple
10229b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth    = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
10239b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth                                 : TargetTriple.get32BitArchVariant();
10241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
102519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The library directories which may contain GCC installations.
10261c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
102719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The compatible GCC triples for this particular architecture.
10281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateTripleAliases;
10291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
10301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
10311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateTripleAliases,
10321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchLibDirs,
10331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchTripleAliases);
103419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
103519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Compute the set of prefixes for our search.
103619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
103719347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                       D.PrefixDirs.end());
1038353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10390e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  StringRef GCCToolchainDir = getGCCToolchainDir(Args);
10400e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (GCCToolchainDir != "") {
10410e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    if (GCCToolchainDir.back() == '/')
10420e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola      GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1043353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10440e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    Prefixes.push_back(GCCToolchainDir);
1045353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  } else {
1046353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot);
1047353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot + "/usr");
1048353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.InstalledDir + "/..");
1049353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  }
105019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
105119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Loop over the various components which exist and select the best GCC
105219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // installation available. GCC installs are ranked by version number.
105319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Version = GCCVersion::Parse("0.0.0");
105419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
105519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (!llvm::sys::fs::exists(Prefixes[i]))
105619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      continue;
105719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
105819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
105919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
106019347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
10611c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1062f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1063f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                               CandidateTripleAliases[k]);
10641c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    }
10651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
10661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      const std::string LibDir
10671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
10681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
10691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        continue;
10701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
10711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth           ++k)
1072f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
10731c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               CandidateMultiarchTripleAliases[k],
10741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               /*NeedsMultiarchSuffix=*/true);
107519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
107619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
107719347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
107819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
107919347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
10801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &TargetTriple,
10811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &MultiarchTriple,
10821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &LibDirs,
10831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &TripleAliases,
10841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchLibDirs,
10851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
10861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Declare a bunch of static data sets that we'll select between below. These
10871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // are specifically designed to always refer to string literals to avoid any
10881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // lifetime or initialization issues.
10891c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMLibDirs[] = { "/lib" };
10901c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMTriples[] = {
10911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-gnueabi",
10921c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-androideabi"
10931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
1094ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  static const char *const ARMHFTriples[] = {
1095ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "arm-linux-gnueabihf",
1096ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
10971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
10981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
10991c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64Triples[] = {
11001c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
11011c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-unknown-linux-gnu",
11021c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-pc-linux-gnu",
11031c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux6E",
11041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux",
11051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-suse-linux",
11061c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-manbo-linux-gnu",
11071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
11081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-slackware-linux"
11091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86LibDirs[] = { "/lib32", "/lib" };
11111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86Triples[] = {
11121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-linux-gnu",
11131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-pc-linux-gnu",
11141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i486-linux-gnu",
11151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-linux-gnu",
11162a907f8735cee8ae145ffded6d8dfb1e8cf29b28NAKAMURA Takumi    "i386-redhat-linux6E",
11171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-redhat-linux",
11181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-redhat-linux",
11191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-redhat-linux",
11201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-suse-linux",
112191720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i486-slackware-linux",
112291720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i686-montavista-linux"
11231c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSLibDirs[] = { "/lib" };
11261c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSTriples[] = { "mips-linux-gnu" };
11271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSELLibDirs[] = { "/lib" };
1128f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  static const char *const MIPSELTriples[] = {
1129f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-gnu",
1130f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-android"
1131f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  };
11321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1133b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1134b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1135b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1136b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1137b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan
11381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
11391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCTriples[] = {
11401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-linux-gnu",
11411c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-unknown-linux-gnu",
114291720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-suse-linux",
114391720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-montavista-linuxspe"
11441c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
11461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64Triples[] = {
1147155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    "powerpc64-linux-gnu",
11481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-unknown-linux-gnu",
11491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-suse-linux",
11501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "ppc64-redhat-linux"
11511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  switch (TargetTriple.getArch()) {
11541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::arm:
11551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::thumb:
115619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1157ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1158ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1159ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1160ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
1161ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1162ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1163ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
11641c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86_64:
11661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11721c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11731c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11751c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86:
117619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mips:
11851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
11871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1189b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1190b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1191b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1192b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
11931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mipsel:
11951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
11971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1199b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1200b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1201b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1202b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1203b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1204b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64:
1205b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1206b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1207b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1208b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1209b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1210b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1211b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1212b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1213b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1214b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64el:
1215b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1216b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1217b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1218b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1219b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1220b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1221b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1222b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
12231c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc:
122519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12261c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc64:
12341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
12351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12411c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12421c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12431c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12441c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  default:
12451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // By default, just rely on the standard lib directories and the original
12461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // triple.
12471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
124819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
12491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Always append the drivers target triple to the end, in case it doesn't
12511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // match any of our aliases.
12521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  TripleAliases.push_back(TargetTriple.str());
12531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Also include the multiarch variant if it's different.
12551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  if (TargetTriple.str() != MultiarchTriple.str())
12561c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.push_back(MultiarchTriple.str());
125719347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
125819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1259f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan// FIXME: There is the same routine in the Tools.cpp.
1260f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic bool hasMipsN32ABIArg(const ArgList &Args) {
1261f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
12621d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A && (A->getValue() == StringRef("n32"));
1263f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1264f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1265f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic StringRef getTargetMultiarchSuffix(llvm::Triple::ArchType TargetArch,
1266f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                                          const ArgList &Args) {
1267f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::x86_64 ||
1268f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::ppc64)
1269f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    return "/64";
1270f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1271f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::mips64 ||
1272f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::mips64el) {
1273f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    if (hasMipsN32ABIArg(Args))
1274f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/n32";
1275f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    else
1276f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/64";
1277f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  }
1278f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1279f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  return "/32";
1280f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1281f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
128219347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1283f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    llvm::Triple::ArchType TargetArch, const ArgList &Args,
1284f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    const std::string &LibDir,
12851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
128619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // There are various different suffixes involving the triple we
128719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // check for. We also record what is necessary to walk from each back
128819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // up to the lib directory.
12891c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const std::string LibSuffixes[] = {
129019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/gcc/" + CandidateTriple.str(),
129119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
129219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
129302014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // The Freescale PPC SDK has the gcc libraries in
129402014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
129502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/" + CandidateTriple.str(),
129602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel
129719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // Ubuntu has a strange mis-matched pair of triples that this happens to
129819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // match.
129919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: It may be worthwhile to generalize this and look for a second
130019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // triple.
1301d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
130219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
130319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const std::string InstallSuffixes[] = {
130419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../..",
130519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../..",
130602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/../..",
130719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../.."
130819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
130919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
13101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
13111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                                   (TargetArch != llvm::Triple::x86));
13121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
13131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef LibSuffix = LibSuffixes[i];
131419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::error_code EC;
13151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
131619347edf7809866350750a1997ec4db009832fa4Chandler Carruth         !EC && LI != LE; LI = LI.increment(EC)) {
131719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      StringRef VersionText = llvm::sys::path::filename(LI->path());
131819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
131919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
132019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion < MinVersion)
132119347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
132219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion <= Version)
132319347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
13242e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel
13252e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel      // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
13265d84bb418405e1256020a66895d163756886b102Chandler Carruth      // in what would normally be GCCInstallPath and put the 64-bit
13271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // libs in a subdirectory named 64. The simple logic we follow is that
13281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // *if* there is a subdirectory of the right name with crtbegin.o in it,
13291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // we use that. If not, and if not a multiarch triple, we look for
13301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // crtbegin.o without the subdirectory.
1331f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      StringRef MultiarchSuffix = getTargetMultiarchSuffix(TargetArch, Args);
13321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
13331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix = MultiarchSuffix.str();
13341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      } else {
13351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        if (NeedsMultiarchSuffix ||
13361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth            !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
13371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth          continue;
13381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix.clear();
13391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      }
134019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
134119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      Version = CandidateVersion;
1342fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth      GCCTriple.setTriple(CandidateTriple);
134319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // FIXME: We hack together the directory name here instead of
134419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // using LI to ensure stable path separators across Windows and
134519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Linux.
13461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
13475d84bb418405e1256020a66895d163756886b102Chandler Carruth      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
134819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      IsValid = true;
134919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
135019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
135119347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
135219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
13530e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaGeneric_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
13540e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                         const ArgList &Args)
13550e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) {
1356edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
135786643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1358edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1359c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
1360c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
13613917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
13623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
13633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
13643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
13653917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
13663917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
1369ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const JobAction &JA,
1370ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const ActionList &Inputs) const {
13715bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
13725bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
13735bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
13745bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
13755bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
13763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13773917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
13783917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
13793917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
13808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
13818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
1382b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
13833917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
13845bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Preprocess(*this); break;
13853917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
13865bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Precompile(*this); break;
13873917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
138830660a898545416f0fea2d717f16f75640001e38Ted Kremenek    case Action::MigrateJobClass:
138985b7f7ddf2f09778ec303f5a39f9e67e3aae1115Bob Wilson      T = new tools::Clang(*this); break;
13905bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    case Action::CompileJobClass:
13915bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky      T = new tools::gcc::Compile(*this); break;
13923917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
13933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
13943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
13953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
13988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
13998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
14008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
14016e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
14026e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
1403f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
1404f857186fd1995b34185d063a29b11ad4f948519fEric Christopher      T = new tools::darwin::VerifyDebug(*this); break;
14053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
14063917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
14073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
14093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14113917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
14126f009b68b9f7aaf280144b0cd81d6a0b23c733a6Rafael Espindola  return getArch() == llvm::Triple::x86_64;
14133917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14157ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefault() const {
14167ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
14173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14197ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefaultForced() const {
14207ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
14213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14227ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
14239631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum/// Hexagon Toolchain
14249631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1425b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisstd::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1426b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1427b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Locate the rest of the toolchain ...
1428b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (strlen(GCC_INSTALL_PREFIX))
1429b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return std::string(GCC_INSTALL_PREFIX);
1430b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1431b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string InstallRelDir = InstalledDir + "/../../gnu";
1432b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(InstallRelDir))
1433b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return InstallRelDir;
1434b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1435b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1436b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(PrefixRelDir))
1437b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return PrefixRelDir;
1438b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1439b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  return InstallRelDir;
1440b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis}
1441b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
14425fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic void GetHexagonLibraryPaths(
14435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const ArgList &Args,
14445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string Ver,
14455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchString,
14465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string &InstalledDir,
14475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths)
14485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis{
14495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool buildingLib = Args.hasArg(options::OPT_shared);
14505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // -L Args
14535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (arg_iterator
14555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         it = Args.filtered_begin(options::OPT_L),
14565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         ie = Args.filtered_end();
14575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       it != ie;
14585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       ++it) {
14595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
14605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      LibPaths->push_back((*it)->getValue(i));
14615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Other standard paths
14655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchSuffix = "/" + MarchString;
14675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string G0Suffix = "/G0";
14685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
14695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
14705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/hexagon/...
14725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
14735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
14755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
14765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
14785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver);
14795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14805fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/...
14815fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(RootDir + "lib/gcc");
14825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // hexagon/lib/...
14845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string HexagonLibDir = RootDir + "hexagon/lib";
14855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14865fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
14875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + G0Suffix);
14885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir + MarchSuffix);
14905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir);
14915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
14925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
1493b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew CurtisHexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1494b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                       const ArgList &Args)
1495b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  : Linux(D, Triple, Args) {
1496b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string InstalledDir(getDriver().getInstalledDir());
1497b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1498b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1499b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1500b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // program paths
1501b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string BinDir(GnuDir + "/bin");
1502b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(BinDir))
1503b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    getProgramPaths().push_back(BinDir);
1504b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1505b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Determine version of GCC libraries and headers to use.
1506b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1507b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::error_code ec;
1508b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1509b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1510b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis       !ec && di != de; di = di.increment(ec)) {
1511b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1512b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    if (MaxVersion < cv)
1513b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      MaxVersion = cv;
1514b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  }
1515b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCLibAndIncVersion = MaxVersion;
15165fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15175fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths= &getFilePaths();
15185fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15195fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
15205fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
15215fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // support 'linux' we'll need to fix this up
15225fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->clear();
15235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15245fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  GetHexagonLibraryPaths(
15255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    Args,
15265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetGCCLibAndIncVersion(),
15275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetTargetCPU(Args),
15285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    InstalledDir,
15295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths);
15309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15329631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumHexagon_TC::~Hexagon_TC() {
15339631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  // Free tool implementations.
15349631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  for (llvm::DenseMap<unsigned, Tool*>::iterator
15359631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
15369631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    delete it->second;
15379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumTool &Hexagon_TC::SelectTool(const Compilation &C,
15409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                             const JobAction &JA,
15419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                             const ActionList &Inputs) const {
15425bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
15435bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   if (JA.getKind () == Action::CompileJobClass)
15445bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     Key = JA.getKind ();
15455bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     else
15465bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
15475bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
15485bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
15495bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
15505bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
15515bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   if ((JA.getKind () == Action::CompileJobClass)
15525bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     && (JA.getType () != types::TY_LTO_BC)) {
15535bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //     Key = JA.getKind ();
15545bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  //   }
15555bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
15569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  Tool *&T = Tools[Key];
15579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  if (!T) {
15589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    switch (Key) {
15599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::InputClass:
15609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::BindArchClass:
15619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      assert(0 && "Invalid tool kind.");
15629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::AnalyzeJobClass:
15639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::Clang(*this); break;
15649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::AssembleJobClass:
15659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::hexagon::Assemble(*this); break;
15669631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    case Action::LinkJobClass:
15679631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      T = new tools::hexagon::Link(*this); break;
15689631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    default:
15699631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum      assert(false && "Unsupported action for Hexagon target.");
15709631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum    }
15719631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
15729631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15739631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  return *T;
15749631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15759631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1576b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1577b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                           ArgStringList &CC1Args) const {
1578b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1579b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1580b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1581b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdlibinc))
1582b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1583b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1584b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path InstallDir(D.InstalledDir);
1585b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1586b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1587b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1588b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1589b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1590b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
15919631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15929631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1593b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1594b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                              ArgStringList &CC1Args) const {
1595b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1596b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1597b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdincxx))
1598b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1599b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1600b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1601b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1602b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1603b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1604b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent("hexagon/include/c++/");
1605b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent(Ver);
1606b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
16077ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth}
16086781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16095fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisToolChain::CXXStdlibType
16105fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisHexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
16115fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
16125fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (!A)
16135fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    return ToolChain::CST_Libstdcxx;
16145fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
16155fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  StringRef Value = A->getValue();
16165fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (Value != "libstdc++") {
16175fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
16185fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      << A->getAsString(Args);
16195fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
16205fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
16215fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  return ToolChain::CST_Libstdcxx;
16225fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
16235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
16245fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic Arg *GetLastHexagonArchArg(const ArgList &Args)
16256781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
16266781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = NULL;
16276781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16286781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
16296781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis       it != ie; ++it) {
16306781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if ((*it)->getOption().matches(options::OPT_march_EQ) ||
16316781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
16326781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A = *it;
16336781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A->claim();
16346781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    } else if ((*it)->getOption().matches(options::OPT_m_Joined)) {
16356781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      StringRef Value = (*it)->getValue(0);
16366781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      if (Value.startswith("v")) {
16376781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A = *it;
16386781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A->claim();
16396781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      }
16406781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    }
16416781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
16426781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return A;
16436781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
16446781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16456781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew CurtisStringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
16466781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
16476781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  // Select the default CPU (v4) if none was given or detection failed.
16486781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = GetLastHexagonArchArg (Args);
16496781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  if (A) {
1650cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    StringRef WhichHexagon = A->getValue();
16516781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon.startswith("hexagon"))
16526781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon.substr(sizeof("hexagon") - 1);
16536781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon != "")
16546781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon;
16556781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
16566781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16576781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return "v4";
16586781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
1659b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis// End Hexagon
1660f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
16613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
16623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
16633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
16643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16651d16f0f805c2a3e2198a87154990347b2759f6bdChandler CarruthTCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple)
16661d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  : ToolChain(D, Triple) {
16673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
16683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
16693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
16713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
16723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
16753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
16763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
16773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
16783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1680304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const {
1681304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  return true;
16823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16847ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefault() const {
16857ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefaultForced() const {
16897ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1692304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA TakumiTool &TCEToolChain::SelectTool(const Compilation &C,
1693ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const JobAction &JA,
1694ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                               const ActionList &Inputs) const {
16953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
16963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
16973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
16993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
17003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
17013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
17023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
17033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
17043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
17053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
1706b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie     llvm_unreachable("Unsupported action for TCE target.");
17073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
17083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
17093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
17103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
17113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1712f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1713f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
17140e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaOpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
17150e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1716ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1717f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
1718f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1719f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1720ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1721ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
17225bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
17235bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
17245bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
17255bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
17265bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
17275bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
1728dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1729dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1730dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1731dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1732f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
1733f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
1734f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
1735dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    case Action::AssembleJobClass: {
1736dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1737dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1738dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1739dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::openbsd::Assemble(*this);
1740dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1741dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    }
1742f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
1743f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
1744f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
1745ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1746f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
1747f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
1748f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1749f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
1750f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1751f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
175242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
175342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
175442f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanBitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
175542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  : Generic_ELF(D, Triple, Args) {
175642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back(getDriver().Dir + "/../lib");
175742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back("/usr/lib");
175842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
175942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
176042f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanTool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA,
176142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                         const ActionList &Inputs) const {
17625bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
17635bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
17645bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
17655bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
17665bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
17675bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
176842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
176942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                             options::OPT_no_integrated_as,
177042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                             IsIntegratedAssemblerDefault());
177142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
177242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  Tool *&T = Tools[Key];
177342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (!T) {
177442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    switch (Key) {
177542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    case Action::AssembleJobClass: {
177642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      if (UseIntegratedAs)
177742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        T = new tools::ClangAs(*this);
177842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      else
177942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman        T = new tools::bitrig::Assemble(*this);
178042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      break;
178142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
178242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    case Action::LinkJobClass:
178342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      T = new tools::bitrig::Link(*this); break;
178442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    default:
178542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      T = &Generic_GCC::SelectTool(C, JA, Inputs);
178642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    }
178742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
178842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
178942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  return *T;
179042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
179142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
179242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
179342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                          ArgStringList &CC1Args) const {
179442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
179542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      DriverArgs.hasArg(options::OPT_nostdincxx))
179642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    return;
179742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
17988e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(DriverArgs)) {
17998e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
18008e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
18018e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/");
18028e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18038e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
18048e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
18058e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++");
18068e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
18078e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
18088e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth
18098e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    StringRef Triple = getTriple().str();
18108e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    if (Triple.startswith("amd64"))
18118e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
18128e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
18138e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple.substr(5));
18148e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    else
18158e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
18168e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/" +
18178e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple);
18188e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18198e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
182042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
182142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
182242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
182342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                 ArgStringList &CmdArgs) const {
18248e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(Args)) {
18258e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
18268e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lc++");
18278e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lcxxrt");
18288e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    // Include supc++ to provide Unwind until provided by libcxx.
18298e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lgcc");
18308e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18318e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
18328e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lstdc++");
18338e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
18348e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
183542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
183642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
183775358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
183875358d267256022475371416654b056ad8531cb3Daniel Dunbar
18390e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaFreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
18400e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1841214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
184224248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
184324248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // back to '/usr/lib' if it doesn't exist.
184400646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if ((Triple.getArch() == llvm::Triple::x86 ||
184500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth       Triple.getArch() == llvm::Triple::ppc) &&
184624248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
184700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
184800646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  else
184900646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
185075358d267256022475371416654b056ad8531cb3Daniel Dunbar}
185175358d267256022475371416654b056ad8531cb3Daniel Dunbar
1852ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1853ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
18545bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
18555bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
18565bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
18575bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
18585bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
18595bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
186067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
186167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             options::OPT_no_integrated_as,
186267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             IsIntegratedAssemblerDefault());
186367dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky
186475358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
186575358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
186675358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
186768a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
186867dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      if (UseIntegratedAs)
186967dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::ClangAs(*this);
187067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      else
187167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::freebsd::Assemble(*this);
1872fe3a7ea7f2132ec5cd0510cc21d2677614a6ab3aRoman Divacky      break;
1873008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
1874008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
187575358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
1876ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
18778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
18788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
18798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
18808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  return *T;
18818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
18828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
188327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindolabool FreeBSD::UseSjLjExceptions() const {
188427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  // FreeBSD uses SjLj exceptions on ARM oabi.
188527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  switch (getTriple().getEnvironment()) {
188627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::GNUEABI:
188727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::EABI:
188827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return false;
188927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
189027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  default:
189127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return (getTriple().getArch() == llvm::Triple::arm ||
189227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola            getTriple().getArch() == llvm::Triple::thumb);
189327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  }
189427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola}
189527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
18968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
18978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
18980e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaNetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
18990e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
19008e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
190105e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (getDriver().UseStdLib) {
190232f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // When targeting a 32-bit platform, try the special directory used on
190332f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // 64-bit hosts, and only fall back to the main library directory if that
190432f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // doesn't work.
190532f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
190632f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // what all logic is needed to emulate the '=' prefix here.
190766de97fcc368ff7e9ea50337177d007c108cfd73Joerg Sonnenberger    if (Triple.getArch() == llvm::Triple::x86)
190805e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib/i386");
190932f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth
191032f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    getFilePaths().push_back("=/usr/lib");
19118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
19128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
19138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
1914ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1915ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                         const ActionList &Inputs) const {
19165bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
19175bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
19185bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
19195bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
19205bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
19215bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
19228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
19238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             options::OPT_no_integrated_as,
19248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             IsIntegratedAssemblerDefault());
19258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
19268e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Tool *&T = Tools[Key];
19278e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!T) {
19288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    switch (Key) {
19298e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::AssembleJobClass:
19308e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      if (UseIntegratedAs)
19318e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        T = new tools::ClangAs(*this);
19328e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      else
19331bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger        T = new tools::netbsd::Assemble(*this);
19348e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      break;
19358e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::LinkJobClass:
19361bd91374498ac78e72545f08f4daa6491f9c9d14Joerg Sonnenberger      T = new tools::netbsd::Link(*this);
1937182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger      break;
19388e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    default:
1939ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
194075358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
194175358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
194275358d267256022475371416654b056ad8531cb3Daniel Dunbar
194375358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
194475358d267256022475371416654b056ad8531cb3Daniel Dunbar}
194511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
194638e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
194738e317d6dce161b249508686cc67eb7176958762Chris Lattner
19480e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaMinix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
19490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
195038e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
195138e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
195238e317d6dce161b249508686cc67eb7176958762Chris Lattner}
195338e317d6dce161b249508686cc67eb7176958762Chris Lattner
1954ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1955ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
19565bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
19575bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
19585bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
19595bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
19605bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
196138e317d6dce161b249508686cc67eb7176958762Chris Lattner
196238e317d6dce161b249508686cc67eb7176958762Chris Lattner  Tool *&T = Tools[Key];
196338e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!T) {
196438e317d6dce161b249508686cc67eb7176958762Chris Lattner    switch (Key) {
196538e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::AssembleJobClass:
196638e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Assemble(*this); break;
196738e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::LinkJobClass:
196838e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Link(*this); break;
196938e317d6dce161b249508686cc67eb7176958762Chris Lattner    default:
1970ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
197138e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
197238e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
197338e317d6dce161b249508686cc67eb7176958762Chris Lattner
197438e317d6dce161b249508686cc67eb7176958762Chris Lattner  return *T;
197538e317d6dce161b249508686cc67eb7176958762Chris Lattner}
197638e317d6dce161b249508686cc67eb7176958762Chris Lattner
1977e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1978e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
19790e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaAuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
19800e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                   const ArgList &Args)
19810e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
1982e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1983edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
198486643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1985edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1986e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1987ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1988e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
1989e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
1990e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
19917adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1992e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1993e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1994e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1995ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1996ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const {
19975bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
19985bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
19995bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
20005bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
20015bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
2002e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2003e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
2004e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
2005e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
2006e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
2007e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
2008e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
2009e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
2010e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
2011ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
2012e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
2013e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
2014e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2015e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
2016e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2017e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
201831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
201931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
20200e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaSolaris::Solaris(const Driver &D, const llvm::Triple& Triple,
20210e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                 const ArgList &Args)
20220e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
202331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
202431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getProgramPaths().push_back(getDriver().getInstalledDir());
202531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (getDriver().getInstalledDir() != getDriver().Dir)
202631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    getProgramPaths().push_back(getDriver().Dir);
202731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
202831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back(getDriver().Dir + "/../lib");
202931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back("/usr/lib");
203031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
203131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
203231c4690047f5f362ecf886f1586844b1aef0c4d2David ChisnallTool &Solaris::SelectTool(const Compilation &C, const JobAction &JA,
203331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                           const ActionList &Inputs) const {
20345bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
20355bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
20365bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
20375bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
20385bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
203931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
204031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  Tool *&T = Tools[Key];
204131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (!T) {
204231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    switch (Key) {
204331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    case Action::AssembleJobClass:
204431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = new tools::solaris::Assemble(*this); break;
204531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    case Action::LinkJobClass:
204631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = new tools::solaris::Link(*this); break;
204731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    default:
204831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall      T = &Generic_GCC::SelectTool(C, JA, Inputs);
204931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    }
205031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
205131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
205231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  return *T;
205331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
2054e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
20556b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
20566b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2057c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro {
20583fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  ArchLinux,
2059c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
2060c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
20610b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  DebianWheezy,
2062b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  DebianJessie,
20630a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
2064d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL4,
2065d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL5,
2066d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL6,
2067c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora13,
2068c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora14,
20698f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  Fedora15,
2070afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  Fedora16,
20718f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  FedoraRawhide,
2072c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  OpenSuse11_3,
2073de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse11_4,
2074de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse12_1,
20754e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  OpenSuse12_2,
2076814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuHardy,
2077814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuIntrepid,
2078021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
20795ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu  UbuntuKarmic,
2080c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
2081c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
208243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  UbuntuNatty,
208325a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer  UbuntuOneiric,
2084668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer  UbuntuPrecise,
2085de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuQuantal,
2086de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuRaring,
2087c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
2088c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
2089c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2090d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattnerstatic bool IsRedhat(enum LinuxDistro Distro) {
2091afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
2092afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer         (Distro >= RHEL4    && Distro <= RHEL6);
2093c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2094c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2095c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) {
20964e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
2097c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2098c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2099c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) {
2100b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  return Distro >= DebianLenny && Distro <= DebianJessie;
2101c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2102c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2103c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) {
2104de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  return Distro >= UbuntuHardy && Distro <= UbuntuRaring;
2105c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2106c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2107c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
21086f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith  OwningPtr<llvm::MemoryBuffer> File;
21094eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
21105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
21115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8> Lines;
2112c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
2113668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    LinuxDistro Version = UnknownDistro;
2114668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2115668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2116668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17))
2117668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("hardy", UbuntuHardy)
2118668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("intrepid", UbuntuIntrepid)
2119668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("jaunty", UbuntuJaunty)
2120668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("karmic", UbuntuKarmic)
2121668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("lucid", UbuntuLucid)
2122668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("maverick", UbuntuMaverick)
2123668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("natty", UbuntuNatty)
2124668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("oneiric", UbuntuOneiric)
2125668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("precise", UbuntuPrecise)
2126de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("quantal", UbuntuQuantal)
2127de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("raring", UbuntuRaring)
2128668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Default(UnknownDistro);
2129668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    return Version;
2130c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2131c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
21324eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
21335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2134afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    if (Data.startswith("Fedora release 16"))
2135afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      return Fedora16;
2136afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    else if (Data.startswith("Fedora release 15"))
21378f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return Fedora15;
21388f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 14"))
2139c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora14;
21408f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 13"))
2141c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora13;
21428f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release") &&
21435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("Rawhide") != StringRef::npos)
21448f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return FedoraRawhide;
2145d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner    else if (Data.startswith("Red Hat Enterprise Linux") &&
21465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 6") != StringRef::npos)
2147d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL6;
21485a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
21495a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
21505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 5") != StringRef::npos)
2151d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL5;
21525a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
21535a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
21545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 4") != StringRef::npos)
2155d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL4;
2156c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2157c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2158c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
21594eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
21605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2161c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
2162c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
21630e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2164c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
21650e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
21660b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      return DebianWheezy;
2167b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru    else if (Data.startswith("jessie/sid")  || Data[0] == '8')
2168b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru      return DebianJessie;
2169c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2170c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2171c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2172afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
2173afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer())
2174afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.3", OpenSuse11_3)
2175afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.4", OpenSuse11_4)
2176afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 12.1", OpenSuse12_1)
21774e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor      .StartsWith("openSUSE 12.2", OpenSuse12_2)
2178afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .Default(UnknownDistro);
2179c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
218032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
218132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
21820a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
21830a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
21843fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
21853fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth    return ArchLinux;
21863fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2187c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
2188c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2189c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2190deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target.
2191deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth///
2192deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use
2193deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths.
2194deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple,
2195deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here.
2196deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruthstatic std::string getMultiarchTriple(const llvm::Triple TargetTriple,
2197deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth                                      StringRef SysRoot) {
2198deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // For most architectures, just use whatever we have rather than trying to be
2199deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // clever.
2200deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  switch (TargetTriple.getArch()) {
2201deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  default:
2202deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2203deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
2204deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // We use the existence of '/lib/<triple>' as a directory to detect some
2205deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // common linux triples that don't quite match the Clang triple for both
2206236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2207236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // regardless of what the actual target triple is.
22080337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::arm:
22090337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::thumb:
2210ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2211ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2212ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabihf";
2213ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
2214ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2215ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabi";
2216ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
22170337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier    return TargetTriple.str();
2218deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86:
2219deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2220deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "i386-linux-gnu";
2221deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2222deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86_64:
2223deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2224deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "x86_64-linux-gnu";
2225deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
22265bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mips:
22275bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
22285bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mips-linux-gnu";
22295bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
22305bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mipsel:
22315bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
22325bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mipsel-linux-gnu";
22335bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
2234155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc:
2235155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2236155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc-linux-gnu";
2237155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2238155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc64:
2239155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2240155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc64-linux-gnu";
2241155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2242deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  }
2243deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth}
2244deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
224500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
224600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
224700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth}
224800646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth
22497a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic bool isMipsArch(llvm::Triple::ArchType Arch) {
22507a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Arch == llvm::Triple::mips ||
22517a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mipsel ||
22527a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64 ||
22537a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64el;
22547a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
22557a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
2256f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyanstatic bool isMipsR2Arch(llvm::Triple::ArchType Arch,
2257f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                         const ArgList &Args) {
2258f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (Arch != llvm::Triple::mips &&
2259f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      Arch != llvm::Triple::mipsel)
2260f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2261f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2262f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  Arg *A = Args.getLastArg(options::OPT_march_EQ,
2263f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mcpu_EQ,
2264f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mips_CPUs_Group);
2265f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2266f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (!A)
2267f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2268f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2269f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (A->getOption().matches(options::OPT_mips_CPUs_Group))
2270f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return A->getOption().matches(options::OPT_mips32r2);
2271f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
22721d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A->getValue() == StringRef("mips32r2");
2273f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan}
2274f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
22757a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic StringRef getMultilibDir(const llvm::Triple &Triple,
22767a9188833a6a09d574144334c9584c417b809007Simon Atanasyan                                const ArgList &Args) {
22777a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Triple.getArch()))
22787a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return Triple.isArch32Bit() ? "lib32" : "lib64";
22797a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22807a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // lib32 directory has a special meaning on MIPS targets.
22817a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // It contains N32 ABI binaries. Use this folder if produce
22827a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // code for N32 ABI only.
2283f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (hasMipsN32ABIArg(Args))
22847a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return "lib32";
22857a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22867a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Triple.isArch32Bit() ? "lib" : "lib64";
22877a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
22887a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
22890e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaLinux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
22900e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
229189088797876bddb866ce821f050a4395b7514dc2Chandler Carruth  llvm::Triple::ArchType Arch = Triple.getArch();
2292fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  const std::string &SysRoot = getDriver().SysRoot;
2293c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2294ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // OpenSuse stores the linker with the compiler, add that to the search
2295ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // path.
2296ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  ToolChain::path_list &PPaths = getProgramPaths();
2297fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2298fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth                         GCCInstallation.getTriple().str() + "/bin").str());
2299ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola
2300ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  Linker = GetProgramPath("ld");
2301c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2302c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  LinuxDistro Distro = DetectLinuxDistro(Arch);
2303c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
230464a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
230594c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
230694c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
230794c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
2308c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2309f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2310c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
2311c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
231294a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2313704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov
2314d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2315d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // and the MIPS ABI require .dynsym to be sorted in different ways.
2316d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2317d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // ABI requires a mapping between the GOT and the symbol table.
2318704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov  // Android loader does not support .gnu.hash.
23197a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Arch) && !IsAndroid) {
2320668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2321668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2322d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=gnu");
2323d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth
2324d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth    if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2325d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2326d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=both");
2327d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  }
2328c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2329d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  if (IsRedhat(Distro))
2330c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
2331c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
23320b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2333b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru      Distro == DebianJessie || IsOpenSuse(Distro) ||
23345a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2335668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2336c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
2337c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
233864a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro))
2339f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth    ExtraOpts.push_back("--enable-new-dtags");
234064a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner
2341d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // The selection of paths to try here is designed to match the patterns which
2342d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2343d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // This was determined by running GCC in a fake filesystem, creating all
2344d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // possible permutations of these directories, and seeing which ones it added
2345d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // to the link paths.
2346d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  path_list &Paths = getFilePaths();
234789088797876bddb866ce821f050a4395b7514dc2Chandler Carruth
23487a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  const std::string Multilib = getMultilibDir(Triple, Args);
2349deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
23503fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2351d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Add the multilib suffixed paths where they are available.
2352d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid()) {
2353fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
235489088797876bddb866ce821f050a4395b7514dc2Chandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2355f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2356f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    if (IsAndroid && isMipsR2Arch(Triple.getArch(), Args))
2357f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists(GCCInstallation.getInstallPath() +
2358f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      GCCInstallation.getMultiarchSuffix() +
2359f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      "/mips-r2",
2360f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
2361f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    else
2362f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists((GCCInstallation.getInstallPath() +
2363f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                       GCCInstallation.getMultiarchSuffix()),
2364f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
23659f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
23669f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // If the GCC installation we found is inside of the sysroot, we want to
23679f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // prefer libraries installed in the parent prefix of the GCC installation.
23689f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // It is important to *not* use these paths when the GCC installation is
2369241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // outside of the system root as that can pick up unintended libraries.
23709f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // This usually happens when there is an external cross compiler on the
23719f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // host system, and a more minimal sysroot available that is the target of
23729f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // the cross.
23739f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
23749f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
23759f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth                      Paths);
23769f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
23779f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + Multilib, Paths);
23789f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
23791d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // On Android, libraries in the parent prefix of the GCC installation are
23801d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // preferred to the ones under sysroot.
23811d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (IsAndroid) {
23821d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
23831d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    }
2384c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2385d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2386d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2387d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2388d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2389d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth
2390d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Try walking via the GCC triple path in case of multiarch GCC
2391d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // installations with strange symlinks.
2392d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid())
2393fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2394d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth                    "/../../" + Multilib, Paths);
2395c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola
23967a09d012f6d52c8a7ba257df85d13149e6aa7cb2Chandler Carruth  // Add the non-multilib suffixed paths (if potentially different).
2397048e6490704d0a4e095e033786230c584b52d82cChandler Carruth  if (GCCInstallation.isValid()) {
2398048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2399fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
24001c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    if (!GCCInstallation.getMultiarchSuffix().empty())
2401048e6490704d0a4e095e033786230c584b52d82cChandler Carruth      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
24029f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
24039f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
24049f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
24059f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath, Paths);
24069f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
2407d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  }
2408fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/lib", Paths);
2409fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib", Paths);
2410c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2411c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2412c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
2413c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
24146b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
24156b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2416ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
2417ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
24185bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
24195bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
24205bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
24215bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
24225bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
24235bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky
2424dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2425dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
2426dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
2427dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
2428ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Tool *&T = Tools[Key];
2429ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (!T) {
2430ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    switch (Key) {
2431ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    case Action::AssembleJobClass:
2432dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
2433dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
2434dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
2435dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::linuxtools::Assemble(*this);
2436dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
2437c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    case Action::LinkJobClass:
2438c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      T = new tools::linuxtools::Link(*this); break;
2439ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    default:
2440ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
2441ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    }
2442ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
2443ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
2444ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  return *T;
2445ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
2446ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
2447a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid Linux::addClangTargetOptions(const ArgList &DriverArgs,
2448a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                  ArgStringList &CC1Args) const {
24498af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2450a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  bool UseInitArrayDefault
2451a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth    = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
2452a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth      getTriple().getEnvironment() == llvm::Triple::Android;
2453a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2454a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         options::OPT_fno_use_init_array,
2455a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         UseInitArrayDefault))
24568af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola    CC1Args.push_back("-fuse-init-array");
24578af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
24588af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
24597d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
24607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                      ArgStringList &CC1Args) const {
24617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  const Driver &D = getDriver();
24627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24637d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
24647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24657d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24667d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
24677d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
24687d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24697d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
24707d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    llvm::sys::Path P(D.ResourceDir);
24717d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    P.appendComponent("include");
247207643086c6460095855573902d66aae1b08a6182Chandler Carruth    addSystemInclude(DriverArgs, CC1Args, P.str());
24737d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
24747d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24757d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
24767d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24777d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24787d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Check for configure-time C include directories.
24797d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CIncludeDirs(C_INCLUDE_DIRS);
24807d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (CIncludeDirs != "") {
24817d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    SmallVector<StringRef, 5> dirs;
24827d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CIncludeDirs.split(dirs, ":");
24837d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
24847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth         I != E; ++I) {
24857d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
24867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
24877d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    }
24887d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24897d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
24907d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
24917d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Lacking those, try to detect the correct set of system includes for the
24927d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // target triple.
24937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2494a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  // Implement generic Debian multiarch support.
2495a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86_64MultiarchIncludeDirs[] = {
2496a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu",
2497a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2498a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2499a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2500a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2501a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu/64",
2502a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu/64"
2503a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2504a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86MultiarchIncludeDirs[] = {
2505a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i386-linux-gnu",
2506a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2507a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2508a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2509a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2510a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu/32",
2511a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu",
2512a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu"
2513a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2514a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef ARMMultiarchIncludeDirs[] = {
2515a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/arm-linux-gnueabi"
2516a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2517ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  const StringRef ARMHFMultiarchIncludeDirs[] = {
2518ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "/usr/include/arm-linux-gnueabihf"
2519ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
2520d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSMultiarchIncludeDirs[] = {
2521d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mips-linux-gnu"
2522d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2523d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSELMultiarchIncludeDirs[] = {
2524d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mipsel-linux-gnu"
2525d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2526079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPCMultiarchIncludeDirs[] = {
2527079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc-linux-gnu"
2528079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2529079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPC64MultiarchIncludeDirs[] = {
2530079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc64-linux-gnu"
2531079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2532a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  ArrayRef<StringRef> MultiarchIncludeDirs;
25337d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getArch() == llvm::Triple::x86_64) {
2534a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
25357d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::x86) {
2536a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
25377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::arm) {
2538ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2539ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2540ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    else
2541ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2542d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mips) {
2543d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2544d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2545d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2546079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc) {
2547079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2548079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2549079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2550a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  }
2551a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2552a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth                                     E = MultiarchIncludeDirs.end();
2553a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth       I != E; ++I) {
2554d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    if (llvm::sys::fs::exists(D.SysRoot + *I)) {
2555a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2556a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      break;
2557a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    }
25587d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
25597d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
25607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getOS() == llvm::Triple::RTEMS)
25617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
25627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2563c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // Add an include of '/include' directly. This isn't provided by default by
2564c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2565c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // add even when Clang is acting as-if it were a system compiler.
2566c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2567c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth
25687d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
25697d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
25707d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
257179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Helper to add the thre variant paths for a libstdc++ installation.
257279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
257379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                const ArgList &DriverArgs,
257479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                ArgStringList &CC1Args) {
2575abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!llvm::sys::fs::exists(Base))
2576abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    return false;
25777d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base);
2578abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
25797d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2580abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  return true;
25817d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
25827d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
25837d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
25847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const {
25857d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
25867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      DriverArgs.hasArg(options::OPT_nostdincxx))
25877d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
25887d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2589eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  // Check if libc++ has been enabled and provide its include paths if so.
2590eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2591eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    // libc++ is always installed at a fixed path on Linux currently.
2592eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
2593eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/v1");
2594eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    return;
2595eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  }
2596eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth
2597fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // We need a detected GCC installation on Linux to provide libstdc++'s
2598fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // headers. We handled the libc++ case above.
2599fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  if (!GCCInstallation.isValid())
2600fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth    return;
2601abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2602abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // By default, look for the C++ headers in an include directory adjacent to
2603abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // the lib directory of the GCC installation. Note that this is expect to be
2604abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2605abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef LibDir = GCCInstallation.getParentLibPath();
2606abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef InstallDir = GCCInstallation.getInstallPath();
26078af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  StringRef Version = GCCInstallation.getVersion().Text;
26081d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  StringRef TripleStr = GCCInstallation.getTriple().str();
26091d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
26101d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  const std::string IncludePathCandidates[] = {
26111d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    LibDir.str() + "/../include/c++/" + Version.str(),
2612abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // Gentoo is weird and places its headers inside the GCC install, so if the
2613abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // first attempt to find the headers fails, try this pattern.
26141d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    InstallDir.str() + "/include/g++-v4",
26151d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // Android standalone toolchain has C++ headers in yet another place.
26161d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
261702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
261802014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // without a subdirectory corresponding to the gcc version.
261902014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    LibDir.str() + "/../include/c++",
26201d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  };
26211d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
26221d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
26231d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
26241d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov                GCCInstallation.getMultiarchSuffix()),
26251d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov            DriverArgs, CC1Args))
26261d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      break;
2627abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  }
26287d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
26297d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
263011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
263111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
26320e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaDragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
26330e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
263411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
263511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
2636edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
263786643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2638edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
263911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2640ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
264111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
264211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
264311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
264411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2645ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
2646ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const ActionList &Inputs) const {
26475bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  Action::ActionClass Key;
26485bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
26495bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = Action::AnalyzeJobClass;
26505bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky  else
26515bab9ae87c41148ee2f92d312945c1e9303222e8Nick Lewycky    Key = JA.getKind();
265211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
265311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
265411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
265511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
265611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
265711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
265811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
265911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
266011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
2661ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
266211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
266311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
266411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
266511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
266611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2667