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