ToolChains.cpp revision e3c153a88a21e620446955705a7fc8215b4cc2f2
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" 14c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h" 154e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 16c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h" 1727e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h" 184e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h" 19265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h" 20c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h" 2284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 23ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h" 24c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h" 25c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 26f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 27f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 283917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 293917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 31f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64. 328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 33f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple, 34cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&_DarwinVersion)[3]) 35cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : ToolChain(Host, Triple), TargetInitialized(false) 361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 3702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(MacosxVersionMin) 385435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.' 395435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar << _DarwinVersion[1]; 401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 42eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 43eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) { 44eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv6k") 45eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 46eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 47eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv5tej") 48eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 49eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 50eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 51eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 52eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 53eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv4t") 54eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv4t"; 55eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 56eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" || 57eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" || 58eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "armv7m") 59eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 60eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 61eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 62eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 63eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 64eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this? 65eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) { 66eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" || 67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm946e-s" || Value == "arm966e-s" || 68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm968e-s" || Value == "arm10e" || 69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" || 70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1026ej-s") 71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv5"; 72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "xscale") 74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "xscale"; 75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "arm1136j-s" || Value == "arm1136jf-s" || 77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar Value == "arm1176jz-s" || Value == "arm1176jzf-s") 78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv6"; 79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3") 81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "armv7"; 82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return 0; 84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const { 87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar switch (getTriple().getArch()) { 88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar default: 89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return getArchName(); 90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar case llvm::Triple::arm: { 92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) 93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMArch(A->getValue(Args))) 94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar if (const char *Arch = GetArmArchForMCpu(A->getValue(Args))) 98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return Arch; 99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar return "arm"; 101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar } 103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar} 104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar 1051d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, 1061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar const unsigned (&DarwinVersion)[3], 107cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&_GCCVersion)[3]) 108cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : Darwin(Host, Triple, DarwinVersion) 1091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 1101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[0] = _GCCVersion[0]; 1111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[1] = _GCCVersion[1]; 1121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[2] = _GCCVersion[2]; 1131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 1141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Set up the tool chain paths to match gcc. 115c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir = "i686-apple-darwin"; 11655bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek ToolChainDir += llvm::utostr(DarwinVersion[0]); 117c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += "/"; 118c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[0]); 119c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[1]); 121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[2]); 123c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 12474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Try the next major version if that tool chain dir is invalid. 125080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar std::string Tmp = "/usr/lib/gcc/" + ToolChainDir; 126080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (!llvm::sys::Path(Tmp).exists()) { 12774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar std::string Next = "i686-apple-darwin"; 12874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(DarwinVersion[0] + 1); 12974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += "/"; 13074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[0]); 13174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 13274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[1]); 13374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 13474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[2]); 13574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 13674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Use that if it exists, otherwise hope the user isn't linking. 13774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // 13874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // FIXME: Drop dependency on gcc's tool chain. 139080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar Tmp = "/usr/lib/gcc/" + Next; 140080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar if (llvm::sys::Path(Tmp).exists()) 14174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar ToolChainDir = Next; 14274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar } 14374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 144c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar std::string Path; 145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar if (getArchName() == "x86_64") { 146ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 147c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1486b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 149c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 152c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1536b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 154c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 155c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 156c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar } 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 158ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 159c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1606b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 161c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 162c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 163c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1646b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 165c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 166c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 167ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar Path = getDriver().Dir; 168c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../libexec/gcc/"; 1696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 170c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 172c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/libexec/gcc/"; 1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 174c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 176ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 177c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 179f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() { 1808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // Free tool implementations. 1818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 1828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar delete it->second; 1848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 186f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 1878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Action::ActionClass Key; 188ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = Action::AnalyzeJobClass; 1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar else 1918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = JA.getKind(); 1928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Tool *&T = Tools[Key]; 1948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (!T) { 1958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar switch (Key) { 1968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 1978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 1988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar assert(0 && "Invalid tool kind."); 1998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::PreprocessJobClass: 2009120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Preprocess(*this); break; 2018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AnalyzeJobClass: 2028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::Clang(*this); break; 2039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar case Action::PrecompileJobClass: 2048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::CompileJobClass: 2059120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Compile(*this); break; 2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AssembleJobClass: 2078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar T = new tools::darwin::Assemble(*this); break; 2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LinkJobClass: 2098f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar T = new tools::darwin::Link(*this); break; 2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 2128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 2148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return *T; 2168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 2191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 220e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar std::string Tmp; 221e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 2226b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // FIXME: Derive these correctly. 2236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar if (getArchName() == "x86_64") { 2246b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2256b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 2266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2276b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2286b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 2296b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar } 2308bc9c550128c0662a04234dc262628c54c76b1eaDaniel Dunbar 2316b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 232e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar 233e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir; 234e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 235e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 236e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/gcc"; 237e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 238e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 2396b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 2406b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 2416b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 242e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib/" + ToolChainDir; 243e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 244e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 245e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar Tmp = getDriver().Dir + "/../lib"; 246e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar if (llvm::sys::Path(Tmp).exists()) 247e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L" + Tmp)); 2486b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../../" + ToolChainDir)); 2506b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 2516b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../..")); 2526b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar} 2536b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 2541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 2551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 256ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar // Note that this routine is only used for targetting OS X. 2576cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 2586cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from libgcc and lib specs but refactored. 2596cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 2606cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 2616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 2636cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_eh"); 2646cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 2656cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 266251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 2676cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 2686cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2716cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 2728a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar Args.hasFlag(options::OPT_fexceptions, 2738a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar options::OPT_fno_exceptions) || 2746cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 2756cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // FIXME: This is probably broken on 10.3? 276ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 2776cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 278ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 2796cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2806cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 281ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 3, 9)) 2826cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar ; // Do nothing. 283ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 5)) 2846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 285ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 2866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 289ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) { 2906cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 2916cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 2926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 2946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2966cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar} 2986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 2991d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple, 300cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar const unsigned (&DarwinVersion)[3]) 301cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar : Darwin(Host, Triple, DarwinVersion) 3021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 3031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // We expect 'as', 'ld', etc. to be adjacent to our install dir. 304ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 3051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 3081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 3091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // The Clang toolchain uses explicit paths for internal libraries. 3101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 3131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 314eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Darwin doesn't support real static executables, don't link any runtime 315eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // libraries with -static. 316eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (Args.hasArg(options::OPT_static)) 3171d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Reject -static-libgcc for now, we can deal with this when and if someone 3201d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // cares. This is useful in situations where someone wants to statically link 3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // something like libstdc++, and needs its runtime support routines. 3221d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 323ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_unsupported_opt) 3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar << A->getAsString(Args); 3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 3271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 328eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Otherwise link libSystem, then the dynamic runtime library, and finally any 329eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // target specific static runtime library. 3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar CmdArgs.push_back("-lSystem"); 331eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 332eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // Select the dynamic runtime library and the target specific static library. 333eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar const char *DarwinStaticLib = 0; 334251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar if (isTargetIPhoneOS()) { 335eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 336eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 337eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // We may need some static functions for armv6/thumb which are required to 338eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // be in the same linkage unit as their caller. 339eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (getDarwinArchName(Args) == "armv6") 340eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.armv6.a"; 341eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } else { 342eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // The dynamic runtime library was merged with libSystem for 10.6 and 343eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // beyond; only 10.4 and 10.5 need an additional runtime library. 344ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 345eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 346ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar else if (isMacosxVersionLT(10, 6)) 347eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 348eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 349eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // For OS X, we only need a static runtime library when targetting 10.4, to 350eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // provide versions of the static functions which were omitted from 351eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // 10.4.dylib. 352ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar if (isMacosxVersionLT(10, 5)) 353eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar DarwinStaticLib = "libclang_rt.10.4.a"; 354eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 355eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 356eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar /// Add the target specific static library, if needed. 357eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (DarwinStaticLib) { 358eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar llvm::sys::Path P(getDriver().ResourceDir); 359eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("lib"); 360eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent("darwin"); 361eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar P.appendComponent(DarwinStaticLib); 362eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar 363eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // For now, allow missing resource libraries to support developers who may 364eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar // not have compiler-rt checked out or integrated into their build. 365eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar if (!P.exists()) 366eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar getDriver().Diag(clang::diag::warn_drv_missing_resource_library) 367eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar << P.str(); 368eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar else 369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar CmdArgs.push_back(Args.MakeArgString(P.str())); 370eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar } 3711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 3721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 3730dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Darwin::TranslateArgs(InputArgList &Args, 3740dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const { 3754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args, false); 376ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar const OptTable &Opts = getDriver().getOpts(); 377ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 378ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 379ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // translation business, as it makes the driver functionality much 380ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 381ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 382ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // have something that works, we should reevaluate each translation 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // and try to push it down into tool specific logic. 384ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 3852603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ); 3862603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ); 387ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar if (OSXVersion && iPhoneVersion) { 388ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 389ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << iPhoneVersion->getAsString(Args); 3912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar iPhoneVersion = 0; 392ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar } else if (!OSXVersion && !iPhoneVersion) { 393816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // If neither OS X nor iPhoneOS targets were specified, check for 394816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // environment defines. 395816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 396816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"); 397816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 398816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar // Ignore empty strings. 399816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (OSXTarget && OSXTarget[0] == '\0') 400816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar OSXTarget = 0; 401816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0') 402816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar iPhoneOSTarget = 0; 403816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar 40439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // Diagnose conflicting deployment targets, and choose default platform 40539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // based on the tool chain. 40639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // 40739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: Don't hardcode default here. 40839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget && iPhoneOSTarget) { 40939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // FIXME: We should see if we can get away with warning or erroring on 41039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar // this. Perhaps put under -pedantic? 41139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 41239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) 41384d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar OSXTarget = 0; 41439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar else 41584d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar iPhoneOSTarget = 0; 41639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar } 4171a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar 41839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar if (OSXTarget) { 41930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 4202603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget); 4212603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(OSXVersion); 422816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else if (iPhoneOSTarget) { 42330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 4242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget); 4252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(iPhoneVersion); 426816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else { 427cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // Otherwise, choose a default platform based on the tool chain. 428cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // 429cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar // FIXME: Don't hardcode default here. 430cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar if (getTriple().getArch() == llvm::Triple::arm || 431cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar getTriple().getArch() == llvm::Triple::thumb) { 432816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 433cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0"); 4342603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(iPhoneVersion); 435816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } else { 436816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 4372603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin); 4382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar DAL->append(OSXVersion); 439816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar } 44030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } 441ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar // Set the tool chain target information. 4442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar unsigned Major, Minor, Micro; 4452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar bool HadExtra; 4462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (OSXVersion) { 4472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(!iPhoneVersion && "Unknown target platform!"); 4482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor, 4492603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 4502603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major != 10 || Minor >= 10 || Micro >= 10) 4512603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 4522603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << OSXVersion->getAsString(Args); 4532603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } else { 4542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar assert(iPhoneVersion && "Unknown target platform!"); 4552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor, 4562603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Micro, HadExtra) || HadExtra || 4572603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar Major >= 10 || Minor >= 100 || Micro >= 100) 4582603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_version_number) 4592603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar << iPhoneVersion->getAsString(Args); 4602603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar } 4612603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar setTarget(iPhoneVersion, Major, Minor, Micro); 4622603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar 4634e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { 4644e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar Arg *A = *it; 4654e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 4664e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 4674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: Canonicalize name. 4684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (getArchName() != A->getValue(Args, 0)) 4694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 4704e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 4714e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: The arg is leaked here, and we should have a nicer 4724e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // interface for this. 4734e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar unsigned Prev, Index = Prev = A->getIndex() + 1; 474ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Arg *XarchArg = Opts.ParseOneArg(Args, Index); 4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4764e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 4774e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 4784e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 4794e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 4804e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 4814e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 4824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 4834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!XarchArg || Index > Prev + 1 || 4854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar XarchArg->getOption().isDriverOption()) { 486ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 4874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 4884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 4894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 4904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 491478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 4924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar A = XarchArg; 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4944e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 495ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 496ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 497ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 4989e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar switch ((options::ID) A->getOption().getID()) { 499ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 500ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 501ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 502ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 503ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 504ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 505ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 506478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 507478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 508ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 510ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 511478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF), 512ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar A->getValue(Args))); 513ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 514ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 515ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 516478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 517478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 518ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols))); 519ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 520ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 521ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 522478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 523478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 524ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols))); 525ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 526ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 527ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fterminated_vtables: 528ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_findirect_virtual_calls: 529478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 530478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar Opts.getOption(options::OPT_fapple_kext))); 531478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 532ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 533ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 534ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 535478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib))); 536ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 537ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 538ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 539478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 540ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mconstant_cfstrings))); 541ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 542ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 543ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 544478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 545ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_constant_cfstrings))); 546ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 548ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 549478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 550ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings))); 551ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 552ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 553ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 554478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 555ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings))); 556ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 557ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 558ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 559478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 560ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mpascal_strings))); 561ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 562ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 563ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 564478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 565ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_pascal_strings))); 566ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 567ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 5684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 5694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 57084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (getTriple().getArch() == llvm::Triple::x86 || 57184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64) 572e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar if (!Args.hasArgNoClaim(options::OPT_mtune_EQ)) 57384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), 57484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar "core2")); 57584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 57684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // Add the arch options based on the particular spelling of -arch, to match 57784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // how the driver driver works. 57884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (BoundArch) { 57984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar llvm::StringRef Name = BoundArch; 58084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 58184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MArch = Opts.getOption(options::OPT_march_EQ); 58284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 58384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 58484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // which defines the list of which architectures we accept. 58584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (Name == "ppc") 58684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 58784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc601") 58884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "601")); 58984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc603") 59084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "603")); 59184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604") 59284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "604")); 59384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604e") 59484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "604e")); 59584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc750") 59684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "750")); 59784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7400") 59884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "7400")); 59984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7450") 60084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "7450")); 60184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc970") 60284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "970")); 60384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 60484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc64") 60584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); 60684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 60784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i386") 60884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 60984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i486") 61084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i486")); 61184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i586") 61284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i586")); 61384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i686") 61484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i686")); 61584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium") 61684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium")); 61784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium2") 61884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); 61984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentpro") 62084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentiumpro")); 62184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentIIm3") 62284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); 62384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 62484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "x86_64") 625478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); 626ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 62784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "arm") 62884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); 62984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv4t") 63084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); 63184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv5") 63284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv5tej")); 63384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "xscale") 63484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "xscale")); 63584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv6") 63684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv6k")); 63784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv7") 63884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv7a")); 63984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 64084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else 6419f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("invalid Darwin arch"); 64284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar } 643ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 6444e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 6468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 647f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const { 6488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 6498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 6508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return getArchName() == "x86_64"; 6518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 653f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const { 654f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar if (const char *S = ::getenv("RC_DEBUG_OPTIONS")) 655f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return S[0] != '\0'; 656f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar return false; 657f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar} 658f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar 659b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const { 660b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar // Darwin uses SjLj exceptions on ARM. 661b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar return (getTriple().getArch() == llvm::Triple::arm || 662b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar getTriple().getArch() == llvm::Triple::thumb); 663b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar} 664b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar 665f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const { 6668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 6678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 669f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const { 6708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (getArchName() == "x86_64") 6718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 6728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return 0; 6738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 6748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 67543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const { 67643a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar // Garbage collection is supported everywhere except on iPhone OS. 67743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar return !isTargetIPhoneOS(); 67843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar} 67943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar 6803917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 6813917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 6823917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 6833917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 684cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : ToolChain(Host, Triple) { 686ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 687c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 688c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 6893917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 6903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar // Free tool implementations. 6913917608370583fa30c466b6c3893448229aea9adDaniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 6923917608370583fa30c466b6c3893448229aea9adDaniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 6933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar delete it->second; 6943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 6953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C, 6973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar const JobAction &JA) const { 6983917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Action::ActionClass Key; 699ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 7003917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = Action::AnalyzeJobClass; 7013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar else 7023917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = JA.getKind(); 7033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Tool *&T = Tools[Key]; 7053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar if (!T) { 7063917608370583fa30c466b6c3893448229aea9adDaniel Dunbar switch (Key) { 7078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 7088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 7093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar assert(0 && "Invalid tool kind."); 7103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PreprocessJobClass: 7113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Preprocess(*this); break; 7123917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PrecompileJobClass: 7133917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Precompile(*this); break; 7143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AnalyzeJobClass: 7153917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::Clang(*this); break; 7163917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::CompileJobClass: 7173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Compile(*this); break; 7183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AssembleJobClass: 7193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Assemble(*this); break; 7203917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::LinkJobClass: 7213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Link(*this); break; 7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // This is a bit ungeneric, but the only platform using a driver 7248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // driver is Darwin. 7258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 7268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 7273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 7283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 7293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return *T; 7313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7333917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 7348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 7358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 7363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return getArchName() == "x86_64"; 7373917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7393917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const { 7403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return "static"; 7413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 7423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 7433917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const { 7443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return 0; 7453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 746f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 7470dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args, 7480dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const { 749f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar return new DerivedArgList(Args, true); 750f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar} 75175358d267256022475371416654b056ad8531cb3Daniel Dunbar 7523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform 7543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target. 7553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation. 7563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple) 7583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner : ToolChain(Host, Triple) { 7593a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner // Path mangling to find libexec 7603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner std::string Path(getDriver().Dir); 7613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Path += "/../libexec"; 7633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner getProgramPaths().push_back(Path); 7643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() { 7673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner for (llvm::DenseMap<unsigned, Tool*>::iterator 7683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 7693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner delete it->second; 7703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const { 7733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return true; 7743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const { 7773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return false; 7783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const { 7813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return "static"; 7823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const { 7853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return 0; 7863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 7873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C, 7893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const JobAction &JA) const { 7903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Action::ActionClass Key; 7913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Key = Action::AnalyzeJobClass; 7923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 7933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner Tool *&T = Tools[Key]; 7943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner if (!T) { 7953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner switch (Key) { 7963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::PreprocessJobClass: 7973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::gcc::Preprocess(*this); break; 7983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner case Action::AnalyzeJobClass: 7993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner T = new tools::Clang(*this); break; 8003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner default: 8013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner assert(false && "Unsupported action for TCE target."); 8023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 8033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner } 8043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return *T; 8053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 8063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 8073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerDerivedArgList *TCEToolChain::TranslateArgs(InputArgList &Args, 8083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner const char *BoundArch) const { 8093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner return new DerivedArgList(Args, true); 8103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner} 8113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner 812f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 813f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 814f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 815f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar : Generic_GCC(Host, Triple) { 816ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 817f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back("/usr/lib"); 818f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 819f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 820f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 821f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Action::ActionClass Key; 822ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 823f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = Action::AnalyzeJobClass; 824f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 825f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = JA.getKind(); 826f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 827f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Tool *&T = Tools[Key]; 828f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!T) { 829f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar switch (Key) { 830f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::AssembleJobClass: 831f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Assemble(*this); break; 832f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::LinkJobClass: 833f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Link(*this); break; 834f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar default: 835f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 836f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 837f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 838f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 839f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar return *T; 840f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 841f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 84275358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 84375358d267256022475371416654b056ad8531cb3Daniel Dunbar 844cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32) 845cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 846bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar if (Lib32) { 847ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib32"); 848bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib32"); 849bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } else { 850ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 851bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib"); 852bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } 85375358d267256022475371416654b056ad8531cb3Daniel Dunbar} 85475358d267256022475371416654b056ad8531cb3Daniel Dunbar 85575358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 85675358d267256022475371416654b056ad8531cb3Daniel Dunbar Action::ActionClass Key; 857ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 85875358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = Action::AnalyzeJobClass; 85975358d267256022475371416654b056ad8531cb3Daniel Dunbar else 86075358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = JA.getKind(); 86175358d267256022475371416654b056ad8531cb3Daniel Dunbar 86275358d267256022475371416654b056ad8531cb3Daniel Dunbar Tool *&T = Tools[Key]; 86375358d267256022475371416654b056ad8531cb3Daniel Dunbar if (!T) { 86475358d267256022475371416654b056ad8531cb3Daniel Dunbar switch (Key) { 86568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar case Action::AssembleJobClass: 86668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar T = new tools::freebsd::Assemble(*this); break; 867008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar case Action::LinkJobClass: 868008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar T = new tools::freebsd::Link(*this); break; 86975358d267256022475371416654b056ad8531cb3Daniel Dunbar default: 87075358d267256022475371416654b056ad8531cb3Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 87175358d267256022475371416654b056ad8531cb3Daniel Dunbar } 87275358d267256022475371416654b056ad8531cb3Daniel Dunbar } 87375358d267256022475371416654b056ad8531cb3Daniel Dunbar 87475358d267256022475371416654b056ad8531cb3Daniel Dunbar return *T; 87575358d267256022475371416654b056ad8531cb3Daniel Dunbar} 87611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 877e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 878e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 879e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 880e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan : Generic_GCC(Host, Triple) { 881e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 882ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 883e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 884ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 885e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/lib"); 886e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/sfw/lib"); 887e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib"); 8887adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 889e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 890e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 891e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 892e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 893e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Action::ActionClass Key; 894ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 895e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = Action::AnalyzeJobClass; 896e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 897e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = JA.getKind(); 898e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 899e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Tool *&T = Tools[Key]; 900e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!T) { 901e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan switch (Key) { 902e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::AssembleJobClass: 903e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Assemble(*this); break; 904e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::LinkJobClass: 905e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Link(*this); break; 906e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan default: 907e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = &Generic_GCC::SelectTool(C, JA); 908e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 909e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 910e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 911e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan return *T; 912e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 913e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 914e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 9156b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment). 9166b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 9176b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 9186b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman : Generic_GCC(Host, Triple) { 919ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/"); 9206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/lib/"); 9216b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/usr/lib/"); 922a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 923a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // Depending on the Linux distribution, any combination of lib{,32,64} is 924a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems, 925a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // openSUSE uses lib and lib64 for the same purpose. 926a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib32/"); 927a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib32/"); 928a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib64/"); 929a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib64/"); 930a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 9316b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // FIXME: Figure out some way to get gcc's libdir 9326b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need 9336b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // crtbegin.o/crtend.o/etc., and want static versions of various 9346b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably 9356b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // get away with using shared versions in /usr/lib, though. 9366b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // We could fall back to the approach we used for includes (a massive 9376b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // list), but that's messy at best. 9386b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman} 9396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 94011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 94111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 942cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 943cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 94411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 94511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // Path mangling to find libexec 946ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getProgramPaths().push_back(getDriver().Dir); 94711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 948ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar getFilePaths().push_back(getDriver().Dir + "/../lib"); 94911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib"); 95011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib/gcc41"); 95111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 95211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 95311e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 95411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Action::ActionClass Key; 955ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 95611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = Action::AnalyzeJobClass; 95711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 95811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = JA.getKind(); 95911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 96011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Tool *&T = Tools[Key]; 96111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!T) { 96211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar switch (Key) { 96311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::AssembleJobClass: 96411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Assemble(*this); break; 96511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::LinkJobClass: 96611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Link(*this); break; 96711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar default: 96811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 96911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 97011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 97111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 97211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar return *T; 97311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 974