ToolChains.cpp revision 0a84aee0a3ada448fb4ae5fd4964791d42a501b3
13917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===--- ToolChains.cpp - ToolChain Implementations ---------------------*-===// 23917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 33917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// The LLVM Compiler Infrastructure 43917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 53917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// This file is distributed under the University of Illinois Open Source 63917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// License. See LICENSE.TXT for details. 73917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// 83917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===----------------------------------------------------------------------===// 93917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar#include "ToolChains.h" 113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 12f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/Arg.h" 13f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/ArgList.h" 140f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h" 15c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h" 164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 17c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h" 1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h" 194e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h" 20265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 2134916dbb1018dc7a7f42a339923f5b73762e9872Douglas Gregor#include "clang/Basic/Version.h" 22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 2300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h" 24c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h" 2584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 26c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h" 27ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h" 28c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h" 29c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 30f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 31f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 323917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 333917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 35f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64. 368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple) 38cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : ToolChain(Host, Triple), TargetInitialized(false) 391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 4025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar // Compute the initial Darwin version based on the host. 4125b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar bool HadExtra; 4225b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar std::string OSName = Triple.getOSName(); 4325b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar if (!Driver::GetReleaseVersion(&OSName[6], 4425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar DarwinVersion[0], DarwinVersion[1], 4525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar DarwinVersion[2], HadExtra)) 4625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_darwin_version) << OSName; 4725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar 4802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(MacosxVersionMin) 4925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.' 5025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar << DarwinVersion[1]; 511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 534180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID Darwin::LookupTypeForExtension(const char *Ext) const { 544180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar types::ID Ty = types::lookupTypeForExtension(Ext); 554180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 564180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar // Darwin always preprocesses assembly files (unless -x is used explicitly). 574180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar if (Ty == types::TY_PP_Asm) 584180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return types::TY_Asm; 594180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 604180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return Ty; 614180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar} 624180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 63b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool Darwin::HasNativeLLVMSupport() const { 64b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar return true; 65b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar} 66b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv6k") 70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv5tej") 73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv4t") 79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv4t"; 80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7m") 84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1026ej-s") 96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 105eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 106eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 107eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 108eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 109eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 110eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 111eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 112eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar switch (getTriple().getArch()) { 113eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar default: 114eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return getArchName(); 115eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 116eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar case llvm::Triple::arm: { 117eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 118eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 119eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 120eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 121eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 122eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 123eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 124eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 125eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "arm"; 126eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 128eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 129eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 13025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple) 13125b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar : Darwin(Host, Triple) 1321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 133c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar // We can only work with 4.2.1 currently. 134c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar GCCVersion[0] = 4; 135c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar GCCVersion[1] = 2; 136c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar GCCVersion[2] = 1; 1371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 1381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Set up the tool chain paths to match gcc. 139c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir = "i686-apple-darwin"; 14055bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek ToolChainDir += llvm::utostr(DarwinVersion[0]); 141c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += "/"; 142c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[0]); 143c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 144c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[1]); 145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 146c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[2]); 147c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 14874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Try the next major version if that tool chain dir is invalid. 149080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar std::string Tmp = "/usr/lib/gcc/" + ToolChainDir; 150080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (!llvm::sys::Path(Tmp).exists()) { 15174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar std::string Next = "i686-apple-darwin"; 15274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(DarwinVersion[0] + 1); 15374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += "/"; 15474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[0]); 15574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 15674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[1]); 15774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 15874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[2]); 15974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 16074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Use that if it exists, otherwise hope the user isn't linking. 16174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // 16274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // FIXME: Drop dependency on gcc's tool chain. 163080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar Tmp = "/usr/lib/gcc/" + Next; 164080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (llvm::sys::Path(Tmp).exists()) 16574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar ToolChainDir = Next; 16674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar } 16774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 168c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar std::string Path; 169c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar if (getArchName() == "x86_64") { 170ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 173c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 174c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 176c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1776b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 179c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 180c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar } 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 182ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 183c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1846b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 185c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 186c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 187c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 189c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 190c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 191ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 192c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../libexec/gcc/"; 1936b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 194c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 195c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 196c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/libexec/gcc/"; 1976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 198c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 199c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 200edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 201edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir) 202edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 203c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 204c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 205f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() { 2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // Free tool implementations. 2078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 2098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar delete it->second; 2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 21200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const { 21300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar llvm::Triple Triple(ComputeLLVMTriple(Args)); 21400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 21500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // If the target isn't initialized (e.g., an unknown Darwin platform, return 21600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // the default triple). 21700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (!isTargetInitialized()) 21800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 21900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 22000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar unsigned Version[3]; 22100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar getTargetVersion(Version); 22200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 22300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Mangle the target version into the OS triple component. For historical 22400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // reasons that make little sense, the version passed here is the "darwin" 22500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // version, which drops the 10 and offsets by 4. See inverse code when 22600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // setting the OS version preprocessor define. 22700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (!isTargetIPhoneOS()) { 22800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Version[0] = Version[1] + 4; 22900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Version[1] = Version[2]; 23000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Version[2] = 0; 23100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } else { 23200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Use the environment to communicate that we are targetting iPhoneOS. 23300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Triple.setEnvironmentName("iphoneos"); 23400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 23500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 23600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar llvm::SmallString<16> Str; 23700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar llvm::raw_svector_ostream(Str) << "darwin" << Version[0] 23800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar << "." << Version[1] << "." << Version[2]; 23900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Triple.setOSName(Str.str()); 24000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 24100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 24200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 24300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 244f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 2458eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Action::ActionClass Key; 246ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 2478eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = Action::AnalyzeJobClass; 2488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar else 2498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = JA.getKind(); 2508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2510f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar // FIXME: This doesn't belong here, but ideally we will support static soon 2520f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar // anyway. 2530f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) || 2540f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar C.getArgs().hasArg(options::OPT_static) || 2550f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar C.getArgs().hasArg(options::OPT_fapple_kext)); 2560f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic; 2570f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 2580f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar options::OPT_no_integrated_as, 2590f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar IsIADefault); 2600f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar 2618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Tool *&T = Tools[Key]; 2628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (!T) { 2638eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar switch (Key) { 2648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 2658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 2668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar assert(0 && "Invalid tool kind."); 2678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::PreprocessJobClass: 2689120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Preprocess(*this); break; 2698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AnalyzeJobClass: 2708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::Clang(*this); break; 2719120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar case Action::PrecompileJobClass: 2728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::CompileJobClass: 2739120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Compile(*this); break; 2740f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar case Action::AssembleJobClass: { 2750f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar if (UseIntegratedAs) 2760f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar T = new tools::ClangAs(*this); 2770f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar else 2780f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar T = new tools::darwin::Assemble(*this); 2790f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar break; 2800f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar } 2818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LinkJobClass: 2828f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar T = new tools::darwin::Link(*this); break; 2838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 2848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 2856e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar case Action::DsymutilJobClass: 2866e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar T = new tools::darwin::Dsymutil(*this); break; 2878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return *T; 2918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 2941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 295e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar std::string Tmp; 296e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 2976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // FIXME: Derive these correctly. 2986b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar if (getArchName() == "x86_64") { 2996b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 3006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 3016b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 3026b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 3036b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 3046b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar } 305eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar 3066b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 307e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 308e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir; 309e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 310e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 311e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc"; 312e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 313e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 3146b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 3156b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 3166b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 317e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/" + ToolChainDir; 318e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 319e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 320e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib"; 321e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 322e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 3236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 3246b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../../" + ToolChainDir)); 3256b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 3266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../..")); 3276b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar} 3286b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 331ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // Note that this routine is only used for targetting OS X. 3326cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 3336cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from libgcc and lib specs but refactored. 3346cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 3356cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 3366cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 3376cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 3386cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_eh"); 3396cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 3406cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 341251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 3426cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 3436cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 3446cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 3456cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3466cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 3478a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar Args.hasFlag(options::OPT_fexceptions, 3488a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar options::OPT_fno_exceptions) || 3496cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 3506cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // FIXME: This is probably broken on 10.3? 351ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 3526cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 353ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 3546cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 3556cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 356ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 3, 9)) 3576cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar ; // Do nothing. 358ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 5)) 3596cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 360ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 3616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 3626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3636cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 364ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) { 3656cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 3666cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 3676cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 3686cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 3696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 3706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3716cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 3726cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar} 3736cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 37425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple) 37525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar : Darwin(Host, Triple) 3761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 3770e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 3780e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir) 3790e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 3800e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar 3811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // We expect 'as', 'ld', etc. to be adjacent to our install dir. 382edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 383edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir) 384edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 3850e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar 3860e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar // For fallback, we need to know how to find the GCC cc1 executables, so we 3870e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar // also add the GCC libexec paths. This is legiy code that can be removed once 3880e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar // fallback is no longer useful. 3890e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar std::string ToolChainDir = "i686-apple-darwin"; 3900e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar ToolChainDir += llvm::utostr(DarwinVersion[0]); 3910e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar ToolChainDir += "/4.2.1"; 3920e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar 3930e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar std::string Path = getDriver().Dir; 3940e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar Path += "/../libexec/gcc/"; 3950e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar Path += ToolChainDir; 3960e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar getProgramPaths().push_back(Path); 3970e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar 3980e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar Path = "/usr/libexec/gcc/"; 3990e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar Path += ToolChainDir; 4000e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar getProgramPaths().push_back(Path); 4011d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 4021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 4041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 4051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // The Clang toolchain uses explicit paths for internal libraries. 406424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar 407424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar // Unfortunately, we still might depend on a few of the libraries that are 408424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar // only available in the gcc library directory (in particular 409424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar // libstdc++.dylib). For now, hardcode the path to the known install location. 410424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar llvm::sys::Path P(getDriver().Dir); 411424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.eraseComponent(); // .../usr/bin -> ../usr 412424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("lib"); 413424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("gcc"); 414424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar switch (getTriple().getArch()) { 415424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar default: 416424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar assert(0 && "Invalid Darwin arch!"); 417424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::x86: 418424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::x86_64: 419424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("i686-apple-darwin10"); 420424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar break; 421424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::arm: 422424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::thumb: 423424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("arm-apple-darwin10"); 424424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar break; 425424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::ppc: 426424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar case llvm::Triple::ppc64: 427424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("powerpc-apple-darwin10"); 428424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar break; 429424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar } 430424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar P.appendComponent("4.2.1"); 431eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar 432eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar // Determine the arch specific GCC subdirectory. 433eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar const char *ArchSpecificDir = 0; 434eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar switch (getTriple().getArch()) { 435eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar default: 436eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar break; 437eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar case llvm::Triple::arm: 4383a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar case llvm::Triple::thumb: { 4393a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar std::string Triple = ComputeLLVMTriple(Args); 4403a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar llvm::StringRef TripleStr = Triple; 4413a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5")) 4423a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar ArchSpecificDir = "v5"; 4433a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6")) 4443a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar ArchSpecificDir = "v6"; 4453a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7")) 4463a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar ArchSpecificDir = "v7"; 447eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar break; 4483a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar } 449eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar case llvm::Triple::ppc64: 450eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar ArchSpecificDir = "ppc64"; 451eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar break; 452eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar case llvm::Triple::x86_64: 453eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar ArchSpecificDir = "x86_64"; 454eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar break; 455eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar } 456eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar 457eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar if (ArchSpecificDir) { 458eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar P.appendComponent(ArchSpecificDir); 459eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar if (P.exists()) 460eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 461eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar P.eraseComponent(); 462eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar } 463eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar 464424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar if (P.exists()) 465424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + P.str())); 4661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 4671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 4691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 470eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Darwin doesn't support real static executables, don't link any runtime 471eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // libraries with -static. 472eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (Args.hasArg(options::OPT_static)) 4731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 4741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 4751d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Reject -static-libgcc for now, we can deal with this when and if someone 4761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // cares. This is useful in situations where someone wants to statically link 4771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // something like libstdc++, and needs its runtime support routines. 4781d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 479ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_unsupported_opt) 4801d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar << A->getAsString(Args); 4811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 4821d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 4831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 484eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Otherwise link libSystem, then the dynamic runtime library, and finally any 485eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // target specific static runtime library. 4861d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar CmdArgs.push_back("-lSystem"); 487eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 488eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Select the dynamic runtime library and the target specific static library. 489eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar const char *DarwinStaticLib = 0; 490251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 491eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 492eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 493eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // We may need some static functions for armv6/thumb which are required to 494eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // be in the same linkage unit as their caller. 495eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (getDarwinArchName(Args) == "armv6") 496eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.armv6.a"; 497eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } else { 498eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // The dynamic runtime library was merged with libSystem for 10.6 and 499eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // beyond; only 10.4 and 10.5 need an additional runtime library. 500ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 501eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 502ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 503eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 504eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 505885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // For OS X, we thought we would only need a static runtime library when 506885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // targetting 10.4, to provide versions of the static functions which were 507885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // omitted from 10.4.dylib. 508885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // 509885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // Unfortunately, that turned out to not be true, because Darwin system 510885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // headers can still use eprintf on i386, and it is not exported from 511885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // libSystem. Therefore, we still must provide a runtime library just for 512885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar // the tiny tiny handful of projects that *might* use that symbol. 513885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar if (isMacosxVersionLT(10, 5)) { 514eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.10.4.a"; 515885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar } else { 516885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar if (getTriple().getArch() == llvm::Triple::x86) 517885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar DarwinStaticLib = "libclang_rt.eprintf.a"; 518885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar } 519eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 520eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 521eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar /// Add the target specific static library, if needed. 522eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (DarwinStaticLib) { 523eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar llvm::sys::Path P(getDriver().ResourceDir); 524eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("lib"); 525eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("darwin"); 526eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent(DarwinStaticLib); 527eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 528eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // For now, allow missing resource libraries to support developers who may 529eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // not have compiler-rt checked out or integrated into their build. 530362ed7052071245c6c1b15d59c1973f8c80b0b2aDaniel Dunbar if (P.exists()) 531eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 532eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 5331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 5341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 53560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const { 536ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const OptTable &Opts = getDriver().getOpts(); 537ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 5382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 5392603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 540ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar if (OSXVersion && iPhoneVersion) { 541ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 542ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << iPhoneVersion->getAsString(Args); 5442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar iPhoneVersion = 0; 545ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar } else if (!OSXVersion && !iPhoneVersion) { 546816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // If neither OS X nor iPhoneOS targets were specified, check for 547816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // environment defines. 548816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 549816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"); 550816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 551816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // Ignore empty strings. 552816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (OSXTarget && OSXTarget[0] == '\0') 553816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar OSXTarget = 0; 554816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0') 555816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar iPhoneOSTarget = 0; 556816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 55739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // Diagnose conflicting deployment targets, and choose default platform 55839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // based on the tool chain. 55939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // 56039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: Don't hardcode default here. 56139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget && iPhoneOSTarget) { 56239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: We should see if we can get away with warning or erroring on 56339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // this. Perhaps put under -pedantic? 56439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 56539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) 56684d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar OSXTarget = 0; 56739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar else 56884d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar iPhoneOSTarget = 0; 56939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar } 5701a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar 57139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget) { 57230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 57360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget); 57460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar Args.append(OSXVersion); 575816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else if (iPhoneOSTarget) { 57630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 57760baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar iPhoneVersion = Args.MakeJoinedArg(0, O, iPhoneOSTarget); 57860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar Args.append(iPhoneVersion); 579816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else { 5802bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar // Otherwise, assume we are targeting OS X. 5812bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 58260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin); 58360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar Args.append(OSXVersion); 58430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } 585ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 5861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5872603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // Set the tool chain target information. 5882603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar unsigned Major, Minor, Micro; 5892603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool HadExtra; 5902603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (OSXVersion) { 5912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!iPhoneVersion && "Unknown target platform!"); 5922603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 5932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 5942603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major != 10 || Minor >= 10 || Micro >= 10) 5952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 5962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << OSXVersion->getAsString(Args); 5972603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } else { 5982603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(iPhoneVersion && "Unknown target platform!"); 5992603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor, 6002603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 6012603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major >= 10 || Minor >= 100 || Micro >= 100) 6022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 6032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << iPhoneVersion->getAsString(Args); 6042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 6052603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar setTarget(iPhoneVersion, Major, Minor, Micro); 606c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar} 607c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 608132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args, 609efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar ArgStringList &CmdArgs) const { 610efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CXXStdlibType Type = GetCXXStdlibType(Args); 611efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 612efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar switch (Type) { 613efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar case ToolChain::CST_Libcxx: 614efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("-lc++"); 615efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar break; 616efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 617efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar case ToolChain::CST_Libstdcxx: { 618efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Unfortunately, -lstdc++ doesn't always exist in the standard search path; 619efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // it was previously found in the gcc lib dir. However, for all the Darwin 620efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // platforms we care about it was -lstdc++.6, so we search for that 621efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // explicitly if we can't see an obvious -lstdc++ candidate. 622efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 623efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Check in the sysroot first. 624efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { 625efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar llvm::sys::Path P(A->getValue(Args)); 626efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar P.appendComponent("usr"); 627efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar P.appendComponent("lib"); 628efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar P.appendComponent("libstdc++.dylib"); 629efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 630efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar if (!P.exists()) { 631efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar P.eraseComponent(); 632efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar P.appendComponent("libstdc++.6.dylib"); 633efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar if (P.exists()) { 634efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 635efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar return; 636efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 637efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 638efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 639efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 640efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Otherwise, look in the root. 641efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar if (!llvm::sys::Path("/usr/lib/libstdc++.dylib").exists() && 642efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar llvm::sys::Path("/usr/lib/libstdc++.6.dylib").exists()) { 643efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("/usr/lib/libstdc++.6.dylib"); 644efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar return; 645efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 646efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 647efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar // Otherwise, let the linker search. 648efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar CmdArgs.push_back("-lstdc++"); 649efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar break; 650efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 651efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar } 652efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar} 653efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar 6547433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args, 6557433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const { 6567433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 6577433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // For Darwin platforms, use the compiler-rt-based support library 6587433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // instead of the gcc-provided one (which is also incidentally 6597433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // only present in the gcc lib dir, which makes it hard to find). 6607433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 6617433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen llvm::sys::Path P(getDriver().ResourceDir); 6627433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen P.appendComponent("lib"); 6637433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen P.appendComponent("darwin"); 6647433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen P.appendComponent("libclang_rt.cc_kext.a"); 6657433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 6667433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // For now, allow missing resource libraries to support developers who may 6677433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen // not have compiler-rt checked out or integrated into their build. 668362ed7052071245c6c1b15d59c1973f8c80b0b2aDaniel Dunbar if (P.exists()) 6697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen CmdArgs.push_back(Args.MakeArgString(P.str())); 6707433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 6717433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 672c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args, 673c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar const char *BoundArch) const { 674c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs()); 675c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar const OptTable &Opts = getDriver().getOpts(); 676c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar 677c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 678c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // translation business, as it makes the driver functionality much 679c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 680c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 681c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // have something that works, we should reevaluate each translation 682c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar // and try to push it down into tool specific logic. 6832603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 684279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar for (ArgList::const_iterator it = Args.begin(), 685279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar ie = Args.end(); it != ie; ++it) { 6864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar Arg *A = *it; 6874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 6884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 6894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: Canonicalize name. 6904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (getArchName() != A->getValue(Args, 0)) 6914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 6924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 6930e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1)); 6940e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar unsigned Prev = Index; 695ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Arg *XarchArg = Opts.ParseOneArg(Args, Index); 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 6984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 6994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 7004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 7014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 7024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 7034e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 7044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!XarchArg || Index > Prev + 1 || 7064e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar XarchArg->getOption().isDriverOption()) { 707ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 7084e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 7094e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 7104e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 7114e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 712478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 7134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar A = XarchArg; 7140e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar 7150e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar DAL->AddSynthesizedArg(A); 7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7174e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 718ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 719ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 720ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 7219e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar switch ((options::ID) A->getOption().getID()) { 722ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 723ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 724ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 725ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 726ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 727ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 728ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 7299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 7309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 731ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 733ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 7349d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), 7359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar A->getValue(Args)); 736ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 737ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 7399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 7409d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)); 742ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 744ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 7459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag)); 7469d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols)); 748ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 749ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 750ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fterminated_vtables: 751ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_findirect_virtual_calls: 7529d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext)); 7539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_static)); 754ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 755ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 756ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 7579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib)); 758ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 759ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 760ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 7619d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings)); 762ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 763ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 764ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 7659d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings)); 766ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 767ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 768ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 7699d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7709d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)); 771ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 772ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 773ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 7749d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, 7759d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)); 776ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 777ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 778ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 7799d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings)); 780ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 781ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 782ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 7839d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings)); 784ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 785ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 7864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 7874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 78884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (getTriple().getArch() == llvm::Triple::x86 || 78984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64) 790e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 7919d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2"); 79284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 79384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // Add the arch options based on the particular spelling of -arch, to match 79484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // how the driver driver works. 79584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (BoundArch) { 79684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar llvm::StringRef Name = BoundArch; 79784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 79884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MArch = Opts.getOption(options::OPT_march_EQ); 79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 80084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 80184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // which defines the list of which architectures we accept. 80284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (Name == "ppc") 80384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 80484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc601") 8059d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "601"); 80684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc603") 8079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "603"); 80884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604") 8099d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "604"); 81084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604e") 8119d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "604e"); 81284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc750") 8139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "750"); 81484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7400") 8159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "7400"); 81684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7450") 8179d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "7450"); 81884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc970") 8199d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MCpu, "970"); 82084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 82184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc64") 8229d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 82384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 82484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i386") 82584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 82684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i486") 8279d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i486"); 82884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i586") 8299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i586"); 83084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i686") 8319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "i686"); 83284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium") 8339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium"); 83484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium2") 8359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium2"); 83684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentpro") 8379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentiumpro"); 83884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentIIm3") 8399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "pentium2"); 84084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 84184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "x86_64") 8429d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64)); 843ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 84484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "arm") 8459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv4t"); 84684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv4t") 8479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv4t"); 84884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv5") 8499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv5tej"); 85084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "xscale") 8519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "xscale"); 85284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv6") 8539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv6k"); 85484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv7") 8559d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar DAL->AddJoinedArg(0, MArch, "armv7a"); 85684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 85784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else 8589f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("invalid Darwin arch"); 85984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar } 860ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 86160baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // Add an explicit version min argument for the deployment target. We do this 86260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // after argument translation because -Xarch_ arguments may add a version min 86360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar // argument. 86460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar AddDeploymentTarget(*DAL); 86560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar 8664e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 8671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 8688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 869f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const { 8708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 8718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 8728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return getArchName() == "x86_64"; 8738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 8748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 875f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const { 876f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 877f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return S[0] != '\0'; 878f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return false; 879f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar} 880f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 881b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const { 882b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar // Darwin uses SjLj exceptions on ARM. 883b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar return (getTriple().getArch() == llvm::Triple::arm || 884b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar getTriple().getArch() == llvm::Triple::thumb); 885b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar} 886b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 887f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const { 8888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 8898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 8908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 891f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const { 8928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (getArchName() == "x86_64") 8938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 8948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return 0; 8958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 8968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 89743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const { 89843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // Garbage collection is supported everywhere except on iPhone OS. 89943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar return !isTargetIPhoneOS(); 90043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar} 90143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 90200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string 90300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel DunbarDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const { 90400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return ComputeLLVMTriple(Args); 90500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 90600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 9073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 9083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 9093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 9103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 911cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : ToolChain(Host, Triple) { 913edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 914edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 915edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 916c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 917c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 9183917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 9193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar // Free tool implementations. 9203917608370583fa30c466b6c3893448229aea9adDaniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 9213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 9223917608370583fa30c466b6c3893448229aea9adDaniel Dunbar delete it->second; 9233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 9243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C, 9263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar const JobAction &JA) const { 9273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Action::ActionClass Key; 928ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 9293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = Action::AnalyzeJobClass; 9303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar else 9313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = JA.getKind(); 9323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9333917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Tool *&T = Tools[Key]; 9343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar if (!T) { 9353917608370583fa30c466b6c3893448229aea9adDaniel Dunbar switch (Key) { 9368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 9378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 9383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar assert(0 && "Invalid tool kind."); 9393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PreprocessJobClass: 9403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Preprocess(*this); break; 9413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PrecompileJobClass: 9423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Precompile(*this); break; 9433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AnalyzeJobClass: 9443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::Clang(*this); break; 9453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::CompileJobClass: 9463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Compile(*this); break; 9473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AssembleJobClass: 9483917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Assemble(*this); break; 9493917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::LinkJobClass: 9503917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Link(*this); break; 9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // This is a bit ungeneric, but the only platform using a driver 9538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // driver is Darwin. 9548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 9558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 9566e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar case Action::DsymutilJobClass: 9576e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar T = new tools::darwin::Dsymutil(*this); break; 9583917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 9593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 9603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9613917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return *T; 9623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 9633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9643917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 9658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 9668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 9673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return getArchName() == "x86_64"; 9683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 9693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9703917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const { 9713917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return "static"; 9723917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 9733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 9743917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const { 9753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return 0; 9763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 977f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 9783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 9793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 9803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation. 9813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 9823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 9833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner : ToolChain(Host, Triple) { 9843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner // Path mangling to find libexec 9853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner std::string Path(getDriver().Dir); 9863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 9873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Path += "/../libexec"; 9883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner getProgramPaths().push_back(Path); 9893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 9903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 9913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() { 9923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner for (llvm::DenseMap<unsigned, Tool*>::iterator 9933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 9943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner delete it->second; 9953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 9963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 9973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const { 9983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return true; 9993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 10003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 10013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const { 10023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return false; 10033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 10043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 10053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const { 10063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return "static"; 10073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 10083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 10093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const { 10103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return 0; 10113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 10123a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 10133a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C, 10143a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const JobAction &JA) const { 10153a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Action::ActionClass Key; 10163a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Key = Action::AnalyzeJobClass; 10173a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 10183a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Tool *&T = Tools[Key]; 10193a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner if (!T) { 10203a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner switch (Key) { 10213a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::PreprocessJobClass: 10223a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::gcc::Preprocess(*this); break; 10233a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::AnalyzeJobClass: 10243a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::Clang(*this); break; 10253a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner default: 10263a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner assert(false && "Unsupported action for TCE target."); 10273a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 10283a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 10293a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return *T; 10303a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 10313a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 1032f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 1033f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 1034f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 1035e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola : Generic_ELF(Host, Triple) { 1036ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 1037f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back("/usr/lib"); 1038f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 1039f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 1040f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 1041f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Action::ActionClass Key; 1042ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1043f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = Action::AnalyzeJobClass; 1044f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 1045f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = JA.getKind(); 1046f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 1047dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1048dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola options::OPT_no_integrated_as, 1049dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola IsIntegratedAssemblerDefault()); 1050dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola 1051f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Tool *&T = Tools[Key]; 1052f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!T) { 1053f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar switch (Key) { 1054dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola case Action::AssembleJobClass: { 1055dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola if (UseIntegratedAs) 1056dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola T = new tools::ClangAs(*this); 1057dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola else 1058dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola T = new tools::openbsd::Assemble(*this); 1059dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola break; 1060dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola } 1061f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::LinkJobClass: 1062f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Link(*this); break; 1063f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar default: 1064f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 1065f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 1066f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 1067f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 1068f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar return *T; 1069f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 1070f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 107175358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 107275358d267256022475371416654b056ad8531cb3Daniel Dunbar 1073214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple) 1074e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola : Generic_ELF(Host, Triple) { 1075214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar 1076214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar // Determine if we are compiling 32-bit code on an x86_64 platform. 1077214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar bool Lib32 = false; 1078214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar if (Triple.getArch() == llvm::Triple::x86 && 1079214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar llvm::Triple(getDriver().DefaultHostTriple).getArch() == 1080214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar llvm::Triple::x86_64) 1081214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar Lib32 = true; 1082214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar 10837fb2c25ab0b6fa1543bce410dbdb2ee5d2513a86Daniel Dunbar getProgramPaths().push_back(getDriver().Dir + "/../libexec"); 10847fb2c25ab0b6fa1543bce410dbdb2ee5d2513a86Daniel Dunbar getProgramPaths().push_back("/usr/libexec"); 1085bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar if (Lib32) { 1086ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib32"); 1087bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib32"); 1088bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } else { 1089ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 1090bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib"); 1091bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } 109275358d267256022475371416654b056ad8531cb3Daniel Dunbar} 109375358d267256022475371416654b056ad8531cb3Daniel Dunbar 109475358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 109575358d267256022475371416654b056ad8531cb3Daniel Dunbar Action::ActionClass Key; 1096ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 109775358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = Action::AnalyzeJobClass; 109875358d267256022475371416654b056ad8531cb3Daniel Dunbar else 109975358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = JA.getKind(); 110075358d267256022475371416654b056ad8531cb3Daniel Dunbar 110167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 110267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky options::OPT_no_integrated_as, 110367dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky IsIntegratedAssemblerDefault()); 110467dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky 110575358d267256022475371416654b056ad8531cb3Daniel Dunbar Tool *&T = Tools[Key]; 110675358d267256022475371416654b056ad8531cb3Daniel Dunbar if (!T) { 110775358d267256022475371416654b056ad8531cb3Daniel Dunbar switch (Key) { 110868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar case Action::AssembleJobClass: 110967dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky if (UseIntegratedAs) 111067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky T = new tools::ClangAs(*this); 111167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky else 111267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky T = new tools::freebsd::Assemble(*this); 1113fe3a7ea7f2132ec5cd0510cc21d2677614a6ab3aRoman Divacky break; 1114008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar case Action::LinkJobClass: 1115008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar T = new tools::freebsd::Link(*this); break; 111675358d267256022475371416654b056ad8531cb3Daniel Dunbar default: 111775358d267256022475371416654b056ad8531cb3Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 111875358d267256022475371416654b056ad8531cb3Daniel Dunbar } 111975358d267256022475371416654b056ad8531cb3Daniel Dunbar } 112075358d267256022475371416654b056ad8531cb3Daniel Dunbar 112175358d267256022475371416654b056ad8531cb3Daniel Dunbar return *T; 112275358d267256022475371416654b056ad8531cb3Daniel Dunbar} 112311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 112438e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly. 112538e317d6dce161b249508686cc67eb7176958762Chris Lattner 112638e317d6dce161b249508686cc67eb7176958762Chris LattnerMinix::Minix(const HostInfo &Host, const llvm::Triple& Triple) 112738e317d6dce161b249508686cc67eb7176958762Chris Lattner : Generic_GCC(Host, Triple) { 112838e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back(getDriver().Dir + "/../lib"); 112938e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back("/usr/lib"); 113038e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back("/usr/gnu/lib"); 113138e317d6dce161b249508686cc67eb7176958762Chris Lattner getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3"); 113238e317d6dce161b249508686cc67eb7176958762Chris Lattner} 113338e317d6dce161b249508686cc67eb7176958762Chris Lattner 113438e317d6dce161b249508686cc67eb7176958762Chris LattnerTool &Minix::SelectTool(const Compilation &C, const JobAction &JA) const { 113538e317d6dce161b249508686cc67eb7176958762Chris Lattner Action::ActionClass Key; 113638e317d6dce161b249508686cc67eb7176958762Chris Lattner if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 113738e317d6dce161b249508686cc67eb7176958762Chris Lattner Key = Action::AnalyzeJobClass; 113838e317d6dce161b249508686cc67eb7176958762Chris Lattner else 113938e317d6dce161b249508686cc67eb7176958762Chris Lattner Key = JA.getKind(); 114038e317d6dce161b249508686cc67eb7176958762Chris Lattner 114138e317d6dce161b249508686cc67eb7176958762Chris Lattner Tool *&T = Tools[Key]; 114238e317d6dce161b249508686cc67eb7176958762Chris Lattner if (!T) { 114338e317d6dce161b249508686cc67eb7176958762Chris Lattner switch (Key) { 114438e317d6dce161b249508686cc67eb7176958762Chris Lattner case Action::AssembleJobClass: 114538e317d6dce161b249508686cc67eb7176958762Chris Lattner T = new tools::minix::Assemble(*this); break; 114638e317d6dce161b249508686cc67eb7176958762Chris Lattner case Action::LinkJobClass: 114738e317d6dce161b249508686cc67eb7176958762Chris Lattner T = new tools::minix::Link(*this); break; 114838e317d6dce161b249508686cc67eb7176958762Chris Lattner default: 114938e317d6dce161b249508686cc67eb7176958762Chris Lattner T = &Generic_GCC::SelectTool(C, JA); 115038e317d6dce161b249508686cc67eb7176958762Chris Lattner } 115138e317d6dce161b249508686cc67eb7176958762Chris Lattner } 115238e317d6dce161b249508686cc67eb7176958762Chris Lattner 115338e317d6dce161b249508686cc67eb7176958762Chris Lattner return *T; 115438e317d6dce161b249508686cc67eb7176958762Chris Lattner} 115538e317d6dce161b249508686cc67eb7176958762Chris Lattner 1156e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 1157e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1158e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 1159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan : Generic_GCC(Host, Triple) { 1160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1161edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 1162edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 1163edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 1164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1165ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 1166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/lib"); 1167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/sfw/lib"); 1168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib"); 11697adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 1170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 1172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1173e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 1174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Action::ActionClass Key; 1175ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1176e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = Action::AnalyzeJobClass; 1177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 1178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = JA.getKind(); 1179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Tool *&T = Tools[Key]; 1181e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!T) { 1182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan switch (Key) { 1183e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::AssembleJobClass: 1184e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Assemble(*this); break; 1185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::LinkJobClass: 1186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Link(*this); break; 1187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan default: 1188e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = &Generic_GCC::SelectTool(C, JA); 1189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 1190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 1191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan return *T; 1193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 1194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 1195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 11966b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment). 11976b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 1198c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro { 1199c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola DebianLenny, 1200c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola DebianSqueeze, 12010a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola Exherbo, 1202c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Fedora13, 1203c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Fedora14, 1204c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola OpenSuse11_3, 1205021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola UbuntuJaunty, 1206c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UbuntuLucid, 1207c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UbuntuMaverick, 1208c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola UnknownDistro 1209c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}; 1210c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1211c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsFedora(enum LinuxDistro Distro) { 1212c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return Distro == Fedora13 || Distro == Fedora14; 1213c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1214c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1215c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) { 1216c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return Distro == OpenSuse11_3; 1217c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1218c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1219c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) { 1220c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return Distro == DebianLenny || Distro == DebianSqueeze; 1221c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1222c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1223c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) { 1224021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola return Distro == UbuntuLucid || Distro == UbuntuMaverick || Distro == UbuntuJaunty; 1225c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1226c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1227c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebianBased(enum LinuxDistro Distro) { 1228c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return IsDebian(Distro) || IsUbuntu(Distro); 1229c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1230c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1231c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) { 12320a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola if (Arch == llvm::Triple::x86_64) { 12330a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola if (Distro == Exherbo && !llvm::sys::Path("/usr/lib32/libc.so").exists()) 12340a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola return false; 12350a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola 1236c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return true; 12370a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola } 1238c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == llvm::Triple::x86 && IsDebianBased(Distro)) 1239c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return true; 1240c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return false; 1241c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1242c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1243c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) { 1244c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::OwningPtr<const llvm::MemoryBuffer> 1245c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola LsbRelease(llvm::MemoryBuffer::getFile("/etc/lsb-release")); 1246c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (LsbRelease) { 1247c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::StringRef Data = LsbRelease.get()->getBuffer(); 1248c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::SmallVector<llvm::StringRef, 8> Lines; 1249c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Data.split(Lines, "\n"); 1250c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) { 1251c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Lines[i] == "DISTRIB_CODENAME=maverick") 1252c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UbuntuMaverick; 1253c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (Lines[i] == "DISTRIB_CODENAME=lucid") 1254c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UbuntuLucid; 1255021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola else if (Lines[i] == "DISTRIB_CODENAME=jaunty") 1256021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola return UbuntuJaunty; 1257c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1258c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 1259c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1260c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1261c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::OwningPtr<const llvm::MemoryBuffer> 1262c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola RHRelease(llvm::MemoryBuffer::getFile("/etc/redhat-release")); 1263c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (RHRelease) { 1264c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::StringRef Data = RHRelease.get()->getBuffer(); 1265c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Data.startswith("Fedora release 14 (Laughlin)")) 1266c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return Fedora14; 1267c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (Data.startswith("Fedora release 13 (Goddard)")) 1268c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return Fedora13; 1269c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 1270c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1271c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1272c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::OwningPtr<const llvm::MemoryBuffer> 1273c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola DebianVersion(llvm::MemoryBuffer::getFile("/etc/debian_version")); 1274c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (DebianVersion) { 1275c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::StringRef Data = DebianVersion.get()->getBuffer(); 1276c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Data[0] == '5') 1277c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return DebianLenny; 1278c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (Data.startswith("squeeze/sid")) 1279c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return DebianSqueeze; 1280c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 1281c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1282c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1283c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::OwningPtr<const llvm::MemoryBuffer> 1284c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola SuseRelease(llvm::MemoryBuffer::getFile("/etc/SuSE-release")); 1285c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (SuseRelease) { 1286c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::StringRef Data = SuseRelease.get()->getBuffer(); 1287c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Data.startswith("openSUSE 11.3")) 1288c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return OpenSuse11_3; 1289c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 1290c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1291c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 12920a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola if (llvm::sys::Path("/etc/exherbo-release").exists()) 12930a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola return Exherbo; 12940a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola 1295c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return UnknownDistro; 1296c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1297c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 12986b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 1299e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola : Generic_ELF(Host, Triple) { 1300c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::Triple::ArchType Arch = 1301c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::Triple(getDriver().DefaultHostTriple).getArch(); 1302c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1303c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Suffix32 = ""; 1304c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == llvm::Triple::x86_64) 1305c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Suffix32 = "/32"; 1306c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1307c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Suffix64 = ""; 1308c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == llvm::Triple::x86) 1309c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Suffix64 = "/64"; 1310c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1311c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Lib32 = "lib"; 1312c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1313c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if ( llvm::sys::Path("/lib32").exists()) 1314c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Lib32 = "lib32"; 1315c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1316c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Lib64 = "lib"; 1317c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::sys::Path Lib64Path("/lib64"); 1318c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Lib64Path.exists() && !Lib64Path.isSymLink()) 1319c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Lib64 = "lib64"; 1320c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1321c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string GccTriple = ""; 1322c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == llvm::Triple::arm) { 1323c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (llvm::sys::Path("/usr/lib/gcc/arm-linux-gnueabi").exists()) 1324c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "arm-linux-gnueabi"; 1325c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else if (Arch == llvm::Triple::x86_64) { 1326c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (llvm::sys::Path("/usr/lib/gcc/x86_64-linux-gnu").exists()) 1327c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "x86_64-linux-gnu"; 13280a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola else if (llvm::sys::Path("/usr/lib/gcc/x86_64-pc-linux-gnu").exists()) 13290a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola GccTriple = "x86_64-pc-linux-gnu"; 1330c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (llvm::sys::Path("/usr/lib/gcc/x86_64-redhat-linux").exists()) 1331c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "x86_64-redhat-linux"; 1332c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (llvm::sys::Path("/usr/lib64/gcc/x86_64-suse-linux").exists()) 1333c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "x86_64-suse-linux"; 1334c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else if (Arch == llvm::Triple::x86) { 1335c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (llvm::sys::Path("/usr/lib/gcc/i686-linux-gnu").exists()) 1336c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "i686-linux-gnu"; 1337c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (llvm::sys::Path("/usr/lib/gcc/i486-linux-gnu").exists()) 1338c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "i486-linux-gnu"; 1339c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (llvm::sys::Path("/usr/lib/gcc/i686-redhat-linux").exists()) 1340c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "i686-redhat-linux"; 1341c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else if (llvm::sys::Path("/usr/lib/gcc/i586-suse-linux").exists()) 1342c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola GccTriple = "i586-suse-linux"; 1343c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1344c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1345c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola const char* GccVersions[] = {"4.5.1", "4.5", "4.4.5", "4.4.4", "4.4.3", 1346021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola "4.3.3", "4.3.2"}; 1347c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Base = ""; 1348c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) { 1349c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Suffix = GccTriple + "/" + GccVersions[i]; 1350c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string t1 = "/usr/lib/gcc/" + Suffix; 1351c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (llvm::sys::Path(t1 + "/crtbegin.o").exists()) { 1352c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Base = t1; 1353c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola break; 1354c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1355c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string t2 = "/usr/lib64/gcc/" + Suffix; 1356c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (llvm::sys::Path(t2 + "/crtbegin.o").exists()) { 1357c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Base = t2; 1358c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola break; 1359c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1360c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1361c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1362c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola path_list &Paths = getFilePaths(); 1363c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola bool Is32Bits = getArch() == llvm::Triple::x86; 1364c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1365c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Suffix; 1366c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola std::string Lib; 1367c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1368c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Is32Bits) { 1369c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Suffix = Suffix32; 1370c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Lib = Lib32; 1371c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } else { 1372c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Suffix = Suffix64; 1373c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Lib = Lib64; 1374c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1375c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1376c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola llvm::sys::Path LinkerPath(Base + "/../../../../" + GccTriple + "/bin/ld"); 1377c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (LinkerPath.exists()) 1378c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Linker = LinkerPath.str(); 1379c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola else 1380c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Linker = GetProgramPath("ld"); 1381c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1382c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola LinuxDistro Distro = DetectLinuxDistro(Arch); 1383c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 138494c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola if (IsUbuntu(Distro)) { 138594c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola ExtraOpts.push_back("-z"); 138694c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola ExtraOpts.push_back("relro"); 138794c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola } 1388c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1389c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == llvm::Triple::arm) 1390c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("-X"); 1391c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1392c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (IsFedora(Distro) || Distro == UbuntuMaverick) 1393c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--hash-style=gnu"); 1394c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1395021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola if (IsDebian(Distro) || Distro == UbuntuLucid || Distro == UbuntuJaunty) 1396c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--hash-style=both"); 1397c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1398c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (IsFedora(Distro)) 1399c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--no-add-needed"); 1400c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1401021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola if (Distro == DebianSqueeze || IsOpenSuse(Distro) || 1402021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola IsFedora(Distro) || Distro == UbuntuLucid || Distro == UbuntuMaverick) 1403c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola ExtraOpts.push_back("--build-id"); 1404c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1405c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base + Suffix); 1406c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (HasMultilib(Arch, Distro)) { 1407c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (IsOpenSuse(Distro) && Is32Bits) 1408c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base + "/../../../../" + GccTriple + "/lib/../lib"); 1409c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base + "/../../../../" + Lib); 1410c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back("/lib/../" + Lib); 1411c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back("/usr/lib/../" + Lib); 1412c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola } 1413c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (!Suffix.empty()) 1414c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base); 1415c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (IsOpenSuse(Distro)) 1416c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base + "/../../../../" + GccTriple + "/lib"); 1417c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back(Base + "/../../.."); 1418c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola if (Arch == getArch() && IsUbuntu(Distro)) 1419c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola Paths.push_back("/usr/lib/" + GccTriple); 1420c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola} 1421c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola 1422c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const { 1423c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola return true; 14246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman} 14256b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 1426ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael EspindolaTool &Linux::SelectTool(const Compilation &C, const JobAction &JA) const { 1427ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Action::ActionClass Key; 1428ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1429ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Key = Action::AnalyzeJobClass; 1430ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola else 1431ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Key = JA.getKind(); 1432ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 1433dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as, 1434dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola options::OPT_no_integrated_as, 1435dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola IsIntegratedAssemblerDefault()); 1436dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola 1437ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola Tool *&T = Tools[Key]; 1438ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola if (!T) { 1439ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola switch (Key) { 1440ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola case Action::AssembleJobClass: 1441dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola if (UseIntegratedAs) 1442dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola T = new tools::ClangAs(*this); 1443dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola else 1444dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola T = new tools::linuxtools::Assemble(*this); 1445dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola break; 1446c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola case Action::LinkJobClass: 1447c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola T = new tools::linuxtools::Link(*this); break; 1448ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola default: 1449ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola T = &Generic_GCC::SelectTool(C, JA); 1450ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 1451ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola } 1452ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 1453ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola return *T; 1454ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola} 1455ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola 145611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 145711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 1458cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 1459e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola : Generic_ELF(Host, Triple) { 146011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 146111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // Path mangling to find libexec 1462edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().getInstalledDir()); 1463edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar if (getDriver().getInstalledDir() != getDriver().Dir.c_str()) 1464edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar getProgramPaths().push_back(getDriver().Dir); 146511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 1466ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 146711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib"); 146811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib/gcc41"); 146911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 147011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 147111e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 147211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Action::ActionClass Key; 1473ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 147411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = Action::AnalyzeJobClass; 147511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 147611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = JA.getKind(); 147711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 147811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Tool *&T = Tools[Key]; 147911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!T) { 148011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar switch (Key) { 148111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::AssembleJobClass: 148211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Assemble(*this); break; 148311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::LinkJobClass: 148411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Link(*this); break; 148511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar default: 148611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 148711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 148811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 148911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 149011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar return *T; 149111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 1492ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1493ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. SpencerWindows::Windows(const HostInfo &Host, const llvm::Triple& Triple) 1494ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer : ToolChain(Host, Triple) { 1495ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1496ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1497ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. SpencerTool &Windows::SelectTool(const Compilation &C, const JobAction &JA) const { 1498ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer Action::ActionClass Key; 1499ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1500ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer Key = Action::AnalyzeJobClass; 1501ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer else 1502ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer Key = JA.getKind(); 1503ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1504ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer Tool *&T = Tools[Key]; 1505ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (!T) { 1506ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer switch (Key) { 1507ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::InputClass: 1508ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::BindArchClass: 1509e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth case Action::LipoJobClass: 1510e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth case Action::DsymutilJobClass: 1511ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer assert(0 && "Invalid tool kind."); 1512ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::PreprocessJobClass: 1513ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::PrecompileJobClass: 1514ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::AnalyzeJobClass: 1515ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::CompileJobClass: 1516ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer T = new tools::Clang(*this); break; 1517ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::AssembleJobClass: 1518ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer T = new tools::ClangAs(*this); break; 1519ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer case Action::LinkJobClass: 1520ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer T = new tools::visualstudio::Link(*this); break; 1521ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 1522ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer } 1523ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1524ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return *T; 1525ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1526ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1527ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsIntegratedAssemblerDefault() const { 1528ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return true; 1529ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1530ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1531ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsUnwindTablesDefault() const { 1532ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer // FIXME: Gross; we should probably have some separate target 1533ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer // definition, possibly even reusing the one in clang. 1534ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return getArchName() == "x86_64"; 1535ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1536ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1537ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetDefaultRelocationModel() const { 1538ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return "static"; 1539ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1540ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer 1541ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetForcedPicModel() const { 1542ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer if (getArchName() == "x86_64") 1543ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return "pic"; 1544ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer return 0; 1545ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer} 1546