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