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
45af370e6e051e505016637e23418354db625dc796Rafael EspindolaDarwin::Darwin(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
46af370e6e051e505016637e23418354db625dc796Rafael Espindola  : ToolChain(D, Triple, Args), 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")
1022503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("armv6m", "armv6m")
103a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv5tej", "armv5")
104a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
105a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv4t", "armv4t")
106a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv7", "armv7")
107a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7a", "armv7-a", "armv7")
108a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7r", "armv7-r", "armv7")
1092503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7em", "armv7e-m", "armv7em")
110336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7f", "armv7-f", "armv7f")
111336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7k", "armv7-k", "armv7k")
1122503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7m", "armv7-m", "armv7m")
113336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7s", "armv7-s", "armv7s")
114a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
115eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
116eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMCpu(StringRef Value) {
118a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char *>(Value)
119a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
120a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm10e", "arm10tdmi", "armv5")
121a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
122a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
1232503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
1242503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m0", "armv6m")
1252503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("cortex-a8", "cortex-r4", "cortex-a9", "cortex-a15", "armv7")
126336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("cortex-a9-mp", "armv7f")
1272503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m3", "armv7m")
1282503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m4", "armv7em")
129336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("swift", "armv7s")
130a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
131eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
132eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1335f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Darwin::getDarwinArchName(const ArgList &Args) const {
134eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
135eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
136eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
137304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
138f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  case llvm::Triple::thumb:
139eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
140eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1411d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMArch(A->getValue()))
142eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
143eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
144eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1451d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMCpu(A->getValue()))
146eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
147eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
148eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
149eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
150eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
151eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
152eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
153f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
15661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
15761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
15861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
15900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
16000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // If the target isn't initialized (e.g., an unknown Darwin platform, return
16100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // the default triple).
16200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetInitialized())
16300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
164304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
165f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<16> Str;
16609c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Str += isTargetIPhoneOS() ? "ios" : "macosx";
16709c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Str += getTargetVersion().getAsString();
16809c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  Triple.setOSName(Str);
16900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
17000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return Triple.getTriple();
17100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
17200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
17399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid Generic_ELF::anchor() {}
17499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
1755b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Darwin::constructTool(Action::ActionClass AC) const {
1765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
177f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::InputClass:
178f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::BindArchClass:
179f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    llvm_unreachable("Invalid tool kind.");
180f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PreprocessJobClass:
181f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AnalyzeJobClass:
182f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::MigrateJobClass:
183f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PrecompileJobClass:
184f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::CompileJobClass:
1855b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::Clang(*this);
186f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass: {
187f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
1885b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
189f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
1905b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::darwin::Assemble(*this);
191f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
192f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  }
193f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
1945b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::Link(*this);
195f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LipoJobClass:
1965b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::Lipo(*this);
197f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::DsymutilJobClass:
1985b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::Dsymutil(*this);
199f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::VerifyJobClass:
2005b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::VerifyDebug(*this);
2018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2038eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2046cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
205af370e6e051e505016637e23418354db625dc796Rafael EspindolaDarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
206af370e6e051e505016637e23418354db625dc796Rafael Espindola                         const ArgList &Args)
207af370e6e051e505016637e23418354db625dc796Rafael Espindola  : Darwin(D, Triple, Args)
2081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
2090e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
2100e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
2110e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2120e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
2131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
214edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
215edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
216edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2171d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
219f85e193739c953358c865005855253af4f68a497John McCallvoid DarwinClang::AddLinkARCArgs(const ArgList &Args,
220f85e193739c953358c865005855253af4f68a497John McCall                                 ArgStringList &CmdArgs) const {
221f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
222f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("-force_load");
223f85e193739c953358c865005855253af4f68a497John McCall  llvm::sys::Path P(getDriver().ClangExecutable);
224f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'clang'
225f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'bin'
226f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("lib");
227f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("arc");
228f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("libarclite_");
229f85e193739c953358c865005855253af4f68a497John McCall  std::string s = P.str();
230f85e193739c953358c865005855253af4f68a497John McCall  // Mash in the platform.
231c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  if (isTargetIOSSimulator())
232c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis    s += "iphonesimulator";
233c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  else if (isTargetIPhoneOS())
234f85e193739c953358c865005855253af4f68a497John McCall    s += "iphoneos";
235f85e193739c953358c865005855253af4f68a497John McCall  else
236f85e193739c953358c865005855253af4f68a497John McCall    s += "macosx";
237f85e193739c953358c865005855253af4f68a497John McCall  s += ".a";
238f85e193739c953358c865005855253af4f68a497John McCall
239f85e193739c953358c865005855253af4f68a497John McCall  CmdArgs.push_back(Args.MakeArgString(s));
240f85e193739c953358c865005855253af4f68a497John McCall}
241f85e193739c953358c865005855253af4f68a497John McCall
2423404fe7105ecc3baa58b7ea725773de4112259d6Eric Christophervoid DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
243f857186fd1995b34185d063a29b11ad4f948519fEric Christopher                                    ArgStringList &CmdArgs,
24469b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov                                    const char *DarwinStaticLib,
24569b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov                                    bool AlwaysLink) const {
2463404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  llvm::sys::Path P(getDriver().ResourceDir);
2473404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("lib");
2483404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("darwin");
2493404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent(DarwinStaticLib);
250f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
2513404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  // For now, allow missing resource libraries to support developers who may
25269b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // not have compiler-rt checked out or integrated into their build (unless
25369b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // we explicitly force linking with this library).
2543404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  bool Exists;
25569b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  if (AlwaysLink || (!llvm::sys::fs::exists(P.str(), Exists) && Exists))
2563404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    CmdArgs.push_back(Args.MakeArgString(P.str()));
2573404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher}
2583404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
2591d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
2601d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
261c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  // Darwin only supports the compiler-rt based runtime libraries.
262c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  switch (GetRuntimeLibType(Args)) {
263c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  case ToolChain::RLT_CompilerRT:
264c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    break;
265c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  default:
266c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
2671d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
268c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    return;
269c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
270c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
271eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
272eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
2737a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (Args.hasArg(options::OPT_static) ||
2747a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext) ||
2757a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_mkernel))
2761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
2771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2781d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
2791d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
2801d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
2811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
2825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_unsupported_opt)
2831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
2841d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
2851d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
2861d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
287f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  // If we are building profile support, link that library in.
288f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
289f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
290f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
291f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_coverage)) {
292f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    // Select the appropriate runtime library for the target.
293f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    if (isTargetIPhoneOS()) {
294f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
295f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    } else {
296f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
297f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    }
298f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  }
299f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar
300bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  SanitizerArgs Sanitize(getDriver(), Args);
301bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov
30275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  // Add Ubsan runtime library, if required.
30375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  if (Sanitize.needsUbsanRt()) {
3042cb3d300ecd36558bf2201debe28808d12a97be2Alexey Samsonov    if (isTargetIPhoneOS()) {
30575fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
30675fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        << "-fsanitize=undefined";
30775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else {
30869b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
30975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
31075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // The Ubsan runtime library requires C++.
31175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      AddCXXStdlibLibArgs(Args, CmdArgs);
31275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    }
31375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  }
31475fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
3157b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // Add ASAN runtime library, if required. Dynamic libraries and bundles
3167b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // should not be linked with the runtime library.
317bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  if (Sanitize.needsAsanRt()) {
3187b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany    if (Args.hasArg(options::OPT_dynamiclib) ||
31975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        Args.hasArg(options::OPT_bundle)) {
32075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // Assume the binary will provide the ASan runtime.
32175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else if (isTargetIPhoneOS()) {
32294b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
323bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov        << "-fsanitize=address";
32494b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    } else {
325454028e1beed117f98d7e5157ba47e784e521f72Alexander Potapenko      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx_dynamic.dylib", true);
32694b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar
327454028e1beed117f98d7e5157ba47e784e521f72Alexander Potapenko      // The ASAN runtime library requires C++.
32894b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      AddCXXStdlibLibArgs(Args, CmdArgs);
32994b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    }
33094b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar  }
33194b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar
332eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
333eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
3341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
335eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
336eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
337251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
33887e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
33987e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // it never went into the SDK.
340163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    // Linking against libgcc_s.1 isn't needed for iOS 5.0+
341163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
342163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      CmdArgs.push_back("-lgcc_s.1");
343eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
3443cceec5e05d974f3993bd0a745325f76fb8e4efcDaniel Dunbar    // We currently always need a static runtime library for iOS.
3453404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
346eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
347eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
348eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
349ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
350eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
351ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
352eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
353eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
354885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // For OS X, we thought we would only need a static runtime library when
355fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner    // targeting 10.4, to provide versions of the static functions which were
356885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // omitted from 10.4.dylib.
357885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    //
358885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // Unfortunately, that turned out to not be true, because Darwin system
359885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // headers can still use eprintf on i386, and it is not exported from
360885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // libSystem. Therefore, we still must provide a runtime library just for
361885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // the tiny tiny handful of projects that *might* use that symbol.
362885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    if (isMacosxVersionLT(10, 5)) {
3633404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
364885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    } else {
365885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::x86)
3663404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher        AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
3673404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
368885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    }
369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
3701d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
37260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
373ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
374ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
3759101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Support allowing the SDKROOT environment variable used by xcrun and other
3769101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Xcode tools to define the default sysroot, by making it the default for
3779101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // isysroot.
378d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
379d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    // Warn if the path does not exist.
380d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    bool Exists;
381d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    if (llvm::sys::fs::exists(A->getValue(), Exists) || !Exists)
382d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier      getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
383d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  } else {
3849101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    if (char *env = ::getenv("SDKROOT")) {
385321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // We only use this value as the default if it is an absolute path,
386321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // exists, and it is not the root path.
387321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
388321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar          StringRef(env) != "/") {
3899101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar        Args.append(Args.MakeSeparateArg(
3909101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar                      0, Opts.getOption(options::OPT_isysroot), env));
3919101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      }
3929101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    }
3939101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  }
3949101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar
3952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
3969d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
3979d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSSimVersion = Args.getLastArg(
3989d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    options::OPT_mios_simulator_version_min_EQ);
399983d835bead0134170a6646a8844926077c968d6Eli Friedman
4009d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
4015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
402ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
4039d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
4049d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSVersion = iOSSimVersion = 0;
4059d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (iOSVersion && iOSSimVersion) {
4065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
4079d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSVersion->getAsString(Args)
4089d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSSimVersion->getAsString(Args);
4099d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSSimVersion = 0;
4109d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
411a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // If no deployment target was specified on the command line, check for
412816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
413a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef OSXTarget;
414a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSTarget;
415a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSSimTarget;
416a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
417a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      OSXTarget = env;
418a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
419a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSTarget = env;
420a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
421a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSSimTarget = env;
422a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier
423a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi    // If no '-miphoneos-version-min' specified on the command line and
424a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
425241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // based on -isysroot.
426a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (iOSTarget.empty()) {
427a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
428a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef first, second;
4291d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef isysroot = A->getValue();
430a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
431a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        if (second != "")
432a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier          iOSTarget = second.substr(0,3);
433a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      }
434a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    }
435816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
4364f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // If no OSX or iOS target has been specified and we're compiling for armv7,
4374f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // go ahead as assume we're targeting iOS.
43849033207b75216a956f3dbf7d018fb3343a54ec1Chad Rosier    if (OSXTarget.empty() && iOSTarget.empty() &&
439336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson        (getDarwinArchName(Args) == "armv7" ||
440336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson         getDarwinArchName(Args) == "armv7s"))
44187ca5580302561c839b2cd12207902b9bf4ed117Chad Rosier        iOSTarget = iOSVersionMin;
4424f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier
4439d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Handle conflicting deployment targets
44439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
44539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
4469d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4479d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Do not allow conflicts with the iOS simulator target.
448a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
4495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
4509d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
451a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
4529d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar            "IPHONEOS_DEPLOYMENT_TARGET");
4539d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    }
4549d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
4559d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Allow conflicts among OSX and iOS for historical reasons, but choose the
4569d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // default platform.
457a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty() && !iOSTarget.empty()) {
45839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
45939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
460a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        OSXTarget = "";
46139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
462a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        iOSTarget = "";
46339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
4641a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
465a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty()) {
466e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
46760baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
46860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
469a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSTarget.empty()) {
470e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
4719d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
4729d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSVersion);
473a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSSimTarget.empty()) {
474e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(
4759d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        options::OPT_mios_simulator_version_min_EQ);
4769d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
4779d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSSimVersion);
478816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
4792bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
480e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
48160baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
48260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
48330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
484ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4863fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  // Reject invalid architecture combinations.
4873fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
4883fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar                        getTriple().getArch() != llvm::Triple::x86_64)) {
4895f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
4903fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
4913fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  }
4923fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar
4932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
4942603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
4952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
4962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
4979d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
4981d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
4992603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
5008a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar        Major != 10 || Minor >= 100 || Micro >= 100)
5015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
5022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
5032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
5049d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
5059d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert(Version && "Unknown target platform!");
5061d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor,
507983d835bead0134170a6646a8844926077c968d6Eli Friedman                                   Micro, HadExtra) || HadExtra ||
508983d835bead0134170a6646a8844926077c968d6Eli Friedman        Major >= 10 || Minor >= 100 || Micro >= 100)
509983d835bead0134170a6646a8844926077c968d6Eli Friedman      getDriver().Diag(diag::err_drv_invalid_version_number)
510983d835bead0134170a6646a8844926077c968d6Eli Friedman        << Version->getAsString(Args);
5112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
5129d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5135f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  bool IsIOSSim = bool(iOSSimVersion);
5145f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5155f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // In GCC, the simulator historically was treated as being OS X in some
5165f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // contexts, like determining the link logic, despite generally being called
5175f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // with an iOS deployment target. For compatibility, we detect the
5185f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // simulator as iOS + x86, and treat it differently in a few contexts.
5195f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
5205f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                     getTriple().getArch() == llvm::Triple::x86_64))
5215f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    IsIOSSim = true;
5225f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5235f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
524c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
525c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
526132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
527efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
528efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
529efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
530efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
531efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
532efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
533efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
534efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
535efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
536efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
537efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
538efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
539efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
540efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
541efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
54232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
543efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5441d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      llvm::sys::Path P(A->getValue());
545efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("usr");
546efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("lib");
547efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("libstdc++.dylib");
548efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
54932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
550efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.eraseComponent();
551efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.appendComponent("libstdc++.6.dylib");
55232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
553efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
554efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
555efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
556efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
557efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
558efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
559efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
5605a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // FIXME: This should be removed someday when we don't have to care about
5615a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
56232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
56332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
564efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
565efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
566efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
567efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
568efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
569efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
570efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
571efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
572efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
573efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
574efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
5757433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
5767433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
5777433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
5787433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
5797433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
5807433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
5817433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
5827433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  llvm::sys::Path P(getDriver().ResourceDir);
5837433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("lib");
5847433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("darwin");
5857a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
5867a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // Use the newer cc_kext for iOS ARM after 6.0.
5877a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
5887a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      !isIPhoneOSVersionLT(6, 0)) {
5897a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext.a");
5907a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  } else {
5917a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    P.appendComponent("libclang_rt.cc_kext_ios5.a");
5927a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
593304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
5947433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
5957433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
59632bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
59732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
5987433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
5997433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
6007433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
601c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
602c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar                                      const char *BoundArch) const {
603c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
604c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
605c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
606c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
607c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
608c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
609c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
610c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
611c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
6122603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
613279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
614279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
6154e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
6164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6174e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
6182a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // Skip this argument unless the architecture matches either the toolchain
6192a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // triple arch, or the arch being bound.
62064f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      llvm::Triple::ArchType XarchArch =
6211d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        tools::darwin::getArchTypeForDarwinArchName(A->getValue(0));
62264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      if (!(XarchArch == getArch()  ||
62364f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola            (BoundArch && XarchArch ==
624cfed8283c3aeb03ddd837411467d19e250068d39Rafael Espindola             tools::darwin::getArchTypeForDarwinArchName(BoundArch))))
6254e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6264e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6278ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      Arg *OriginalArg = A;
6281d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
6290e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
630ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
6311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6324e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
6334e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
6344e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
6354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
6364e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
6374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
6384e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
6394e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
6400e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar      if (!XarchArg || Index > Prev + 1) {
6415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
6427e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar          << A->getAsString(Args);
6437e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar        continue;
64491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
6455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
6464e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
6474e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
6494e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
650478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
6514e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
6520e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
6530e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
6548ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
6558ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // Linker input arguments require custom handling. The problem is that we
6568ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // have already constructed the phase actions, so we can not treat them as
6578ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // "input arguments".
65891e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      if (A->getOption().hasFlag(options::LinkerInput)) {
6598ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        // Convert the argument into individual Zlinker_input_args.
6608ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
6618ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar          DAL->AddSeparateArg(OriginalArg,
6628ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              Opts.getOption(options::OPT_Zlinker_input),
6631d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                              A->getValue(i));
664304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6658ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        }
6668ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        continue;
6678ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      }
6681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
6694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
670ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
671ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
672ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
6739e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
674ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
675ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
676ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
677ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
678ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
679ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
680ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
6819d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
682ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
6831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
684ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
6859d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
6861d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                          A->getValue());
687ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
688ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
689ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
6909d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
6919d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
6929d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
693ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
694ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
695ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
6969d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
6979d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
6989d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
699ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
700ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
701ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
7029d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
703ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
704ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
705ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
7069d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
707ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
708ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
709ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
7109d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
711ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
712ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
713ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
7149d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
716ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
717ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
718ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
7199d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7209d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
721ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
722ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
723ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
7249d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
725ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
726ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
727ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
7289d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
729ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
730ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
7314e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
7324e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
73384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
73484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
735e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
7369d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
73784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
73884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
739c97e96a61fca41e84d5af3027b91cc1db32f1654Chad Rosier  // how the driver driver works.
74084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
7415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = BoundArch;
742e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
743e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MArch = Opts.getOption(options::OPT_march_EQ);
74484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
74584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
74684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
74784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
74884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
74984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
7509d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
75184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
7529d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
75384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
7549d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
75584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
7569d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
75784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
7589d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
75984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
7609d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
76184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
7629d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
76384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
7649d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
76584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
76684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
7679d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
76884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
76984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
77084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
77184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
7729d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
77384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
7749d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
77584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
7769d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
77784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
7789d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
77984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
7809d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
78184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
7829d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
78384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
7849d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
78584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
78684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
7879d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
788ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
78984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
7909d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
79184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
7929d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
79384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
7949d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
79584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
7969d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
79784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
7989d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
7992503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv6m")
8002503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv6m");
80184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
8029d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
8032503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv7em")
8042503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7em");
805336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7f")
806336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7f");
807336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7k")
808336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7k");
8092503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv7m")
8102503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7m");
811336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7s")
812336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson      DAL->AddJoinedArg(0, MArch, "armv7s");
81384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
81484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
8159f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
81684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
817ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
81860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
81960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
82060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
8218202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier  if (BoundArch)
8228202fb8ee3c86797f737413de6030a88c8e0781cChad Rosier    AddDeploymentTarget(*DAL);
82360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
8247a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
8257a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // FIXME: It would be far better to avoid inserting those -static arguments,
8267a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // but we can't check the deployment target in the translation code until
8277a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // it is set here.
8287a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) {
8297a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
8307a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Arg *A = *it;
8317a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      ++it;
8327a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      if (A->getOption().getID() != options::OPT_mkernel &&
8337a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar          A->getOption().getID() != options::OPT_fapple_kext)
8347a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar        continue;
8357a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(it != ie && "unexpected argument translation");
8367a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      A = *it;
8377a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(A->getOption().getID() == options::OPT_static &&
8387a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar             "missing expected -static argument");
8397a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      it = DAL->getArgs().erase(it);
8407a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    }
8417a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
8427a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
843163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  // Validate the C++ standard library choice.
844163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  CXXStdlibType Type = GetCXXStdlibType(*DAL);
845163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  if (Type == ToolChain::CST_Libcxx) {
846260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Check whether the target provides libc++.
847260611a32535c851237926bfcf78869b13c07d5bJohn McCall    StringRef where;
848260611a32535c851237926bfcf78869b13c07d5bJohn McCall
849260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Complain about targetting iOS < 5.0 in any way.
850377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson    if (isTargetIPhoneOS() && isIPhoneOSVersionLT(5, 0))
851377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson      where = "iOS 5.0";
852260611a32535c851237926bfcf78869b13c07d5bJohn McCall
853260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (where != StringRef()) {
854163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
855260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << where;
856163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    }
857163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  }
858163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
8594e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
8601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
8618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
862f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
863a4a809e23ef17bef21afc50e70412a77567807aeRafael Espindola  return getArch() == llvm::Triple::x86_64;
8648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
866f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
867f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
868f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
869f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
870f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
871f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
872b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
873b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
874b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
875b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
876b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
877b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
8787ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefault() const {
8797ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return true;
8808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
8827ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Darwin::isPICDefaultForced() const {
8837ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return getArch() == llvm::Triple::x86_64;
8848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
886bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbarbool Darwin::SupportsProfiling() const {
887bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  // Profiling instrumentation is only supported on x86.
88864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
889bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar}
890bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
89143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
89243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
89343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
89443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
89543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
8960a7dd788dbef975f35f273c7ab913f480f7edd60John McCallvoid Darwin::CheckObjCARC() const {
8970a7dd788dbef975f35f273c7ab913f480f7edd60John McCall  if (isTargetIPhoneOS() || !isMacosxVersionLT(10, 6))
8980a7dd788dbef975f35f273c7ab913f480f7edd60John McCall    return;
89980fd37a57176433d05854dff27b9c5fa869fadd2John McCall  getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
9005840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis}
9015840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
90200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string
90361ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad RosierDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
90461ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
90561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
90600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
90700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
9083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
9093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
9103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
9113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
91219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text.
91319347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
91419347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects.
91519347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/
91619347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
91719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
91819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> First = VersionText.split('.');
91919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> Second = First.second.split('.');
92019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
92119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
92219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (First.first.getAsInteger(10, GoodVersion.Major) ||
92319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Major < 0)
92419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
92519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
92619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Minor < 0)
92719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
92819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
92919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // First look for a number prefix and parse that if present. Otherwise just
93019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // stash the entire patch string in the suffix, and leave the number
93119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // unspecified. This covers versions strings such as:
93219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4
93319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.0
93419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x
93519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.2-rc4
93619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x-patched
93719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // And retains any patch number it finds.
93819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
93919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (!PatchText.empty()) {
940ca1ad5018da214b9ff584f57288258424eb76089Will Dietz    if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
94119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Try to parse the number and any suffix.
94219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
94319347edf7809866350750a1997ec4db009832fa4Chandler Carruth          GoodVersion.Patch < 0)
94419347edf7809866350750a1997ec4db009832fa4Chandler Carruth        return BadVersion;
94519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
94619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
94719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
94819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
94919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return GoodVersion;
95019347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
95119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
95219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
95319347edf7809866350750a1997ec4db009832fa4Chandler Carruthbool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
954f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Major != RHS.Major)
955f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Major < RHS.Major;
956f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Minor != RHS.Minor)
957f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Minor < RHS.Minor;
958f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (Patch != RHS.Patch) {
959f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Note that versions without a specified patch sort higher than those with
960f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // a patch.
961f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (RHS.Patch == -1)
962f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
963f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (Patch == -1)
964f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return false;
965f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
966f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Otherwise just sort on the patch itself.
967f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return Patch < RHS.Patch;
968f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
969f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  if (PatchSuffix != RHS.PatchSuffix) {
970f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Sort empty suffixes higher.
971f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (RHS.PatchSuffix.empty())
972f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
973f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (PatchSuffix.empty())
9745ba0c8e4077902f53e5f3e8271e470a1d8c1c074Chandler Carruth      return false;
975f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
976f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Provide a lexicographic sort to make this a total ordering.
977f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    return PatchSuffix < RHS.PatchSuffix;
978f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
979f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
980f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  // The versions are equal.
98119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return false;
98219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
98319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
9840e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindolastatic StringRef getGCCToolchainDir(const ArgList &Args) {
9850e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
9860e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (A)
9871d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    return A->getValue();
9880e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  return GCC_INSTALL_PREFIX;
9890e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola}
9900e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola
99119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Construct a GCCInstallationDetector from the driver.
99219347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
99319347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths.
9940407a04049016bdd6fe4fda462aa199d82c750d4Gabor Greif/// Once constructed, a GCCInstallationDetector is essentially immutable.
9951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth///
9961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
9971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// should instead pull the target out of the driver. This is currently
9981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// necessary because the driver doesn't store the final version of the target
9991c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// triple.
10001c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler CarruthGeneric_GCC::GCCInstallationDetector::GCCInstallationDetector(
10011c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const Driver &D,
10020e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const llvm::Triple &TargetTriple,
10030e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    const ArgList &Args)
10041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    : IsValid(false) {
10059b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth  llvm::Triple MultiarchTriple
10069b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth    = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
10079b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth                                 : TargetTriple.get32BitArchVariant();
10081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
100919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The library directories which may contain GCC installations.
10101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
101119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The compatible GCC triples for this particular architecture.
10121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateTripleAliases;
10131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
10141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
10151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateTripleAliases,
10161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchLibDirs,
10171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                           CandidateMultiarchTripleAliases);
101819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
101919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Compute the set of prefixes for our search.
102019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
102119347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                       D.PrefixDirs.end());
1022353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10230e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  StringRef GCCToolchainDir = getGCCToolchainDir(Args);
10240e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (GCCToolchainDir != "") {
10250e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    if (GCCToolchainDir.back() == '/')
10260e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola      GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1027353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
10280e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    Prefixes.push_back(GCCToolchainDir);
1029353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  } else {
1030353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot);
1031353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.SysRoot + "/usr");
1032353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.InstalledDir + "/..");
1033353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  }
103419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
103519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Loop over the various components which exist and select the best GCC
103619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // installation available. GCC installs are ranked by version number.
103719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Version = GCCVersion::Parse("0.0.0");
103819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
103919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (!llvm::sys::fs::exists(Prefixes[i]))
104019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      continue;
104119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
104219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
104319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
104419347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
10451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1046f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
1047f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                               CandidateTripleAliases[k]);
10481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    }
10491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
10501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      const std::string LibDir
10511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
10521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
10531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        continue;
10541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
10551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth           ++k)
1056f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan        ScanLibDirForGCCTriple(TargetArch, Args, LibDir,
10571c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               CandidateMultiarchTripleAliases[k],
10581c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                               /*NeedsMultiarchSuffix=*/true);
105919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
106019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
106119347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
106219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
106319347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
10641c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &TargetTriple,
10651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    const llvm::Triple &MultiarchTriple,
10661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &LibDirs,
10671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &TripleAliases,
10681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchLibDirs,
10691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
10701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Declare a bunch of static data sets that we'll select between below. These
10711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // are specifically designed to always refer to string literals to avoid any
10721c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // lifetime or initialization issues.
1073c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  static const char *const AArch64LibDirs[] = { "/lib" };
1074c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  static const char *const AArch64Triples[] = {
1075c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    "aarch64-none-linux-gnu",
1076c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    "aarch64-linux-gnu"
1077c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  };
1078c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
10791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMLibDirs[] = { "/lib" };
10801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMTriples[] = {
10811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-gnueabi",
10821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "arm-linux-androideabi"
10831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
1084ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  static const char *const ARMHFTriples[] = {
1085ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "arm-linux-gnueabihf",
1086ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
10871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
10881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
10891c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64Triples[] = {
10901c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
10911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-unknown-linux-gnu",
10921c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-pc-linux-gnu",
10931c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux6E",
10941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-redhat-linux",
10951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-suse-linux",
10961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-manbo-linux-gnu",
10971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-linux-gnu",
10981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "x86_64-slackware-linux"
10991c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11001c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86LibDirs[] = { "/lib32", "/lib" };
11011c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86Triples[] = {
11021c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-linux-gnu",
11031c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-pc-linux-gnu",
11041c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i486-linux-gnu",
11051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-linux-gnu",
11062a907f8735cee8ae145ffded6d8dfb1e8cf29b28NAKAMURA Takumi    "i386-redhat-linux6E",
11071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i686-redhat-linux",
11081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-redhat-linux",
11091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i386-redhat-linux",
11101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "i586-suse-linux",
111191720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i486-slackware-linux",
111291720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "i686-montavista-linux"
11131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSLibDirs[] = { "/lib" };
11161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSTriples[] = { "mips-linux-gnu" };
11171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSELLibDirs[] = { "/lib" };
1118f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  static const char *const MIPSELTriples[] = {
1119f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-gnu",
1120f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    "mipsel-linux-android"
1121f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  };
11221c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1123b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1124b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1125b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1126b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1127b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan
11281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
11291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCTriples[] = {
11301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-linux-gnu",
11311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc-unknown-linux-gnu",
1132b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru    "powerpc-linux-gnuspe",
113391720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-suse-linux",
113491720917d4ea35af0f9f15eeebf0daf709c41e98Gabor Greif    "powerpc-montavista-linuxspe"
11351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
11371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64Triples[] = {
1138155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    "powerpc64-linux-gnu",
11391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-unknown-linux-gnu",
11401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "powerpc64-suse-linux",
11411c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    "ppc64-redhat-linux"
11421c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
11431c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
11441c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  switch (TargetTriple.getArch()) {
1145c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case llvm::Triple::aarch64:
11464f4e2af2643c1914c2e49ac6372f7c2c38616432Eric Christopher    LibDirs.append(AArch64LibDirs, AArch64LibDirs
1147c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                   + llvm::array_lengthof(AArch64LibDirs));
1148c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    TripleAliases.append(
1149c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1150c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    MultiarchLibDirs.append(
1151c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      AArch64LibDirs, AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs));
1152c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    MultiarchTripleAliases.append(
1153c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1154c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    break;
11551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::arm:
11561c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::thumb:
115719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1158ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1159ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1160ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMHFTriples, ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1161ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
1162ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      TripleAliases.append(
1163ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1164ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
11651c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11661c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86_64:
11671c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11701c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11721c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11731c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11751c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86:
117719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
11781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
11801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
11811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
11821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
11831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
11841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mips:
11861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
11881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11891c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1190b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1191b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1192b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1193b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
11941c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
11951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mipsel:
11961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
11971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
11981c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
11991c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
1200b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1201b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1202b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1203b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1204b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1205b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64:
1206b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1207b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1208b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1209b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1210b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1211b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1212b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1213b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1214b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1215b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64el:
1216b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    LibDirs.append(
1217b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1218b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1219b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1220b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchLibDirs.append(
1221b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1222b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    MultiarchTripleAliases.append(
1223b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan      MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
12241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc:
122619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12271c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12321c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc64:
12351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    LibDirs.append(
12361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
12371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    TripleAliases.append(
12381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
12391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchLibDirs.append(
12401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
12411c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.append(
12421c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
12431c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
12441c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  default:
12461c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // By default, just rely on the standard lib directories and the original
12471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // triple.
12481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
124919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
12501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12511c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Always append the drivers target triple to the end, in case it doesn't
12521c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // match any of our aliases.
12531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  TripleAliases.push_back(TargetTriple.str());
12541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
12551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Also include the multiarch variant if it's different.
12561c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  if (TargetTriple.str() != MultiarchTriple.str())
12571c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    MultiarchTripleAliases.push_back(MultiarchTriple.str());
125819347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
125919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1260f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan// FIXME: There is the same routine in the Tools.cpp.
1261f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic bool hasMipsN32ABIArg(const ArgList &Args) {
1262f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
12631d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A && (A->getValue() == StringRef("n32"));
1264f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1265f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1266f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyanstatic StringRef getTargetMultiarchSuffix(llvm::Triple::ArchType TargetArch,
1267f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                                          const ArgList &Args) {
1268f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::x86_64 ||
1269f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::ppc64)
1270f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    return "/64";
1271f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1272f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (TargetArch == llvm::Triple::mips64 ||
1273f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      TargetArch == llvm::Triple::mips64el) {
1274f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    if (hasMipsN32ABIArg(Args))
1275f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/n32";
1276f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    else
1277f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      return "/64";
1278f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  }
1279f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
1280f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  return "/32";
1281f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan}
1282f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan
128319347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
1284f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    llvm::Triple::ArchType TargetArch, const ArgList &Args,
1285f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan    const std::string &LibDir,
12861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
128719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // There are various different suffixes involving the triple we
128819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // check for. We also record what is necessary to walk from each back
128919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // up to the lib directory.
12901c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const std::string LibSuffixes[] = {
129119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/gcc/" + CandidateTriple.str(),
129219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
129319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
129402014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // The Freescale PPC SDK has the gcc libraries in
129502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
129602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/" + CandidateTriple.str(),
129702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel
129819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // Ubuntu has a strange mis-matched pair of triples that this happens to
129919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // match.
130019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: It may be worthwhile to generalize this and look for a second
130119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // triple.
1302d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
130319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
130419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const std::string InstallSuffixes[] = {
130519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../..",
130619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../..",
130702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/../..",
130819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../.."
130919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
131019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
13111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
13121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                                   (TargetArch != llvm::Triple::x86));
13131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
13141c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef LibSuffix = LibSuffixes[i];
131519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::error_code EC;
13161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
131719347edf7809866350750a1997ec4db009832fa4Chandler Carruth         !EC && LI != LE; LI = LI.increment(EC)) {
131819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      StringRef VersionText = llvm::sys::path::filename(LI->path());
131919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
132019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
132119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion < MinVersion)
132219347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
132319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion <= Version)
132419347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
13252e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel
13262e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel      // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
13275d84bb418405e1256020a66895d163756886b102Chandler Carruth      // in what would normally be GCCInstallPath and put the 64-bit
13281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // libs in a subdirectory named 64. The simple logic we follow is that
13291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // *if* there is a subdirectory of the right name with crtbegin.o in it,
13301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // we use that. If not, and if not a multiarch triple, we look for
13311c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      // crtbegin.o without the subdirectory.
1332f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan      StringRef MultiarchSuffix = getTargetMultiarchSuffix(TargetArch, Args);
13331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
13341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix = MultiarchSuffix.str();
13351c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      } else {
13361c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        if (NeedsMultiarchSuffix ||
13371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth            !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
13381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth          continue;
13391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        GCCMultiarchSuffix.clear();
13401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      }
134119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
134219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      Version = CandidateVersion;
1343fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth      GCCTriple.setTriple(CandidateTriple);
134419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // FIXME: We hack together the directory name here instead of
134519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // using LI to ensure stable path separators across Windows and
134619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Linux.
13471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
13485d84bb418405e1256020a66895d163756886b102Chandler Carruth      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
134919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      IsValid = true;
135019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
135119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
135219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
135319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
13540e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaGeneric_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
13550e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                         const ArgList &Args)
1356af370e6e051e505016637e23418354db625dc796Rafael Espindola  : ToolChain(D, Triple, Args), GCCInstallation(getDriver(), Triple, Args) {
1357edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
135886643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1359edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1360c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
1361c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
13623917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
13633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13655b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Generic_GCC::constructTool(Action::ActionClass AC) const {
13665b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1367f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::InputClass:
1368f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::BindArchClass:
1369f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    llvm_unreachable("Invalid tool kind.");
1370f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PreprocessJobClass:
13715b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Preprocess(*this);
1372f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PrecompileJobClass:
13735b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Precompile(*this);
1374f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AnalyzeJobClass:
1375f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::MigrateJobClass:
13765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::Clang(*this);
1377f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::CompileJobClass:
13785b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Compile(*this);
1379f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
13805b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Assemble(*this);
1381f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
13825b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Link(*this);
1383f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola
1384f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    // This is a bit ungeneric, but the only platform using a driver
1385f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    // driver is Darwin.
1386f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LipoJobClass:
13875b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::Lipo(*this);
1388f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::DsymutilJobClass:
13895b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::Dsymutil(*this);
1390f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::VerifyJobClass:
13915b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::darwin::VerifyDebug(*this);
13923917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
13933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13953917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
13966f009b68b9f7aaf280144b0cd81d6a0b23c733a6Rafael Espindola  return getArch() == llvm::Triple::x86_64;
13973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13983917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13997ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefault() const {
14007ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
14013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14023917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
14037ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefaultForced() const {
14047ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
14053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
14067ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
14079631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum/// Hexagon Toolchain
14089631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1409b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisstd::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
1410b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1411b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Locate the rest of the toolchain ...
1412b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (strlen(GCC_INSTALL_PREFIX))
1413b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return std::string(GCC_INSTALL_PREFIX);
1414b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1415b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string InstallRelDir = InstalledDir + "/../../gnu";
1416b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(InstallRelDir))
1417b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return InstallRelDir;
1418b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1419b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
1420b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(PrefixRelDir))
1421b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return PrefixRelDir;
1422b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1423b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  return InstallRelDir;
1424b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis}
1425b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
14265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic void GetHexagonLibraryPaths(
14275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const ArgList &Args,
14285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string Ver,
14295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchString,
14305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string &InstalledDir,
14315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths)
14325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis{
14335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool buildingLib = Args.hasArg(options::OPT_shared);
14345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // -L Args
14375fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14385fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (arg_iterator
14395fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         it = Args.filtered_begin(options::OPT_L),
14405fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         ie = Args.filtered_end();
14415fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       it != ie;
14425fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       ++it) {
14435fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
14445fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      LibPaths->push_back((*it)->getValue(i));
14455fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14465fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14475fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14485fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Other standard paths
14495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
14505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchSuffix = "/" + MarchString;
14515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string G0Suffix = "/G0";
14525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
14535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
14545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/hexagon/...
14565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
14575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
14595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
14605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
14625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver);
14635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/...
14655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(RootDir + "lib/gcc");
14665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
14675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // hexagon/lib/...
14685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string HexagonLibDir = RootDir + "hexagon/lib";
14695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
14705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
14715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + G0Suffix);
14725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
14735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir + MarchSuffix);
14745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir);
14755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
14765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
1477b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew CurtisHexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
1478b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                       const ArgList &Args)
1479b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  : Linux(D, Triple, Args) {
1480b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string InstalledDir(getDriver().getInstalledDir());
1481b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
1482b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1483b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
1484b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // program paths
1485b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string BinDir(GnuDir + "/bin");
1486b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(BinDir))
1487b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    getProgramPaths().push_back(BinDir);
1488b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1489b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Determine version of GCC libraries and headers to use.
1490b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
1491b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::error_code ec;
1492b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
1493b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
1494b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis       !ec && di != de; di = di.increment(ec)) {
1495b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
1496b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    if (MaxVersion < cv)
1497b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      MaxVersion = cv;
1498b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  }
1499b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCLibAndIncVersion = MaxVersion;
15005fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15015fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths= &getFilePaths();
15025fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15035fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
15045fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
15055fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // support 'linux' we'll need to fix this up
15065fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->clear();
15075fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15085fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  GetHexagonLibraryPaths(
15095fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    Args,
15105fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetGCCLibAndIncVersion(),
15115fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetTargetCPU(Args),
15125fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    InstalledDir,
15135fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths);
15149631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15159631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15169631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumHexagon_TC::~Hexagon_TC() {
15179631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15189631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
15195b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Hexagon_TC::constructTool(Action::ActionClass AC) const {
15205b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1521f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
15225b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::hexagon::Assemble(*this);
1523f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
15245b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::hexagon::Link(*this);
1525f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
1526f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    assert(false && "Unsupported action for Hexagon target.");
15275b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Linux::constructTool(AC);
15289631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  }
15299631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1531b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
1532b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                           ArgStringList &CC1Args) const {
1533b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1534b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1535b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
1536b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdlibinc))
1537b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1538b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1539b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path InstallDir(D.InstalledDir);
1540b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1541b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
1542b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
1543b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
1544b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
1545b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
15469631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
15479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1548b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
1549b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                              ArgStringList &CC1Args) const {
1550b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1551b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
1552b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdincxx))
1553b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
1554b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1555b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
1556b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
1557b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  llvm::sys::Path IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
1558b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
1559b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent("hexagon/include/c++/");
1560b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  IncludeDir.appendComponent(Ver);
1561b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
15627ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth}
15636781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
15645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisToolChain::CXXStdlibType
15655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisHexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
15665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
15675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (!A)
15685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    return ToolChain::CST_Libstdcxx;
15695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  StringRef Value = A->getValue();
15715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (Value != "libstdc++") {
15725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
15735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      << A->getAsString(Args);
15745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
15755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  return ToolChain::CST_Libstdcxx;
15775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
15785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
15795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic Arg *GetLastHexagonArchArg(const ArgList &Args)
15806781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
15816781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = NULL;
15826781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
15836781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
15846781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis       it != ie; ++it) {
15856781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if ((*it)->getOption().matches(options::OPT_march_EQ) ||
15866781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
15876781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A = *it;
15886781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      A->claim();
15896781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    } else if ((*it)->getOption().matches(options::OPT_m_Joined)) {
15906781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      StringRef Value = (*it)->getValue(0);
15916781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      if (Value.startswith("v")) {
15926781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A = *it;
15936781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis        A->claim();
15946781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      }
15956781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    }
15966781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
15976781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return A;
15986781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
15996781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16006781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew CurtisStringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
16016781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
16026781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  // Select the default CPU (v4) if none was given or detection failed.
16036781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  Arg *A = GetLastHexagonArchArg (Args);
16046781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  if (A) {
1605cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    StringRef WhichHexagon = A->getValue();
16066781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon.startswith("hexagon"))
16076781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon.substr(sizeof("hexagon") - 1);
16086781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis    if (WhichHexagon != "")
16096781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis      return WhichHexagon;
16106781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
16116781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
16126781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  return "v4";
16136781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
1614b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis// End Hexagon
1615f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
16163a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
16173a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
16183a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
16193a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1620af370e6e051e505016637e23418354db625dc796Rafael EspindolaTCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
1621af370e6e051e505016637e23418354db625dc796Rafael Espindola                           const ArgList &Args)
1622af370e6e051e505016637e23418354db625dc796Rafael Espindola  : ToolChain(D, Triple, Args) {
16233a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
16243a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
16253a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16263a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
16273a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
16283a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16293a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16303a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
16313a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16323a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1633304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const {
1634304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  return true;
16353a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16363a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16377ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefault() const {
16387ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16393a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16403a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16417ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefaultForced() const {
16427ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
16433a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16443a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
16455b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *TCEToolChain::constructTool(Action::ActionClass AC) const {
16465b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1647f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PreprocessJobClass:
16485b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::gcc::Preprocess(*this);
1649f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AnalyzeJobClass:
16505b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::Clang(*this);
1651f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
1652f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    llvm_unreachable("Unsupported action for TCE target.");
16533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
16543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
16553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1656f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1657f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
16580e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaOpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
16590e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1660ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1661f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
1662f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1663f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
16645b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *OpenBSD::constructTool(Action::ActionClass AC) const {
16655b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1666f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass: {
1667f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
16685b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
1669f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
16705b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::openbsd::Assemble(*this);
1671f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
1672f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  }
1673f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
16745b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::openbsd::Link(*this);
1675f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
16765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
1677f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
1678f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1679f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
168042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
168142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
168242f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanBitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
168342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  : Generic_ELF(D, Triple, Args) {
168442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back(getDriver().Dir + "/../lib");
168542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back("/usr/lib");
168642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
168742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
16885b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Bitrig::constructTool(Action::ActionClass AC) const {
16895b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1690f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass: {
1691f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
16925b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
1693f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
16945b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::bitrig::Assemble(*this);
1695f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
1696f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  }
1697f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
16985b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::bitrig::Link(*this); break;
1699f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
17005b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
170142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  }
170242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
170342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
170442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
170542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                          ArgStringList &CC1Args) const {
170642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
170742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      DriverArgs.hasArg(options::OPT_nostdincxx))
170842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    return;
170942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
17108e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(DriverArgs)) {
17118e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
17128e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17138e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/");
17148e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
17158e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
17168e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17178e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++");
17188e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
17198e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
17208e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth
17218e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    StringRef Triple = getTriple().str();
17228e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    if (Triple.startswith("amd64"))
17238e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
17248e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
17258e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple.substr(5));
17268e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    else
17278e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
17288e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/" +
17298e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple);
17308e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
17318e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
173242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
173342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
173442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
173542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                 ArgStringList &CmdArgs) const {
17368e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(Args)) {
17378e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
17388e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lc++");
17398e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lcxxrt");
17408e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    // Include supc++ to provide Unwind until provided by libcxx.
17418e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lgcc");
17428e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
17438e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
17448e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lstdc++");
17458e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
17468e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
174742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
174842f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
174975358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
175075358d267256022475371416654b056ad8531cb3Daniel Dunbar
17510e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaFreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
17520e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
1753214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
175424248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
175524248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // back to '/usr/lib' if it doesn't exist.
175600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if ((Triple.getArch() == llvm::Triple::x86 ||
175700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth       Triple.getArch() == llvm::Triple::ppc) &&
175824248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
175900646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
176000646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  else
176100646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
176275358d267256022475371416654b056ad8531cb3Daniel Dunbar}
176375358d267256022475371416654b056ad8531cb3Daniel Dunbar
17645b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *FreeBSD::constructTool(Action::ActionClass AC) const {
17655b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1766f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
1767f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
17685b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
1769f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
17705b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::freebsd::Assemble(*this);
1771f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
1772f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
17735b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return  new tools::freebsd::Link(*this); break;
1774f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
17755b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
17768e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
17778e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
17788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
177927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindolabool FreeBSD::UseSjLjExceptions() const {
178027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  // FreeBSD uses SjLj exceptions on ARM oabi.
178127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  switch (getTriple().getEnvironment()) {
178227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::GNUEABI:
178327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::EABI:
178427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return false;
178527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
178627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  default:
178727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return (getTriple().getArch() == llvm::Triple::arm ||
178827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola            getTriple().getArch() == llvm::Triple::thumb);
178927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  }
179027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola}
179127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
17928e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
17938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
17940e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaNetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
17950e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
17968e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
179705e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (getDriver().UseStdLib) {
179832f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // When targeting a 32-bit platform, try the special directory used on
179932f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // 64-bit hosts, and only fall back to the main library directory if that
180032f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // doesn't work.
180132f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
180232f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // what all logic is needed to emulate the '=' prefix here.
180366de97fcc368ff7e9ea50337177d007c108cfd73Joerg Sonnenberger    if (Triple.getArch() == llvm::Triple::x86)
180405e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib/i386");
180532f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth
180632f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    getFilePaths().push_back("=/usr/lib");
18078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
18088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
18098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
18105b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *NetBSD::constructTool(Action::ActionClass AC) const {
18115b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1812f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
1813f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
18145b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
1815f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
18165b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::netbsd::Assemble(*this);
1817f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
1818f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
18195b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::netbsd::Link(*this);
1820f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
1821f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
18225b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
182375358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
182475358d267256022475371416654b056ad8531cb3Daniel Dunbar}
182511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
182638e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
182738e317d6dce161b249508686cc67eb7176958762Chris Lattner
18280e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaMinix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
18290e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
183038e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
183138e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
183238e317d6dce161b249508686cc67eb7176958762Chris Lattner}
183338e317d6dce161b249508686cc67eb7176958762Chris Lattner
18345b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Minix::constructTool(Action::ActionClass AC) const {
18355b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1836f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
18375b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::minix::Assemble(*this);
1838f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
18395b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::minix::Link(*this);
1840f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
18415b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
184238e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
184338e317d6dce161b249508686cc67eb7176958762Chris Lattner}
184438e317d6dce161b249508686cc67eb7176958762Chris Lattner
1845e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1846e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
18470e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaAuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
18480e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                   const ArgList &Args)
18490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
1850e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1851edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
185286643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1853edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1854e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1855ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1856e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
1857e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
1858e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
18597adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1860e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1861e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1862e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
18635b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *AuroraUX::constructTool(Action::ActionClass AC) const {
18645b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1865f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
18665b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::auroraux::Assemble(*this);
1867f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
18685b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::auroraux::Link(*this);
1869f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
18705b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
1871e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
1872e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1873e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
187431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
187531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
18760e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaSolaris::Solaris(const Driver &D, const llvm::Triple& Triple,
18770e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                 const ArgList &Args)
18780e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
187931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
188031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getProgramPaths().push_back(getDriver().getInstalledDir());
188131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (getDriver().getInstalledDir() != getDriver().Dir)
188231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    getProgramPaths().push_back(getDriver().Dir);
188331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
188431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back(getDriver().Dir + "/../lib");
188531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back("/usr/lib");
188631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
188731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
18885b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Solaris::constructTool(Action::ActionClass AC) const {
18895b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
1890f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
18915b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::solaris::Assemble(*this);
1892f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
18935b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::solaris::Link(*this);
1894f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
18955b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
189631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  }
189731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
1898e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
18996b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
19006b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1901c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro {
19023fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  ArchLinux,
1903c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
1904c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
19050b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  DebianWheezy,
1906b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  DebianJessie,
19070a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
1908d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL4,
1909d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL5,
1910d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL6,
1911c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora13,
1912c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora14,
19138f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  Fedora15,
1914afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  Fedora16,
19158f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  FedoraRawhide,
1916c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  OpenSuse11_3,
1917de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse11_4,
1918de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse12_1,
19194e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  OpenSuse12_2,
1920814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuHardy,
1921814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuIntrepid,
1922021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
19235ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu  UbuntuKarmic,
1924c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
1925c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
192643ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  UbuntuNatty,
192725a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer  UbuntuOneiric,
1928668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer  UbuntuPrecise,
1929de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuQuantal,
1930de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuRaring,
1931c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
1932c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
1933c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1934d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattnerstatic bool IsRedhat(enum LinuxDistro Distro) {
1935afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
1936afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer         (Distro >= RHEL4    && Distro <= RHEL6);
1937c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1938c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1939c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) {
19404e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor  return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
1941c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1942c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1943c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) {
1944b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  return Distro >= DebianLenny && Distro <= DebianJessie;
1945c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1946c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1947c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) {
1948de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  return Distro >= UbuntuHardy && Distro <= UbuntuRaring;
1949c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1950c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1951c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
19526f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith  OwningPtr<llvm::MemoryBuffer> File;
19534eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
19545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
19555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8> Lines;
1956c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
1957668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    LinuxDistro Version = UnknownDistro;
1958668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
1959668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
1960668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17))
1961668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("hardy", UbuntuHardy)
1962668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("intrepid", UbuntuIntrepid)
1963668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("jaunty", UbuntuJaunty)
1964668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("karmic", UbuntuKarmic)
1965668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("lucid", UbuntuLucid)
1966668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("maverick", UbuntuMaverick)
1967668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("natty", UbuntuNatty)
1968668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("oneiric", UbuntuOneiric)
1969668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("precise", UbuntuPrecise)
1970de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("quantal", UbuntuQuantal)
1971de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("raring", UbuntuRaring)
1972668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Default(UnknownDistro);
1973668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    return Version;
1974c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1975c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
19764eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
19775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
1978afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    if (Data.startswith("Fedora release 16"))
1979afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      return Fedora16;
1980afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    else if (Data.startswith("Fedora release 15"))
19818f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return Fedora15;
19828f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 14"))
1983c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora14;
19848f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 13"))
1985c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora13;
19868f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release") &&
19875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("Rawhide") != StringRef::npos)
19888f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return FedoraRawhide;
1989d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner    else if (Data.startswith("Red Hat Enterprise Linux") &&
19905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 6") != StringRef::npos)
1991d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL6;
19925a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
19934f4e2af2643c1914c2e49ac6372f7c2c38616432Eric Christopher              Data.startswith("CentOS")) &&
19945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 5") != StringRef::npos)
1995d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL5;
19965a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
19974f4e2af2643c1914c2e49ac6372f7c2c38616432Eric Christopher              Data.startswith("CentOS")) &&
19985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 4") != StringRef::npos)
1999d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL4;
2000c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2001c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2002c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
20034eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
20045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2005c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
2006c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
20070e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2008c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
20090e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
20100b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      return DebianWheezy;
2011b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru    else if (Data.startswith("jessie/sid")  || Data[0] == '8')
2012b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru      return DebianJessie;
2013c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2014c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2015c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2016afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer  if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
2017afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer    return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer())
2018afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.3", OpenSuse11_3)
2019afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 11.4", OpenSuse11_4)
2020afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .StartsWith("openSUSE 12.1", OpenSuse12_1)
20214e1b292146936432dd6c76ba413f700eb1cd3432Douglas Gregor      .StartsWith("openSUSE 12.2", OpenSuse12_2)
2022afe55fbc10bb1f15f0f6b9d34c88d3a86475c8c9Benjamin Kramer      .Default(UnknownDistro);
2023c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
202432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
202532bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
20260a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
20270a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
20283fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
20293fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth    return ArchLinux;
20303fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2031c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
2032c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2033c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2034deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target.
2035deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth///
2036deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use
2037deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths.
2038deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple,
2039deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here.
2040deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruthstatic std::string getMultiarchTriple(const llvm::Triple TargetTriple,
2041deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth                                      StringRef SysRoot) {
2042deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // For most architectures, just use whatever we have rather than trying to be
2043deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // clever.
2044deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  switch (TargetTriple.getArch()) {
2045deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  default:
2046deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2047deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
2048deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // We use the existence of '/lib/<triple>' as a directory to detect some
2049deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // common linux triples that don't quite match the Clang triple for both
2050236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2051236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // regardless of what the actual target triple is.
20520337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::arm:
20530337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::thumb:
2054ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2055ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2056ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabihf";
2057ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
2058ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2059ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabi";
2060ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
20610337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier    return TargetTriple.str();
2062deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86:
2063deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2064deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "i386-linux-gnu";
2065deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2066deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86_64:
2067deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2068deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "x86_64-linux-gnu";
2069deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2070c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case llvm::Triple::aarch64:
2071c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2072c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      return "aarch64-linux-gnu";
20735bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mips:
20745bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
20755bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mips-linux-gnu";
20765bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
20775bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mipsel:
20785bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
20795bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mipsel-linux-gnu";
20805bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
2081155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc:
2082b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
2083b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru      return "powerpc-linux-gnuspe";
2084155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
2085155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc-linux-gnu";
2086155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2087155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc64:
2088155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
2089155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc64-linux-gnu";
2090155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
2091deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  }
2092deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth}
2093deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
209400646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
209500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
209600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth}
209700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth
20987a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic bool isMipsArch(llvm::Triple::ArchType Arch) {
20997a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Arch == llvm::Triple::mips ||
21007a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mipsel ||
21017a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64 ||
21027a9188833a6a09d574144334c9584c417b809007Simon Atanasyan         Arch == llvm::Triple::mips64el;
21037a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
21047a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
2105f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyanstatic bool isMipsR2Arch(llvm::Triple::ArchType Arch,
2106f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                         const ArgList &Args) {
2107f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (Arch != llvm::Triple::mips &&
2108f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      Arch != llvm::Triple::mipsel)
2109f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2110f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2111f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  Arg *A = Args.getLastArg(options::OPT_march_EQ,
2112f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mcpu_EQ,
2113f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                           options::OPT_mips_CPUs_Group);
2114f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2115f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (!A)
2116f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return false;
2117f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2118f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan  if (A->getOption().matches(options::OPT_mips_CPUs_Group))
2119f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    return A->getOption().matches(options::OPT_mips32r2);
2120f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
21211d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith  return A->getValue() == StringRef("mips32r2");
2122f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan}
2123f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
21247a9188833a6a09d574144334c9584c417b809007Simon Atanasyanstatic StringRef getMultilibDir(const llvm::Triple &Triple,
21257a9188833a6a09d574144334c9584c417b809007Simon Atanasyan                                const ArgList &Args) {
21267a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Triple.getArch()))
21277a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return Triple.isArch32Bit() ? "lib32" : "lib64";
21287a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
21297a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // lib32 directory has a special meaning on MIPS targets.
21307a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // It contains N32 ABI binaries. Use this folder if produce
21317a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  // code for N32 ABI only.
2132f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan  if (hasMipsN32ABIArg(Args))
21337a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return "lib32";
21347a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
21357a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Triple.isArch32Bit() ? "lib" : "lib64";
21367a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
21377a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
21380e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaLinux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
21390e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
214089088797876bddb866ce821f050a4395b7514dc2Chandler Carruth  llvm::Triple::ArchType Arch = Triple.getArch();
2141fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  const std::string &SysRoot = getDriver().SysRoot;
2142c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2143ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // OpenSuse stores the linker with the compiler, add that to the search
2144ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // path.
2145ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  ToolChain::path_list &PPaths = getProgramPaths();
2146fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
2147fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth                         GCCInstallation.getTriple().str() + "/bin").str());
2148ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola
2149ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  Linker = GetProgramPath("ld");
2150c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2151c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  LinuxDistro Distro = DetectLinuxDistro(Arch);
2152c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
215364a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
215494c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
215594c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
215694c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
2157c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2158f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
2159c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
2160c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
216194a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
2162704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov
2163d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
2164d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // and the MIPS ABI require .dynsym to be sorted in different ways.
2165d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
2166d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // ABI requires a mapping between the GOT and the symbol table.
2167704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov  // Android loader does not support .gnu.hash.
21687a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  if (!isMipsArch(Arch) && !IsAndroid) {
2169668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
2170668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
2171d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=gnu");
2172d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth
2173d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth    if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
2174d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
2175d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=both");
2176d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  }
2177c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2178d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  if (IsRedhat(Distro))
2179c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
2180c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
21810b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
2182b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru      Distro == DebianJessie || IsOpenSuse(Distro) ||
21835a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
2184668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
2185c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
2186c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
218764a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro))
2188f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth    ExtraOpts.push_back("--enable-new-dtags");
218964a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner
2190d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // The selection of paths to try here is designed to match the patterns which
2191d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2192d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // This was determined by running GCC in a fake filesystem, creating all
2193d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // possible permutations of these directories, and seeing which ones it added
2194d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // to the link paths.
2195d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  path_list &Paths = getFilePaths();
219689088797876bddb866ce821f050a4395b7514dc2Chandler Carruth
21977a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  const std::string Multilib = getMultilibDir(Triple, Args);
2198deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
21993fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2200d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Add the multilib suffixed paths where they are available.
2201d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid()) {
2202fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
220389088797876bddb866ce821f050a4395b7514dc2Chandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2204f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
2205f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    if (IsAndroid && isMipsR2Arch(Triple.getArch(), Args))
2206f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists(GCCInstallation.getInstallPath() +
2207f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      GCCInstallation.getMultiarchSuffix() +
2208f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      "/mips-r2",
2209f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
2210f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan    else
2211f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan      addPathIfExists((GCCInstallation.getInstallPath() +
2212f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                       GCCInstallation.getMultiarchSuffix()),
2213f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan                      Paths);
22149f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
22159f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // If the GCC installation we found is inside of the sysroot, we want to
22169f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // prefer libraries installed in the parent prefix of the GCC installation.
22179f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // It is important to *not* use these paths when the GCC installation is
2218241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // outside of the system root as that can pick up unintended libraries.
22199f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // This usually happens when there is an external cross compiler on the
22209f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // host system, and a more minimal sysroot available that is the target of
22219f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // the cross.
22229f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
22239f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
22249f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth                      Paths);
22259f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
22269f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + Multilib, Paths);
22279f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
22281d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // On Android, libraries in the parent prefix of the GCC installation are
22291d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // preferred to the ones under sysroot.
22301d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (IsAndroid) {
22311d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
22321d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    }
2233c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2234d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2235d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2236d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2237d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2238d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth
2239d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Try walking via the GCC triple path in case of multiarch GCC
2240d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // installations with strange symlinks.
2241d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid())
2242fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
2243d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth                    "/../../" + Multilib, Paths);
2244c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola
22457a09d012f6d52c8a7ba257df85d13149e6aa7cb2Chandler Carruth  // Add the non-multilib suffixed paths (if potentially different).
2246048e6490704d0a4e095e033786230c584b52d82cChandler Carruth  if (GCCInstallation.isValid()) {
2247048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
2248fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
22491c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    if (!GCCInstallation.getMultiarchSuffix().empty())
2250048e6490704d0a4e095e033786230c584b52d82cChandler Carruth      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
22519f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
22529f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
22539f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
22549f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath, Paths);
22559f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
2256d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  }
2257fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/lib", Paths);
2258fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib", Paths);
2259c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2260c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2261c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
2262c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
22636b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
22646b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
22655b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *Linux::constructTool(Action::ActionClass AC) const {
22665b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
2267f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
2268f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    if (useIntegratedAs())
22695b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::ClangAs(*this);
2270f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    else
22715b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola      return new tools::linuxtools::Assemble(*this);
2272f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola    break;
2273f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
22745b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::linuxtools::Link(*this); break;
2275f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
22765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
2277ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
2278ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
2279ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
2280a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid Linux::addClangTargetOptions(const ArgList &DriverArgs,
2281a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                  ArgStringList &CC1Args) const {
22828af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2283a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  bool UseInitArrayDefault
2284a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth    = V >= Generic_GCC::GCCVersion::Parse("4.7.0") ||
2285c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      getTriple().getArch() == llvm::Triple::aarch64 ||
2286a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth      getTriple().getEnvironment() == llvm::Triple::Android;
2287a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2288a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         options::OPT_fno_use_init_array,
2289a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                         UseInitArrayDefault))
22908af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola    CC1Args.push_back("-fuse-init-array");
22918af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
22928af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
22937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
22947d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                      ArgStringList &CC1Args) const {
22957d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  const Driver &D = getDriver();
22967d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
22977d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
22987d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
22997d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23007d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
23017d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
23027d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23037d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
23047d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    llvm::sys::Path P(D.ResourceDir);
23057d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    P.appendComponent("include");
230607643086c6460095855573902d66aae1b08a6182Chandler Carruth    addSystemInclude(DriverArgs, CC1Args, P.str());
23077d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
23087d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23097d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
23107d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
23117d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23127d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Check for configure-time C include directories.
23137d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CIncludeDirs(C_INCLUDE_DIRS);
23147d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (CIncludeDirs != "") {
23157d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    SmallVector<StringRef, 5> dirs;
23167d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CIncludeDirs.split(dirs, ":");
23177d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
23187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth         I != E; ++I) {
23197d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
23207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
23217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    }
23227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
23237d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
23247d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23257d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Lacking those, try to detect the correct set of system includes for the
23267d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // target triple.
23277d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2328a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  // Implement generic Debian multiarch support.
2329a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86_64MultiarchIncludeDirs[] = {
2330a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu",
2331a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2332a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2333a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2334a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2335a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu/64",
2336a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu/64"
2337a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2338a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86MultiarchIncludeDirs[] = {
2339a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i386-linux-gnu",
2340a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
2341a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
2342a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
2343a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
2344a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu/32",
2345a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu",
2346a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu"
2347a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2348c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  const StringRef AArch64MultiarchIncludeDirs[] = {
2349c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    "/usr/include/aarch64-linux-gnu"
2350c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  };
2351a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef ARMMultiarchIncludeDirs[] = {
2352a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/arm-linux-gnueabi"
2353a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
2354ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  const StringRef ARMHFMultiarchIncludeDirs[] = {
2355ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "/usr/include/arm-linux-gnueabihf"
2356ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
2357d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSMultiarchIncludeDirs[] = {
2358d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mips-linux-gnu"
2359d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2360d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSELMultiarchIncludeDirs[] = {
2361d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mipsel-linux-gnu"
2362d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
2363079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPCMultiarchIncludeDirs[] = {
2364079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc-linux-gnu"
2365079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2366079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPC64MultiarchIncludeDirs[] = {
2367079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc64-linux-gnu"
2368079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
2369a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  ArrayRef<StringRef> MultiarchIncludeDirs;
23707d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getArch() == llvm::Triple::x86_64) {
2371a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
23727d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::x86) {
2373a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
2374c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  } else if (getTriple().getArch() == llvm::Triple::aarch64) {
2375c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
23767d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::arm) {
2377ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
2378ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
2379ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    else
2380ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
2381d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mips) {
2382d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2383d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2384d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
2385079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc) {
2386079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2387079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2388079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
2389a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  }
2390a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2391a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth                                     E = MultiarchIncludeDirs.end();
2392a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth       I != E; ++I) {
2393d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    if (llvm::sys::fs::exists(D.SysRoot + *I)) {
2394a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2395a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      break;
2396a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    }
23977d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
23987d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
23997d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getOS() == llvm::Triple::RTEMS)
24007d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24017d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2402c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // Add an include of '/include' directly. This isn't provided by default by
2403c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2404c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // add even when Clang is acting as-if it were a system compiler.
2405c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2406c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth
24077d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
24087d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
24097d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2410f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add the three variant paths for a libstdc++ installation.
241179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
241279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                const ArgList &DriverArgs,
241379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                ArgStringList &CC1Args) {
2414abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!llvm::sys::fs::exists(Base))
2415abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    return false;
24167d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base);
2417abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
24187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2419abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  return true;
24207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
24217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2422f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add an extra variant path for an (Ubuntu) multilib
2423f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// libstdc++ installation.
2424f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
2425f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                Twine TargetArchDir,
2426f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                Twine MultiLibSuffix,
2427f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                const ArgList &DriverArgs,
2428f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                ArgStringList &CC1Args) {
2429f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  if (!addLibStdCXXIncludePaths(Base+Suffix, TargetArchDir + MultiLibSuffix,
2430f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                DriverArgs, CC1Args))
2431f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko    return false;
2432f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
2433f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix
2434f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                   + MultiLibSuffix);
2435f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  return true;
2436f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko}
2437f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
24387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
24397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const {
24407d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
24417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      DriverArgs.hasArg(options::OPT_nostdincxx))
24427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
24437d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2444eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  // Check if libc++ has been enabled and provide its include paths if so.
2445eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2446eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    // libc++ is always installed at a fixed path on Linux currently.
2447eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
2448eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/v1");
2449eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    return;
2450eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  }
2451eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth
2452fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // We need a detected GCC installation on Linux to provide libstdc++'s
2453fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // headers. We handled the libc++ case above.
2454fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  if (!GCCInstallation.isValid())
2455fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth    return;
2456abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2457abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // By default, look for the C++ headers in an include directory adjacent to
2458abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // the lib directory of the GCC installation. Note that this is expect to be
2459abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2460abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef LibDir = GCCInstallation.getParentLibPath();
2461abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef InstallDir = GCCInstallation.getInstallPath();
24628af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola  StringRef Version = GCCInstallation.getVersion().Text;
24631d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  StringRef TripleStr = GCCInstallation.getTriple().str();
24641d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
2465f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
2466f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                               "/c++/" + Version.str(),
2467f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                               TripleStr,
2468f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                               GCCInstallation.getMultiarchSuffix(),
2469f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                               DriverArgs, CC1Args))
2470f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko    return;
2471f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
24721d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  const std::string IncludePathCandidates[] = {
2473abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // Gentoo is weird and places its headers inside the GCC install, so if the
2474abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // first attempt to find the headers fails, try this pattern.
24751d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    InstallDir.str() + "/include/g++-v4",
24761d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // Android standalone toolchain has C++ headers in yet another place.
24771d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.str(),
247802014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
247902014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // without a subdirectory corresponding to the gcc version.
248002014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    LibDir.str() + "/../include/c++",
24811d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  };
24821d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
24831d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  for (unsigned i = 0; i < llvm::array_lengthof(IncludePathCandidates); ++i) {
24841d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    if (addLibStdCXXIncludePaths(IncludePathCandidates[i], (TripleStr +
24851d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov                GCCInstallation.getMultiarchSuffix()),
24861d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov            DriverArgs, CC1Args))
24871d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      break;
2488abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  }
24897d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
24907d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
249111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
249211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
24930e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaDragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
24940e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
249511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
249611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
2497edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
249886643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2499edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
250011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2501ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
250211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
250311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
250411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
250511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
25065b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool *DragonFly::constructTool(Action::ActionClass AC) const {
25075b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
2508f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::AssembleJobClass:
25095b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::dragonfly::Assemble(*this);
2510f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LinkJobClass:
25115b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return new tools::dragonfly::Link(*this);
2512f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  default:
25135b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return Generic_GCC::constructTool(AC);
251411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
251511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2516