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