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