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 "clang/Basic/ObjCRuntime.h" 1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/Version.h" 13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX 140f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h" 15c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h" 164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 17265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 181b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov#include "clang/Driver/SanitizerArgs.h" 1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/STLExtras.h" 2000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h" 21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h" 22a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson#include "llvm/ADT/StringSwitch.h" 23b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h" 24b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h" 25b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h" 26b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h" 2784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 2832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h" 29c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h" 3003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h" 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Program.h" 3255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h" 33f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include <system_error> 35f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 363917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 373917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang; 39b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt; 403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 41651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMachO::MachO(const Driver &D, const llvm::Triple &Triple, 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const ArgList &Args) 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : ToolChain(D, Triple, Args) { 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getProgramPaths().push_back(getDriver().getInstalledDir()); 456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (getDriver().getInstalledDir() != getDriver().Dir) 466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getProgramPaths().push_back(getDriver().Dir); 476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // We expect 'as', 'ld', etc. to be adjacent to our install dir. 496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getProgramPaths().push_back(getDriver().getInstalledDir()); 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (getDriver().getInstalledDir() != getDriver().Dir) 516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getProgramPaths().push_back(getDriver().Dir); 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Darwin - Darwin tool chain for i386 and x86_64. 55651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDarwin::Darwin(const Driver & D, const llvm::Triple & Triple, 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const ArgList & Args) 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : MachO(D, Triple, Args), TargetInitialized(false) { 581085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson // Compute the initial Darwin version from the triple 591085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson unsigned Major, Minor, Micro; 604c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson if (!Triple.getMacOSXVersion(Major, Minor, Micro)) 614c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson getDriver().Diag(diag::err_drv_invalid_darwin_version) << 624c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson Triple.getOSName(); 634c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson llvm::raw_string_ostream(MacosxVersionMin) 644c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson << Major << '.' << Minor << '.' << Micro; 654c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson 661085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson // FIXME: DarwinVersion is only used to find GCC's libexec directory. 671085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson // It should be removed when we stop supporting that. 681085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson DarwinVersion[0] = Minor + 4; 691085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson DarwinVersion[1] = Micro; 701085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson DarwinVersion[2] = 0; 71c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier 72c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier // Compute the initial iOS version from the triple 738c990274ae17cf7c56048ee453b0566515633b7fChad Rosier Triple.getiOSVersion(Major, Minor, Micro); 74c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier llvm::raw_string_ostream(iOSVersionMin) 75c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier << Major << '.' << Minor << '.' << Micro; 761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypes::ID MachO::LookupTypeForExtension(const char *Ext) const { 794180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar types::ID Ty = types::lookupTypeForExtension(Ext); 804180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 814180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar // Darwin always preprocesses assembly files (unless -x is used explicitly). 824180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar if (Ty == types::TY_PP_Asm) 834180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return types::TY_Asm; 844180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 854180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return Ty; 864180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar} 874180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::HasNativeLLVMSupport() const { 89b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar return true; 90b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar} 91b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 929f084a3166b684573ba49df28fc5792bc37d92e1John McCall/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0. 93260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const { 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) 95260611a32535c851237926bfcf78869b13c07d5bJohn McCall return ObjCRuntime(ObjCRuntime::iOS, TargetVersion); 96377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson if (isNonFragile) 97377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion); 98377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion); 999f084a3166b684573ba49df28fc5792bc37d92e1John McCall} 1009f084a3166b684573ba49df28fc5792bc37d92e1John McCall 10113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2. 10213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCallbool Darwin::hasBlocksRuntime() const { 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) 10413db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall return !isIPhoneOSVersionLT(3, 2); 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else { 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetMacOS() && "unexpected darwin target"); 10713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall return !isMacosxVersionLT(10, 6); 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 10913db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall} 11013db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall 1115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMArch(StringRef Value) { 112a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson return llvm::StringSwitch<const char*>(Value) 113a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("armv6k", "armv6") 1142503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("armv6m", "armv6m") 115a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("armv5tej", "armv5") 116a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("xscale", "xscale") 117a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("armv4t", "armv4t") 118a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("armv7", "armv7") 119a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Cases("armv7a", "armv7-a", "armv7") 120a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Cases("armv7r", "armv7-r", "armv7") 1212503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7em", "armv7e-m", "armv7em") 122336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7k", "armv7-k", "armv7k") 1232503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7m", "armv7-m", "armv7m") 124336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7s", "armv7-s", "armv7s") 1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines .Default(nullptr); 126eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 1285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMCpu(StringRef Value) { 129a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson return llvm::StringSwitch<const char *>(Value) 130a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5") 131a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Cases("arm10e", "arm10tdmi", "armv5") 132a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5") 133a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson .Case("xscale", "xscale") 1342503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6") 1352503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m0", "armv6m") 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "armv7") 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "armv7") 138b029c5038b73fd093291f40059614b5421a45ec8Renato Golin .Cases("cortex-r4", "cortex-r5", "armv7r") 1392503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m3", "armv7m") 1402503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m4", "armv7em") 141336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("swift", "armv7s") 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines .Default(nullptr); 143eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 144eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isSoftFloatABI(const ArgList &Args) { 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines options::OPT_mfloat_abi_EQ); 148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!A) 149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return A->getOption().matches(options::OPT_msoft_float) || 152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (A->getOption().matches(options::OPT_mfloat_abi_EQ) && 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines A->getValue() == StringRef("soft")); 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 156651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesStringRef MachO::getMachOArchName(const ArgList &Args) const { 157eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar switch (getTriple().getArch()) { 158eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar default: 159eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return getArchName(); 160304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi 161f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor case llvm::Triple::thumb: 162eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar case llvm::Triple::arm: { 163eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 1641d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (const char *Arch = GetArmArchForMArch(A->getValue())) 165eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 166eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 167eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 1681d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (const char *Arch = GetArmArchForMCpu(A->getValue())) 169eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 170eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 171eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "arm"; 172eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 173eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 174eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 175eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 176f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() { 1778eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 179651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMachO::~MachO() { 180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstd::string MachO::ComputeEffectiveClangTriple(const ArgList &Args, 184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines types::ID InputType) const { 185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Triple.getTriple(); 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, 19161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const { 19261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier llvm::Triple Triple(ComputeLLVMTriple(Args, InputType)); 19300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 19400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // If the target isn't initialized (e.g., an unknown Darwin platform, return 19500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // the default triple). 19600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (!isTargetInitialized()) 19700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 198304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallString<16> Str; 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Str += isTargetIOSBased() ? "ios" : "macosx"; 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Str += getTargetVersion().getAsString(); 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Triple.setOSName(Str); 20300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 20400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 20500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 20600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 20799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid Generic_ELF::anchor() {} 20899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 209651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::getTool(Action::ActionClass AC) const { 2105b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola switch (AC) { 211f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola case Action::LipoJobClass: 212f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Lipo) 213f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Lipo.reset(new tools::darwin::Lipo(*this)); 214f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Lipo.get(); 215f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola case Action::DsymutilJobClass: 216f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Dsymutil) 217f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Dsymutil.reset(new tools::darwin::Dsymutil(*this)); 218f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Dsymutil.get(); 219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Action::VerifyDebugInfoJobClass: 220f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!VerifyDebug) 221f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola VerifyDebug.reset(new tools::darwin::VerifyDebug(*this)); 222f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return VerifyDebug.get(); 223c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola default: 224f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return ToolChain::getTool(AC); 2258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 228651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::buildLinker() const { 229f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::darwin::Link(*this); 230f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 231f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 232651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::buildAssembler() const { 233f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::darwin::Assemble(*this); 234f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2356cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 236af370e6e051e505016637e23418354db625dc796Rafael EspindolaDarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple, 237af370e6e051e505016637e23418354db625dc796Rafael Espindola const ArgList &Args) 238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : Darwin(D, Triple, Args) { 2391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const { 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // For iOS, 64-bit, promote certain warnings to errors. 243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!isTargetMacOS() && getTriple().isArch64Bit()) { 244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Always enable -Wdeprecated-objc-isa-usage and promote it 245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // to an error. 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CC1Args.push_back("-Wdeprecated-objc-isa-usage"); 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CC1Args.push_back("-Werror=deprecated-objc-isa-usage"); 248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Also error about implicit function declarations, as that 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // can impact calling conventions. 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CC1Args.push_back("-Werror=implicit-function-declaration"); 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Determine whether Objective-C automated reference counting is 256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// enabled. 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isObjCAutoRefCount(const ArgList &Args) { 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); 259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 261f85e193739c953358c865005855253af4f68a497John McCallvoid DarwinClang::AddLinkARCArgs(const ArgList &Args, 262f85e193739c953358c865005855253af4f68a497John McCall ArgStringList &CmdArgs) const { 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Avoid linking compatibility stubs on i386 mac. 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetMacOS() && getArch() == llvm::Triple::x86) 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true); 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) && 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines runtime.hasSubscripting()) 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 272f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 273f857186fd1995b34185d063a29b11ad4f948519fEric Christopher CmdArgs.push_back("-force_load"); 2747b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> P(getDriver().ClangExecutable); 2757b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::remove_filename(P); // 'clang' 2767b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::remove_filename(P); // 'bin' 277ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer llvm::sys::path::append(P, "lib", "arc", "libarclite_"); 278f85e193739c953358c865005855253af4f68a497John McCall // Mash in the platform. 279c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis if (isTargetIOSSimulator()) 2807b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola P += "iphonesimulator"; 281c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis else if (isTargetIPhoneOS()) 2827b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola P += "iphoneos"; 283f85e193739c953358c865005855253af4f68a497John McCall else 2847b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola P += "macosx"; 2857b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola P += ".a"; 286f85e193739c953358c865005855253af4f68a497John McCall 2877b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola CmdArgs.push_back(Args.MakeArgString(P)); 288f85e193739c953358c865005855253af4f68a497John McCall} 289f85e193739c953358c865005855253af4f68a497John McCall 290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs, 291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef DarwinStaticLib, bool AlwaysLink, 292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsEmbedded) const { 2937b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> P(getDriver().ResourceDir); 294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::sys::path::append(P, "lib", IsEmbedded ? "macho_embedded" : "darwin", 295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DarwinStaticLib); 296f857186fd1995b34185d063a29b11ad4f948519fEric Christopher 2973404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher // For now, allow missing resource libraries to support developers who may 29869b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov // not have compiler-rt checked out or integrated into their build (unless 29969b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov // we explicitly force linking with this library). 30040e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (AlwaysLink || llvm::sys::fs::exists(P.str())) 3013404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher CmdArgs.push_back(Args.MakeArgString(P.str())); 3023404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher} 3033404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher 3041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 3051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 306c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar // Darwin only supports the compiler-rt based runtime libraries. 307c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar switch (GetRuntimeLibType(Args)) { 308c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar case ToolChain::RLT_CompilerRT: 309c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar break; 310c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar default: 311c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) 3121d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin"; 313c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return; 314c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar } 315c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar 316eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Darwin doesn't support real static executables, don't link any runtime 317eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // libraries with -static. 3187a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar if (Args.hasArg(options::OPT_static) || 3197a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar Args.hasArg(options::OPT_fapple_kext) || 3207a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar Args.hasArg(options::OPT_mkernel)) 3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3221d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Reject -static-libgcc for now, we can deal with this when and if someone 3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // cares. This is useful in situations where someone wants to statically link 3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // something like libstdc++, and needs its runtime support routines. 3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 3275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_unsupported_opt) 3281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar << A->getAsString(Args); 3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 3311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 332f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar // If we are building profile support, link that library in. 333f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar if (Args.hasArg(options::OPT_fprofile_arcs) || 334f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar Args.hasArg(options::OPT_fprofile_generate) || 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(options::OPT_fprofile_instr_generate) || 336f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar Args.hasArg(options::OPT_fcreate_profile) || 337f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar Args.hasArg(options::OPT_coverage)) { 338f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar // Select the appropriate runtime library for the target. 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) 340f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a"); 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 342f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a"); 343f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar } 344f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar 345c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne const SanitizerArgs &Sanitize = getSanitizerArgs(); 346bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov 34775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov // Add Ubsan runtime library, if required. 34875fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov if (Sanitize.needsUbsanRt()) { 349c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) { 35175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) 35275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov << "-fsanitize=undefined"; 35375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov } else { 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetMacOS() && "unexpected non OS X target"); 35569b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true); 35675fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov 35775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov // The Ubsan runtime library requires C++. 35875fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov AddCXXStdlibLibArgs(Args, CmdArgs); 35975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov } 36075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov } 36175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov 3627b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany // Add ASAN runtime library, if required. Dynamic libraries and bundles 3637b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany // should not be linked with the runtime library. 364bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov if (Sanitize.needsAsanRt()) { 365c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds. 366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIPhoneOS()) { 36794b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar getDriver().Diag(diag::err_drv_clang_unsupported_per_platform) 368bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov << "-fsanitize=address"; 36994b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar } else { 3704123b92f915fb27855ddaa294b0c7de7aa6c6274Alexander Potapenko if (!Args.hasArg(options::OPT_dynamiclib) && 3714123b92f915fb27855ddaa294b0c7de7aa6c6274Alexander Potapenko !Args.hasArg(options::OPT_bundle)) { 3723656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko // The ASAN runtime library requires C++. 3733656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko AddCXXStdlibLibArgs(Args, CmdArgs); 3743656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko } 375cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko if (isTargetMacOS()) { 376cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko AddLinkRuntimeLib(Args, CmdArgs, 377cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko "libclang_rt.asan_osx_dynamic.dylib", 378cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko true); 379cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko } else { 380cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko if (isTargetIOSSimulator()) { 381cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko AddLinkRuntimeLib(Args, CmdArgs, 382cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko "libclang_rt.asan_iossim_dynamic.dylib", 383cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko true); 384cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko } 385cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko } 38694b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar } 38794b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar } 38894b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar 389eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Otherwise link libSystem, then the dynamic runtime library, and finally any 390eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // target specific static runtime library. 3911d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar CmdArgs.push_back("-lSystem"); 392eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 393eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Select the dynamic runtime library and the target specific static library. 394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()) { 39587e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1, 39687e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar // it never went into the SDK. 397163b151809beef8f917fd16c546016e83ae3e361Bob Wilson // Linking against libgcc_s.1 isn't needed for iOS 5.0+ 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() && 3996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (getTriple().getArch() != llvm::Triple::arm64 && 4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() != llvm::Triple::aarch64)) 401163b151809beef8f917fd16c546016e83ae3e361Bob Wilson CmdArgs.push_back("-lgcc_s.1"); 402eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 4033cceec5e05d974f3993bd0a745325f76fb8e4efcDaniel Dunbar // We currently always need a static runtime library for iOS. 4043404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a"); 405eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } else { 406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetMacOS() && "unexpected non MacOS platform"); 407eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // The dynamic runtime library was merged with libSystem for 10.6 and 408eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // beyond; only 10.4 and 10.5 need an additional runtime library. 409ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 410eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 411ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 412eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 413eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 414885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // For OS X, we thought we would only need a static runtime library when 415fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner // targeting 10.4, to provide versions of the static functions which were 416885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // omitted from 10.4.dylib. 417885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // 418885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // Unfortunately, that turned out to not be true, because Darwin system 419885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // headers can still use eprintf on i386, and it is not exported from 420885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // libSystem. Therefore, we still must provide a runtime library just for 421885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // the tiny tiny handful of projects that *might* use that symbol. 422885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar if (isMacosxVersionLT(10, 5)) { 4233404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a"); 424885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar } else { 425885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar if (getTriple().getArch() == llvm::Triple::x86) 4263404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a"); 4273404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a"); 428885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar } 429eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 4301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 4311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 43260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 433ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const OptTable &Opts = getDriver().getOpts(); 434ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 4359101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar // Support allowing the SDKROOT environment variable used by xcrun and other 4369101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar // Xcode tools to define the default sysroot, by making it the default for 4379101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar // isysroot. 438d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 439d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier // Warn if the path does not exist. 44040e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (!llvm::sys::fs::exists(A->getValue())) 441d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue(); 442d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier } else { 4439101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar if (char *env = ::getenv("SDKROOT")) { 444321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar // We only use this value as the default if it is an absolute path, 445321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar // exists, and it is not the root path. 446321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) && 447321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar StringRef(env) != "/") { 4489101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar Args.append(Args.MakeSeparateArg( 4496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, Opts.getOption(options::OPT_isysroot), env)); 4509101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar } 4519101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar } 4529101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar } 4539101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar 4542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 4559d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 4569d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar Arg *iOSSimVersion = Args.getLastArg( 4579d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_mios_simulator_version_min_EQ); 458983d835bead0134170a6646a8844926077c968d6Eli Friedman 4599d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar if (OSXVersion && (iOSVersion || iOSSimVersion)) { 4605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_argument_not_allowed_with) 461ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 4629d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args); 4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines iOSVersion = iOSSimVersion = nullptr; 4649d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar } else if (iOSVersion && iOSSimVersion) { 4655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_argument_not_allowed_with) 4669d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar << iOSVersion->getAsString(Args) 4679d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar << iOSSimVersion->getAsString(Args); 4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines iOSSimVersion = nullptr; 4699d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) { 470a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier // If no deployment target was specified on the command line, check for 471816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // environment defines. 472a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier StringRef OSXTarget; 473a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier StringRef iOSTarget; 474a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier StringRef iOSSimTarget; 475a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET")) 476a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier OSXTarget = env; 477a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET")) 478a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier iOSTarget = env; 479a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET")) 480a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier iOSSimTarget = env; 481a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier 482a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // If no '-miphoneos-version-min' specified on the command line and 483a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default 484241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif // based on -isysroot. 485a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (iOSTarget.empty()) { 486a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 487a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier StringRef first, second; 4881d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef isysroot = A->getValue(); 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS")); 490a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (second != "") 491a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier iOSTarget = second.substr(0,3); 492a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier } 493a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier } 494816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 4954f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier // If no OSX or iOS target has been specified and we're compiling for armv7, 4964f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier // go ahead as assume we're targeting iOS. 497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef MachOArchName = getMachOArchName(Args); 49849033207b75216a956f3dbf7d018fb3343a54ec1Chad Rosier if (OSXTarget.empty() && iOSTarget.empty() && 499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (MachOArchName == "armv7" || MachOArchName == "armv7s" || 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MachOArchName == "arm64")) 50187ca5580302561c839b2cd12207902b9bf4ed117Chad Rosier iOSTarget = iOSVersionMin; 5024f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier 5039d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // Handle conflicting deployment targets 50439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // 50539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: Don't hardcode default here. 5069d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar 5079d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // Do not allow conflicts with the iOS simulator target. 508a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) { 5095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_conflicting_deployment_targets) 5109d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar << "IOS_SIMULATOR_DEPLOYMENT_TARGET" 511a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" : 5129d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar "IPHONEOS_DEPLOYMENT_TARGET"); 5139d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar } 5149d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar 5159d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // Allow conflicts among OSX and iOS for historical reasons, but choose the 5169d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // default platform. 517a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (!OSXTarget.empty() && !iOSTarget.empty()) { 51839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm64 || 5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::aarch64 || 52139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) 522a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier OSXTarget = ""; 52339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar else 524a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier iOSTarget = ""; 52539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar } 5261a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar 527a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier if (!OSXTarget.empty()) { 528e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget); 53060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar Args.append(OSXVersion); 531a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier } else if (!iOSTarget.empty()) { 532e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget); 5349d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar Args.append(iOSVersion); 535a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier } else if (!iOSSimTarget.empty()) { 536e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option O = Opts.getOption( 5379d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_mios_simulator_version_min_EQ); 5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines iOSSimVersion = Args.MakeJoinedArg(nullptr, O, iOSSimTarget); 5399d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar Args.append(iOSSimVersion); 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" && 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MachOArchName != "armv7em") { 5422bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar // Otherwise, assume we are targeting OS X. 543e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OSXVersion = Args.MakeJoinedArg(nullptr, O, MacosxVersionMin); 54560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar Args.append(OSXVersion); 54630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } 547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 5481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DarwinPlatformKind Platform; 550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (OSXVersion) 551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Platform = MacOS; 552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (iOSVersion) 553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Platform = IPhoneOS; 554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (iOSSimVersion) 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Platform = IPhoneOSSimulator; 556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm_unreachable("Unable to infer Darwin variant"); 558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5593fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar // Reject invalid architecture combinations. 5603fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 && 5613fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar getTriple().getArch() != llvm::Triple::x86_64)) { 5625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target) 5633fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar << getTriple().getArchName() << iOSSimVersion->getAsString(Args); 5643fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar } 5653fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar 5662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // Set the tool chain target information. 5672603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar unsigned Major, Minor, Micro; 5682603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool HadExtra; 569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Platform == MacOS) { 5709d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!"); 5711d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, 5722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 5738a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar Major != 10 || Minor >= 100 || Micro >= 100) 5745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_version_number) 5752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << OSXVersion->getAsString(Args); 576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Platform == IPhoneOS || Platform == IPhoneOSSimulator) { 5779d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion; 5789d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar assert(Version && "Unknown target platform!"); 5791d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor, 580983d835bead0134170a6646a8844926077c968d6Eli Friedman Micro, HadExtra) || HadExtra || 581983d835bead0134170a6646a8844926077c968d6Eli Friedman Major >= 10 || Minor >= 100 || Micro >= 100) 582983d835bead0134170a6646a8844926077c968d6Eli Friedman getDriver().Diag(diag::err_drv_invalid_version_number) 583983d835bead0134170a6646a8844926077c968d6Eli Friedman << Version->getAsString(Args); 584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else 585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm_unreachable("unknown kind of Darwin platform"); 5865f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 5875f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar // In GCC, the simulator historically was treated as being OS X in some 5885f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar // contexts, like determining the link logic, despite generally being called 5895f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar // with an iOS deployment target. For compatibility, we detect the 5905f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar // simulator as iOS + x86, and treat it differently in a few contexts. 5915f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 || 5925f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64)) 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Platform = IPhoneOSSimulator; 5945f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar 595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines setTarget(Platform, Major, Minor, Micro); 596c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar} 597c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 598132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 599efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar ArgStringList &CmdArgs) const { 600efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CXXStdlibType Type = GetCXXStdlibType(Args); 601efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 602efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar switch (Type) { 603efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar case ToolChain::CST_Libcxx: 604efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("-lc++"); 605efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar break; 606efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 607efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar case ToolChain::CST_Libstdcxx: { 608efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 609efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // it was previously found in the gcc lib dir. However, for all the Darwin 610efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // platforms we care about it was -lstdc++.6, so we search for that 611efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // explicitly if we can't see an obvious -lstdc++ candidate. 612efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 613efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Check in the sysroot first. 614efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 6157b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> P(A->getValue()); 616ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib"); 617efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 61840e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (!llvm::sys::fs::exists(P.str())) { 6197b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::remove_filename(P); 6207b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(P, "libstdc++.6.dylib"); 62140e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (llvm::sys::fs::exists(P.str())) { 622efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 623efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar return; 624efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 625efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 626efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 627efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 628efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Otherwise, look in the root. 6295a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson // FIXME: This should be removed someday when we don't have to care about 6305a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist. 63140e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") && 63240e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) { 633efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 634efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar return; 635efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 636efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 637efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Otherwise, let the linker search. 638efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("-lstdc++"); 639efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar break; 640efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 641efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 642efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar} 643efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 6447433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args, 6457433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const { 6467433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 6477433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // For Darwin platforms, use the compiler-rt-based support library 6487433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // instead of the gcc-provided one (which is also incidentally 6497433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // only present in the gcc lib dir, which makes it hard to find). 6507433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 6517b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> P(getDriver().ResourceDir); 652ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer llvm::sys::path::append(P, "lib", "darwin"); 6537a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar 6547a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // Use the newer cc_kext for iOS ARM after 6.0. 6557a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar if (!isTargetIPhoneOS() || isTargetIOSSimulator() || 656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm64 || 6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::aarch64 || 6587a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar !isIPhoneOSVersionLT(6, 0)) { 6597b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(P, "libclang_rt.cc_kext.a"); 6607a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar } else { 6617b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a"); 6627a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar } 663304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi 6647433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // For now, allow missing resource libraries to support developers who may 6657433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // not have compiler-rt checked out or integrated into their build. 66640e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola if (llvm::sys::fs::exists(P.str())) 6677433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen CmdArgs.push_back(Args.MakeArgString(P.str())); 6687433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 6697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 670651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args, 671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *BoundArch) const { 672c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 673c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar const OptTable &Opts = getDriver().getOpts(); 674c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 675c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 676c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // translation business, as it makes the driver functionality much 677c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 678c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 679c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // have something that works, we should reevaluate each translation 680c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // and try to push it down into tool specific logic. 6812603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 6826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (Arg *A : Args) { 6834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 6842a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar // Skip this argument unless the architecture matches either the toolchain 6852a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar // triple arch, or the arch being bound. 68664f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola llvm::Triple::ArchType XarchArch = 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tools::darwin::getArchTypeForMachOArchName(A->getValue(0)); 68864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola if (!(XarchArch == getArch() || 68964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola (BoundArch && XarchArch == 690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tools::darwin::getArchTypeForMachOArchName(BoundArch)))) 6914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 6924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 6938ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar Arg *OriginalArg = A; 6941d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1)); 6950e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar unsigned Prev = Index; 6966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index)); 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 6994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 7004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 7014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 7024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 7034e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 7044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 7054e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 7060e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar if (!XarchArg || Index > Prev + 1) { 7075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args) 7087e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar << A->getAsString(Args); 7097e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar continue; 71091e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer } else if (XarchArg->getOption().hasFlag(options::DriverOption)) { 7115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver) 7124e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 7134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 7144e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 7154e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 716478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 7170e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar 7186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines A = XarchArg.release(); 7190e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar DAL->AddSynthesizedArg(A); 7208ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar 7218ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // Linker input arguments require custom handling. The problem is that we 7228ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // have already constructed the phase actions, so we can not treat them as 7238ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // "input arguments". 72491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer if (A->getOption().hasFlag(options::LinkerInput)) { 7258ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar // Convert the argument into individual Zlinker_input_args. 7268ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) { 7278ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar DAL->AddSeparateArg(OriginalArg, 7288ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar Opts.getOption(options::OPT_Zlinker_input), 7291d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith A->getValue(i)); 730304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi 7318ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar } 7328ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar continue; 7338ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar } 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 736ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 737ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 7399e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar switch ((options::ID) A->getOption().getID()) { 740ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 741ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 742ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 744ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 745ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 746ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 7479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 748ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 750ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 7519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 7521d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith A->getValue()); 753ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 754ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 755ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 7569d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 7579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7589d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 759ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 760ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 761ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 7629d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 7639d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7649d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 765ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 766ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 767ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 7689d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 769ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 770ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 771ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 7729d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 773ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 774ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 775ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 7769d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 777ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 778ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 779ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 7809d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7819d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 782ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 783ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 784ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 7859d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7869d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 787ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 788ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 789ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 7909d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 791ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 792ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 793ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 7949d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 795ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 796ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 7974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 7984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (getTriple().getArch() == llvm::Triple::x86 || 80084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64) 801e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 8026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ), 8036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "core2"); 80484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 80584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // Add the arch options based on the particular spelling of -arch, to match 806c97e96a61fca41e84d5af3027b91cc1db32f1654Chad Rosier // how the driver driver works. 80784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (BoundArch) { 8085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Name = BoundArch; 809e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ); 810e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer const Option MArch = Opts.getOption(options::OPT_march_EQ); 81184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 81284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 81384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // which defines the list of which architectures we accept. 81484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (Name == "ppc") 81584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 81684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc601") 8176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "601"); 81884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc603") 8196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "603"); 82084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604") 8216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "604"); 82284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604e") 8236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "604e"); 82484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc750") 8256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "750"); 82684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7400") 8276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "7400"); 82884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7450") 8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "7450"); 83084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc970") 8316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MCpu, "970"); 83284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 833ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt else if (Name == "ppc64" || Name == "ppc64le") 8346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 83584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 83684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i386") 83784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 83884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i486") 8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "i486"); 84084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i586") 8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "i586"); 84284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i686") 8436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "i686"); 84484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium") 8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "pentium"); 84684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium2") 8476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "pentium2"); 84884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentpro") 8496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "pentiumpro"); 85084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentIIm3") 8516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "pentium2"); 85284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 85384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "x86_64") 8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 85532ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach else if (Name == "x86_64h") { 8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64)); 8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "x86_64h"); 85832ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach } 859ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 86084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "arm") 8616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv4t"); 86284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv4t") 8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv4t"); 86484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv5") 8656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv5tej"); 86684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "xscale") 8676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "xscale"); 86884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv6") 8696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv6k"); 8702503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson else if (Name == "armv6m") 8716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv6m"); 87284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv7") 8736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv7a"); 8742503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson else if (Name == "armv7em") 8756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv7em"); 876336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson else if (Name == "armv7k") 8776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv7k"); 8782503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson else if (Name == "armv7m") 8796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv7m"); 880336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson else if (Name == "armv7s") 8816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "armv7s"); 88284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (Name == "arm64") 8846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "arm64"); 885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (Name == "armv8") 8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, MArch, "arm64"); 88784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar } 888ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DAL; 890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid MachO::AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, 893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const { 894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Embedded targets are simple at the moment, not supporting sanitizers and 895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // with different libraries for each member of the product { static, PIC } x 896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // { hard-float, soft-float } 897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::SmallString<32> CompilerRT = StringRef("libclang_rt."); 898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompilerRT += 899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tools::arm::getARMFloatABI(getDriver(), Args, getTriple()) == "hard" 900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ? "hard" 901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : "soft"; 902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a"; 903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true); 905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 908651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *BoundArch) const { 910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // First get the generic Apple args, before moving onto Darwin-specific ones. 911651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch); 912651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const OptTable &Opts = getDriver().getOpts(); 913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If no architecture is bound, none of the translations here are relevant. 915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!BoundArch) 916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return DAL; 917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 91860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // Add an explicit version min argument for the deployment target. We do this 91960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // after argument translation because -Xarch_ arguments may add a version min 92060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // argument. 921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AddDeploymentTarget(*DAL); 92260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar 9237a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext. 9247a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // FIXME: It would be far better to avoid inserting those -static arguments, 9257a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // but we can't check the deployment target in the translation code until 9267a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar // it is set here. 927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0) && 9286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() != llvm::Triple::arm64 && 9296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() != llvm::Triple::aarch64) { 9307a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) { 9317a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar Arg *A = *it; 9327a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar ++it; 9337a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar if (A->getOption().getID() != options::OPT_mkernel && 9347a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar A->getOption().getID() != options::OPT_fapple_kext) 9357a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar continue; 9367a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar assert(it != ie && "unexpected argument translation"); 9377a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar A = *it; 9387a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar assert(A->getOption().getID() == options::OPT_static && 9397a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar "missing expected -static argument"); 9407a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar it = DAL->getArgs().erase(it); 9417a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar } 9427a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar } 9437a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar 94466dbb3f95e1666089acd3431792d02c623e459fcBob Wilson // Default to use libc++ on OS X 10.9+ and iOS 7+. 94566dbb3f95e1666089acd3431792d02c623e459fcBob Wilson if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) || 946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) && 94766dbb3f95e1666089acd3431792d02c623e459fcBob Wilson !Args.getLastArg(options::OPT_stdlib_EQ)) 9486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ), 9496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "libc++"); 95066dbb3f95e1666089acd3431792d02c623e459fcBob Wilson 951163b151809beef8f917fd16c546016e83ae3e361Bob Wilson // Validate the C++ standard library choice. 952163b151809beef8f917fd16c546016e83ae3e361Bob Wilson CXXStdlibType Type = GetCXXStdlibType(*DAL); 953163b151809beef8f917fd16c546016e83ae3e361Bob Wilson if (Type == ToolChain::CST_Libcxx) { 954260611a32535c851237926bfcf78869b13c07d5bJohn McCall // Check whether the target provides libc++. 955260611a32535c851237926bfcf78869b13c07d5bJohn McCall StringRef where; 956260611a32535c851237926bfcf78869b13c07d5bJohn McCall 957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Complain about targeting iOS < 5.0 in any way. 958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0)) 959377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson where = "iOS 5.0"; 960260611a32535c851237926bfcf78869b13c07d5bJohn McCall 961260611a32535c851237926bfcf78869b13c07d5bJohn McCall if (where != StringRef()) { 962163b151809beef8f917fd16c546016e83ae3e361Bob Wilson getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) 963260611a32535c851237926bfcf78869b13c07d5bJohn McCall << where; 964163b151809beef8f917fd16c546016e83ae3e361Bob Wilson } 965163b151809beef8f917fd16c546016e83ae3e361Bob Wilson } 966163b151809beef8f917fd16c546016e83ae3e361Bob Wilson 9674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 9698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::IsUnwindTablesDefault() const { 971a4a809e23ef17bef21afc50e70412a77567807aeRafael Espindola return getArch() == llvm::Triple::x86_64; 9728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 9738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::UseDwarfDebugFlags() const { 975f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 976f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return S[0] != '\0'; 977f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return false; 978f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar} 979f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 980b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const { 981b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar // Darwin uses SjLj exceptions on ARM. 982b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar return (getTriple().getArch() == llvm::Triple::arm || 983b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar getTriple().getArch() == llvm::Triple::thumb); 984b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar} 985b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPICDefault() const { 9877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth return true; 9888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 9898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPIEDefault() const { 99152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne return false; 99252ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne} 99352ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne 994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPICDefaultForced() const { 995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return (getArch() == llvm::Triple::x86_64 || 9966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getArch() == llvm::Triple::arm64 || 9976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getArch() == llvm::Triple::aarch64); 9988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 9998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::SupportsProfiling() const { 1001bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar // Profiling instrumentation is only supported on x86. 100264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64; 1003bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar} 1004bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar 1005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Darwin::addMinVersionArgs(const llvm::opt::ArgList &Args, 1006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const { 1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VersionTuple TargetVersion = getTargetVersion(); 1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we had an explicit -mios-simulator-version-min argument, honor that, 1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // otherwise use the traditional deployment targets. We can't just check the 1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // is-sim attribute because existing code follows this path, and the linker 1012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // may not handle the argument. 1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // 1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: We may be able to remove this, once we can verify no one depends on 1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // it. 1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ)) 1017651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-ios_simulator_version_min"); 1018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isTargetIOSBased()) 1019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-iphoneos_version_min"); 1020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else { 1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isTargetMacOS() && "unexpected target"); 1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-macosx_version_min"); 1023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString())); 1026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Darwin::addStartObjectFileArgs(const llvm::opt::ArgList &Args, 1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::opt::ArgStringList &CmdArgs) const { 1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Derived from startfile spec. 1031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_dynamiclib)) { 1032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Derived from darwin_dylib1 spec. 1033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSSimulator()) { 1034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ; // iOS simulator does not need dylib1.o. 1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (isTargetIPhoneOS()) { 1036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isIPhoneOSVersionLT(3, 1)) 1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-ldylib1.o"); 1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isMacosxVersionLT(10, 5)) 1040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-ldylib1.o"); 1041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isMacosxVersionLT(10, 6)) 1042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-ldylib1.10.5.o"); 1043651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_bundle)) { 1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Args.hasArg(options::OPT_static)) { 1047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Derived from darwin_bundle1 spec. 1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSSimulator()) { 1049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ; // iOS simulator does not need bundle1.o. 1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (isTargetIPhoneOS()) { 1051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isIPhoneOSVersionLT(3, 1)) 1052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lbundle1.o"); 1053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isMacosxVersionLT(10, 6)) 1055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lbundle1.o"); 1056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1057651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) { 1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_static) || 1061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(options::OPT_object) || 1062651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(options::OPT_preload)) { 1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lgcrt0.o"); 1064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lgcrt1.o"); 1066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // darwin_crt2 spec is empty. 1068651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // By default on OS X 10.8 and later, we don't link with a crt1.o 1070651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // file and the linker knows to use _main as the entry point. But, 1071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // when compiling with -pg, we need to link with the gcrt1.o file, 1072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // so pass the -no_new_main option to tell the linker to use the 1073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // "start" symbol as the entry point. 1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetMacOS() && !isMacosxVersionLT(10, 8)) 1075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-no_new_main"); 1076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Args.hasArg(options::OPT_static) || 1078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(options::OPT_object) || 1079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Args.hasArg(options::OPT_preload)) { 1080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt0.o"); 1081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Derived from darwin_crt1 spec. 1083651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSSimulator()) { 1084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ; // iOS simulator does not need crt1.o. 1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (isTargetIPhoneOS()) { 10866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (getArch() == llvm::Triple::arm64 || 10876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getArch() == llvm::Triple::aarch64) 1088651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ; // iOS does not need any crt1 files for arm64 1089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isIPhoneOSVersionLT(3, 1)) 1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt1.o"); 1091651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isIPhoneOSVersionLT(6, 0)) 1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt1.3.1.o"); 1093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isMacosxVersionLT(10, 5)) 1095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt1.o"); 1096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isMacosxVersionLT(10, 6)) 1097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt1.10.5.o"); 1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (isMacosxVersionLT(10, 8)) 1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back("-lcrt1.10.6.o"); 1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // darwin_crt2 spec is empty. 1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) && 1109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines isMacosxVersionLT(10, 5)) { 1110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *Str = Args.MakeArgString(GetFilePath("crt3.o")); 1111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CmdArgs.push_back(Str); 1112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 111543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const { 1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return isTargetMacOS(); 111743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar} 111843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 11190a7dd788dbef975f35f273c7ab913f480f7edd60John McCallvoid Darwin::CheckObjCARC() const { 1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isTargetIOSBased()|| (isTargetMacOS() && !isMacosxVersionLT(10, 6))) 11210a7dd788dbef975f35f273c7ab913f480f7edd60John McCall return; 112280fd37a57176433d05854dff27b9c5fa869fadd2John McCall getDriver().Diag(diag::err_arc_unsupported_on_toolchain); 11235840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis} 11245840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis 11253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 11263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 11273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 11283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 112919347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text. 113019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// 113119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects. 113219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ 113319347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) { 11340affc67389171834adf113e3a0422a32218a6192Chandler Carruth const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "", "", "" }; 113519347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::pair<StringRef, StringRef> First = VersionText.split('.'); 113619347edf7809866350750a1997ec4db009832fa4Chandler Carruth std::pair<StringRef, StringRef> Second = First.second.split('.'); 113719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 11380affc67389171834adf113e3a0422a32218a6192Chandler Carruth GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "", "", "" }; 113919347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (First.first.getAsInteger(10, GoodVersion.Major) || 114019347edf7809866350750a1997ec4db009832fa4Chandler Carruth GoodVersion.Major < 0) 114119347edf7809866350750a1997ec4db009832fa4Chandler Carruth return BadVersion; 11420affc67389171834adf113e3a0422a32218a6192Chandler Carruth GoodVersion.MajorStr = First.first.str(); 114319347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (Second.first.getAsInteger(10, GoodVersion.Minor) || 114419347edf7809866350750a1997ec4db009832fa4Chandler Carruth GoodVersion.Minor < 0) 114519347edf7809866350750a1997ec4db009832fa4Chandler Carruth return BadVersion; 11460affc67389171834adf113e3a0422a32218a6192Chandler Carruth GoodVersion.MinorStr = Second.first.str(); 114719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 114819347edf7809866350750a1997ec4db009832fa4Chandler Carruth // First look for a number prefix and parse that if present. Otherwise just 114919347edf7809866350750a1997ec4db009832fa4Chandler Carruth // stash the entire patch string in the suffix, and leave the number 115019347edf7809866350750a1997ec4db009832fa4Chandler Carruth // unspecified. This covers versions strings such as: 115119347edf7809866350750a1997ec4db009832fa4Chandler Carruth // 4.4 115219347edf7809866350750a1997ec4db009832fa4Chandler Carruth // 4.4.0 115319347edf7809866350750a1997ec4db009832fa4Chandler Carruth // 4.4.x 115419347edf7809866350750a1997ec4db009832fa4Chandler Carruth // 4.4.2-rc4 115519347edf7809866350750a1997ec4db009832fa4Chandler Carruth // 4.4.x-patched 115619347edf7809866350750a1997ec4db009832fa4Chandler Carruth // And retains any patch number it finds. 115719347edf7809866350750a1997ec4db009832fa4Chandler Carruth StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str(); 115819347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (!PatchText.empty()) { 1159ca1ad5018da214b9ff584f57288258424eb76089Will Dietz if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) { 116019347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Try to parse the number and any suffix. 116119347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) || 116219347edf7809866350750a1997ec4db009832fa4Chandler Carruth GoodVersion.Patch < 0) 116319347edf7809866350750a1997ec4db009832fa4Chandler Carruth return BadVersion; 11640affc67389171834adf113e3a0422a32218a6192Chandler Carruth GoodVersion.PatchSuffix = PatchText.substr(EndNumber); 116519347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 116619347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 116719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 116819347edf7809866350750a1997ec4db009832fa4Chandler Carruth return GoodVersion; 116919347edf7809866350750a1997ec4db009832fa4Chandler Carruth} 117019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 117119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering. 1172ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramerbool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor, 1173ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer int RHSPatch, 1174ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer StringRef RHSPatchSuffix) const { 1175ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (Major != RHSMajor) 1176ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer return Major < RHSMajor; 1177ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (Minor != RHSMinor) 1178ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer return Minor < RHSMinor; 1179ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (Patch != RHSPatch) { 1180f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // Note that versions without a specified patch sort higher than those with 1181f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // a patch. 1182ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (RHSPatch == -1) 1183f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth return true; 1184f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth if (Patch == -1) 1185f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth return false; 1186f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth 1187f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // Otherwise just sort on the patch itself. 1188ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer return Patch < RHSPatch; 1189f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth } 1190ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (PatchSuffix != RHSPatchSuffix) { 1191f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // Sort empty suffixes higher. 1192ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (RHSPatchSuffix.empty()) 1193f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth return true; 1194f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth if (PatchSuffix.empty()) 11955ba0c8e4077902f53e5f3e8271e470a1d8c1c074Chandler Carruth return false; 1196f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth 1197f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // Provide a lexicographic sort to make this a total ordering. 1198ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer return PatchSuffix < RHSPatchSuffix; 1199f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth } 1200f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth 1201f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth // The versions are equal. 120219347edf7809866350750a1997ec4db009832fa4Chandler Carruth return false; 120319347edf7809866350750a1997ec4db009832fa4Chandler Carruth} 120419347edf7809866350750a1997ec4db009832fa4Chandler Carruth 1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic llvm::StringRef getGCCToolchainDir(const ArgList &Args) { 12060e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain); 12070e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola if (A) 12081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith return A->getValue(); 12090e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola return GCC_INSTALL_PREFIX; 12100e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola} 12110e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola 1212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Initialize a GCCInstallationDetector from the driver. 121319347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// 121419347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths. 12150407a04049016bdd6fe4fda462aa199d82c750d4Gabor Greif/// Once constructed, a GCCInstallationDetector is essentially immutable. 12161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// 12171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and 12181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// should instead pull the target out of the driver. This is currently 12191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// necessary because the driver doesn't store the final version of the target 12201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// triple. 1221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid 1222651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesGeneric_GCC::GCCInstallationDetector::init( 1223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) { 1224d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth llvm::Triple BiarchVariantTriple = 1225d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant() 12269b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth : TargetTriple.get32BitArchVariant(); 122719347edf7809866350750a1997ec4db009832fa4Chandler Carruth // The library directories which may contain GCC installations. 1228d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs; 122919347edf7809866350750a1997ec4db009832fa4Chandler Carruth // The compatible GCC triples for this particular architecture. 12301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVector<StringRef, 10> CandidateTripleAliases; 1231d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVector<StringRef, 10> CandidateBiarchTripleAliases; 1232d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs, 1233d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth CandidateTripleAliases, CandidateBiarchLibDirs, 1234d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth CandidateBiarchTripleAliases); 123519347edf7809866350750a1997ec4db009832fa4Chandler Carruth 123619347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Compute the set of prefixes for our search. 123719347edf7809866350750a1997ec4db009832fa4Chandler Carruth SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), 123819347edf7809866350750a1997ec4db009832fa4Chandler Carruth D.PrefixDirs.end()); 1239353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola 12400e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola StringRef GCCToolchainDir = getGCCToolchainDir(Args); 12410e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola if (GCCToolchainDir != "") { 12420e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola if (GCCToolchainDir.back() == '/') 12430e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the / 1244353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola 12450e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola Prefixes.push_back(GCCToolchainDir); 1246353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola } else { 124769ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola // If we have a SysRoot, try that first. 124869ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola if (!D.SysRoot.empty()) { 124969ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola Prefixes.push_back(D.SysRoot); 125069ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola Prefixes.push_back(D.SysRoot + "/usr"); 125169ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola } 125269ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola 125369ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola // Then look for gcc installed alongside clang. 1254353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola Prefixes.push_back(D.InstalledDir + "/.."); 125569ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola 125669ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola // And finally in /usr. 125769ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola if (D.SysRoot.empty()) 125869ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola Prefixes.push_back("/usr"); 1259353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola } 126019347edf7809866350750a1997ec4db009832fa4Chandler Carruth 126119347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Loop over the various components which exist and select the best GCC 126219347edf7809866350750a1997ec4db009832fa4Chandler Carruth // installation available. GCC installs are ranked by version number. 126319347edf7809866350750a1997ec4db009832fa4Chandler Carruth Version = GCCVersion::Parse("0.0.0"); 126419347edf7809866350750a1997ec4db009832fa4Chandler Carruth for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) { 126519347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (!llvm::sys::fs::exists(Prefixes[i])) 126619347edf7809866350750a1997ec4db009832fa4Chandler Carruth continue; 126719347edf7809866350750a1997ec4db009832fa4Chandler Carruth for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) { 126819347edf7809866350750a1997ec4db009832fa4Chandler Carruth const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str(); 126919347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (!llvm::sys::fs::exists(LibDir)) 127019347edf7809866350750a1997ec4db009832fa4Chandler Carruth continue; 12711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k) 1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, 1273f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan CandidateTripleAliases[k]); 12741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth } 1275d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth for (unsigned j = 0, je = CandidateBiarchLibDirs.size(); j < je; ++j) { 1276d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth const std::string LibDir = Prefixes[i] + CandidateBiarchLibDirs[j].str(); 12771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth if (!llvm::sys::fs::exists(LibDir)) 12781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth continue; 1279d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth for (unsigned k = 0, ke = CandidateBiarchTripleAliases.size(); k < ke; 12801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth ++k) 1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, 1282d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth CandidateBiarchTripleAliases[k], 1283d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth /*NeedsBiarchSuffix=*/ true); 128419347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 128519347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 128619347edf7809866350750a1997ec4db009832fa4Chandler Carruth} 128719347edf7809866350750a1997ec4db009832fa4Chandler Carruth 12886365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruthvoid Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const { 12896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto &InstallPath : CandidateGCCInstallPaths) 12906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "Found candidate GCC installation: " << InstallPath << "\n"; 12916365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 1292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!GCCInstallPath.empty()) 1293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Selected GCC installation: " << GCCInstallPath << "\n"; 1294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto &Multilib : Multilibs) 12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "Candidate multilib: " << Multilib << "\n"; 1297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Multilibs.size() != 0 || !SelectedMultilib.isDefault()) 1299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Selected multilib: " << SelectedMultilib << "\n"; 1300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { 1303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (BiarchSibling.hasValue()) { 1304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines M = BiarchSibling.getValue(); 1305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 13086365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth} 13096365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 131019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples( 1311d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple, 13121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &LibDirs, 13131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth SmallVectorImpl<StringRef> &TripleAliases, 1314d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &BiarchLibDirs, 1315d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SmallVectorImpl<StringRef> &BiarchTripleAliases) { 13161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // Declare a bunch of static data sets that we'll select between below. These 13171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // are specifically designed to always refer to string literals to avoid any 13181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // lifetime or initialization issues. 13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static const char *const AArch64LibDirs[] = { "/lib64", "/lib" }; 1320d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu", 13216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "aarch64-linux-gnu", 13226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "aarch64-linux-android", 13236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "aarch64-redhat-linux" }; 1324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const AArch64beLibDirs[] = { "/lib" }; 1325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const AArch64beTriples[] = { "aarch64_be-none-linux-gnu", 1326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "aarch64_be-linux-gnu" }; 1327c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover 13281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const ARMLibDirs[] = { "/lib" }; 1329d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static const char *const ARMTriples[] = { "arm-linux-gnueabi", 1330d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "arm-linux-androideabi" }; 1331d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf", 1332d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "armv7hl-redhat-linux-gnueabi" }; 1333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const ARMebLibDirs[] = { "/lib" }; 1334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const ARMebTriples[] = { "armeb-linux-gnueabi", 1335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "armeb-linux-androideabi" }; 1336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf", 1337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "armebv7hl-redhat-linux-gnueabi" }; 13381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 13391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const X86_64LibDirs[] = { "/lib64", "/lib" }; 13401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const X86_64Triples[] = { 1341d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu", 1342d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux", 1343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux", 1344ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "x86_64-linux-android", "x86_64-unknown-linux" 13451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth }; 1346ef8225444452a1486bd721f3285301fe84643b00Stephen Hines static const char *const X32LibDirs[] = { "/libx32" }; 13471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const X86LibDirs[] = { "/lib32", "/lib" }; 13481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const X86Triples[] = { 1349d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu", 1350d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux", 1351d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux", 1352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "i686-montavista-linux", "i686-linux-android" 13531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth }; 13541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 13551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const MIPSLibDirs[] = { "/lib" }; 13564e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan static const char *const MIPSTriples[] = { "mips-linux-gnu", 1357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-mti-linux-gnu", 1358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-img-linux-gnu" }; 13591c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const MIPSELLibDirs[] = { "/lib" }; 1360d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static const char *const MIPSELTriples[] = { "mipsel-linux-gnu", 1361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mipsel-linux-android", 1362ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-img-linux-gnu" }; 13631c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 1364b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" }; 13654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan static const char *const MIPS64Triples[] = { "mips64-linux-gnu", 1366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-mti-linux-gnu", 1367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-img-linux-gnu", 1368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips64-linux-gnuabi64" }; 1369b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" }; 13704e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu", 1371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "mips-mti-linux-gnu", 1372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips-img-linux-gnu", 1373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips64el-linux-android", 1374ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "mips64el-linux-gnuabi64" }; 1375b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan 13761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const PPCLibDirs[] = { "/lib32", "/lib" }; 13771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const PPCTriples[] = { 1378d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe", 1379d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "powerpc-suse-linux", "powerpc-montavista-linuxspe" 13801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth }; 13811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth static const char *const PPC64LibDirs[] = { "/lib64", "/lib" }; 1382d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth static const char *const PPC64Triples[] = { "powerpc64-linux-gnu", 1383d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "powerpc64-unknown-linux-gnu", 1384d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "powerpc64-suse-linux", 1385d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "ppc64-redhat-linux" }; 1386ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" }; 1387ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu", 1388ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt "powerpc64le-unknown-linux-gnu", 1389ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt "powerpc64le-suse-linux", 1390ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt "ppc64le-redhat-linux" }; 13911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 1392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const SPARCv8LibDirs[] = { "/lib32", "/lib" }; 1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const SPARCv8Triples[] = { "sparc-linux-gnu", 1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "sparcv8-linux-gnu" }; 1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib" }; 1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines static const char *const SPARCv9Triples[] = { "sparc64-linux-gnu", 1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "sparcv9-linux-gnu" }; 1398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1399b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand static const char *const SystemZLibDirs[] = { "/lib64", "/lib" }; 1400b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand static const char *const SystemZTriples[] = { 1401d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu", 1402d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "s390x-suse-linux", "s390x-redhat-linux" 1403b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand }; 1404b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand 14051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth switch (TargetTriple.getArch()) { 1406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::arm64: 1407c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover case llvm::Triple::aarch64: 1408d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(AArch64LibDirs, 1409d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs)); 1410d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(AArch64Triples, 1411d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth AArch64Triples + llvm::array_lengthof(AArch64Triples)); 1412d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(AArch64LibDirs, 1413d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs)); 1414d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1415d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples)); 1416c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover break; 14176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::arm64_be: 1418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::aarch64_be: 1419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LibDirs.append(AArch64beLibDirs, 1420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AArch64beLibDirs + llvm::array_lengthof(AArch64beLibDirs)); 1421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleAliases.append(AArch64beTriples, 1422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AArch64beTriples + llvm::array_lengthof(AArch64beTriples)); 1423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchLibDirs.append(AArch64beLibDirs, 1424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AArch64beLibDirs + llvm::array_lengthof(AArch64beLibDirs)); 1425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchTripleAliases.append( 1426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AArch64beTriples, AArch64beTriples + llvm::array_lengthof(AArch64beTriples)); 1427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 14281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::arm: 14291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::thumb: 143019347edf7809866350750a1997ec4db009832fa4Chandler Carruth LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs)); 1431ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 1432d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(ARMHFTriples, 1433d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth ARMHFTriples + llvm::array_lengthof(ARMHFTriples)); 1434ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu } else { 1435d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(ARMTriples, 1436d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth ARMTriples + llvm::array_lengthof(ARMTriples)); 1437ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu } 14381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 1439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::armeb: 1440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::thumbeb: 1441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LibDirs.append(ARMebLibDirs, ARMebLibDirs + llvm::array_lengthof(ARMebLibDirs)); 1442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 1443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleAliases.append(ARMebHFTriples, 1444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ARMebHFTriples + llvm::array_lengthof(ARMebHFTriples)); 1445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleAliases.append(ARMebTriples, 1447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ARMebTriples + llvm::array_lengthof(ARMebTriples)); 1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 14501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::x86_64: 1451d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(X86_64LibDirs, 1452d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1453d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(X86_64Triples, 1454d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1455ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // x32 is always available when x86_64 is available, so adding it as secondary 1456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // arch with x86_64 triples 1457ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) { 1458ef8225444452a1486bd721f3285301fe84643b00Stephen Hines BiarchLibDirs.append(X32LibDirs, 1459ef8225444452a1486bd721f3285301fe84643b00Stephen Hines X32LibDirs + llvm::array_lengthof(X32LibDirs)); 1460ef8225444452a1486bd721f3285301fe84643b00Stephen Hines BiarchTripleAliases.append(X86_64Triples, 1461ef8225444452a1486bd721f3285301fe84643b00Stephen Hines X86_64Triples + llvm::array_lengthof(X86_64Triples)); 1462ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else { 1463ef8225444452a1486bd721f3285301fe84643b00Stephen Hines BiarchLibDirs.append(X86LibDirs, 1464ef8225444452a1486bd721f3285301fe84643b00Stephen Hines X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1465ef8225444452a1486bd721f3285301fe84643b00Stephen Hines BiarchTripleAliases.append(X86Triples, 1466ef8225444452a1486bd721f3285301fe84643b00Stephen Hines X86Triples + llvm::array_lengthof(X86Triples)); 1467ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 14681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 14691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::x86: 147019347edf7809866350750a1997ec4db009832fa4Chandler Carruth LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs)); 1471d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(X86Triples, 1472d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth X86Triples + llvm::array_lengthof(X86Triples)); 1473d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(X86_64LibDirs, 1474d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs)); 1475d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1476d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples)); 14771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 14781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::mips: 1479d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(MIPSLibDirs, 1480d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1481d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(MIPSTriples, 1482d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1483d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(MIPS64LibDirs, 1484d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1485d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1486d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 14871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 14881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::mipsel: 1489d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(MIPSELLibDirs, 1490d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1491d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(MIPSELTriples, 1492d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 14934e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan TripleAliases.append(MIPSTriples, 14944e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1495d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append( 1496d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELLibDirs, 1497d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1498d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1499d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELTriples, 1500d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1501b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan break; 1502b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan case llvm::Triple::mips64: 1503d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(MIPS64LibDirs, 1504d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs)); 1505d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(MIPS64Triples, 1506d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64Triples + llvm::array_lengthof(MIPS64Triples)); 1507d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(MIPSLibDirs, 1508d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs)); 1509d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append(MIPSTriples, 1510d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSTriples + llvm::array_lengthof(MIPSTriples)); 1511b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan break; 1512b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan case llvm::Triple::mips64el: 1513d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(MIPS64ELLibDirs, 1514d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs)); 1515b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan TripleAliases.append( 1516d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELTriples, 1517d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples)); 1518d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(MIPSELLibDirs, 1519d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs)); 1520d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1521d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples)); 15224e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan BiarchTripleAliases.append( 15234e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples)); 15241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 15251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::ppc: 152619347edf7809866350750a1997ec4db009832fa4Chandler Carruth LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1527d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(PPCTriples, 1528d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPCTriples + llvm::array_lengthof(PPCTriples)); 1529d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(PPC64LibDirs, 1530d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1531d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append( 1532d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples)); 15331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 15341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth case llvm::Triple::ppc64: 1535d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(PPC64LibDirs, 1536d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs)); 1537d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(PPC64Triples, 1538d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPC64Triples + llvm::array_lengthof(PPC64Triples)); 1539d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchLibDirs.append(PPCLibDirs, 1540d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPCLibDirs + llvm::array_lengthof(PPCLibDirs)); 1541d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.append(PPCTriples, 1542d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth PPCTriples + llvm::array_lengthof(PPCTriples)); 15431c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 1544ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt case llvm::Triple::ppc64le: 1545ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt LibDirs.append(PPC64LELibDirs, 1546ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt PPC64LELibDirs + llvm::array_lengthof(PPC64LELibDirs)); 1547ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt TripleAliases.append(PPC64LETriples, 1548ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt PPC64LETriples + llvm::array_lengthof(PPC64LETriples)); 1549ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt break; 1550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::sparc: 1551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LibDirs.append(SPARCv8LibDirs, 1552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv8LibDirs + llvm::array_lengthof(SPARCv8LibDirs)); 1553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleAliases.append(SPARCv8Triples, 1554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv8Triples + llvm::array_lengthof(SPARCv8Triples)); 1555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchLibDirs.append(SPARCv9LibDirs, 1556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv9LibDirs + llvm::array_lengthof(SPARCv9LibDirs)); 1557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchTripleAliases.append( 1558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv9Triples, SPARCv9Triples + llvm::array_lengthof(SPARCv9Triples)); 1559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::sparcv9: 1561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines LibDirs.append(SPARCv9LibDirs, 1562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv9LibDirs + llvm::array_lengthof(SPARCv9LibDirs)); 1563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleAliases.append(SPARCv9Triples, 1564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv9Triples + llvm::array_lengthof(SPARCv9Triples)); 1565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchLibDirs.append(SPARCv8LibDirs, 1566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv8LibDirs + llvm::array_lengthof(SPARCv8LibDirs)); 1567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchTripleAliases.append( 1568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SPARCv8Triples, SPARCv8Triples + llvm::array_lengthof(SPARCv8Triples)); 1569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1570b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand case llvm::Triple::systemz: 1571d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth LibDirs.append(SystemZLibDirs, 1572d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SystemZLibDirs + llvm::array_lengthof(SystemZLibDirs)); 1573d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth TripleAliases.append(SystemZTriples, 1574d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth SystemZTriples + llvm::array_lengthof(SystemZTriples)); 1575b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand break; 15761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 15771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth default: 15781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // By default, just rely on the standard lib directories and the original 15791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // triple. 15801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth break; 158119347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 15821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 15831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // Always append the drivers target triple to the end, in case it doesn't 15841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // match any of our aliases. 15851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth TripleAliases.push_back(TargetTriple.str()); 15861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth 15871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth // Also include the multiarch variant if it's different. 1588d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth if (TargetTriple.str() != BiarchTriple.str()) 1589d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth BiarchTripleAliases.push_back(BiarchTriple.str()); 159019347edf7809866350750a1997ec4db009832fa4Chandler Carruth} 159119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 1592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace { 1593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Filter to remove Multilibs that don't exist as a suffix to Path 1594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass FilterNonExistent : public MultilibSet::FilterCallback { 1595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string Base; 1596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic: 1597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FilterNonExistent(std::string Base) : Base(Base) {} 1598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool operator()(const Multilib &M) const override { 1599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o"); 1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 1602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end anonymous namespace 16038e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 1604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic void addMultilibFlag(bool Enabled, const char *const Flag, 1605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::vector<std::string> &Flags) { 1606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Enabled) 1607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags.push_back(std::string("+") + Flag); 1608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 1609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Flags.push_back(std::string("-") + Flag); 16108e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 16118e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 16128e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMipsArch(llvm::Triple::ArchType Arch) { 1613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel || 1614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el; 1615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMips32(llvm::Triple::ArchType Arch) { 1618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel; 1619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMips64(llvm::Triple::ArchType Arch) { 1622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el; 1623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMipsEL(llvm::Triple::ArchType Arch) { 1626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el; 1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMipsEB(llvm::Triple::ArchType Arch) { 1630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Arch == llvm::Triple::mips || Arch == llvm::Triple::mips64; 16318e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 16328e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 16338e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMips16(const ArgList &Args) { 16348e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan Arg *A = Args.getLastArg(options::OPT_mips16, 16358e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan options::OPT_mno_mips16); 16368e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan return A && A->getOption().matches(options::OPT_mips16); 16378e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 16388e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 163987d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyanstatic bool isMips32r2(const ArgList &Args) { 164087d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan Arg *A = Args.getLastArg(options::OPT_march_EQ, 164187d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan options::OPT_mcpu_EQ); 164287d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan 164387d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan return A && A->getValue() == StringRef("mips32r2"); 164487d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan} 164587d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan 16464e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyanstatic bool isMips64r2(const ArgList &Args) { 16474e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan Arg *A = Args.getLastArg(options::OPT_march_EQ, 16484e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan options::OPT_mcpu_EQ); 16494e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 1650ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return A && (A->getValue() == StringRef("mips64r2") || 1651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines A->getValue() == StringRef("octeon")); 16524e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan} 16534e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 16548e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMicroMips(const ArgList &Args) { 16558e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan Arg *A = Args.getLastArg(options::OPT_mmicromips, 16568e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan options::OPT_mno_micromips); 16578e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan return A && A->getOption().matches(options::OPT_mmicromips); 16588e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 16598e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 16606c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sandersstatic bool isMipsFP64(const ArgList &Args) { 16616c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders Arg *A = Args.getLastArg(options::OPT_mfp64, options::OPT_mfp32); 16626c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders return A && A->getOption().matches(options::OPT_mfp64); 16636c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders} 16646c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders 16654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyanstatic bool isMipsNan2008(const ArgList &Args) { 16664e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan Arg *A = Args.getLastArg(options::OPT_mnan_EQ); 16674e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan return A && A->getValue() == StringRef("2008"); 16684e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan} 16694e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 16706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct DetectedMultilibs { 16716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// The set of multilibs that the detected installation supports. 16726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines MultilibSet Multilibs; 16736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// The primary multilib appropriate for the given flags. 16756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Multilib SelectedMultilib; 16766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// On Biarch systems, this corresponds to the default multilib when 16786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// targeting the non-default multilib. Otherwise, it is empty. 16796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm::Optional<Multilib> BiarchSibling; 16806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 16816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path, 16836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const llvm::opt::ArgList &Args, 16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DetectedMultilibs &Result) { 16854e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // Some MIPS toolchains put libraries and object files compiled 16864e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // using different options in to the sub-directoris which names 16874e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // reflects the flags used for compilation. For example sysroot 16884e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // directory might looks like the following examples: 16894e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // 16904e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 16914e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips32' 16924e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /mips16 16934e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 16944e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips16' 16954e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /el 16964e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 16974e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips16 -EL' 16984e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // 16994e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // or 17004e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // 17014e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 17024e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips32r2' 17034e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /mips16 17044e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 17054e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips32r2 -mips16' 17064e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /mips32 17074e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /usr 17084e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // /lib <= crt*.o files compiled with '-mips32' 17094e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 1710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FilterNonExistent NonExistent(Path); 1711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Check for FSF toolchain multilibs 1713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet FSFMipsMultilibs; 1714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 1715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMips32 = Multilib() 1716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/mips32") 1717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/mips32") 1718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/mips32") 1719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m32").flag("-m64").flag("-mmicromips").flag("-march=mips32r2"); 1720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMicroMips = Multilib() 1722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/micromips") 1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/micromips") 1724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/micromips") 1725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m32").flag("-m64").flag("+mmicromips"); 1726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMips64r2 = Multilib() 1728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/mips64r2") 1729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/mips64r2") 1730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/mips64r2") 1731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("-m32").flag("+m64").flag("+march=mips64r2"); 1732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMips64 = Multilib() 1734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/mips64") 1735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/mips64") 1736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/mips64") 1737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("-m32").flag("+m64").flag("-march=mips64r2"); 1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchDefault = Multilib() 1740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m32").flag("-m64").flag("+march=mips32r2"); 1741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Mips16 = Multilib() 1743651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/mips16") 1744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/mips16") 1745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/mips16") 1746651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mips16"); 1747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MAbi64 = Multilib() 1749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/64") 1750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/64") 1751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/64") 1752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mabi=64").flag("-mabi=n32").flag("-m32"); 1753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib BigEndian = Multilib() 1755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+EB").flag("-EL"); 1756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib LittleEndian = Multilib() 1758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/el") 1759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/el") 1760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/el") 1761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+EL").flag("-EB"); 1762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib SoftFloat = Multilib() 1764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/sof") 1765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/sof") 1766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/sof") 1767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+msoft-float"); 1768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib FP64 = Multilib() 1770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/fp64") 1771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/fp64") 1772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/fp64") 1773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mfp64"); 1774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Nan2008 = Multilib() 1776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/nan2008") 1777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/nan2008") 1778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/nan2008") 1779651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mnan=2008"); 1780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FSFMipsMultilibs = MultilibSet() 1782651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(MArchMips32, MArchMicroMips, 1783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MArchMips64r2, MArchMips64, MArchDefault) 1784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(Mips16) 1785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips64/mips16") 1786651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips64r2/mips16") 1787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/micromips/mips16") 1788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(MAbi64) 1789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/micromips/64") 1790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips32/64") 1791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("^/64") 1792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips16/64") 1793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(BigEndian, LittleEndian) 1794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(SoftFloat) 1795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(FP64) 1796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(Nan2008) 1797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(".*sof/nan2008") 1798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(".*sof/fp64") 1799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(NonExistent); 1800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Check for Code Sourcery toolchain multilibs 1803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet CSMipsMultilibs; 1804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 1805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMips16 = Multilib() 1806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/mips16") 1807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/mips16") 1808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/mips16") 1809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m32").flag("+mips16"); 1810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchMicroMips = Multilib() 1812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/micromips") 1813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/micromips") 1814651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/micromips") 1815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m32").flag("+mmicromips"); 1816651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MArchDefault = Multilib() 1818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("-mips16").flag("-mmicromips"); 1819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib SoftFloat = Multilib() 1821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/soft-float") 1822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/soft-float") 1823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/soft-float") 1824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+msoft-float"); 1825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Nan2008 = Multilib() 1827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/nan2008") 1828651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/nan2008") 1829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/nan2008") 1830651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mnan=2008"); 1831651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1832651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib DefaultFloat = Multilib() 1833651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("-msoft-float").flag("-mnan=2008"); 1834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib BigEndian = Multilib() 1836651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+EB").flag("-EL"); 1837651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1838651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib LittleEndian = Multilib() 1839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/el") 1840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .osSuffix("/el") 1841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/el") 1842651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+EL").flag("-EB"); 1843651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1844651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Note that this one's osSuffix is "" 1845651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MAbi64 = Multilib() 1846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/64") 1847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/64") 1848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mabi=64").flag("-mabi=n32").flag("-m32"); 1849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CSMipsMultilibs = MultilibSet() 1851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(MArchMips16, MArchMicroMips, MArchDefault) 1852651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(SoftFloat, Nan2008, DefaultFloat) 1853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/micromips/nan2008") 1854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips16/nan2008") 1855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(BigEndian, LittleEndian) 1856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(MAbi64) 1857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/mips16.*/64") 1858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut("/micromips.*/64") 1859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(NonExistent); 1860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet AndroidMipsMultilibs = MultilibSet() 1863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Maybe(Multilib("/mips-r2").flag("+march=mips32r2")) 1864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(NonExistent); 1865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet DebianMipsMultilibs; 1867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines { 1868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib MAbiN32 = Multilib() 1869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/n32") 1870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/n32") 1871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+mabi=n32"); 1872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib M64 = Multilib() 1874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/64") 1875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/64") 1876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("+m64").flag("-m32").flag("-mabi=n32"); 1877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib M32 = Multilib() 1879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .flag("-m64").flag("+m32").flag("-mabi=n32"); 1880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DebianMipsMultilibs = MultilibSet() 1882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .Either(M32, M64, MAbiN32) 1883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .FilterOut(NonExistent); 1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 18858e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 1886ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MultilibSet ImgMultilibs; 1887ef8225444452a1486bd721f3285301fe84643b00Stephen Hines { 1888ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Multilib Mips64r6 = Multilib() 1889ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .gccSuffix("/mips64r6") 1890ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .osSuffix("/mips64r6") 1891ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .includeSuffix("/mips64r6") 1892ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("+m64").flag("-m32"); 1893ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1894ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Multilib LittleEndian = Multilib() 1895ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .gccSuffix("/el") 1896ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .osSuffix("/el") 1897ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .includeSuffix("/el") 1898ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("+EL").flag("-EB"); 1899ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1900ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Multilib MAbi64 = Multilib() 1901ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .gccSuffix("/64") 1902ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .osSuffix("/64") 1903ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .includeSuffix("/64") 1904ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("+mabi=64").flag("-mabi=n32").flag("-m32"); 1905ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1906ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ImgMultilibs = MultilibSet() 1907ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .Maybe(Mips64r6) 1908ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .Maybe(MAbi64) 1909ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .Maybe(LittleEndian) 1910ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .FilterOut(NonExistent); 1911ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1912ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); 19148e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 1915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib::flags_list Flags; 1916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMips32(TargetArch), "m32", Flags); 1917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMips64(TargetArch), "m64", Flags); 1918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMips16(Args), "mips16", Flags); 1919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMips32r2(Args), "march=mips32r2", Flags); 1920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMips64r2(Args), "march=mips64r2", Flags); 1921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMicroMips(Args), "mmicromips", Flags); 1922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMipsFP64(Args), "mfp64", Flags); 1923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(!isMipsFP64(Args), "mfp32", Flags); 1924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMipsNan2008(Args), "mnan=2008", Flags); 1925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(tools::mips::hasMipsAbiArg(Args, "n32"), "mabi=n32", Flags); 1926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Default is to assume mabi=64 1927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsMABI64 = 1928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tools::mips::hasMipsAbiArg(Args, "64") || 1929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (!tools::mips::hasMipsAbiArg(Args, "n32") && isMips64(TargetArch)); 1930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(IsMABI64, "mabi=64", Flags); 1931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags); 1932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isSoftFloatABI(Args), "mfloat-abi=soft", Flags); 1933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags); 1934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(!isSoftFloatABI(Args), "mfloat-abi=hard", Flags); 1935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMipsEL(TargetArch), "EL", Flags); 1936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(isMipsEB(TargetArch), "EB", Flags); 1937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TargetTriple.getEnvironment() == llvm::Triple::Android) { 1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Select Android toolchain. It's the only choice in that case. 19406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) { 19416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs = AndroidMipsMultilibs; 19426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 19436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 19446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 1945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 19466c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders 1947ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies && 1948ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TargetTriple.getOS() == llvm::Triple::Linux && 1949ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TargetTriple.getEnvironment() == llvm::Triple::GNU) { 1950ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Select mips-img-linux-gnu toolchain. 1951ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) { 1952ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.Multilibs = ImgMultilibs; 1953ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1954ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1955ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1956ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1957ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Sort candidates. Toolchain that best meets the directories goes first. 1959651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Then select the first toolchains matches command line flags. 1960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MultilibSet *candidates[] = { &DebianMipsMultilibs, &FSFMipsMultilibs, 1961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines &CSMipsMultilibs }; 1962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::sort( 1963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::begin(candidates), std::end(candidates), 1964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); }); 1965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &candidate : candidates) { 19666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (candidate->select(Flags, Result.SelectedMultilib)) { 1967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (candidate == &DebianMipsMultilibs) 19686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.BiarchSibling = Multilib(); 19696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs = *candidate; 1970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 19716c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders } 19724e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan } 19738e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 1974ef8225444452a1486bd721f3285301fe84643b00Stephen Hines { 1975ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Fallback to the regular toolchain-tree structure. 1976ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Multilib Default; 1977ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.Multilibs.push_back(Default); 1978ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.Multilibs.FilterOut(NonExistent); 1979ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1980ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) { 1981ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.BiarchSibling = Multilib(); 1982ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1983ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1984ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1985ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 19896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool findBiarchMultilibs(const llvm::Triple &TargetTriple, 19906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Path, const ArgList &Args, 19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool NeedsBiarchSuffix, 19926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DetectedMultilibs &Result) { 1993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Some versions of SUSE and Fedora on ppc64 put 32-bit libs 1995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // in what would normally be GCCInstallPath and put the 64-bit 1996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // libs in a subdirectory named 64. The simple logic we follow is that 1997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // *if* there is a subdirectory of the right name with crtbegin.o in it, 1998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // we use that. If not, and if not a biarch triple alias, we look for 1999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // crtbegin.o without the subdirectory. 2000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Default; 2002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Alt64 = Multilib() 2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/64") 2004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/64") 2005ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("-m32").flag("+m64").flag("-mx32"); 2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib Alt32 = Multilib() 2007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .gccSuffix("/32") 2008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines .includeSuffix("/32") 2009ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("+m32").flag("-m64").flag("-mx32"); 2010ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Multilib Altx32 = Multilib() 2011ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .gccSuffix("/x32") 2012ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .includeSuffix("/x32") 2013ef8225444452a1486bd721f3285301fe84643b00Stephen Hines .flag("-m32").flag("-m64").flag("+mx32"); 2014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FilterNonExistent NonExistent(Path); 2016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2017ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Determine default multilib from: 32, 64, x32 2018ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Also handle cases such as 64 on 32, 32 on 64, etc. 2019ef8225444452a1486bd721f3285301fe84643b00Stephen Hines enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN; 2020ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const bool IsX32 {TargetTriple.getEnvironment() == llvm::Triple::GNUX32}; 2021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TargetTriple.isArch32Bit() && !NonExistent(Alt32)) 2022ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = WANT64; 2023ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32)) 2024ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = WANT64; 2025ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64)) 2026ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = WANT32; 2027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else { 2028ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (TargetTriple.isArch32Bit()) 2029ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = NeedsBiarchSuffix ? WANT64 : WANT32; 2030ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (IsX32) 2031ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = NeedsBiarchSuffix ? WANT64 : WANTX32; 2032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 2033ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Want = NeedsBiarchSuffix ? WANT32 : WANT64; 2034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2036ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Want == WANT32) 2037ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Default.flag("+m32").flag("-m64").flag("-mx32"); 2038ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (Want == WANT64) 2039ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Default.flag("-m32").flag("+m64").flag("-mx32"); 2040ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (Want == WANTX32) 2041ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Default.flag("-m32").flag("-m64").flag("+mx32"); 2042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 2043ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 2044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs.push_back(Default); 20466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs.push_back(Alt64); 20476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs.push_back(Alt32); 2048ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.Multilibs.push_back(Altx32); 2049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.Multilibs.FilterOut(NonExistent); 2051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib::flags_list Flags; 2053ef8225444452a1486bd721f3285301fe84643b00Stephen Hines addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags); 2054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags); 2055ef8225444452a1486bd721f3285301fe84643b00Stephen Hines addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags); 2056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Result.Multilibs.select(Flags, Result.SelectedMultilib)) 2058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 2059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2060ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Result.SelectedMultilib == Alt64 || 2061ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.SelectedMultilib == Alt32 || 2062ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Result.SelectedMultilib == Altx32) 20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Result.BiarchSibling = Default; 2064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 20668e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 20678e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 206819347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( 2069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const llvm::Triple &TargetTriple, const ArgList &Args, 2070d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth const std::string &LibDir, StringRef CandidateTriple, 2071d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth bool NeedsBiarchSuffix) { 2072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Triple::ArchType TargetArch = TargetTriple.getArch(); 207319347edf7809866350750a1997ec4db009832fa4Chandler Carruth // There are various different suffixes involving the triple we 207419347edf7809866350750a1997ec4db009832fa4Chandler Carruth // check for. We also record what is necessary to walk from each back 207519347edf7809866350750a1997ec4db009832fa4Chandler Carruth // up to the lib directory. 20761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth const std::string LibSuffixes[] = { 207719347edf7809866350750a1997ec4db009832fa4Chandler Carruth "/gcc/" + CandidateTriple.str(), 2078003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman // Debian puts cross-compilers in gcc-cross 2079003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/gcc-cross/" + CandidateTriple.str(), 208019347edf7809866350750a1997ec4db009832fa4Chandler Carruth "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(), 208119347edf7809866350750a1997ec4db009832fa4Chandler Carruth 208202014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel // The Freescale PPC SDK has the gcc libraries in 208302014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. 208402014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel "/" + CandidateTriple.str(), 208502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel 208619347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Ubuntu has a strange mis-matched pair of triples that this happens to 208719347edf7809866350750a1997ec4db009832fa4Chandler Carruth // match. 208819347edf7809866350750a1997ec4db009832fa4Chandler Carruth // FIXME: It may be worthwhile to generalize this and look for a second 208919347edf7809866350750a1997ec4db009832fa4Chandler Carruth // triple. 2090d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth "/i386-linux-gnu/gcc/" + CandidateTriple.str() 209119347edf7809866350750a1997ec4db009832fa4Chandler Carruth }; 2092003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman const std::string InstallSuffixes[] = { 2093003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/../../..", // gcc/ 2094003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/../../..", // gcc-cross/ 2095003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/../../../..", // <triple>/gcc/ 2096003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/../..", // <triple>/ 2097003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman "/../../../.." // i386-linux-gnu/gcc/<triple>/ 2098003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman }; 209919347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Only look at the final, weird Ubuntu suffix for i386-linux-gnu. 2100d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth const unsigned NumLibSuffixes = 2101d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86)); 21021c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth for (unsigned i = 0; i < NumLibSuffixes; ++i) { 21031c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth StringRef LibSuffix = LibSuffixes[i]; 2104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::error_code EC; 21051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE; 210619347edf7809866350750a1997ec4db009832fa4Chandler Carruth !EC && LI != LE; LI = LI.increment(EC)) { 210719347edf7809866350750a1997ec4db009832fa4Chandler Carruth StringRef VersionText = llvm::sys::path::filename(LI->path()); 210819347edf7809866350750a1997ec4db009832fa4Chandler Carruth GCCVersion CandidateVersion = GCCVersion::Parse(VersionText); 2109f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer if (CandidateVersion.Major != -1) // Filter obviously bad entries. 2110f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer if (!CandidateGCCInstallPaths.insert(LI->path()).second) 2111f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer continue; // Saw this path before; no need to look at it again. 2112ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer if (CandidateVersion.isOlderThan(4, 1, 1)) 211319347edf7809866350750a1997ec4db009832fa4Chandler Carruth continue; 211419347edf7809866350750a1997ec4db009832fa4Chandler Carruth if (CandidateVersion <= Version) 211519347edf7809866350750a1997ec4db009832fa4Chandler Carruth continue; 21162e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel 21176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DetectedMultilibs Detected; 2118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Debian mips multilibs behave more like the rest of the biarch ones, 2120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // so handle them there 2121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isMipsArch(TargetArch)) { 21226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected)) 2123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 2124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args, 21256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NeedsBiarchSuffix, Detected)) { 21265c805e92a5f70a913bc3bfcd15c44875974c2111Simon Atanasyan continue; 21276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 212819347edf7809866350750a1997ec4db009832fa4Chandler Carruth 21296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Multilibs = Detected.Multilibs; 21306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SelectedMultilib = Detected.SelectedMultilib; 21316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines BiarchSibling = Detected.BiarchSibling; 213219347edf7809866350750a1997ec4db009832fa4Chandler Carruth Version = CandidateVersion; 2133fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth GCCTriple.setTriple(CandidateTriple); 213419347edf7809866350750a1997ec4db009832fa4Chandler Carruth // FIXME: We hack together the directory name here instead of 213519347edf7809866350750a1997ec4db009832fa4Chandler Carruth // using LI to ensure stable path separators across Windows and 213619347edf7809866350750a1997ec4db009832fa4Chandler Carruth // Linux. 21371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str(); 21385d84bb418405e1256020a66895d163756886b102Chandler Carruth GCCParentLibPath = GCCInstallPath + InstallSuffixes[i]; 213919347edf7809866350750a1997ec4db009832fa4Chandler Carruth IsValid = true; 214019347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 214119347edf7809866350750a1997ec4db009832fa4Chandler Carruth } 214219347edf7809866350750a1997ec4db009832fa4Chandler Carruth} 214319347edf7809866350750a1997ec4db009832fa4Chandler Carruth 21440e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaGeneric_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple, 21450e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const ArgList &Args) 2146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : ToolChain(D, Triple, Args), GCCInstallation() { 2147edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 214886643b88a11582cfff2091a4815950d166269428Benjamin Kramer if (getDriver().getInstalledDir() != getDriver().Dir) 2149edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 2150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 2151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 21523917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 21533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 21543917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 2155f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::getTool(Action::ActionClass AC) const { 21565b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola switch (AC) { 2157f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola case Action::PreprocessJobClass: 2158f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Preprocess) 2159f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Preprocess.reset(new tools::gcc::Preprocess(*this)); 2160f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Preprocess.get(); 2161f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola case Action::CompileJobClass: 2162f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Compile) 2163f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Compile.reset(new tools::gcc::Compile(*this)); 2164f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Compile.get(); 2165c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola default: 2166f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return ToolChain::getTool(AC); 21673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 21683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 21693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 2170f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::buildAssembler() const { 2171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new tools::gnutools::Assemble(*this); 2172f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2173f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2174f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::buildLinker() const { 2175f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::gcc::Link(*this); 2176f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2177f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 21786365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruthvoid Generic_GCC::printVerboseInfo(raw_ostream &OS) const { 21796365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth // Print the information about how we detected the GCC installation. 21806365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth GCCInstallation.print(OS); 21816365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth} 21826365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth 21833917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 21846f009b68b9f7aaf280144b0cd81d6a0b23c733a6Rafael Espindola return getArch() == llvm::Triple::x86_64; 21853917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 21863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 21877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefault() const { 21887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth return false; 21893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 21903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 219152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool Generic_GCC::isPIEDefault() const { 219252ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne return false; 219352ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne} 219452ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne 21957ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefaultForced() const { 21967ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth return false; 21973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 21987ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth 2199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Generic_GCC::IsIntegratedAssemblerDefault() const { 2200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getTriple().getArch() == llvm::Triple::x86 || 2201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::x86_64 || 2202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::aarch64 || 2203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::aarch64_be || 2204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm64 || 22056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::arm64_be || 2206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm || 2207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::armeb || 2208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::thumb || 2209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::thumbeb; 2210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs, 2213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArgStringList &CC1Args) const { 2214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion(); 2215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool UseInitArrayDefault = 2216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::aarch64 || 2217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::aarch64_be || 2218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::arm64 || 22196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::arm64_be || 2220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (getTriple().getOS() == llvm::Triple::Linux && 2221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (!V.isOlderThan(4, 7, 0) || 2222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getEnvironment() == llvm::Triple::Android)); 2223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DriverArgs.hasFlag(options::OPT_fuse_init_array, 2225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines options::OPT_fno_use_init_array, 2226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines UseInitArrayDefault)) 2227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CC1Args.push_back("-fuse-init-array"); 2228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 22309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum/// Hexagon Toolchain 22319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 2232b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisstd::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) { 2233b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2234b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis // Locate the rest of the toolchain ... 2235b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (strlen(GCC_INSTALL_PREFIX)) 2236b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return std::string(GCC_INSTALL_PREFIX); 2237b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2238b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string InstallRelDir = InstalledDir + "/../../gnu"; 2239b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (llvm::sys::fs::exists(InstallRelDir)) 2240b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return InstallRelDir; 2241b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2242b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu"; 2243b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (llvm::sys::fs::exists(PrefixRelDir)) 2244b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return PrefixRelDir; 2245b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2246b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return InstallRelDir; 2247b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis} 2248b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 22495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic void GetHexagonLibraryPaths( 22505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const ArgList &Args, 22515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string Ver, 22525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string MarchString, 22535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string &InstalledDir, 22545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ToolChain::path_list *LibPaths) 22555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis{ 22565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis bool buildingLib = Args.hasArg(options::OPT_shared); 22575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 22585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 22595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // -L Args 22605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 22615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for (arg_iterator 22625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis it = Args.filtered_begin(options::OPT_L), 22635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ie = Args.filtered_end(); 22645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis it != ie; 22655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ++it) { 22665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i) 22675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back((*it)->getValue(i)); 22685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 22695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 22705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 22715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Other standard paths 22725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis //---------------------------------------------------------------------------- 22735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string MarchSuffix = "/" + MarchString; 22745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string G0Suffix = "/G0"; 22755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string MarchG0Suffix = MarchSuffix + G0Suffix; 22765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/"; 22775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 22785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // lib/gcc/hexagon/... 22795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/"; 22805fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (buildingLib) { 22815fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix); 22825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix); 22835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 22845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix); 22855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(LibGCCHexagonDir + Ver); 22865fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 22875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // lib/gcc/... 22885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(RootDir + "lib/gcc"); 22895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 22905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // hexagon/lib/... 22915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis std::string HexagonLibDir = RootDir + "hexagon/lib"; 22925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (buildingLib) { 22935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(HexagonLibDir + MarchG0Suffix); 22945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(HexagonLibDir + G0Suffix); 22955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 22965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(HexagonLibDir + MarchSuffix); 22975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->push_back(HexagonLibDir); 22985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis} 22995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 2300b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew CurtisHexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple, 2301b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const ArgList &Args) 2302b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis : Linux(D, Triple, Args) { 2303b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const std::string InstalledDir(getDriver().getInstalledDir()); 2304b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir); 2305b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2306b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to 2307b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis // program paths 2308b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const std::string BinDir(GnuDir + "/bin"); 2309b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (llvm::sys::fs::exists(BinDir)) 2310b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis getProgramPaths().push_back(BinDir); 2311b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2312b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis // Determine version of GCC libraries and headers to use. 2313b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon"); 2314ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::error_code ec; 2315b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis GCCVersion MaxVersion= GCCVersion::Parse("0.0.0"); 2316b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de; 2317b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis !ec && di != de; di = di.increment(ec)) { 2318b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path())); 2319b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (MaxVersion < cv) 2320b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis MaxVersion = cv; 2321b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis } 2322b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis GCCLibAndIncVersion = MaxVersion; 23235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 23245fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis ToolChain::path_list *LibPaths= &getFilePaths(); 23255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 23265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets 23275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // 'elf' OS type, so the Linux paths are not appropriate. When we actually 23285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis // support 'linux' we'll need to fix this up 23295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths->clear(); 23305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 23315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis GetHexagonLibraryPaths( 23325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Args, 23335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis GetGCCLibAndIncVersion(), 23345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis GetTargetCPU(Args), 23355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis InstalledDir, 23365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis LibPaths); 23379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 23389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 23399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumHexagon_TC::~Hexagon_TC() { 23409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 23419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 2342f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Hexagon_TC::buildAssembler() const { 2343f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::hexagon::Assemble(*this); 2344f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2345f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2346f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Hexagon_TC::buildLinker() const { 2347f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::hexagon::Link(*this); 23489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 23499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 2350b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 2351b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis ArgStringList &CC1Args) const { 2352b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const Driver &D = getDriver(); 2353b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2354b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (DriverArgs.hasArg(options::OPT_nostdinc) || 2355b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis DriverArgs.hasArg(options::OPT_nostdlibinc)) 2356b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return; 2357b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2358b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string Ver(GetGCCLibAndIncVersion()); 2359b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir); 2360b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver); 2361b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include"); 2362b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed"); 2363b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include"); 23649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum} 23659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum 2366b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2367b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis ArgStringList &CC1Args) const { 2368b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2369b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 2370b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis DriverArgs.hasArg(options::OPT_nostdincxx)) 2371b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis return; 2372b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 2373b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis const Driver &D = getDriver(); 2374b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis std::string Ver(GetGCCLibAndIncVersion()); 23757b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir)); 2376b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis 23777b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(IncludeDir, "hexagon/include/c++/"); 23787b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(IncludeDir, Ver); 2379b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis addSystemInclude(DriverArgs, CC1Args, IncludeDir.str()); 23807ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth} 23816781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis 23825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisToolChain::CXXStdlibType 23835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisHexagon_TC::GetCXXStdlibType(const ArgList &Args) const { 23845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis Arg *A = Args.getLastArg(options::OPT_stdlib_EQ); 23855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (!A) 23865fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis return ToolChain::CST_Libstdcxx; 23875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 23885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis StringRef Value = A->getValue(); 23895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis if (Value != "libstdc++") { 23905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis getDriver().Diag(diag::err_drv_invalid_stdlib_name) 23915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis << A->getAsString(Args); 23925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis } 23935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 23945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis return ToolChain::CST_Libstdcxx; 23955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis} 23965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis 2397f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindolastatic int getHexagonVersion(const ArgList &Args) { 2398f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ); 2399f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola // Select the default CPU (v4) if none was given. 2400f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola if (!A) 2401f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return 4; 2402f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola 2403f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola // FIXME: produce errors if we cannot parse the version. 2404f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola StringRef WhichHexagon = A->getValue(); 2405f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola if (WhichHexagon.startswith("hexagonv")) { 2406f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola int Val; 2407f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val)) 2408f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return Val; 2409f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola } 2410f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola if (WhichHexagon.startswith("v")) { 2411f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola int Val; 2412f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola if (!WhichHexagon.substr(1).getAsInteger(10, Val)) 2413f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return Val; 24146781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis } 2415f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola 2416f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola // FIXME: should probably be an error. 2417f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return 4; 24186781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis} 24196781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis 24206781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew CurtisStringRef Hexagon_TC::GetTargetCPU(const ArgList &Args) 24216781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{ 2422f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola int V = getHexagonVersion(Args); 2423f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola // FIXME: We don't support versions < 4. We should error on them. 2424f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola switch (V) { 2425f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola default: 2426f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola llvm_unreachable("Unexpected version"); 2427f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola case 5: 2428f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return "v5"; 2429f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola case 4: 2430f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return "v4"; 2431f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola case 3: 2432f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return "v3"; 2433f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola case 2: 2434f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return "v2"; 2435f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola case 1: 2436f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola return "v1"; 24376781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis } 24386781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis} 2439b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis// End Hexagon 2440f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 24413a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 24423a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 24433a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation. 24443a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 2445af370e6e051e505016637e23418354db625dc796Rafael EspindolaTCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple, 2446af370e6e051e505016637e23418354db625dc796Rafael Espindola const ArgList &Args) 2447af370e6e051e505016637e23418354db625dc796Rafael Espindola : ToolChain(D, Triple, Args) { 24483a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner // Path mangling to find libexec 24493a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner std::string Path(getDriver().Dir); 24503a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 24513a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Path += "/../libexec"; 24523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner getProgramPaths().push_back(Path); 24533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 24543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 24553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() { 24563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 24573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 2458304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const { 2459304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi return true; 24603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 24613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 24627ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefault() const { 24637ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth return false; 24643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 24653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 246652ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool TCEToolChain::isPIEDefault() const { 246752ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne return false; 246852ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne} 246952ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne 24707ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefaultForced() const { 24717ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth return false; 24723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 24733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 2474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 2475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 24760e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaOpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 24770e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 2478ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 2479f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back("/usr/lib"); 2480f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2481f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 2482f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *OpenBSD::buildAssembler() const { 2483f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::openbsd::Assemble(*this); 2484f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2485f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2486f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *OpenBSD::buildLinker() const { 2487f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::openbsd::Link(*this); 2488f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 2489f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 249042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly. 249142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 249242f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanBitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 249342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman : Generic_ELF(D, Triple, Args) { 249442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getFilePaths().push_back(getDriver().Dir + "/../lib"); 249542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman getFilePaths().push_back("/usr/lib"); 249642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 249742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 2498f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Bitrig::buildAssembler() const { 2499f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::bitrig::Assemble(*this); 2500f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2501f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2502f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Bitrig::buildLinker() const { 2503f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::bitrig::Link(*this); 250442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 250542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 25066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesToolChain::CXXStdlibType 25076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesBitrig::GetCXXStdlibType(const ArgList &Args) const { 25086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 25096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Value = A->getValue(); 25106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Value == "libstdc++") 25116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ToolChain::CST_Libstdcxx; 25126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Value == "libc++") 25136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ToolChain::CST_Libcxx; 25146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 25156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getDriver().Diag(diag::err_drv_invalid_stdlib_name) 25166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << A->getAsString(Args); 25176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 25186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return ToolChain::CST_Libcxx; 25196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 25206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 252142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 252242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman ArgStringList &CC1Args) const { 252342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 252442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman DriverArgs.hasArg(options::OPT_nostdincxx)) 252542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman return; 252642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 25278e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth switch (GetCXXStdlibType(DriverArgs)) { 25288e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth case ToolChain::CST_Libcxx: 25298e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth addSystemInclude(DriverArgs, CC1Args, 25306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getDriver().SysRoot + "/usr/include/c++/v1"); 25318e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth break; 25328e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth case ToolChain::CST_Libstdcxx: 25338e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth addSystemInclude(DriverArgs, CC1Args, 25348e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth getDriver().SysRoot + "/usr/include/c++/stdc++"); 25358e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth addSystemInclude(DriverArgs, CC1Args, 25368e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth getDriver().SysRoot + "/usr/include/c++/stdc++/backward"); 25378e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth 25388e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth StringRef Triple = getTriple().str(); 25398e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth if (Triple.startswith("amd64")) 25408e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth addSystemInclude(DriverArgs, CC1Args, 25418e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" + 25428e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth Triple.substr(5)); 25438e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth else 25448e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth addSystemInclude(DriverArgs, CC1Args, 25458e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth getDriver().SysRoot + "/usr/include/c++/stdc++/" + 25468e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth Triple); 25478e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth break; 25488e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth } 254942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 255042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 255142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddCXXStdlibLibArgs(const ArgList &Args, 255242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman ArgStringList &CmdArgs) const { 25538e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth switch (GetCXXStdlibType(Args)) { 25548e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth case ToolChain::CST_Libcxx: 25558e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth CmdArgs.push_back("-lc++"); 25566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CmdArgs.push_back("-lc++abi"); 25576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CmdArgs.push_back("-lpthread"); 25588e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth break; 25598e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth case ToolChain::CST_Libstdcxx: 25608e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth CmdArgs.push_back("-lstdc++"); 25618e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth break; 25628e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth } 256342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman} 256442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman 256575358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 256675358d267256022475371416654b056ad8531cb3Daniel Dunbar 25670e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaFreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 25680e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 2569214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar 257024248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall 257124248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth // back to '/usr/lib' if it doesn't exist. 257200646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth if ((Triple.getArch() == llvm::Triple::x86 || 257300646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth Triple.getArch() == llvm::Triple::ppc) && 257424248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o")) 257500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32"); 257600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth else 257700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); 257875358d267256022475371416654b056ad8531cb3Daniel Dunbar} 257975358d267256022475371416654b056ad8531cb3Daniel Dunbar 25801cc766fb3e62fedc5d99b103bcd0ec4aa3146859David ChisnallToolChain::CXXStdlibType 25811cc766fb3e62fedc5d99b103bcd0ec4aa3146859David ChisnallFreeBSD::GetCXXStdlibType(const ArgList &Args) const { 25821cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 25831cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall StringRef Value = A->getValue(); 25841cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall if (Value == "libstdc++") 25851cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall return ToolChain::CST_Libstdcxx; 25861cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall if (Value == "libc++") 25871cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall return ToolChain::CST_Libcxx; 25881cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall 25891cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall getDriver().Diag(diag::err_drv_invalid_stdlib_name) 25901cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall << A->getAsString(Args); 25911cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall } 25921cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall if (getTriple().getOSMajorVersion() >= 10) 25931cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall return ToolChain::CST_Libcxx; 25941cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall return ToolChain::CST_Libstdcxx; 25951cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall} 25961cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall 25971cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnallvoid FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 25981cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall ArgStringList &CC1Args) const { 25991cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 26001cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall DriverArgs.hasArg(options::OPT_nostdincxx)) 26011cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall return; 26021cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall 26031cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall switch (GetCXXStdlibType(DriverArgs)) { 26041cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall case ToolChain::CST_Libcxx: 26051cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall addSystemInclude(DriverArgs, CC1Args, 26061cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall getDriver().SysRoot + "/usr/include/c++/v1"); 26071cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall break; 26081cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall case ToolChain::CST_Libstdcxx: 26091cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall addSystemInclude(DriverArgs, CC1Args, 26101cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall getDriver().SysRoot + "/usr/include/c++/4.2"); 26111cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall addSystemInclude(DriverArgs, CC1Args, 26121cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall getDriver().SysRoot + "/usr/include/c++/4.2/backward"); 26131cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall break; 26141cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall } 26151cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall} 26161cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall 2617f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *FreeBSD::buildAssembler() const { 2618f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::freebsd::Assemble(*this); 2619f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2620f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2621f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *FreeBSD::buildLinker() const { 2622f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::freebsd::Link(*this); 26238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 26248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 262527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindolabool FreeBSD::UseSjLjExceptions() const { 262627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola // FreeBSD uses SjLj exceptions on ARM oabi. 262727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola switch (getTriple().getEnvironment()) { 2628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::GNUEABIHF: 262927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola case llvm::Triple::GNUEABI: 263027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola case llvm::Triple::EABI: 263127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola return false; 263227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola 263327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola default: 263427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola return (getTriple().getArch() == llvm::Triple::arm || 263527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola getTriple().getArch() == llvm::Triple::thumb); 263627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola } 263727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola} 263827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola 2639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool FreeBSD::HasNativeLLVMSupport() const { 2640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 2641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool FreeBSD::isPIEDefault() const { 2644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return getSanitizerArgs().hasZeroBaseShadow(); 2645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 2646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 26478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly. 26488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 26490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaNetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 26500e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 26518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 265205e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger if (getDriver().UseStdLib) { 265332f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth // When targeting a 32-bit platform, try the special directory used on 265432f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth // 64-bit hosts, and only fall back to the main library directory if that 265532f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth // doesn't work. 265632f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth // FIXME: It'd be nicer to test if this directory exists, but I'm not sure 265732f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth // what all logic is needed to emulate the '=' prefix here. 2658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Triple.getArch()) { 2659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::x86: 266005e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger getFilePaths().push_back("=/usr/lib/i386"); 2661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::arm: 26636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::armeb: 2664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::thumb: 26656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::thumbeb: 2666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Triple.getEnvironment()) { 2667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::EABI: 2668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::EABIHF: 2669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::GNUEABI: 2670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::GNUEABIHF: 2671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getFilePaths().push_back("=/usr/lib/eabi"); 2672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 2674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getFilePaths().push_back("=/usr/lib/oabi"); 2675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::mips64: 2679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::mips64el: 2680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (tools::mips::hasMipsAbiArg(Args, "o32")) 2681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getFilePaths().push_back("=/usr/lib/o32"); 2682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (tools::mips::hasMipsAbiArg(Args, "64")) 2683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getFilePaths().push_back("=/usr/lib/64"); 2684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 26856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::sparc: 26866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getFilePaths().push_back("=/usr/lib/sparc"); 26876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 2688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 2689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 269132f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth 269232f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth getFilePaths().push_back("=/usr/lib"); 26938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer } 26948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer} 26958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer 2696f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *NetBSD::buildAssembler() const { 2697f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::netbsd::Assemble(*this); 2698f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2699f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2700f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *NetBSD::buildLinker() const { 2701f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::netbsd::Link(*this); 270275358d267256022475371416654b056ad8531cb3Daniel Dunbar} 270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 2704a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg SonnenbergerToolChain::CXXStdlibType 2705a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg SonnenbergerNetBSD::GetCXXStdlibType(const ArgList &Args) const { 2706a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 2707a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger StringRef Value = A->getValue(); 2708a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger if (Value == "libstdc++") 2709a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger return ToolChain::CST_Libstdcxx; 2710a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger if (Value == "libc++") 2711a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger return ToolChain::CST_Libcxx; 2712a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 2713a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger getDriver().Diag(diag::err_drv_invalid_stdlib_name) 2714a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger << A->getAsString(Args); 2715a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger } 2716a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 2717e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger unsigned Major, Minor, Micro; 2718e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger getTriple().getOSVersion(Major, Minor, Micro); 27196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) { 2720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (getArch()) { 27216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::arm: 27226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::armeb: 27236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::thumb: 27246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::thumbeb: 2725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::x86: 2726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::x86_64: 2727e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger return ToolChain::CST_Libcxx; 2728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 2729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2731e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger } 2732a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger return ToolChain::CST_Libstdcxx; 2733a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger} 2734a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 2735a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenbergervoid NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 2736a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger ArgStringList &CC1Args) const { 2737a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 2738a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger DriverArgs.hasArg(options::OPT_nostdincxx)) 2739a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger return; 2740a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 2741a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger switch (GetCXXStdlibType(DriverArgs)) { 2742a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger case ToolChain::CST_Libcxx: 2743a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger addSystemInclude(DriverArgs, CC1Args, 2744a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger getDriver().SysRoot + "/usr/include/c++/"); 2745a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger break; 2746a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger case ToolChain::CST_Libstdcxx: 2747a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger addSystemInclude(DriverArgs, CC1Args, 2748a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger getDriver().SysRoot + "/usr/include/g++"); 2749a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger addSystemInclude(DriverArgs, CC1Args, 2750a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger getDriver().SysRoot + "/usr/include/g++/backward"); 2751a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger break; 2752a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger } 2753a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger} 2754a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger 275538e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly. 275638e317d6dce161b249508686cc67eb7176958762Chris Lattner 27570e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaMinix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 27580e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 275938e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back(getDriver().Dir + "/../lib"); 276038e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back("/usr/lib"); 276138e317d6dce161b249508686cc67eb7176958762Chris Lattner} 276238e317d6dce161b249508686cc67eb7176958762Chris Lattner 2763f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Minix::buildAssembler() const { 2764f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::minix::Assemble(*this); 2765f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2766f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2767f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Minix::buildLinker() const { 2768f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::minix::Link(*this); 276938e317d6dce161b249508686cc67eb7176958762Chris Lattner} 277038e317d6dce161b249508686cc67eb7176958762Chris Lattner 2771e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 2772e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 27730e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaAuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple, 27740e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const ArgList &Args) 27750e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) { 2776e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2777edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 277886643b88a11582cfff2091a4815950d166269428Benjamin Kramer if (getDriver().getInstalledDir() != getDriver().Dir) 2779edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 2780e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2781ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 2782e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/lib"); 2783e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/sfw/lib"); 2784e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib"); 27857adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 2786e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2787e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2788e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2789f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *AuroraUX::buildAssembler() const { 2790f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::auroraux::Assemble(*this); 2791f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2792f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2793f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *AuroraUX::buildLinker() const { 2794f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::auroraux::Link(*this); 2795e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 2796e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 279731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly. 279831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 27990e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaSolaris::Solaris(const Driver &D, const llvm::Triple& Triple, 28000e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola const ArgList &Args) 28010e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_GCC(D, Triple, Args) { 280231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 280331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall getProgramPaths().push_back(getDriver().getInstalledDir()); 280431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall if (getDriver().getInstalledDir() != getDriver().Dir) 280531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall getProgramPaths().push_back(getDriver().Dir); 280631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 280731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall getFilePaths().push_back(getDriver().Dir + "/../lib"); 280831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall getFilePaths().push_back("/usr/lib"); 280931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 281031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall 2811f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Solaris::buildAssembler() const { 2812f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::solaris::Assemble(*this); 2813f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 2814f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 2815f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Solaris::buildLinker() const { 2816f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::solaris::Link(*this); 281731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall} 2818e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 2819d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge/// Distribution (very bare-bones at the moment). 28206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 2821d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingeenum Distro { 28223fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth ArchLinux, 2823c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola DebianLenny, 2824c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola DebianSqueeze, 28250b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman DebianWheezy, 2826b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru DebianJessie, 28270a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola Exherbo, 2828d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner RHEL4, 2829d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner RHEL5, 2830d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner RHEL6, 28311a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola Fedora, 2832766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola OpenSUSE, 2833814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor UbuntuHardy, 2834814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor UbuntuIntrepid, 2835021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola UbuntuJaunty, 28365ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu UbuntuKarmic, 2837c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UbuntuLucid, 2838c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UbuntuMaverick, 283943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek UbuntuNatty, 284025a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer UbuntuOneiric, 2841668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer UbuntuPrecise, 2842de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola UbuntuQuantal, 2843de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola UbuntuRaring, 28441b034649379530c8870932449354b876f90e1644Sylvestre Ledru UbuntuSaucy, 284524d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru UbuntuTrusty, 2846c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UnknownDistro 2847c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}; 2848c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2849d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsRedhat(enum Distro Distro) { 28501a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL6); 2851c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 2852c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2853766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindolastatic bool IsOpenSUSE(enum Distro Distro) { 2854766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola return Distro == OpenSUSE; 2855c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 2856c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2857d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsDebian(enum Distro Distro) { 2858b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru return Distro >= DebianLenny && Distro <= DebianJessie; 2859c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 2860c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2861d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsUbuntu(enum Distro Distro) { 286224d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru return Distro >= UbuntuHardy && Distro <= UbuntuTrusty; 2863c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 2864c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 28659a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindolastatic Distro DetectDistro(llvm::Triple::ArchType Arch) { 2866ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = 2867ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::MemoryBuffer::getFile("/etc/lsb-release"); 2868ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (File) { 28695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data = File.get()->getBuffer(); 28705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<StringRef, 8> Lines; 2871c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Data.split(Lines, "\n"); 2872d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge Distro Version = UnknownDistro; 2873668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer for (unsigned i = 0, s = Lines.size(); i != s; ++i) 2874668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME=")) 2875d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge Version = llvm::StringSwitch<Distro>(Lines[i].substr(17)) 2876668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("hardy", UbuntuHardy) 2877668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("intrepid", UbuntuIntrepid) 2878668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("jaunty", UbuntuJaunty) 2879668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("karmic", UbuntuKarmic) 2880668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("lucid", UbuntuLucid) 2881668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("maverick", UbuntuMaverick) 2882668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("natty", UbuntuNatty) 2883668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("oneiric", UbuntuOneiric) 2884668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Case("precise", UbuntuPrecise) 2885de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola .Case("quantal", UbuntuQuantal) 2886de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola .Case("raring", UbuntuRaring) 28871b034649379530c8870932449354b876f90e1644Sylvestre Ledru .Case("saucy", UbuntuSaucy) 288824d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru .Case("trusty", UbuntuTrusty) 2889668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer .Default(UnknownDistro); 2890668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer return Version; 2891c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 2892c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2893ef8225444452a1486bd721f3285301fe84643b00Stephen Hines File = llvm::MemoryBuffer::getFile("/etc/redhat-release"); 2894ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (File) { 28955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data = File.get()->getBuffer(); 28961a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola if (Data.startswith("Fedora release")) 28971a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola return Fedora; 28986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Data.startswith("Red Hat Enterprise Linux") || 28996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Data.startswith("CentOS")) { 29006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Data.find("release 6") != StringRef::npos) 29016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RHEL6; 29026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (Data.find("release 5") != StringRef::npos) 29036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RHEL5; 29046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (Data.find("release 4") != StringRef::npos) 29056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return RHEL4; 29066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 2907c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 2908c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 2909c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2910ef8225444452a1486bd721f3285301fe84643b00Stephen Hines File = llvm::MemoryBuffer::getFile("/etc/debian_version"); 2911ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (File) { 29125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Data = File.get()->getBuffer(); 2913c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Data[0] == '5') 2914c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return DebianLenny; 29150e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola else if (Data.startswith("squeeze/sid") || Data[0] == '6') 2916c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return DebianSqueeze; 29170e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola else if (Data.startswith("wheezy/sid") || Data[0] == '7') 29180b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman return DebianWheezy; 2919b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru else if (Data.startswith("jessie/sid") || Data[0] == '8') 2920b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru return DebianJessie; 2921c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 2922c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 2923c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 29249a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola if (llvm::sys::fs::exists("/etc/SuSE-release")) 2925766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola return OpenSUSE; 2926c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 29279a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola if (llvm::sys::fs::exists("/etc/exherbo-release")) 29280a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola return Exherbo; 29290a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola 29309a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola if (llvm::sys::fs::exists("/etc/arch-release")) 29313fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth return ArchLinux; 29323fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth 2933c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 2934c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 2935c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 2936deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target. 2937deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// 2938deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use 2939deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths. 2940deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple, 2941deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here. 2942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic std::string getMultiarchTriple(const llvm::Triple &TargetTriple, 2943deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth StringRef SysRoot) { 2944deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth // For most architectures, just use whatever we have rather than trying to be 2945deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth // clever. 2946deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth switch (TargetTriple.getArch()) { 2947deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth default: 2948deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth return TargetTriple.str(); 2949deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth 2950deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth // We use the existence of '/lib/<triple>' as a directory to detect some 2951deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth // common linux triples that don't quite match the Clang triple for both 2952236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth // 32-bit and 64-bit targets. Multiarch fixes its install triples to these 2953236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth // regardless of what the actual target triple is. 29540337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier case llvm::Triple::arm: 29550337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier case llvm::Triple::thumb: 2956ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 2957ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf")) 2958ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu return "arm-linux-gnueabihf"; 2959ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu } else { 2960ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi")) 2961ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu return "arm-linux-gnueabi"; 2962ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu } 29630337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier return TargetTriple.str(); 2964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::armeb: 2965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::thumbeb: 2966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { 2967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf")) 2968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return "armeb-linux-gnueabihf"; 2969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 2970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi")) 2971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return "armeb-linux-gnueabi"; 2972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return TargetTriple.str(); 2974deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth case llvm::Triple::x86: 2975deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu")) 2976deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth return "i386-linux-gnu"; 2977deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth return TargetTriple.str(); 2978deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth case llvm::Triple::x86_64: 2979ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // We don't want this for x32, otherwise it will match x86_64 libs 2980ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (TargetTriple.getEnvironment() != llvm::Triple::GNUX32 && 2981ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu")) 2982deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth return "x86_64-linux-gnu"; 2983deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth return TargetTriple.str(); 2984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::arm64: 2985c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover case llvm::Triple::aarch64: 2986c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu")) 2987c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover return "aarch64-linux-gnu"; 2988162579a9441c7c8c308c56ac706799765ccbc4eeTim Northover return TargetTriple.str(); 29896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case llvm::Triple::arm64_be: 2990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case llvm::Triple::aarch64_be: 2991651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu")) 2992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return "aarch64_be-linux-gnu"; 2993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return TargetTriple.str(); 29945bea4f6860543017be326e3fbe702edb2678d898Eli Friedman case llvm::Triple::mips: 29955bea4f6860543017be326e3fbe702edb2678d898Eli Friedman if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu")) 29965bea4f6860543017be326e3fbe702edb2678d898Eli Friedman return "mips-linux-gnu"; 29975bea4f6860543017be326e3fbe702edb2678d898Eli Friedman return TargetTriple.str(); 29985bea4f6860543017be326e3fbe702edb2678d898Eli Friedman case llvm::Triple::mipsel: 29995bea4f6860543017be326e3fbe702edb2678d898Eli Friedman if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu")) 30005bea4f6860543017be326e3fbe702edb2678d898Eli Friedman return "mipsel-linux-gnu"; 30015bea4f6860543017be326e3fbe702edb2678d898Eli Friedman return TargetTriple.str(); 3002ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case llvm::Triple::mips64: 3003ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu")) 3004ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return "mips64-linux-gnu"; 3005ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64")) 3006ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return "mips64-linux-gnuabi64"; 3007ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return TargetTriple.str(); 3008ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case llvm::Triple::mips64el: 3009ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu")) 3010ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return "mips64el-linux-gnu"; 3011ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64")) 3012ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return "mips64el-linux-gnuabi64"; 3013ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return TargetTriple.str(); 3014155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth case llvm::Triple::ppc: 3015b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe")) 3016b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru return "powerpc-linux-gnuspe"; 3017155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu")) 3018155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth return "powerpc-linux-gnu"; 3019155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth return TargetTriple.str(); 3020155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth case llvm::Triple::ppc64: 3021155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu")) 3022155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth return "powerpc64-linux-gnu"; 3023ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt case llvm::Triple::ppc64le: 3024ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu")) 3025ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt return "powerpc64le-linux-gnu"; 3026155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth return TargetTriple.str(); 3027deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth } 3028deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth} 3029deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth 303000646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) { 303100646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str()); 303200646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth} 303300646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth 3034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) { 30352a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth if (isMipsArch(Triple.getArch())) { 30362a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // lib32 directory has a special meaning on MIPS targets. 30372a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // It contains N32 ABI binaries. Use this folder if produce 30382a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // code for N32 ABI only. 3039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (tools::mips::hasMipsAbiArg(Args, "n32")) 30402a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth return "lib32"; 30412a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth return Triple.isArch32Bit() ? "lib" : "lib64"; 30422a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth } 30437a9188833a6a09d574144334c9584c417b809007Simon Atanasyan 3044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and 30452a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // using that variant while targeting other architectures causes problems 30462a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // because the libraries are laid out in shared system roots that can't cope 3047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // with a 'lib32' library search path being considered. So we only enable 30482a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // them when we know we may need it. 30492a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // 30502a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // FIXME: This is a bit of a hack. We should really unify this code for 3051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // reasoning about oslibdir spellings with the lib dir spellings in the 30522a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth // GCCInstallationDetector, but that is a more significant refactoring. 30532a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth if (Triple.getArch() == llvm::Triple::x86 || 30542a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth Triple.getArch() == llvm::Triple::ppc) 30557a9188833a6a09d574144334c9584c417b809007Simon Atanasyan return "lib32"; 30567a9188833a6a09d574144334c9584c417b809007Simon Atanasyan 3057ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Triple.getArch() == llvm::Triple::x86_64 && 3058ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Triple.getEnvironment() == llvm::Triple::GNUX32) 3059ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return "libx32"; 3060ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 30617a9188833a6a09d574144334c9584c417b809007Simon Atanasyan return Triple.isArch32Bit() ? "lib" : "lib64"; 30627a9188833a6a09d574144334c9584c417b809007Simon Atanasyan} 30637a9188833a6a09d574144334c9584c417b809007Simon Atanasyan 30640e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaLinux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) 30650e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 3066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines GCCInstallation.init(D, Triple, Args); 3067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilibs = GCCInstallation.getMultilibs(); 306889088797876bddb866ce821f050a4395b7514dc2Chandler Carruth llvm::Triple::ArchType Arch = Triple.getArch(); 3069ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyan std::string SysRoot = computeSysRoot(); 3070c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3071766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola // Cross-compiling binutils and GCC installations (vanilla and openSUSE at 3072ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // least) put various tools in a triple-prefixed directory off of the parent 3073ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // of the GCC installation. We use the GCC triple here to ensure that we end 3074ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // up with tools that support the same amount of cross compiling as the 3075ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // detected GCC installation. For example, if we find a GCC installation 3076ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // targeting x86_64, but it is a bi-arch GCC installation, it can also be 3077ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // used to target i386. 3078ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth // FIXME: This seems unlikely to be Linux-specific. 3079ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola ToolChain::path_list &PPaths = getProgramPaths(); 3080fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" + 3081fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth GCCInstallation.getTriple().str() + "/bin").str()); 3082ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola 3083ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Linker = GetLinkerPath(); 3084c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 30859a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola Distro Distro = DetectDistro(Arch); 3086c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3087766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) { 308894c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola ExtraOpts.push_back("-z"); 308994c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola ExtraOpts.push_back("relro"); 309094c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola } 3091c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3092f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) 3093c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("-X"); 3094c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 309594a7142f74bb4a9daa53c22087b19d4568073109Logan Chien const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android; 30968e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan const bool IsMips = isMipsArch(Arch); 30978e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 30988e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (IsMips && !SysRoot.empty()) 30998e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan ExtraOpts.push_back("--sysroot=" + SysRoot); 3100704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov 3101d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth // Do not use 'gnu' hash style for Mips targets because .gnu.hash 3102d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth // and the MIPS ABI require .dynsym to be sorted in different ways. 3103d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS 3104d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth // ABI requires a mapping between the GOT and the symbol table. 3105704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov // Android loader does not support .gnu.hash. 31068e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (!IsMips && !IsAndroid) { 3107766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola if (IsRedhat(Distro) || IsOpenSUSE(Distro) || 3108668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer (IsUbuntu(Distro) && Distro >= UbuntuMaverick)) 3109d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth ExtraOpts.push_back("--hash-style=gnu"); 3110d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth 3111766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid || 3112d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth Distro == UbuntuJaunty || Distro == UbuntuKarmic) 3113d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth ExtraOpts.push_back("--hash-style=both"); 3114d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth } 3115c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3116d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner if (IsRedhat(Distro)) 3117c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--no-add-needed"); 3118c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 31190b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman if (Distro == DebianSqueeze || Distro == DebianWheezy || 3120766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola Distro == DebianJessie || IsOpenSUSE(Distro) || 31215a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) || 3122668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer (IsUbuntu(Distro) && Distro >= UbuntuKarmic)) 3123c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--build-id"); 3124c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3125766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola if (IsOpenSUSE(Distro)) 3126f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth ExtraOpts.push_back("--enable-new-dtags"); 312764a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner 3128d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth // The selection of paths to try here is designed to match the patterns which 3129d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth // the GCC driver itself uses, as this is part of the GCC-compatible driver. 3130d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth // This was determined by running GCC in a fake filesystem, creating all 3131d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth // possible permutations of these directories, and seeing which ones it added 3132d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth // to the link paths. 3133d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth path_list &Paths = getFilePaths(); 313489088797876bddb866ce821f050a4395b7514dc2Chandler Carruth 3135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string OSLibDir = getOSLibDir(Triple, Args); 3136deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot); 31373fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth 3138d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth // Add the multilib suffixed paths where they are available. 3139d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth if (GCCInstallation.isValid()) { 3140fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 314189088797876bddb866ce821f050a4395b7514dc2Chandler Carruth const std::string &LibPath = GCCInstallation.getParentLibPath(); 3142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Multilib &Multilib = GCCInstallation.getMultilib(); 3143f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan 314428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // Sourcery CodeBench MIPS toolchain holds some libraries under 314576671edc68f1c86369c84c2a6c011dabd39e37e5Chandler Carruth // a biarch-like suffix of the GCC installation. 3146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists((GCCInstallation.getInstallPath() + 3147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib.gccSuffix()), 3148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Paths); 314928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth 315028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // GCC cross compiling toolchains will install target libraries which ship 315128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as 315228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // any part of the GCC installation in 315328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat 315428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // debatable, but is the reality today. We need to search this tree even 315528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // when we have a sysroot somewhere else. It is the responsibility of 3156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // whomever is doing the cross build targeting a sysroot using a GCC 315728803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // installation that is *not* within the system root to ensure two things: 315828803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // 315928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // 1) Any DSOs that are linked in from this tree or from the install path 316028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // above must be preasant on the system root and found via an 316128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // appropriate rpath. 316228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // 2) There must not be libraries installed into 316328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // <prefix>/<triple>/<libdir> unless they should be preferred over 316428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // those within the system root. 316528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // 316628803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // Note that this matches the GCC behavior. See the below comment for where 316728803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // Clang diverges from GCC's behavior. 3168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir + 3169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib.osSuffix(), 317028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth Paths); 317128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth 31729f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth // If the GCC installation we found is inside of the sysroot, we want to 31739f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth // prefer libraries installed in the parent prefix of the GCC installation. 31749f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth // It is important to *not* use these paths when the GCC installation is 3175241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif // outside of the system root as that can pick up unintended libraries. 31769f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth // This usually happens when there is an external cross compiler on the 31779f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth // host system, and a more minimal sysroot available that is the target of 317828803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // the cross. Note that GCC does include some of these directories in some 317928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // configurations but this seems somewhere between questionable and simply 318028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // a bug. 31819f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth if (StringRef(LibPath).startswith(SysRoot)) { 31829f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth addPathIfExists(LibPath + "/" + MultiarchTriple, Paths); 3183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(LibPath + "/../" + OSLibDir, Paths); 31849f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth } 3185c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 3186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Similar to the logic for GCC above, if we currently running Clang inside 3188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // of the requested system root, add its parent library paths to 3189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // those searched. 3190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: It's not clear whether we should use the driver's installed 3191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // directory ('Dir' below) or the ResourceDir. 3192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (StringRef(D.Dir).startswith(SysRoot)) { 3193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths); 3194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(D.Dir + "/../" + OSLibDir, Paths); 3195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3197d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths); 3198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths); 3199d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths); 3200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths); 3201d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth 3202d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth // Try walking via the GCC triple path in case of biarch or multiarch GCC 3203d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth // installations with strange symlinks. 320479cabd0793a624c1bc64c7c9e11575793c01b1e7Rafael Espindola if (GCCInstallation.isValid()) { 3205fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() + 3206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "/../../" + OSLibDir, Paths); 3207c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola 3208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Add the 'other' biarch variant path 3209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib BiarchSibling; 3210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (GCCInstallation.getBiarchSibling(BiarchSibling)) { 32114e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan addPathIfExists(GCCInstallation.getInstallPath() + 3212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BiarchSibling.gccSuffix(), Paths); 3213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 32149f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth 321528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // See comments above on the multilib variant for details of why this is 321628803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // included even from outside the sysroot. 3217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string &LibPath = GCCInstallation.getParentLibPath(); 3218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const llvm::Triple &GCCTriple = GCCInstallation.getTriple(); 3219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Multilib &Multilib = GCCInstallation.getMultilib(); 32204e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan addPathIfExists(LibPath + "/../" + GCCTriple.str() + 3221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "/lib" + Multilib.osSuffix(), Paths); 322228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth 322328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // See comments above on the multilib variant for details of why this is 322428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth // only included from within the sysroot. 322528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth if (StringRef(LibPath).startswith(SysRoot)) 32269f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth addPathIfExists(LibPath, Paths); 3227d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth } 3228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Similar to the logic for GCC above, if we are currently running Clang 3230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // inside of the requested system root, add its parent library path to those 3231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // searched. 3232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: It's not clear whether we should use the driver's installed 3233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // directory ('Dir' below) or the ResourceDir. 3234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (StringRef(D.Dir).startswith(SysRoot)) 3235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addPathIfExists(D.Dir + "/../lib", Paths); 3236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3237fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth addPathIfExists(SysRoot + "/lib", Paths); 3238fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth addPathIfExists(SysRoot + "/usr/lib", Paths); 3239c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 3240c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 3241c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const { 3242c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return true; 32436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman} 32446b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 3245f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Linux::buildLinker() const { 3246577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge return new tools::gnutools::Link(*this); 3247f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 3248f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 3249f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Linux::buildAssembler() const { 3250577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge return new tools::gnutools::Assemble(*this); 3251ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola} 3252ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 3253ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyanstd::string Linux::computeSysRoot() const { 32548e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (!getDriver().SysRoot.empty()) 32558e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan return getDriver().SysRoot; 32568e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 32578e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch())) 32588e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan return std::string(); 32598e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 32604e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // Standalone MIPS toolchains use different names for sysroot folder 32614e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // and put it into different places. Here we try to check some known 32624e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan // variants. 32634e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 32644e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan const StringRef InstallDir = GCCInstallation.getInstallPath(); 32654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan const StringRef TripleStr = GCCInstallation.getTriple().str(); 3266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Multilib &Multilib = GCCInstallation.getMultilib(); 32674e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 3268f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth std::string Path = (InstallDir + "/../../../../" + TripleStr + "/libc" + 3269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib.osSuffix()).str(); 32708e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 32714e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan if (llvm::sys::fs::exists(Path)) 32724e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan return Path; 32734e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 3274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str(); 32754e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 32764e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan if (llvm::sys::fs::exists(Path)) 32774e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan return Path; 32784e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 32794e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan return std::string(); 32808e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 32818e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 32827d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 32837d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const { 32847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth const Driver &D = getDriver(); 3285ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyan std::string SysRoot = computeSysRoot(); 32867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 32877d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (DriverArgs.hasArg(options::OPT_nostdinc)) 32887d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth return; 32897d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 32907d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) 32918e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include"); 32927d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 32937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { 32947b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola SmallString<128> P(D.ResourceDir); 32957b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola llvm::sys::path::append(P, "include"); 329607643086c6460095855573902d66aae1b08a6182Chandler Carruth addSystemInclude(DriverArgs, CC1Args, P.str()); 32977d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } 32987d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 32997d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (DriverArgs.hasArg(options::OPT_nostdlibinc)) 33007d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth return; 33017d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 33027d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth // Check for configure-time C include directories. 33037d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth StringRef CIncludeDirs(C_INCLUDE_DIRS); 33047d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (CIncludeDirs != "") { 33057d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth SmallVector<StringRef, 5> dirs; 33067d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth CIncludeDirs.split(dirs, ":"); 33076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (StringRef dir : dirs) { 33086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines StringRef Prefix = llvm::sys::path::is_absolute(dir) ? SysRoot : ""; 33096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir); 33107d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } 33117d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth return; 33127d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } 33137d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 33147d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth // Lacking those, try to detect the correct set of system includes for the 33157d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth // target triple. 33167d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 33178e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan // Sourcery CodeBench and modern FSF Mips toolchains put extern C 33188e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan // system includes under three additional directories. 33198e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (GCCInstallation.isValid() && isMipsArch(getTriple().getArch())) { 3320d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth addExternCSystemIncludeIfExists( 3321d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth DriverArgs, CC1Args, GCCInstallation.getInstallPath() + "/include"); 3322d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth 3323d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth addExternCSystemIncludeIfExists( 3324d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth DriverArgs, CC1Args, 3325d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth GCCInstallation.getInstallPath() + "/../../../../" + 3326d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth GCCInstallation.getTriple().str() + "/libc/usr/include"); 33274e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan 33284e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan addExternCSystemIncludeIfExists( 33294e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan DriverArgs, CC1Args, 33304e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan GCCInstallation.getInstallPath() + "/../../../../sysroot/usr/include"); 33318e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan } 33328e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 3333a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // Implement generic Debian multiarch support. 3334a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth const StringRef X86_64MultiarchIncludeDirs[] = { 3335a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth "/usr/include/x86_64-linux-gnu", 3336a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth 3337a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // FIXME: These are older forms of multiarch. It's not clear that they're 3338a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // in use in any released version of Debian, so we should consider 3339a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // removing them. 3340d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64" 3341a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth }; 3342a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth const StringRef X86MultiarchIncludeDirs[] = { 3343a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth "/usr/include/i386-linux-gnu", 3344a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth 3345a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // FIXME: These are older forms of multiarch. It's not clear that they're 3346a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // in use in any released version of Debian, so we should consider 3347a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth // removing them. 3348d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu", 3349a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth "/usr/include/i486-linux-gnu" 3350a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth }; 3351c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover const StringRef AArch64MultiarchIncludeDirs[] = { 3352c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover "/usr/include/aarch64-linux-gnu" 3353c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover }; 3354a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth const StringRef ARMMultiarchIncludeDirs[] = { 3355a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth "/usr/include/arm-linux-gnueabi" 3356a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth }; 3357ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu const StringRef ARMHFMultiarchIncludeDirs[] = { 3358ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu "/usr/include/arm-linux-gnueabihf" 3359ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu }; 3360d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman const StringRef MIPSMultiarchIncludeDirs[] = { 3361d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman "/usr/include/mips-linux-gnu" 3362d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman }; 3363d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman const StringRef MIPSELMultiarchIncludeDirs[] = { 3364d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman "/usr/include/mipsel-linux-gnu" 3365d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman }; 3366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const StringRef MIPS64MultiarchIncludeDirs[] = { 3367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "/usr/include/mips64-linux-gnu", 3368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "/usr/include/mips64-linux-gnuabi64" 3369ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 3370ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const StringRef MIPS64ELMultiarchIncludeDirs[] = { 3371ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "/usr/include/mips64el-linux-gnu", 3372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "/usr/include/mips64el-linux-gnuabi64" 3373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 3374079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth const StringRef PPCMultiarchIncludeDirs[] = { 3375079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth "/usr/include/powerpc-linux-gnu" 3376079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth }; 3377079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth const StringRef PPC64MultiarchIncludeDirs[] = { 3378079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth "/usr/include/powerpc64-linux-gnu" 3379079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth }; 3380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const StringRef PPC64LEMultiarchIncludeDirs[] = { 3381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "/usr/include/powerpc64le-linux-gnu" 3382ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 3383a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth ArrayRef<StringRef> MultiarchIncludeDirs; 33847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (getTriple().getArch() == llvm::Triple::x86_64) { 3385a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; 33867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } else if (getTriple().getArch() == llvm::Triple::x86) { 3387a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth MultiarchIncludeDirs = X86MultiarchIncludeDirs; 3388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (getTriple().getArch() == llvm::Triple::aarch64 || 3389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getTriple().getArch() == llvm::Triple::aarch64_be || 33906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::arm64 || 33916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getTriple().getArch() == llvm::Triple::arm64_be) { 3392c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover MultiarchIncludeDirs = AArch64MultiarchIncludeDirs; 33937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } else if (getTriple().getArch() == llvm::Triple::arm) { 3394ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) 3395ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs; 3396ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu else 3397ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu MultiarchIncludeDirs = ARMMultiarchIncludeDirs; 3398d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman } else if (getTriple().getArch() == llvm::Triple::mips) { 3399d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman MultiarchIncludeDirs = MIPSMultiarchIncludeDirs; 3400d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman } else if (getTriple().getArch() == llvm::Triple::mipsel) { 3401d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs; 3402ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (getTriple().getArch() == llvm::Triple::mips64) { 3403ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs; 3404ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (getTriple().getArch() == llvm::Triple::mips64el) { 3405ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs; 3406079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth } else if (getTriple().getArch() == llvm::Triple::ppc) { 3407079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth MultiarchIncludeDirs = PPCMultiarchIncludeDirs; 3408079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth } else if (getTriple().getArch() == llvm::Triple::ppc64) { 3409079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth MultiarchIncludeDirs = PPC64MultiarchIncludeDirs; 3410ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (getTriple().getArch() == llvm::Triple::ppc64le) { 3411ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs; 3412a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth } 34136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (StringRef Dir : MultiarchIncludeDirs) { 34146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (llvm::sys::fs::exists(SysRoot + Dir)) { 34156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir); 3416a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth break; 3417a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth } 34187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth } 34197d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 34207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (getTriple().getOS() == llvm::Triple::RTEMS) 34217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth return; 34227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 3423c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth // Add an include of '/include' directly. This isn't provided by default by 3424c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth // system GCCs, but is often used with cross-compiling GCCs, and harmless to 3425c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth // add even when Clang is acting as-if it were a system compiler. 34268e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include"); 3427c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth 34288e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include"); 34297d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth} 34307d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 3431f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add the three variant paths for a libstdc++ installation. 343279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir, 343379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const ArgList &DriverArgs, 343479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args) { 3435abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth if (!llvm::sys::fs::exists(Base)) 3436abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth return false; 34377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth addSystemInclude(DriverArgs, CC1Args, Base); 3438abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir); 34397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth addSystemInclude(DriverArgs, CC1Args, Base + "/backward"); 3440abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth return true; 34417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth} 34427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 3443f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add an extra variant path for an (Ubuntu) multilib 3444f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// libstdc++ installation. 3445f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix, 3446f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko Twine TargetArchDir, 3447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Twine IncludeSuffix, 3448f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko const ArgList &DriverArgs, 3449f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko ArgStringList &CC1Args) { 3450f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth if (!addLibStdCXXIncludePaths(Base + Suffix, 3451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TargetArchDir + IncludeSuffix, 3452f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko DriverArgs, CC1Args)) 3453f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko return false; 3454f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko 3455f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix 3456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines + IncludeSuffix); 3457f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko return true; 3458f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko} 3459f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko 34607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 34617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth ArgStringList &CC1Args) const { 34627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth if (DriverArgs.hasArg(options::OPT_nostdlibinc) || 34637d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth DriverArgs.hasArg(options::OPT_nostdincxx)) 34647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth return; 34657d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 3466eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth // Check if libc++ has been enabled and provide its include paths if so. 3467eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) { 3468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string LibCXXIncludePathCandidates[] = { 3469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The primary location is within the Clang installation. 3470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to 3471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // newer ABI versions. 3472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDriver().Dir + "/../include/c++/v1", 3473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // We also check the system as for a long time this is the only place Clang looked. 3475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: We should really remove this. It doesn't make any sense. 3476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getDriver().SysRoot + "/usr/include/c++/v1" 3477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines }; 34786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto &IncludePath : LibCXXIncludePathCandidates) { 34796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!llvm::sys::fs::exists(IncludePath)) 3480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines continue; 3481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Add the first candidate that exists. 34826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines addSystemInclude(DriverArgs, CC1Args, IncludePath); 3483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 3484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 3485eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth return; 3486eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth } 3487eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth 3488fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth // We need a detected GCC installation on Linux to provide libstdc++'s 3489fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth // headers. We handled the libc++ case above. 3490fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth if (!GCCInstallation.isValid()) 3491fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth return; 3492abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth 3493abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth // By default, look for the C++ headers in an include directory adjacent to 3494abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth // the lib directory of the GCC installation. Note that this is expect to be 3495abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth // equivalent to '/usr/include/c++/X.Y' in almost all cases. 3496abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth StringRef LibDir = GCCInstallation.getParentLibPath(); 3497abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth StringRef InstallDir = GCCInstallation.getInstallPath(); 34981d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov StringRef TripleStr = GCCInstallation.getTriple().str(); 3499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const Multilib &Multilib = GCCInstallation.getMultilib(); 35000affc67389171834adf113e3a0422a32218a6192Chandler Carruth const GCCVersion &Version = GCCInstallation.getVersion(); 35011d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov 3502f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth if (addLibStdCXXIncludePaths(LibDir.str() + "/../include", 3503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "/c++/" + Version.Text, TripleStr, 3504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Multilib.includeSuffix(), DriverArgs, CC1Args)) 3505f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko return; 3506f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko 3507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::string LibStdCXXIncludePathCandidates[] = { 3508abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth // Gentoo is weird and places its headers inside the GCC install, so if the 35090affc67389171834adf113e3a0422a32218a6192Chandler Carruth // first attempt to find the headers fails, try these patterns. 35100affc67389171834adf113e3a0422a32218a6192Chandler Carruth InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." + 35110affc67389171834adf113e3a0422a32218a6192Chandler Carruth Version.MinorStr, 35120affc67389171834adf113e3a0422a32218a6192Chandler Carruth InstallDir.str() + "/include/g++-v" + Version.MajorStr, 35131d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov // Android standalone toolchain has C++ headers in yet another place. 35140affc67389171834adf113e3a0422a32218a6192Chandler Carruth LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text, 351502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++, 351602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel // without a subdirectory corresponding to the gcc version. 351702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel LibDir.str() + "/../include/c++", 35181d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov }; 35191d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov 35206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (const auto &IncludePath : LibStdCXXIncludePathCandidates) { 35216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (addLibStdCXXIncludePaths(IncludePath, 3522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TripleStr + Multilib.includeSuffix(), 3523f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth DriverArgs, CC1Args)) 35241d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov break; 3525abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth } 35267d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth} 35277d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth 352852ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool Linux::isPIEDefault() const { 3529c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne return getSanitizerArgs().hasZeroBaseShadow(); 353052ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne} 353152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne 353211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 353311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 35340e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaDragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) 35350e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola : Generic_ELF(D, Triple, Args) { 353611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 353711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // Path mangling to find libexec 3538edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 353986643b88a11582cfff2091a4815950d166269428Benjamin Kramer if (getDriver().getInstalledDir() != getDriver().Dir) 3540edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 354111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 3542ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 354311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib"); 35448cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall if (llvm::sys::fs::exists("/usr/lib/gcc47")) 35458cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall getFilePaths().push_back("/usr/lib/gcc47"); 35468cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall else 35478cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall getFilePaths().push_back("/usr/lib/gcc44"); 354811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 354911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 3550f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *DragonFly::buildAssembler() const { 3551f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::dragonfly::Assemble(*this); 3552f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 3553f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 3554f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *DragonFly::buildLinker() const { 3555f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::dragonfly::Link(*this); 355611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 35574e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35584e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35594e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton/// XCore tool chain 35604e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonXCore::XCore(const Driver &D, const llvm::Triple &Triple, 35614e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton const ArgList &Args) : ToolChain(D, Triple, Args) { 35624e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton // ProgramPaths are found via 'PATH' environment variable. 35634e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35644e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35654e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonTool *XCore::buildAssembler() const { 35664e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return new tools::XCore::Assemble(*this); 35674e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35684e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35694e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonTool *XCore::buildLinker() const { 35704e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return new tools::XCore::Link(*this); 35714e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35724e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35734e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPICDefault() const { 35744e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return false; 35754e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35764e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35774e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPIEDefault() const { 35784e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return false; 35794e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35804e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35814e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPICDefaultForced() const { 35824e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return false; 35834e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35844e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35854e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::SupportsProfiling() const { 35864e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return false; 35874e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35884e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35894e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::hasBlocksRuntime() const { 35904e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return false; 35914e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 35924e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 35934e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 35944e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton ArgStringList &CC1Args) const { 35954e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton if (DriverArgs.hasArg(options::OPT_nostdinc) || 35964e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton DriverArgs.hasArg(options::OPT_nostdlibinc)) 35974e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return; 35984e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) { 35994e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton SmallVector<StringRef, 4> Dirs; 36004e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'}; 36014e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 36024e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton ArrayRef<StringRef> DirVec(Dirs); 36034e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton addSystemIncludes(DriverArgs, CC1Args, DirVec); 36044e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton } 36054e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 36064e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 36074e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 36084e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton llvm::opt::ArgStringList &CC1Args) const { 36094e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton CC1Args.push_back("-nostdsysteminc"); 36104e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 36114e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 36124e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 36134e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton ArgStringList &CC1Args) const { 36144e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton if (DriverArgs.hasArg(options::OPT_nostdinc) || 36154e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton DriverArgs.hasArg(options::OPT_nostdlibinc)) 36164e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton return; 36174e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) { 36184e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton SmallVector<StringRef, 4> Dirs; 36194e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'}; 36204e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr)); 36214e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton ArrayRef<StringRef> DirVec(Dirs); 36224e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton addSystemIncludes(DriverArgs, CC1Args, DirVec); 36234e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton } 36244e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 36254e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton 36264e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddCXXStdlibLibArgs(const ArgList &Args, 36274e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton ArgStringList &CmdArgs) const { 36284e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton // We don't output any lib args. This is handled by xcc. 36294e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton} 3630