ToolChains.cpp revision 19347edf7809866350750a1997ec4db009832fa4
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"
113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
1214ea13cb5af3e9925e141458ab1388daa2ede86dRafael Espindola#ifdef HAVE_CLANG_CONFIG_H
1314ea13cb5af3e9925e141458ab1388daa2ede86dRafael Espindola# include "clang/Config/config.h"
1414ea13cb5af3e9925e141458ab1388daa2ede86dRafael Espindola#endif
1514ea13cb5af3e9925e141458ab1388daa2ede86dRafael Espindola
16f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/Arg.h"
17f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/ArgList.h"
180f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h"
19c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h"
204e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h"
229f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "clang/Driver/ObjCRuntime.h"
2327e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h"
244e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h"
25265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
2634916dbb1018dc7a7f42a339923f5b73762e9872Douglas Gregor#include "clang/Basic/Version.h"
27c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
2800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h"
29c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
30a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson#include "llvm/ADT/StringSwitch.h"
31f85e193739c953358c865005855253af4f68a497John McCall#include "llvm/ADT/STLExtras.h"
3284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
3332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
34c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h"
35ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h"
3603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
373a321e23f66128dbb986343927456ff6702af617Michael J. Spencer#include "llvm/Support/system_error.h"
38c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
39f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
40f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
4189bb6146a8eca177b63fbcbc03c68f9012666023Dylan Noblesmith#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
4289bb6146a8eca177b63fbcbc03c68f9012666023Dylan Noblesmith
43ca23419b8214654d185d595956e9ddf24984750aChandler Carruth// Include the necessary headers to interface with the Windows registry and
44ca23419b8214654d185d595956e9ddf24984750aChandler Carruth// environment.
45ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#ifdef _MSC_VER
466fdebeef8f6067808ad5adcfbf3cf03e904d3edaBenjamin Kramer  #define WIN32_LEAN_AND_MEAN
476fdebeef8f6067808ad5adcfbf3cf03e904d3edaBenjamin Kramer  #define NOGDI
486fdebeef8f6067808ad5adcfbf3cf03e904d3edaBenjamin Kramer  #define NOMINMAX
499cef8874ec046db3ba4784d4b2a2e608466f7d0cMichael J. Spencer  #include <Windows.h>
50ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#endif
51ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
523917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
533917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
553917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
567d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments.
577d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthstatic void addSystemInclude(const ArgList &DriverArgs, ArgStringList &CC1Args,
587d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                             const Twine &Path) {
597d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  CC1Args.push_back("-internal-isystem");
607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
637d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// \brief Utility function to add a system include directory with extern "C"
647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// semantics to CC1 arguments.
657d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth///
667d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// Note that this should be used rarely, and only for directories that
677d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// historically and for legacy reasons are treated as having implicit extern
687d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its
697d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// important to preserve the preprocessor changes resulting from the
707d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// classification.
717d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthstatic void addExternCSystemInclude(const ArgList &DriverArgs,
727d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                    ArgStringList &CC1Args, const Twine &Path) {
737d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  CC1Args.push_back("-internal-externc-isystem");
747d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
757d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
767d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
777d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth/// \brief Utility function to add a list of system include directories to CC1.
787d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthstatic void addSystemIncludes(const ArgList &DriverArgs,
797d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                              ArgStringList &CC1Args,
807d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                              ArrayRef<StringRef> Paths) {
817d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
827d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth       I != E; ++I) {
837d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CC1Args.push_back("-internal-isystem");
847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(*I));
857d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
877d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
88f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
9025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
91f85e193739c953358c865005855253af4f68a497John McCall  : ToolChain(Host, Triple), TargetInitialized(false),
92163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    ARCRuntimeForSimulator(ARCSimulator_None),
93163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXForSimulator(LibCXXSimulator_None)
941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
9525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  // Compute the initial Darwin version based on the host.
9625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  bool HadExtra;
9725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  std::string OSName = Triple.getOSName();
9834f9e296418229074e1cf2ecdf5049cb6acfcebeDaniel Dunbar  if (!Driver::GetReleaseVersion(&OSName.c_str()[6],
9925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar                                 DarwinVersion[0], DarwinVersion[1],
10025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar                                 DarwinVersion[2], HadExtra))
1015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName;
10225b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar
10302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(MacosxVersionMin)
10425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar    << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
10525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar    << DarwinVersion[1];
1061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
1071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
1084180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID Darwin::LookupTypeForExtension(const char *Ext) const {
1094180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  types::ID Ty = types::lookupTypeForExtension(Ext);
1104180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
1114180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  // Darwin always preprocesses assembly files (unless -x is used explicitly).
1124180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  if (Ty == types::TY_PP_Asm)
1134180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar    return types::TY_Asm;
1144180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
1154180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return Ty;
1164180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
1174180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
118b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool Darwin::HasNativeLLVMSupport() const {
119b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return true;
120b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
121b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
1229f084a3166b684573ba49df28fc5792bc37d92e1John McCallbool Darwin::hasARCRuntime() const {
123f85e193739c953358c865005855253af4f68a497John McCall  // FIXME: Remove this once there is a proper way to detect an ARC runtime
124f85e193739c953358c865005855253af4f68a497John McCall  // for the simulator.
125f85e193739c953358c865005855253af4f68a497John McCall  switch (ARCRuntimeForSimulator) {
126f85e193739c953358c865005855253af4f68a497John McCall  case ARCSimulator_None:
127f85e193739c953358c865005855253af4f68a497John McCall    break;
128f85e193739c953358c865005855253af4f68a497John McCall  case ARCSimulator_HasARCRuntime:
129f85e193739c953358c865005855253af4f68a497John McCall    return true;
130f85e193739c953358c865005855253af4f68a497John McCall  case ARCSimulator_NoARCRuntime:
131f85e193739c953358c865005855253af4f68a497John McCall    return false;
132f85e193739c953358c865005855253af4f68a497John McCall  }
133f85e193739c953358c865005855253af4f68a497John McCall
134f85e193739c953358c865005855253af4f68a497John McCall  if (isTargetIPhoneOS())
135f85e193739c953358c865005855253af4f68a497John McCall    return !isIPhoneOSVersionLT(5);
136f85e193739c953358c865005855253af4f68a497John McCall  else
137f85e193739c953358c865005855253af4f68a497John McCall    return !isMacosxVersionLT(10, 7);
138f85e193739c953358c865005855253af4f68a497John McCall}
139f85e193739c953358c865005855253af4f68a497John McCall
1409f084a3166b684573ba49df28fc5792bc37d92e1John McCall/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
1419f084a3166b684573ba49df28fc5792bc37d92e1John McCallvoid Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
1429f084a3166b684573ba49df28fc5792bc37d92e1John McCall  if (runtime.getKind() != ObjCRuntime::NeXT)
1439f084a3166b684573ba49df28fc5792bc37d92e1John McCall    return ToolChain::configureObjCRuntime(runtime);
1449f084a3166b684573ba49df28fc5792bc37d92e1John McCall
1459f084a3166b684573ba49df28fc5792bc37d92e1John McCall  runtime.HasARC = runtime.HasWeak = hasARCRuntime();
146256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall
147256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall  // So far, objc_terminate is only available in iOS 5.
148256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall  // FIXME: do the simulator logic properly.
149256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall  if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
150256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall    runtime.HasTerminate = !isIPhoneOSVersionLT(5);
151256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall  else
152256a76e0b0e0c9e65a3122917d553ef10bc84d29John McCall    runtime.HasTerminate = false;
1539f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
1549f084a3166b684573ba49df28fc5792bc37d92e1John McCall
15513db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
15613db5cfc4e5f03eb70efe0d227b53b8280f16161John McCallbool Darwin::hasBlocksRuntime() const {
15713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  if (isTargetIPhoneOS())
15813db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isIPhoneOSVersionLT(3, 2);
15913db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  else
16013db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isMacosxVersionLT(10, 6);
16113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall}
16213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall
1635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMArch(StringRef Value) {
164a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char*>(Value)
165a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv6k", "armv6")
166a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv5tej", "armv5")
167a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
168a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv4t", "armv4t")
169a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv7", "armv7")
170a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7a", "armv7-a", "armv7")
171a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7r", "armv7-r", "armv7")
172a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7m", "armv7-m", "armv7")
173a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
174eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
175eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMCpu(StringRef Value) {
177a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char *>(Value)
178a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
179a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm10e", "arm10tdmi", "armv5")
180a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
181a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
182a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
183a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson           "arm1176jzf-s", "cortex-m0", "armv6")
184a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7")
185a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Default(0);
186eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
187eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1885f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef Darwin::getDarwinArchName(const ArgList &Args) const {
189eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
190eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
191eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
192304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
193f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  case llvm::Triple::thumb:
194eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
195eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
196eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
197eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
198eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
199eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
200eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
201eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
202eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
203eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
204eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
205eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
206eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
207eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
208f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
2098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
2128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
21561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
21661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
21761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
21800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
21900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // If the target isn't initialized (e.g., an unknown Darwin platform, return
22000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // the default triple).
22100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetInitialized())
22200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
223304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
22400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  unsigned Version[3];
22500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  getTargetVersion(Version);
226304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
22700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  llvm::SmallString<16> Str;
228729f38ebc6b5a747fe7565a5238e70c84ccfee84Daniel Dunbar  llvm::raw_svector_ostream(Str)
229659d23a4e645c1d7a700da05a1b1aabf9fd4c6f3Daniel Dunbar    << (isTargetIPhoneOS() ? "ios" : "macosx")
230729f38ebc6b5a747fe7565a5238e70c84ccfee84Daniel Dunbar    << Version[0] << "." << Version[1] << "." << Version[2];
23100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  Triple.setOSName(Str.str());
23200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
23300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return Triple.getTriple();
23400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
23500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
236ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
237ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                         const ActionList &Inputs) const {
2388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Action::ActionClass Key;
2395ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar
2405ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
2415ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar    // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
2425ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar    if (Inputs.size() == 1 &&
2435ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar        types::isCXX(Inputs[0]->getType()) &&
244905c45f15a25598620d19160c139c6b785aeea89Bob Wilson        getTriple().isOSDarwin() &&
2455ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar        getTriple().getArch() == llvm::Triple::x86 &&
246a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson        (C.getArgs().getLastArg(options::OPT_fapple_kext) ||
247a544aeece3e16296bdbbc9ee32053fac9616f85bBob Wilson         C.getArgs().getLastArg(options::OPT_mkernel)))
2485ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar      Key = JA.getKind();
2495ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar    else
2505ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar      Key = Action::AnalyzeJobClass;
2515ce872fdcdf868c60e91f4669b2c2925c5c2e6ccDaniel Dunbar  } else
2528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = JA.getKind();
2538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2540f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2550f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             options::OPT_no_integrated_as,
2561a1764bd15406f86d53c51b4c7f8a54afee2a541Bob Wilson                                             IsIntegratedAssemblerDefault());
2570f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar
2588eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
2598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
2608eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
2618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
2628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
263b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
2648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
2659120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Preprocess(*this); break;
2668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
2678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::Clang(*this); break;
2689120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
2698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
2709120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Compile(*this); break;
2710f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    case Action::AssembleJobClass: {
2720f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      if (UseIntegratedAs)
2730f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::ClangAs(*this);
2740f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      else
2750f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::darwin::Assemble(*this);
2760f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      break;
2770f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    }
2788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
2798f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
2808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
2818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
2826e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
2836e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
284f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
285f857186fd1995b34185d063a29b11ad4f948519fEric Christopher      T = new tools::darwin::VerifyDebug(*this); break;
2868eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
2878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
2908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
29325b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
29425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  : Darwin(Host, Triple)
2951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
2960e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
2970e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
2980e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2990e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3001d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
301edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
302edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
303edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
3040e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3050e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  // For fallback, we need to know how to find the GCC cc1 executables, so we
3064702309fb6718bcb52751722cf6ed28742707e58Daniel Dunbar  // also add the GCC libexec paths. This is legacy code that can be removed
3074702309fb6718bcb52751722cf6ed28742707e58Daniel Dunbar  // once fallback is no longer useful.
3088aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  AddGCCLibexecPath(DarwinVersion[0]);
3098aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  AddGCCLibexecPath(DarwinVersion[0] - 2);
3108aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  AddGCCLibexecPath(DarwinVersion[0] - 1);
3118aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  AddGCCLibexecPath(DarwinVersion[0] + 1);
3128aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  AddGCCLibexecPath(DarwinVersion[0] + 2);
3138aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson}
3148aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson
3158aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilsonvoid DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) {
3160e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  std::string ToolChainDir = "i686-apple-darwin";
3178aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  ToolChainDir += llvm::utostr(darwinVersion);
3180e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  ToolChainDir += "/4.2.1";
3190e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3200e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  std::string Path = getDriver().Dir;
3218aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  Path += "/../llvm-gcc-4.2/libexec/gcc/";
3220e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path += ToolChainDir;
3230e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(Path);
3240e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3258aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  Path = "/usr/llvm-gcc-4.2/libexec/gcc/";
3260e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path += ToolChainDir;
3270e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(Path);
3281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
3311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                       ArgStringList &CmdArgs) const {
3321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // The Clang toolchain uses explicit paths for internal libraries.
333424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar
334424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // Unfortunately, we still might depend on a few of the libraries that are
335424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // only available in the gcc library directory (in particular
336424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // libstdc++.dylib). For now, hardcode the path to the known install location.
337424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  llvm::sys::Path P(getDriver().Dir);
338424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.eraseComponent(); // .../usr/bin -> ../usr
339424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("lib");
340424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("gcc");
341424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  switch (getTriple().getArch()) {
342424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  default:
343b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Invalid Darwin arch!");
344424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::x86:
345424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::x86_64:
346424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("i686-apple-darwin10");
347424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
348424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::arm:
349424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::thumb:
350424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("arm-apple-darwin10");
351424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
352424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::ppc:
353424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::ppc64:
354424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("powerpc-apple-darwin10");
355424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
356424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  }
357424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("4.2.1");
358eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
359eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  // Determine the arch specific GCC subdirectory.
360eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  const char *ArchSpecificDir = 0;
361eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  switch (getTriple().getArch()) {
362eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  default:
363eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
364eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::arm:
3653a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar  case llvm::Triple::thumb: {
3663a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    std::string Triple = ComputeLLVMTriple(Args);
3675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef TripleStr = Triple;
3683a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
3693a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v5";
3703a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
3713a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v6";
3723a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
3733a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v7";
374eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
3753a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar  }
376eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::ppc64:
377eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    ArchSpecificDir = "ppc64";
378eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
379eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::x86_64:
380eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    ArchSpecificDir = "x86_64";
381eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
382eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  }
383eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
384eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  if (ArchSpecificDir) {
385eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    P.appendComponent(ArchSpecificDir);
38632bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
38732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
388eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
389eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    P.eraseComponent();
390eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  }
391eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
39232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
39332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
394424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
3951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
397f85e193739c953358c865005855253af4f68a497John McCallvoid DarwinClang::AddLinkARCArgs(const ArgList &Args,
398f85e193739c953358c865005855253af4f68a497John McCall                                 ArgStringList &CmdArgs) const {
399f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
400f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("-force_load");
401f85e193739c953358c865005855253af4f68a497John McCall  llvm::sys::Path P(getDriver().ClangExecutable);
402f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'clang'
403f85e193739c953358c865005855253af4f68a497John McCall  P.eraseComponent(); // 'bin'
404f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("lib");
405f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("arc");
406f85e193739c953358c865005855253af4f68a497John McCall  P.appendComponent("libarclite_");
407f85e193739c953358c865005855253af4f68a497John McCall  std::string s = P.str();
408f85e193739c953358c865005855253af4f68a497John McCall  // Mash in the platform.
409c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  if (isTargetIOSSimulator())
410c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis    s += "iphonesimulator";
411c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  else if (isTargetIPhoneOS())
412f85e193739c953358c865005855253af4f68a497John McCall    s += "iphoneos";
413c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  // FIXME: Remove this once we depend fully on -mios-simulator-version-min.
414f85e193739c953358c865005855253af4f68a497John McCall  else if (ARCRuntimeForSimulator != ARCSimulator_None)
415f85e193739c953358c865005855253af4f68a497John McCall    s += "iphonesimulator";
416f85e193739c953358c865005855253af4f68a497John McCall  else
417f85e193739c953358c865005855253af4f68a497John McCall    s += "macosx";
418f85e193739c953358c865005855253af4f68a497John McCall  s += ".a";
419f85e193739c953358c865005855253af4f68a497John McCall
420f85e193739c953358c865005855253af4f68a497John McCall  CmdArgs.push_back(Args.MakeArgString(s));
421f85e193739c953358c865005855253af4f68a497John McCall}
422f85e193739c953358c865005855253af4f68a497John McCall
4233404fe7105ecc3baa58b7ea725773de4112259d6Eric Christophervoid DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
424f857186fd1995b34185d063a29b11ad4f948519fEric Christopher                                    ArgStringList &CmdArgs,
4253404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher                                    const char *DarwinStaticLib) const {
4263404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  llvm::sys::Path P(getDriver().ResourceDir);
4273404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("lib");
4283404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent("darwin");
4293404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  P.appendComponent(DarwinStaticLib);
430f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
4313404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  // For now, allow missing resource libraries to support developers who may
4323404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  // not have compiler-rt checked out or integrated into their build.
4333404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  bool Exists;
4343404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
4353404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    CmdArgs.push_back(Args.MakeArgString(P.str()));
4363404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher}
4373404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
4381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
4391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
440eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
441eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
442eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (Args.hasArg(options::OPT_static))
4431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
4441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
4451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
4461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
4471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
4481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
4495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_unsupported_opt)
4501d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
4511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
4521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
4531d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
454eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
455eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
4561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
457eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
458eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
459251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
46087e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
46187e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // it never went into the SDK.
462163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    // Linking against libgcc_s.1 isn't needed for iOS 5.0+
463163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
464163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      CmdArgs.push_back("-lgcc_s.1");
465eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
4663cceec5e05d974f3993bd0a745325f76fb8e4efcDaniel Dunbar    // We currently always need a static runtime library for iOS.
4673404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
468eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
469eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
470eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
471ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
472eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
473ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
474eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
475eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
476885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // For OS X, we thought we would only need a static runtime library when
477fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner    // targeting 10.4, to provide versions of the static functions which were
478885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // omitted from 10.4.dylib.
479885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    //
480885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // Unfortunately, that turned out to not be true, because Darwin system
481885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // headers can still use eprintf on i386, and it is not exported from
482885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // libSystem. Therefore, we still must provide a runtime library just for
483885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // the tiny tiny handful of projects that *might* use that symbol.
484885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    if (isMacosxVersionLT(10, 5)) {
4853404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
486885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    } else {
487885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::x86)
4883404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher        AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
4893404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
490885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    }
491eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
4921d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
4931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
494dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidisstatic inline StringRef SimulatorVersionDefineName() {
495dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  return "__IPHONE_OS_VERSION_MIN_REQUIRED";
496dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis}
497dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis
498dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis/// \brief Parse the simulator version define:
499dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
500dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis// and return the grouped values as integers, e.g:
501dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis//   __IPHONE_OS_VERSION_MIN_REQUIRED=40201
502dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis// will return Major=4, Minor=2, Micro=1.
503dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidisstatic bool GetVersionFromSimulatorDefine(StringRef define,
504dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis                                          unsigned &Major, unsigned &Minor,
505dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis                                          unsigned &Micro) {
506dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  assert(define.startswith(SimulatorVersionDefineName()));
507dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  StringRef name, version;
508dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  llvm::tie(name, version) = define.split('=');
509dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  if (version.empty())
510dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis    return false;
511dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  std::string verstr = version.str();
512dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  char *end;
513dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
514dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  if (*end != '\0')
515dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis    return false;
516dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  Major = num / 10000;
517dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  num = num % 10000;
518dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  Minor = num / 100;
519dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  Micro = num % 100;
520dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  return true;
521dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis}
522dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis
52360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
524ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
525ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
5262603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
5279d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
5289d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSSimVersion = Args.getLastArg(
5299d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    options::OPT_mios_simulator_version_min_EQ);
530f85e193739c953358c865005855253af4f68a497John McCall
531dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  // FIXME: HACK! When compiling for the simulator we don't get a
532dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  // '-miphoneos-version-min' to help us know whether there is an ARC runtime
533dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
534dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  // define passed in command-line.
535c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  if (!iOSVersion && !iOSSimVersion) {
536dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis    for (arg_iterator it = Args.filtered_begin(options::OPT_D),
537dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis           ie = Args.filtered_end(); it != ie; ++it) {
538dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis      StringRef define = (*it)->getValue(Args);
539dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis      if (define.startswith(SimulatorVersionDefineName())) {
540dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis        unsigned Major = 0, Minor = 0, Micro = 0;
541dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis        if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
542dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis            Major < 10 && Minor < 100 && Micro < 100) {
543dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis          ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
544dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis                                             : ARCSimulator_HasARCRuntime;
545dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis          LibCXXForSimulator = Major < 5 ? LibCXXSimulator_NotAvailable
546dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis                                         : LibCXXSimulator_Available;
547dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis        }
548dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis        break;
549dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis      }
550dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis    }
551dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis  }
552dceb11fdcf3ea657a06d2ec90a8f4b8359ab8727Argyrios Kyrtzidis
5539d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
5545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
555ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
5569d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
5579d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSVersion = iOSSimVersion = 0;
5589d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (iOSVersion && iOSSimVersion) {
5595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
5609d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSVersion->getAsString(Args)
5619d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSSimVersion->getAsString(Args);
5629d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    iOSSimVersion = 0;
5639d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
564a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // If no deployment target was specified on the command line, check for
565816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
566a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef OSXTarget;
567a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSTarget;
568a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSSimTarget;
569a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
570a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      OSXTarget = env;
571a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
572a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSTarget = env;
573a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
574a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSSimTarget = env;
575a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier
576a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi    // If no '-miphoneos-version-min' specified on the command line and
577a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
578a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // based on isysroot.
579a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (iOSTarget.empty()) {
580a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
581a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef first, second;
582a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef isysroot = A->getValue(Args);
583a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
584a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        if (second != "")
585a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier          iOSTarget = second.substr(0,3);
586a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      }
587a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    }
588816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
5894f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // If no OSX or iOS target has been specified and we're compiling for armv7,
5904f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // go ahead as assume we're targeting iOS.
5914f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    if (OSXTarget.empty() && iOSTarget.empty())
5924f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier      if (getDarwinArchName(Args) == "armv7")
5934f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier        iOSTarget = "0.0";
5944f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier
5959d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Handle conflicting deployment targets
59639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
59739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
5989d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5999d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Do not allow conflicts with the iOS simulator target.
600a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
6015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
6029d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
603a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
6049d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar            "IPHONEOS_DEPLOYMENT_TARGET");
6059d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    }
6069d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
6079d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Allow conflicts among OSX and iOS for historical reasons, but choose the
6089d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // default platform.
609a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty() && !iOSTarget.empty()) {
61039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
61139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
612a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        OSXTarget = "";
61339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
614a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        iOSTarget = "";
61539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
6161a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
617a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty()) {
61830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
61960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
62060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
621a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSTarget.empty()) {
62230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
6239d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
6249d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSVersion);
625a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSSimTarget.empty()) {
6269d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      const Option *O = Opts.getOption(
6279d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        options::OPT_mios_simulator_version_min_EQ);
6289d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
6299d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSSimVersion);
630816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
6312bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
6322bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
63360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
63460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
63530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
636ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
6371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6383fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  // Reject invalid architecture combinations.
6393fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
6403fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar                        getTriple().getArch() != llvm::Triple::x86_64)) {
6415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
6423fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
6433fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  }
6443fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar
6452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
6462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
6472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
6482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
6499d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
6502603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
6512603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
6528a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar        Major != 10 || Minor >= 100 || Micro >= 100)
6535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
6542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
6552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
6569d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
6579d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert(Version && "Unknown target platform!");
6589d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
6592603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
6602603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major >= 10 || Minor >= 100 || Micro >= 100)
6615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
6629d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << Version->getAsString(Args);
6632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
6649d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
6655f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  bool IsIOSSim = bool(iOSSimVersion);
6665f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
6675f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // In GCC, the simulator historically was treated as being OS X in some
6685f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // contexts, like determining the link logic, despite generally being called
6695f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // with an iOS deployment target. For compatibility, we detect the
6705f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // simulator as iOS + x86, and treat it differently in a few contexts.
6715f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
6725f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                     getTriple().getArch() == llvm::Triple::x86_64))
6735f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    IsIOSSim = true;
6745f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
6755f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
676c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
677c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
678132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
679efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
680efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
681efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
682efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
683efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
684efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
685efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
686efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
687efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
688efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
689efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
690efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
691efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
692efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
693efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
69432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    bool Exists;
695efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
696efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
697efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("usr");
698efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("lib");
699efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("libstdc++.dylib");
700efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
70132bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
702efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.eraseComponent();
703efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.appendComponent("libstdc++.6.dylib");
70432bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer        if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
705efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
706efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
707efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
708efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
709efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
710efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
711efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
71232bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer    if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
71332bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer      (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
714efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
715efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
716efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
717efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
718efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
719efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
720efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
721efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
722efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
723efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
724efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
7257433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
7267433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
7277433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
7287433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
7297433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
7307433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
7317433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
7327433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  llvm::sys::Path P(getDriver().ResourceDir);
7337433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("lib");
7347433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("darwin");
7357433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("libclang_rt.cc_kext.a");
736304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
7377433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
7387433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
73932bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
74032bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
7417433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
7427433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
7437433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
744c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
745c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar                                      const char *BoundArch) const {
746c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
747c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
748c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
749c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
750c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
751c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
752c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
753c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
754c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
7552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
756279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
757279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
7584e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
7594e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
7604e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
7612a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // Skip this argument unless the architecture matches either the toolchain
7622a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // triple arch, or the arch being bound.
7632a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      //
7644e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: Canonicalize name.
7655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      StringRef XarchArch = A->getValue(Args, 0);
7662a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      if (!(XarchArch == getArchName()  ||
7672a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar            (BoundArch && XarchArch == BoundArch)))
7684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
7694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
7708ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      Arg *OriginalArg = A;
7710e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
7720e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
773ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
7741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
7764e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
7774e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
7784e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
7794e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
7804e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
7814e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
7824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
7830e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar      if (!XarchArg || Index > Prev + 1) {
7845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
7857e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar          << A->getAsString(Args);
7867e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar        continue;
7877e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar      } else if (XarchArg->getOption().isDriverOption()) {
7885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
7894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
7904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
7914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
7924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
793478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
7944e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
7950e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
7960e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
7978ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
7988ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // Linker input arguments require custom handling. The problem is that we
7998ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // have already constructed the phase actions, so we can not treat them as
8008ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // "input arguments".
8018ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      if (A->getOption().isLinkerInput()) {
8028ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        // Convert the argument into individual Zlinker_input_args.
8038ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
8048ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar          DAL->AddSeparateArg(OriginalArg,
8058ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              Opts.getOption(options::OPT_Zlinker_input),
8068ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              A->getValue(Args, i));
807304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
8088ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        }
8098ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        continue;
8108ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      }
8111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
8124e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
813ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
814ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
815ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
8169e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
817ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
818ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
819ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
820ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
821ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
822ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
823ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
8249d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
825ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
8261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
827ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
8289d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
8299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                          A->getValue(Args));
830ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
831ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
832ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
8339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
8349d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
8359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
836ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
837ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
838ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
8399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
8409d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
8419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
842ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
843ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
844ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
8459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
846ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
847ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
848ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
8499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
850ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
851ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
852ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
8539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
854ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
855ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
856ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
8579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
8589d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
859ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
860ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
861ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
8629d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
8639d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
864ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
865ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
866ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
8679d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
868ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
869ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
870ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
8719d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
872ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
873ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
8744e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
8754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
87684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
87784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
878e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
8799d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
88084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
88184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
88284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // how the driver driver works.
88384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
8845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = BoundArch;
88584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
88684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
88784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
88884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
88984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
89084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
89184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
89284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
8939d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
89484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
8959d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
89684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
8979d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
89884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
8999d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
90084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
9019d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
90284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
9039d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
90484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
9059d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
90684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
9079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
90884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
90984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
9109d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
91184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
91284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
91384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
91484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
9159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
91684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
9179d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
91884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
9199d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
92084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
9219d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
92284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
9239d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
92484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
9259d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
92684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
9279d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
92884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
92984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
9309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
931ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
93284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
9339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
93484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
9359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
93684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
9379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
93884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
9399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
94084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
9419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
94284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
9439d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
94484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
94584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
9469f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
94784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
948ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
94960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
95060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
95160baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
95260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  AddDeploymentTarget(*DAL);
95360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
954163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  // Validate the C++ standard library choice.
955163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  CXXStdlibType Type = GetCXXStdlibType(*DAL);
956163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  if (Type == ToolChain::CST_Libcxx) {
957163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    switch (LibCXXForSimulator) {
958163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    case LibCXXSimulator_None:
959163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      // Handle non-simulator cases.
960163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      if (isTargetIPhoneOS()) {
961163b151809beef8f917fd16c546016e83ae3e361Bob Wilson        if (isIPhoneOSVersionLT(5, 0)) {
962163b151809beef8f917fd16c546016e83ae3e361Bob Wilson          getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
963163b151809beef8f917fd16c546016e83ae3e361Bob Wilson            << "iOS 5.0";
964163b151809beef8f917fd16c546016e83ae3e361Bob Wilson        }
965163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      }
966163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      break;
967163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    case LibCXXSimulator_NotAvailable:
968163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
969163b151809beef8f917fd16c546016e83ae3e361Bob Wilson        << "iOS 5.0";
970163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      break;
971163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    case LibCXXSimulator_Available:
972163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      break;
973163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    }
974163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  }
975163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
9764e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
9788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
979f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
9808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
9818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
9828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return getArchName() == "x86_64";
9838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
9848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
985f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
986f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
987f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
988f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
989f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
990f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
991b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
992b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
993b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
994b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
995b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
996b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
997f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const {
9988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return "pic";
9998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
10008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1001f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const {
10028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (getArchName() == "x86_64")
10038eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    return "pic";
10048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return 0;
10058eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
10068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1007bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbarbool Darwin::SupportsProfiling() const {
1008bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  // Profiling instrumentation is only supported on x86.
1009bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  return getArchName() == "i386" || getArchName() == "x86_64";
1010bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar}
1011bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
101243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
101343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
101443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
101543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
101643a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
101700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string
101861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad RosierDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
101961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
102061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
102100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
102200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
10233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
10243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
10253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
10263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
102719347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text.
102819347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
102919347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects.
103019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/
103119347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
103219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
103319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> First = VersionText.split('.');
103419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> Second = First.second.split('.');
103519347edf7809866350750a1997ec4db009832fa4Chandler Carruth
103619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
103719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (First.first.getAsInteger(10, GoodVersion.Major) ||
103819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Major < 0)
103919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
104019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
104119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Minor < 0)
104219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
104319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
104419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // First look for a number prefix and parse that if present. Otherwise just
104519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // stash the entire patch string in the suffix, and leave the number
104619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // unspecified. This covers versions strings such as:
104719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4
104819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.0
104919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x
105019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.2-rc4
105119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x-patched
105219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // And retains any patch number it finds.
105319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
105419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (!PatchText.empty()) {
105519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (unsigned EndNumber = PatchText.find_first_not_of("0123456789")) {
105619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Try to parse the number and any suffix.
105719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
105819347edf7809866350750a1997ec4db009832fa4Chandler Carruth          GoodVersion.Patch < 0)
105919347edf7809866350750a1997ec4db009832fa4Chandler Carruth        return BadVersion;
106019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
106119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
106219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
106319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
106419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return GoodVersion;
106519347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
106619347edf7809866350750a1997ec4db009832fa4Chandler Carruth
106719347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
106819347edf7809866350750a1997ec4db009832fa4Chandler Carruthbool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
106919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Major < RHS.Major) return true; if (Major > RHS.Major) return false;
107019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Minor < RHS.Minor) return true; if (Minor > RHS.Minor) return false;
107119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
107219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Note that we rank versions with *no* patch specified is better than ones
107319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // hard-coding a patch version. Thus if the RHS has no patch, it always
107419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // wins, and the LHS only wins if it has no patch and the RHS does have
107519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // a patch.
107619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (RHS.Patch == -1) return true;   if (Patch == -1) return false;
107719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false;
107819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
107919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Finally, between completely tied version numbers, the version with the
108019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // suffix loses as we prefer full releases.
108119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (RHS.PatchSuffix.empty()) return true;
108219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return false;
108319347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
108419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
108519347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Construct a GCCInstallationDetector from the driver.
108619347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
108719347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths.
108819347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// Once constructed, a GCCInstallation is esentially immutable.
108919347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCInstallationDetector::GCCInstallationDetector(const Driver &D)
109019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  : IsValid(false),
109119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccTriple(D.DefaultHostTriple) {
109219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
109319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // avoids adding yet another option to configure/cmake.
109419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // It would probably be cleaner to break it in two variables
109519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // CXX_GCC_ROOT with just /foo/bar
109619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // CXX_GCC_VER with 4.5.2
109719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Then we would have
109819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER
109919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // and this function would return
110019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER
110119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  llvm::SmallString<128> CxxIncludeRoot(CXX_INCLUDE_ROOT);
110219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (CxxIncludeRoot != "") {
110319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // This is of the form /foo/bar/include/c++/4.5.2/
110419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (CxxIncludeRoot.back() == '/')
110519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the /
110619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    StringRef Version = llvm::sys::path::filename(CxxIncludeRoot);
110719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version
110819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++
110919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include
111019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccInstallPath = CxxIncludeRoot.str();
111119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccInstallPath.append("/lib/gcc/");
111219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccInstallPath.append(CXX_INCLUDE_ARCH);
111319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccInstallPath.append("/");
111419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccInstallPath.append(Version);
111519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GccParentLibPath = GccInstallPath + "/../../..";
111619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    IsValid = true;
111719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return;
111819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
111919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
112019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  llvm::Triple::ArchType HostArch = llvm::Triple(GccTriple).getArch();
112119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The library directories which may contain GCC installations.
112219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<StringRef, 4> CandidateLibDirs;
112319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The compatible GCC triples for this particular architecture.
112419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<StringRef, 10> CandidateTriples;
112519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  CollectLibDirsAndTriples(HostArch, CandidateLibDirs, CandidateTriples);
112619347edf7809866350750a1997ec4db009832fa4Chandler Carruth
112719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Always include the default host triple as the final fallback if no
112819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // specific triple is detected.
112919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  CandidateTriples.push_back(D.DefaultHostTriple);
113019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
113119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Compute the set of prefixes for our search.
113219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
113319347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                       D.PrefixDirs.end());
113419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Prefixes.push_back(D.SysRoot);
113519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Prefixes.push_back(D.SysRoot + "/usr");
113619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Prefixes.push_back(D.InstalledDir + "/..");
113719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
113819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Loop over the various components which exist and select the best GCC
113919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // installation available. GCC installs are ranked by version number.
114019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Version = GCCVersion::Parse("0.0.0");
114119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
114219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (!llvm::sys::fs::exists(Prefixes[i]))
114319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      continue;
114419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
114519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
114619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
114719347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
114819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k)
114919347edf7809866350750a1997ec4db009832fa4Chandler Carruth        ScanLibDirForGCCTriple(LibDir, CandidateTriples[k]);
115019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
115119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
115219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
115319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
115419347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
115519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::Triple::ArchType HostArch, SmallVectorImpl<StringRef> &LibDirs,
115619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    SmallVectorImpl<StringRef> &Triples) {
115719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (HostArch == llvm::Triple::arm || HostArch == llvm::Triple::thumb) {
115819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const ARMLibDirs[] = { "/lib" };
115919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const ARMTriples[] = { "arm-linux-gnueabi" };
116019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
116119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    Triples.append(ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
116219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  } else if (HostArch == llvm::Triple::x86_64) {
116319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
116419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const X86_64Triples[] = {
116519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-linux-gnu",
116619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-unknown-linux-gnu",
116719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-pc-linux-gnu",
116819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-redhat-linux6E",
116919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-redhat-linux",
117019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-suse-linux",
117119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-manbo-linux-gnu",
117219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-linux-gnu",
117319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "x86_64-slackware-linux"
117419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    };
117519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86_64LibDirs,
117619347edf7809866350750a1997ec4db009832fa4Chandler Carruth                   X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
117719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    Triples.append(X86_64Triples,
117819347edf7809866350750a1997ec4db009832fa4Chandler Carruth                   X86_64Triples + llvm::array_lengthof(X86_64Triples));
117919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  } else if (HostArch == llvm::Triple::x86) {
118019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const X86LibDirs[] = { "/lib32", "/lib" };
118119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const X86Triples[] = {
118219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i686-linux-gnu",
118319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i686-pc-linux-gnu",
118419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i486-linux-gnu",
118519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i386-linux-gnu",
118619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i686-redhat-linux",
118719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i586-redhat-linux",
118819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i386-redhat-linux",
118919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i586-suse-linux",
119019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "i486-slackware-linux"
119119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    };
119219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
119319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    Triples.append(X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
119419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  } else if (HostArch == llvm::Triple::ppc) {
119519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
119619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const PPCTriples[] = {
119719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "powerpc-linux-gnu",
119819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "powerpc-unknown-linux-gnu"
119919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    };
120019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
120119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    Triples.append(PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
120219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  } else if (HostArch == llvm::Triple::ppc64) {
120319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
120419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static const char *const PPC64Triples[] = {
120519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      "powerpc64-unknown-linux-gnu"
120619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    };
120719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPC64LibDirs,
120819347edf7809866350750a1997ec4db009832fa4Chandler Carruth                   PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
120919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    Triples.append(PPC64Triples,
121019347edf7809866350750a1997ec4db009832fa4Chandler Carruth                   PPC64Triples + llvm::array_lengthof(PPC64Triples));
121119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
121219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
121319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
121419347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
121519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    const std::string &LibDir, StringRef CandidateTriple) {
121619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // There are various different suffixes involving the triple we
121719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // check for. We also record what is necessary to walk from each back
121819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // up to the lib directory.
121919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const std::string Suffixes[] = {
122019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/gcc/" + CandidateTriple.str(),
122119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
122219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
122319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // Ubuntu has a strange mis-matched pair of triples that this happens to
122419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // match.
122519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: It may be worthwhile to generalize this and look for a second
122619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // triple.
122719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/i686-linux-gnu"
122819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
122919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const std::string InstallSuffixes[] = {
123019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../..",
123119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../..",
123219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/../../../.."
123319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
123419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
123519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -
123619347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                (CandidateTriple != "i386-linux-gnu"));
123719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0; i < NumSuffixes; ++i) {
123819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    StringRef Suffix = Suffixes[i];
123919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    llvm::error_code EC;
124019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (llvm::sys::fs::directory_iterator LI(LibDir + Suffix, EC), LE;
124119347edf7809866350750a1997ec4db009832fa4Chandler Carruth         !EC && LI != LE; LI = LI.increment(EC)) {
124219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      StringRef VersionText = llvm::sys::path::filename(LI->path());
124319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
124419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
124519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion < MinVersion)
124619347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
124719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion <= Version)
124819347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
124919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
125019347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
125119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
125219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      Version = CandidateVersion;
125319347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GccTriple = CandidateTriple.str();
125419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // FIXME: We hack together the directory name here instead of
125519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // using LI to ensure stable path separators across Windows and
125619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Linux.
125719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GccInstallPath = LibDir + Suffixes[i] + "/" + VersionText.str();
125819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GccParentLibPath = GccInstallPath + InstallSuffixes[i];
125919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      IsValid = true;
126019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
126119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
126219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
126319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1264cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
126519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  : ToolChain(Host, Triple), GCCInstallation(getDriver()) {
1266edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
126786643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1268edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1269c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
1270c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
12713917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
12723917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
12733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
12743917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
12753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
12763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
12773917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
12781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
1279ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const JobAction &JA,
1280ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                              const ActionList &Inputs) const {
12813917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Action::ActionClass Key;
1282ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
12833917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = Action::AnalyzeJobClass;
12843917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  else
12853917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = JA.getKind();
12863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
12873917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
12883917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
12893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
12908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
12918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
1292b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
12933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
12943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Preprocess(*this); break;
12953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
12963917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Precompile(*this); break;
12973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
12983917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::Clang(*this); break;
12993917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::CompileJobClass:
13003917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Compile(*this); break;
13013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
13023917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
13033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
13043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
13078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
13088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
13098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
13106e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
13116e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
1312f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
1313f857186fd1995b34185d063a29b11ad4f948519fEric Christopher      T = new tools::darwin::VerifyDebug(*this); break;
13143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
13153917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
13163917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
13183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13203917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
13218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
13228eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
13233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return getArchName() == "x86_64";
13243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13263917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const {
13273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return "static";
13283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
13293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
13303917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const {
13313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return 0;
13323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
1333f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
13343a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
13353a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
13363a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
13373a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13383a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
13393a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  : ToolChain(Host, Triple) {
13403a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
13413a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
13423a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13433a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
13443a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
13453a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13463a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13473a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
13483a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
13493a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
13503a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
13513a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1353304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const {
1354304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  return true;
13553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const {
13583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return false;
13593a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const {
13623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return "static";
13633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const {
13663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return 0;
13673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1369304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA TakumiTool &TCEToolChain::SelectTool(const Compilation &C,
1370ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const JobAction &JA,
1371ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                               const ActionList &Inputs) const {
13723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
13733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
13743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
13753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
13763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
13773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
13783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
13793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
13803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
13813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
13823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
1383b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie     llvm_unreachable("Unsupported action for TCE target.");
13843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
13853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
13863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
13873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
13883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1389f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1390f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1391f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
1392e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
1393ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1394f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
1395f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1396f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1397ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1398ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
1399f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Action::ActionClass Key;
1400ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1401f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = Action::AnalyzeJobClass;
1402f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
1403f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = JA.getKind();
1404f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1405dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1406dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1407dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1408dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1409f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
1410f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
1411f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
1412dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    case Action::AssembleJobClass: {
1413dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1414dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1415dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1416dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::openbsd::Assemble(*this);
1417dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1418dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    }
1419f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
1420f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
1421f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
1422ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1423f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
1424f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
1425f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1426f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
1427f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1428f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
142975358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
143075358d267256022475371416654b056ad8531cb3Daniel Dunbar
1431214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
1432e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
1433214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
1434214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  // Determine if we are compiling 32-bit code on an x86_64 platform.
1435214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  bool Lib32 = false;
1436214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  if (Triple.getArch() == llvm::Triple::x86 &&
1437214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar      llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1438214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar        llvm::Triple::x86_64)
1439214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar    Lib32 = true;
1440304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
14413393cef18e887723aaa2395d33550ab35551af1dRoman Divacky  if (Triple.getArch() == llvm::Triple::ppc &&
14423393cef18e887723aaa2395d33550ab35551af1dRoman Divacky      llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
14433393cef18e887723aaa2395d33550ab35551af1dRoman Divacky        llvm::Triple::ppc64)
14443393cef18e887723aaa2395d33550ab35551af1dRoman Divacky    Lib32 = true;
14453393cef18e887723aaa2395d33550ab35551af1dRoman Divacky
1446bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  if (Lib32) {
1447bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib32");
1448bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  } else {
1449bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib");
1450bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  }
145175358d267256022475371416654b056ad8531cb3Daniel Dunbar}
145275358d267256022475371416654b056ad8531cb3Daniel Dunbar
1453ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1454ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
145575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Action::ActionClass Key;
1456ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
145775358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = Action::AnalyzeJobClass;
145875358d267256022475371416654b056ad8531cb3Daniel Dunbar  else
145975358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = JA.getKind();
146075358d267256022475371416654b056ad8531cb3Daniel Dunbar
146167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
146267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             options::OPT_no_integrated_as,
146367dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             IsIntegratedAssemblerDefault());
146467dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky
146575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
146675358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
146775358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
146868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
146967dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      if (UseIntegratedAs)
147067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::ClangAs(*this);
147167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      else
147267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::freebsd::Assemble(*this);
1473fe3a7ea7f2132ec5cd0510cc21d2677614a6ab3aRoman Divacky      break;
1474008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
1475008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
147675358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
1477ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
14788e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    }
14798e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
14808e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
14818e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  return *T;
14828e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
14838e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
14848e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
14858e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
1486182564cd14a2105fff05fd52f5940eff96161d57Joerg SonnenbergerNetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
1487182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger               const llvm::Triple& ToolTriple)
1488182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger  : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
14898e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
14908e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  // Determine if we are compiling 32-bit code on an x86_64 platform.
14918e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  bool Lib32 = false;
1492182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger  if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
1493182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger      Triple.getArch() == llvm::Triple::x86)
14948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Lib32 = true;
14958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
149605e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (getDriver().UseStdLib) {
149705e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger    if (Lib32)
149805e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib/i386");
149905e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger    else
150005e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib");
15018e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
15028e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
15038e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
1504ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1505ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                         const ActionList &Inputs) const {
15068e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Action::ActionClass Key;
15078e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
15088e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Key = Action::AnalyzeJobClass;
15098e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  else
15108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    Key = JA.getKind();
15118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
15128e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
15138e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             options::OPT_no_integrated_as,
15148e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer                                             IsIntegratedAssemblerDefault());
15158e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
15168e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  Tool *&T = Tools[Key];
15178e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  if (!T) {
15188e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    switch (Key) {
15198e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::AssembleJobClass:
15208e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      if (UseIntegratedAs)
15218e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer        T = new tools::ClangAs(*this);
15228e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      else
1523182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger        T = new tools::netbsd::Assemble(*this, ToolTriple);
15248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer      break;
15258e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    case Action::LinkJobClass:
1526182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger      T = new tools::netbsd::Link(*this, ToolTriple);
1527182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger      break;
15288e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer    default:
1529ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
153075358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
153175358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
153275358d267256022475371416654b056ad8531cb3Daniel Dunbar
153375358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
153475358d267256022475371416654b056ad8531cb3Daniel Dunbar}
153511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
153638e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
153738e317d6dce161b249508686cc67eb7176958762Chris Lattner
153838e317d6dce161b249508686cc67eb7176958762Chris LattnerMinix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
153938e317d6dce161b249508686cc67eb7176958762Chris Lattner  : Generic_GCC(Host, Triple) {
154038e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
154138e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
154238e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/gnu/lib");
154338e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
154438e317d6dce161b249508686cc67eb7176958762Chris Lattner}
154538e317d6dce161b249508686cc67eb7176958762Chris Lattner
1546ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1547ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
154838e317d6dce161b249508686cc67eb7176958762Chris Lattner  Action::ActionClass Key;
154938e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
155038e317d6dce161b249508686cc67eb7176958762Chris Lattner    Key = Action::AnalyzeJobClass;
155138e317d6dce161b249508686cc67eb7176958762Chris Lattner  else
155238e317d6dce161b249508686cc67eb7176958762Chris Lattner    Key = JA.getKind();
155338e317d6dce161b249508686cc67eb7176958762Chris Lattner
155438e317d6dce161b249508686cc67eb7176958762Chris Lattner  Tool *&T = Tools[Key];
155538e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!T) {
155638e317d6dce161b249508686cc67eb7176958762Chris Lattner    switch (Key) {
155738e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::AssembleJobClass:
155838e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Assemble(*this); break;
155938e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::LinkJobClass:
156038e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Link(*this); break;
156138e317d6dce161b249508686cc67eb7176958762Chris Lattner    default:
1562ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
156338e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
156438e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
156538e317d6dce161b249508686cc67eb7176958762Chris Lattner
156638e317d6dce161b249508686cc67eb7176958762Chris Lattner  return *T;
156738e317d6dce161b249508686cc67eb7176958762Chris Lattner}
156838e317d6dce161b249508686cc67eb7176958762Chris Lattner
1569e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1570e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1571e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
1572e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  : Generic_GCC(Host, Triple) {
1573e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1574edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
157586643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
1576edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1577e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1578ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1579e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
1580e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
1581e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
15827adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1583e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1584e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1585e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1586ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1587ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const {
1588e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Action::ActionClass Key;
1589ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1590e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = Action::AnalyzeJobClass;
1591e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
1592e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = JA.getKind();
1593e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1594e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
1595e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
1596e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
1597e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
1598e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
1599e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
1600e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
1601e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
1602ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1603e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
1604e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
1605e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1606e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
1607e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1608e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1609e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
16106b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
16116b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1612c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro {
16133fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  ArchLinux,
1614c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
1615c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
16160b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  DebianWheezy,
16170a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
1618d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL4,
1619d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL5,
1620d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL6,
1621c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora13,
1622c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora14,
16238f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  Fedora15,
16248f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  FedoraRawhide,
1625c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  OpenSuse11_3,
1626de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse11_4,
1627de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  OpenSuse12_1,
1628814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuHardy,
1629814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuIntrepid,
1630021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
16315ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu  UbuntuKarmic,
1632c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
1633c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
163443ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  UbuntuNatty,
163525a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer  UbuntuOneiric,
1636c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
1637c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
1638c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1639d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattnerstatic bool IsRedhat(enum LinuxDistro Distro) {
16408f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher  return Distro == Fedora13 || Distro == Fedora14 ||
16415a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola         Distro == Fedora15 || Distro == FedoraRawhide ||
16425a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola         Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6;
1643c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1644c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1645c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) {
1646de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall  return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 ||
1647de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall         Distro == OpenSuse12_1;
1648c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1649c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1650c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) {
16510b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  return Distro == DebianLenny || Distro == DebianSqueeze ||
16520b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman         Distro == DebianWheezy;
1653c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1654c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1655c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) {
1656814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  return Distro == UbuntuHardy  || Distro == UbuntuIntrepid ||
1657304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi         Distro == UbuntuLucid  || Distro == UbuntuMaverick ||
165843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek         Distro == UbuntuJaunty || Distro == UbuntuKarmic ||
165925a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer         Distro == UbuntuNatty  || Distro == UbuntuOneiric;
1660c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1661c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1662c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
16634eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  llvm::OwningPtr<llvm::MemoryBuffer> File;
16644eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
16655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
16665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8> Lines;
1667c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
1668c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
1669814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor      if (Lines[i] == "DISTRIB_CODENAME=hardy")
1670814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor        return UbuntuHardy;
167143ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek      else if (Lines[i] == "DISTRIB_CODENAME=intrepid")
167243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek        return UbuntuIntrepid;
1673021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola      else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
16744eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer        return UbuntuJaunty;
16755ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu      else if (Lines[i] == "DISTRIB_CODENAME=karmic")
16765ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu        return UbuntuKarmic;
167743ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek      else if (Lines[i] == "DISTRIB_CODENAME=lucid")
167843ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek        return UbuntuLucid;
167943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek      else if (Lines[i] == "DISTRIB_CODENAME=maverick")
168043ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek        return UbuntuMaverick;
168143ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek      else if (Lines[i] == "DISTRIB_CODENAME=natty")
168243ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek        return UbuntuNatty;
168325a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer      else if (Lines[i] == "DISTRIB_CODENAME=oneiric")
168425a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer        return UbuntuOneiric;
1685c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    }
1686c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1687c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1688c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
16894eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
16905f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
16918f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    if (Data.startswith("Fedora release 15"))
16928f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return Fedora15;
16938f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 14"))
1694c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora14;
16958f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release 13"))
1696c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora13;
16978f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher    else if (Data.startswith("Fedora release") &&
16985f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("Rawhide") != StringRef::npos)
16998f1cc075c36212797ef52dac0e2fe35417a6bb6bEric Christopher      return FedoraRawhide;
1700d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner    else if (Data.startswith("Red Hat Enterprise Linux") &&
17015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 6") != StringRef::npos)
1702d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL6;
17035a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
17045a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
17055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 5") != StringRef::npos)
1706d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL5;
17075a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola    else if ((Data.startswith("Red Hat Enterprise Linux") ||
17085a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola	      Data.startswith("CentOS")) &&
17095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner             Data.find("release 4") != StringRef::npos)
1710d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner      return RHEL4;
1711c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1712c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1713c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
17144eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
17155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
1716c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
1717c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
1718c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (Data.startswith("squeeze/sid"))
1719c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
17200b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman    else if (Data.startswith("wheezy/sid"))
17210b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      return DebianWheezy;
1722c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1723c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1724c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
17254eeebc464e1f968d9968a4786c82558f18ac2ed8Michael J. Spencer  if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) {
17265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
1727c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data.startswith("openSUSE 11.3"))
1728c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return OpenSuse11_3;
1729de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall    else if (Data.startswith("openSUSE 11.4"))
1730de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall      return OpenSuse11_4;
1731de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall    else if (Data.startswith("openSUSE 12.1"))
1732de5c048fedb81f9b91c80cee1e5f4afd551dadd6David Chisnall      return OpenSuse12_1;
1733c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1734c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1735c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
173632bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  bool Exists;
173732bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer  if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
17380a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
17390a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
17403fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
17413fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth    return ArchLinux;
17423fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
1743c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
1744c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1745c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1746fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
1747fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
1748d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth}
1749d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth
1750deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target.
1751deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth///
1752deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use
1753deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths.
1754deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple,
1755deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here.
1756deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruthstatic std::string getMultiarchTriple(const llvm::Triple TargetTriple,
1757deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth                                      StringRef SysRoot) {
1758deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // For most architectures, just use whatever we have rather than trying to be
1759deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // clever.
1760deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  switch (TargetTriple.getArch()) {
1761deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  default:
1762deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
1763deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
1764deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // We use the existence of '/lib/<triple>' as a directory to detect some
1765deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // common linux triples that don't quite match the Clang triple for both
1766236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
1767236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // regardless of what the actual target triple is.
1768deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86:
1769deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
1770deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "i386-linux-gnu";
1771deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
1772deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86_64:
1773deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
1774deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "x86_64-linux-gnu";
1775deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
1776deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  }
1777deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth}
1778deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
17793fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick LewyckyLinux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
178019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  : Generic_ELF(Host, Triple) {
1781c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::Triple::ArchType Arch =
1782c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::Triple(getDriver().DefaultHostTriple).getArch();
1783fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  const std::string &SysRoot = getDriver().SysRoot;
1784c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1785ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // OpenSuse stores the linker with the compiler, add that to the search
1786ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  // path.
1787ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  ToolChain::path_list &PPaths = getProgramPaths();
1788fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
1789fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth                         GCCInstallation.getTriple() + "/bin").str());
1790ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola
1791ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  Linker = GetProgramPath("ld");
1792c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1793c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  LinuxDistro Distro = DetectLinuxDistro(Arch);
1794c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
179564a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
179694c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
179794c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
179894c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
1799c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1800f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
1801c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
1802c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1803304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick ||
180425a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer      Distro == UbuntuNatty || Distro == UbuntuOneiric)
1805c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--hash-style=gnu");
1806c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1807304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
180864a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner      Distro == UbuntuJaunty || Distro == UbuntuKarmic)
1809c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--hash-style=both");
1810c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1811d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  if (IsRedhat(Distro))
1812c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
1813c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
18140b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
18155a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      IsOpenSuse(Distro) ||
18165a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
18175a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      Distro == UbuntuLucid ||
18180b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      Distro == UbuntuMaverick || Distro == UbuntuKarmic ||
181925a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer      Distro == UbuntuNatty || Distro == UbuntuOneiric)
1820c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
1821c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
182264a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner  if (IsOpenSuse(Distro))
1823f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth    ExtraOpts.push_back("--enable-new-dtags");
182464a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner
1825d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // The selection of paths to try here is designed to match the patterns which
1826d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
1827d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // This was determined by running GCC in a fake filesystem, creating all
1828d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // possible permutations of these directories, and seeing which ones it added
1829d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // to the link paths.
1830d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  path_list &Paths = getFilePaths();
1831d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  const bool Is32Bits = (getArch() == llvm::Triple::x86 ||
1832d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth                         getArch() == llvm::Triple::ppc);
1833d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth
1834d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  const std::string Suffix32 = Arch == llvm::Triple::x86_64 ? "/32" : "";
183538ec546a56a267320f8f6c86141a7b0f7d6493c4Chandler Carruth  const std::string Suffix64 = Arch == llvm::Triple::x86_64 ? "" : "/64";
1836d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  const std::string Suffix = Is32Bits ? Suffix32 : Suffix64;
1837d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  const std::string Multilib = Is32Bits ? "lib32" : "lib64";
1838deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
18393fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
1840d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Add the multilib suffixed paths where they are available.
1841d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid()) {
1842d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
1843d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    const std::string &GccTriple = GCCInstallation.getTriple();
1844d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    addPathIfExists(GCCInstallation.getInstallPath() + Suffix, Paths);
1845d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    addPathIfExists(LibPath + "/../" + GccTriple + "/lib/../" + Multilib,
1846d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth                    Paths);
1847d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
1848d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    addPathIfExists(LibPath + "/../" + Multilib, Paths);
1849c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1850d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
1851d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
1852d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
1853d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
1854d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth
1855d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Try walking via the GCC triple path in case of multiarch GCC
1856d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // installations with strange symlinks.
1857d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid())
1858d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple() +
1859d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth                    "/../../" + Multilib, Paths);
1860c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola
18617a09d012f6d52c8a7ba257df85d13149e6aa7cb2Chandler Carruth  // Add the non-multilib suffixed paths (if potentially different).
1862048e6490704d0a4e095e033786230c584b52d82cChandler Carruth  if (GCCInstallation.isValid()) {
1863048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
1864048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    const std::string &GccTriple = GCCInstallation.getTriple();
1865d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth    if (!Suffix.empty())
1866048e6490704d0a4e095e033786230c584b52d82cChandler Carruth      addPathIfExists(GCCInstallation.getInstallPath(), Paths);
1867048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths);
1868deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
1869048e6490704d0a4e095e033786230c584b52d82cChandler Carruth    addPathIfExists(LibPath, Paths);
1870d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  }
1871deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
1872fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/lib", Paths);
1873deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
1874fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib", Paths);
1875c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1876c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1877c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
1878c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
18796b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
18806b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1881ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
1882ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                        const ActionList &Inputs) const {
1883ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Action::ActionClass Key;
1884ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1885ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Key = Action::AnalyzeJobClass;
1886ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  else
1887ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Key = JA.getKind();
1888ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
1889dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1890dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1891dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1892dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1893ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Tool *&T = Tools[Key];
1894ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (!T) {
1895ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    switch (Key) {
1896ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    case Action::AssembleJobClass:
1897dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1898dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1899dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1900dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::linuxtools::Assemble(*this);
1901dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1902c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    case Action::LinkJobClass:
1903c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      T = new tools::linuxtools::Link(*this); break;
1904ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    default:
1905ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
1906ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    }
1907ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
1908ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
1909ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  return *T;
1910ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
1911ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
19127d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
19137d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                      ArgStringList &CC1Args) const {
19147d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  const Driver &D = getDriver();
19157d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19167d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
19177d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
19187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19197d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
19207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
19217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
19237d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    // Ignore the sysroot, we *always* look for clang headers relative to
19247d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    // supplied path.
19257d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    llvm::sys::Path P(D.ResourceDir);
19267d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    P.appendComponent("include");
19277d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CC1Args.push_back("-internal-nosysroot-isystem");
19287d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(P.str()));
19297d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
19307d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19317d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
19327d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
19337d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19347d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Check for configure-time C include directories.
19357d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CIncludeDirs(C_INCLUDE_DIRS);
19367d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (CIncludeDirs != "") {
19377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    SmallVector<StringRef, 5> dirs;
19387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CIncludeDirs.split(dirs, ":");
19397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
19407d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth         I != E; ++I) {
19417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
19427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
19437d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    }
19447d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
19457d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
19467d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19477d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Lacking those, try to detect the correct set of system includes for the
19487d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // target triple.
19497d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
1950a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  // Implement generic Debian multiarch support.
1951a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86_64MultiarchIncludeDirs[] = {
1952a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu",
1953a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
1954a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
1955a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
1956a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
1957a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu/64",
1958a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu/64"
1959a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
1960a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86MultiarchIncludeDirs[] = {
1961a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i386-linux-gnu",
1962a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
1963a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
1964a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
1965a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
1966a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu/32",
1967a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i686-linux-gnu",
1968a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu"
1969a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
1970a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef ARMMultiarchIncludeDirs[] = {
1971a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/arm-linux-gnueabi"
1972a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
1973a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  ArrayRef<StringRef> MultiarchIncludeDirs;
19747d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getArch() == llvm::Triple::x86_64) {
1975a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
19767d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::x86) {
1977a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
19787d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::arm) {
1979a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
1980a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  }
1981a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
1982a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth                                     E = MultiarchIncludeDirs.end();
1983a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth       I != E; ++I) {
1984a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    if (llvm::sys::fs::exists(*I)) {
1985a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
1986a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      break;
1987a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    }
19887d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
19897d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19907d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getOS() == llvm::Triple::RTEMS)
19917d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
19927d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
19937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
19947d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
19957d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
1996abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruthstatic bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
19977d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                     const ArgList &DriverArgs,
19987d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                     ArgStringList &CC1Args) {
1999abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!llvm::sys::fs::exists(Base))
2000abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    return false;
20017d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base);
2002abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
20037d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
2004abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  return true;
20057d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
20067d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
20077d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
20087d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const {
20097d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
20107d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      DriverArgs.hasArg(options::OPT_nostdincxx))
20117d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
20127d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
2013abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  const llvm::Triple &TargetTriple = getTriple();
2014abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  const llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2015abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  bool IsTarget64Bit = (TargetArch == llvm::Triple::x86_64 ||
2016abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                        TargetArch == llvm::Triple::ppc64);
2017abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
20187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
2019abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!CxxIncludeRoot.empty()) {
20207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    StringRef CxxIncludeArch(CXX_INCLUDE_ARCH);
2021abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    if (CxxIncludeArch.empty())
2022abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      CxxIncludeArch = TargetTriple.str();
2023abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2024abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    addLibStdCXXIncludePaths(
2025abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      CxxIncludeRoot,
2026abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      CxxIncludeArch + (IsTarget64Bit ? CXX_INCLUDE_64BIT_DIR
2027abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                                      : CXX_INCLUDE_32BIT_DIR),
2028abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      DriverArgs, CC1Args);
20297d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
20307d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
2031abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2032abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // Check if the target architecture specific dirs need a suffix. Note that we
2033abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // only support the suffix-based bi-arch-like header scheme for host/target
2034abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // mismatches of just bit width.
2035abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  llvm::Triple::ArchType HostArch =
2036abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    llvm::Triple(getDriver().DefaultHostTriple).getArch();
2037abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef Suffix;
2038abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if ((HostArch == llvm::Triple::x86 && TargetArch == llvm::Triple::x86_64) ||
2039abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      (HostArch == llvm::Triple::ppc && TargetArch == llvm::Triple::ppc64))
2040abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    Suffix = "/64";
2041abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if ((HostArch == llvm::Triple::x86_64 && TargetArch == llvm::Triple::x86) ||
2042abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth      (HostArch == llvm::Triple::ppc64 && TargetArch == llvm::Triple::ppc))
2043abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    Suffix = "/32";
2044abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
2045abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // By default, look for the C++ headers in an include directory adjacent to
2046abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // the lib directory of the GCC installation. Note that this is expect to be
2047abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2048abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef LibDir = GCCInstallation.getParentLibPath();
2049abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef InstallDir = GCCInstallation.getInstallPath();
2050abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef Version = GCCInstallation.getVersion();
2051abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!addLibStdCXXIncludePaths(LibDir + "/../include/c++/" + Version,
2052abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                                GCCInstallation.getTriple() + Suffix,
2053abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                                DriverArgs, CC1Args)) {
2054abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // Gentoo is weird and places its headers inside the GCC install, so if the
2055abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // first attempt to find the headers fails, try this pattern.
2056abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    addLibStdCXXIncludePaths(InstallDir + "/include/g++-v4",
2057abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                             GCCInstallation.getTriple() + Suffix,
2058abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth                             DriverArgs, CC1Args);
2059abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  }
20607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
20617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
206211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
206311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2064cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
2065e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
206611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
206711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
2068edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
206986643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2070edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
207111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2072ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
207311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
207411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
207511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
207611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2077ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
2078ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                            const ActionList &Inputs) const {
207911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Action::ActionClass Key;
2080ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
208111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = Action::AnalyzeJobClass;
208211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
208311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = JA.getKind();
208411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
208511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
208611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
208711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
208811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
208911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
209011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
209111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
209211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
2093ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA, Inputs);
209411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
209511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
209611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
209711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
209811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
2099ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2100ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. SpencerWindows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
2101ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  : ToolChain(Host, Triple) {
2102ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2103ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2104ac0659ae4124156915eddf70e78065df224d34c8Daniel DunbarTool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
2105ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                          const ActionList &Inputs) const {
2106ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  Action::ActionClass Key;
2107ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
2108ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Key = Action::AnalyzeJobClass;
2109ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  else
2110ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Key = JA.getKind();
2111ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2112c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2113c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier                                             options::OPT_no_integrated_as,
2114c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier                                             IsIntegratedAssemblerDefault());
2115c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier
2116ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  Tool *&T = Tools[Key];
2117ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (!T) {
2118ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    switch (Key) {
2119ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::InputClass:
2120ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::BindArchClass:
2121e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth    case Action::LipoJobClass:
2122e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth    case Action::DsymutilJobClass:
2123f857186fd1995b34185d063a29b11ad4f948519fEric Christopher    case Action::VerifyJobClass:
2124b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Invalid tool kind.");
2125ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::PreprocessJobClass:
2126ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::PrecompileJobClass:
2127ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::AnalyzeJobClass:
2128ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::CompileJobClass:
2129ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      T = new tools::Clang(*this); break;
2130ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::AssembleJobClass:
2131c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier      if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO)
2132c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier        T = new tools::darwin::Assemble(*this);
2133c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier      else
2134c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier        T = new tools::ClangAs(*this);
2135c57114ab9f8e4c2d680f43a95fe23b13f446b723Chad Rosier      break;
2136ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::LinkJobClass:
2137ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      T = new tools::visualstudio::Link(*this); break;
2138ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    }
2139ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
2140ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2141ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return *T;
2142ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2143ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2144ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsIntegratedAssemblerDefault() const {
2145ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return true;
2146ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2147ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2148ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsUnwindTablesDefault() const {
2149ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  // FIXME: Gross; we should probably have some separate target
2150ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  // definition, possibly even reusing the one in clang.
2151ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return getArchName() == "x86_64";
2152ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2153ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2154ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetDefaultRelocationModel() const {
2155ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return "static";
2156ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2157ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
2158ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetForcedPicModel() const {
2159ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (getArchName() == "x86_64")
2160ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return "pic";
2161ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return 0;
2162ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
2163ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2164ca23419b8214654d185d595956e9ddf24984750aChandler Carruth// FIXME: This probably should goto to some platform utils place.
2165ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#ifdef _MSC_VER
2166ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2167ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// \brief Read registry string.
2168ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// This also supports a means to look for high-versioned keys by use
2169ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// of a $VERSION placeholder in the key path.
2170ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// $VERSION in the key path is a placeholder for the version number,
2171ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// causing the highest value path to be searched for and used.
2172ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// I.e. "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION".
2173ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// There can be additional characters in the component.  Only the numberic
2174ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// characters are compared.
2175ca23419b8214654d185d595956e9ddf24984750aChandler Carruthstatic bool getSystemRegistryString(const char *keyPath, const char *valueName,
2176ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                    char *value, size_t maxLength) {
2177ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  HKEY hRootKey = NULL;
2178ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  HKEY hKey = NULL;
2179ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char* subKey = NULL;
2180ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  DWORD valueType;
2181ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  DWORD valueSize = maxLength - 1;
2182ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  long lResult;
2183ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  bool returnValue = false;
2184ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2185ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) {
2186ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    hRootKey = HKEY_CLASSES_ROOT;
2187ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    subKey = keyPath + 18;
2188ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  } else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) {
2189ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    hRootKey = HKEY_USERS;
2190ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    subKey = keyPath + 11;
2191ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  } else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) {
2192ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    hRootKey = HKEY_LOCAL_MACHINE;
2193ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    subKey = keyPath + 19;
2194ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  } else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) {
2195ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    hRootKey = HKEY_CURRENT_USER;
2196ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    subKey = keyPath + 18;
2197ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  } else {
2198ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return false;
2199ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2200ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2201ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char *placeHolder = strstr(subKey, "$VERSION");
2202ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  char bestName[256];
2203ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  bestName[0] = '\0';
2204ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // If we have a $VERSION placeholder, do the highest-version search.
2205ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (placeHolder) {
2206ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    const char *keyEnd = placeHolder - 1;
2207ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    const char *nextKey = placeHolder;
2208ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    // Find end of previous key.
2209ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    while ((keyEnd > subKey) && (*keyEnd != '\\'))
2210ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      keyEnd--;
2211ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    // Find end of key containing $VERSION.
2212ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    while (*nextKey && (*nextKey != '\\'))
2213ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      nextKey++;
2214ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    size_t partialKeyLength = keyEnd - subKey;
2215ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    char partialKey[256];
2216ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (partialKeyLength > sizeof(partialKey))
2217ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      partialKeyLength = sizeof(partialKey);
2218ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    strncpy(partialKey, subKey, partialKeyLength);
2219ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    partialKey[partialKeyLength] = '\0';
2220ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    HKEY hTopKey = NULL;
2221ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    lResult = RegOpenKeyEx(hRootKey, partialKey, 0, KEY_READ, &hTopKey);
2222ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (lResult == ERROR_SUCCESS) {
2223ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      char keyName[256];
2224ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      int bestIndex = -1;
2225ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      double bestValue = 0.0;
2226ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      DWORD index, size = sizeof(keyName) - 1;
2227ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      for (index = 0; RegEnumKeyEx(hTopKey, index, keyName, &size, NULL,
2228ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          NULL, NULL, NULL) == ERROR_SUCCESS; index++) {
2229ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        const char *sp = keyName;
2230ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        while (*sp && !isdigit(*sp))
2231ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          sp++;
2232ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        if (!*sp)
2233ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          continue;
2234ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        const char *ep = sp + 1;
2235ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        while (*ep && (isdigit(*ep) || (*ep == '.')))
2236ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          ep++;
2237ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        char numBuf[32];
2238ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        strncpy(numBuf, sp, sizeof(numBuf) - 1);
2239ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        numBuf[sizeof(numBuf) - 1] = '\0';
2240ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        double value = strtod(numBuf, NULL);
2241ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        if (value > bestValue) {
2242ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          bestIndex = (int)index;
2243ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          bestValue = value;
2244ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          strcpy(bestName, keyName);
2245ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        }
2246ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        size = sizeof(keyName) - 1;
2247ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      }
2248ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      // If we found the highest versioned key, open the key and get the value.
2249ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      if (bestIndex != -1) {
2250ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        // Append rest of key.
2251ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        strncat(bestName, nextKey, sizeof(bestName) - 1);
2252ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        bestName[sizeof(bestName) - 1] = '\0';
2253ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        // Open the chosen key path remainder.
2254ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        lResult = RegOpenKeyEx(hTopKey, bestName, 0, KEY_READ, &hKey);
2255ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        if (lResult == ERROR_SUCCESS) {
2256ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
2257ca23419b8214654d185d595956e9ddf24984750aChandler Carruth            (LPBYTE)value, &valueSize);
2258ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          if (lResult == ERROR_SUCCESS)
2259ca23419b8214654d185d595956e9ddf24984750aChandler Carruth            returnValue = true;
2260ca23419b8214654d185d595956e9ddf24984750aChandler Carruth          RegCloseKey(hKey);
2261ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        }
2262ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      }
2263ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      RegCloseKey(hTopKey);
2264ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    }
2265ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  } else {
2266ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
2267ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (lResult == ERROR_SUCCESS) {
2268ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType,
2269ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        (LPBYTE)value, &valueSize);
2270ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      if (lResult == ERROR_SUCCESS)
2271ca23419b8214654d185d595956e9ddf24984750aChandler Carruth        returnValue = true;
2272ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      RegCloseKey(hKey);
2273ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    }
2274ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2275ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  return returnValue;
2276ca23419b8214654d185d595956e9ddf24984750aChandler Carruth}
2277ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2278ca23419b8214654d185d595956e9ddf24984750aChandler Carruth/// \brief Get Windows SDK installation directory.
2279ca23419b8214654d185d595956e9ddf24984750aChandler Carruthstatic bool getWindowsSDKDir(std::string &path) {
2280ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  char windowsSDKInstallDir[256];
2281ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Try the Windows registry.
2282ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  bool hasSDKDir = getSystemRegistryString(
2283ca23419b8214654d185d595956e9ddf24984750aChandler Carruth   "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\$VERSION",
2284ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                           "InstallationFolder",
2285ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                           windowsSDKInstallDir,
2286ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                           sizeof(windowsSDKInstallDir) - 1);
2287ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    // If we have both vc80 and vc90, pick version we were compiled with.
2288ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (hasSDKDir && windowsSDKInstallDir[0]) {
2289ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    path = windowsSDKInstallDir;
2290ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return true;
2291ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2292ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  return false;
2293ca23419b8214654d185d595956e9ddf24984750aChandler Carruth}
2294ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2295ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Get Visual Studio installation directory.
2296ca23419b8214654d185d595956e9ddf24984750aChandler Carruthstatic bool getVisualStudioDir(std::string &path) {
2297ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // First check the environment variables that vsvars32.bat sets.
2298ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char* vcinstalldir = getenv("VCINSTALLDIR");
2299ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (vcinstalldir) {
2300ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    char *p = const_cast<char *>(strstr(vcinstalldir, "\\VC"));
2301ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (p)
2302ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      *p = '\0';
2303ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    path = vcinstalldir;
2304ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return true;
2305ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2306ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2307ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  char vsIDEInstallDir[256];
2308ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  char vsExpressIDEInstallDir[256];
2309ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Then try the windows registry.
2310ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  bool hasVCDir = getSystemRegistryString(
2311ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\$VERSION",
2312ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "InstallDir", vsIDEInstallDir, sizeof(vsIDEInstallDir) - 1);
2313ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  bool hasVCExpressDir = getSystemRegistryString(
2314ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\$VERSION",
2315ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "InstallDir", vsExpressIDEInstallDir, sizeof(vsExpressIDEInstallDir) - 1);
2316ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    // If we have both vc80 and vc90, pick version we were compiled with.
2317ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (hasVCDir && vsIDEInstallDir[0]) {
2318ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    char *p = (char*)strstr(vsIDEInstallDir, "\\Common7\\IDE");
2319ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (p)
2320ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      *p = '\0';
2321ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    path = vsIDEInstallDir;
2322ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return true;
2323ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
23249cef8874ec046db3ba4784d4b2a2e608466f7d0cMichael J. Spencer
2325ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (hasVCExpressDir && vsExpressIDEInstallDir[0]) {
2326ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    char *p = (char*)strstr(vsExpressIDEInstallDir, "\\Common7\\IDE");
2327ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (p)
2328ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      *p = '\0';
2329ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    path = vsExpressIDEInstallDir;
2330ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return true;
2331ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2332ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2333ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Try the environment.
2334ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char *vs100comntools = getenv("VS100COMNTOOLS");
2335ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char *vs90comntools = getenv("VS90COMNTOOLS");
2336ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char *vs80comntools = getenv("VS80COMNTOOLS");
2337ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const char *vscomntools = NULL;
2338ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2339ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Try to find the version that we were compiled with
2340ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if(false) {}
2341ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  #if (_MSC_VER >= 1600)  // VC100
2342ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if(vs100comntools) {
2343ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs100comntools;
2344ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2345ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  #elif (_MSC_VER == 1500) // VC80
2346ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if(vs90comntools) {
2347ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs90comntools;
2348ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2349ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  #elif (_MSC_VER == 1400) // VC80
2350ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if(vs80comntools) {
2351ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs80comntools;
2352ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2353ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  #endif
2354ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // Otherwise find any version we can
2355ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if (vs100comntools)
2356ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs100comntools;
2357ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if (vs90comntools)
2358ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs90comntools;
2359ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  else if (vs80comntools)
2360ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    vscomntools = vs80comntools;
2361ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2362ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (vscomntools && *vscomntools) {
2363ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    const char *p = strstr(vscomntools, "\\Common7\\Tools");
2364ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    path = p ? std::string(vscomntools, p) : vscomntools;
2365ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return true;
2366ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2367ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  return false;
2368ca23419b8214654d185d595956e9ddf24984750aChandler Carruth}
2369ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2370ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#endif // _MSC_VER
2371ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2372ca23419b8214654d185d595956e9ddf24984750aChandler Carruthvoid Windows::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2373ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                        ArgStringList &CC1Args) const {
2374103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
2375103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    return;
2376103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth
2377103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2378103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    // Ignore the sysroot, we *always* look for clang headers relative to
2379103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    // supplied path.
2380103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    llvm::sys::Path P(getDriver().ResourceDir);
2381103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    P.appendComponent("include");
2382103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    CC1Args.push_back("-internal-nosysroot-isystem");
2383103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(P.str()));
2384103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth  }
2385103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth
2386103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2387103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth    return;
2388103accc00cf1c9a09790ef487a9fb89ec0750fd7Chandler Carruth
2389ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  std::string VSDir;
2390ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  std::string WindowsSDKDir;
2391ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2392ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#ifdef _MSC_VER
2393ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // When built with access to the proper Windows APIs, try to actually find
2394ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // the correct include paths first.
2395ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  if (getVisualStudioDir(VSDir)) {
2396ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    addSystemInclude(DriverArgs, CC1Args, VSDir + "\\VC\\include");
2397ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    if (getWindowsSDKDir(WindowsSDKDir))
2398ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      addSystemInclude(DriverArgs, CC1Args, WindowsSDKDir + "\\include");
2399ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    else
2400ca23419b8214654d185d595956e9ddf24984750aChandler Carruth      addSystemInclude(DriverArgs, CC1Args,
2401ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                       VSDir + "\\VC\\PlatformSDK\\Include");
2402ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    return;
2403ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  }
2404ca23419b8214654d185d595956e9ddf24984750aChandler Carruth#endif // _MSC_VER
2405ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2406ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // As a fallback, select default install paths.
2407ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  const StringRef Paths[] = {
2408ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "C:/Program Files/Microsoft Visual Studio 10.0/VC/include",
2409ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "C:/Program Files/Microsoft Visual Studio 9.0/VC/include",
2410ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include",
2411ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "C:/Program Files/Microsoft Visual Studio 8/VC/include",
2412ca23419b8214654d185d595956e9ddf24984750aChandler Carruth    "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include"
2413ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  };
2414ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  addSystemIncludes(DriverArgs, CC1Args, Paths);
2415ca23419b8214654d185d595956e9ddf24984750aChandler Carruth}
2416ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
2417ca23419b8214654d185d595956e9ddf24984750aChandler Carruthvoid Windows::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2418ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                           ArgStringList &CC1Args) const {
2419ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  // FIXME: There should probably be logic here to find libc++ on Windows.
2420ca23419b8214654d185d595956e9ddf24984750aChandler Carruth}
2421