ToolChains.cpp revision 74782b066ecfb0ee05b34ef3a29e24d39c59c1bd
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" 174e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h" 18c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 19c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h" 2084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h" 21ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h" 22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h" 23c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 24f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 25f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 263917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 273917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 29f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64. 308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 31f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple, 321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar const unsigned (&_DarwinVersion)[3], bool _IsIPhoneOS) 331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar : ToolChain(Host, Triple), 341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar IsIPhoneOS(_IsIPhoneOS) 351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 36c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[0] = _DarwinVersion[0]; 37c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[1] = _DarwinVersion[1]; 38c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[2] = _DarwinVersion[2]; 39c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 4002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(MacosxVersionMin) 4102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << "10." << DarwinVersion[0] - 4 << '.' << DarwinVersion[1]; 4202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 4330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // FIXME: Lift default up. 4430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar IPhoneOSVersionMin = "3.0"; 451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 471d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple, 481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar const unsigned (&DarwinVersion)[3], 4955bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek const unsigned (&_GCCVersion)[3], bool IsIPhoneOS) 501d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar : Darwin(Host, Triple, DarwinVersion, IsIPhoneOS) 511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[0] = _GCCVersion[0]; 531d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[1] = _GCCVersion[1]; 541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar GCCVersion[2] = _GCCVersion[2]; 551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Set up the tool chain paths to match gcc. 57c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir = "i686-apple-darwin"; 5855bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek ToolChainDir += llvm::utostr(DarwinVersion[0]); 59c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += "/"; 60c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[0]); 61c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 62c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[1]); 63c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 64c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[2]); 65c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 6674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Try the next major version if that tool chain dir is invalid. 6774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar if (!llvm::sys::Path(ToolChainDir).exists()) { 6874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar std::string Next = "i686-apple-darwin"; 6974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(DarwinVersion[0] + 1); 7074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += "/"; 7174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[0]); 7274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 7374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[1]); 7474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += '.'; 7574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar Next += llvm::utostr(GCCVersion[2]); 7674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 7774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // Use that if it exists, otherwise hope the user isn't linking. 7874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // 7974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar // FIXME: Drop dependency on gcc's tool chain. 8074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar if (llvm::sys::Path(Next).exists()) 8174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar ToolChainDir = Next; 8274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar } 8374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar 84c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar std::string Path; 85c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar if (getArchName() == "x86_64") { 86c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 87c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 89c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 90c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 91c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 92c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 936b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 94c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 95c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 96c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar } 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 99c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 1006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 101c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 102c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 103c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 1046b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 105c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 106c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 107c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 108c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../libexec/gcc/"; 1096b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 110c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 111c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 112c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/libexec/gcc/"; 1136b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar Path += ToolChainDir; 114c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 115c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 11682fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path = getHost().getDriver().Dir; 11782fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path += "/../libexec"; 11882fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar getProgramPaths().push_back(Path); 11982fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar 120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(getHost().getDriver().Dir); 121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 123f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() { 1248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // Free tool implementations. 1258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 1268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 1278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar delete it->second; 1288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1298eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 130f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const { 1318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Action::ActionClass Key; 132a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 1338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = Action::AnalyzeJobClass; 1348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar else 1358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = JA.getKind(); 1368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Tool *&T = Tools[Key]; 1388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (!T) { 1398eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar switch (Key) { 1408eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 1418eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 1428eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar assert(0 && "Invalid tool kind."); 1438eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::PreprocessJobClass: 1449120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Preprocess(*this); break; 1458eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AnalyzeJobClass: 1468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::Clang(*this); break; 1479120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar case Action::PrecompileJobClass: 1488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::CompileJobClass: 1499120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Compile(*this); break; 1508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AssembleJobClass: 1518cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar T = new tools::darwin::Assemble(*this); break; 1528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LinkJobClass: 1538f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar T = new tools::darwin::Link(*this); break; 1548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 1558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 1568eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 1578eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 1588eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return *T; 1608eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1621d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args, 1631d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 1646b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // FIXME: Derive these correctly. 1656b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar if (getArchName() == "x86_64") { 1666b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 1676b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 1686b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 1696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 1706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/x86_64")); 1716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar } 1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir)); 1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar // Intentionally duplicated for (temporary) gcc bug compatibility. 1756b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir)); 1766b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 1776b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../../" + ToolChainDir)); 1786b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir + 1796b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar "/../../..")); 1806b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar} 1816b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar 1821d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args, 1831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 1846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar unsigned MacosxVersionMin[3]; 1856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar getMacosxVersionMin(Args, MacosxVersionMin); 1866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 1876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from libgcc and lib specs but refactored. 1886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 1896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_static"); 1906cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 1916cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (Args.hasArg(options::OPT_static_libgcc)) { 1926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_eh"); 1936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) { 1946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // Derived from darwin_iphoneos_libgcc spec. 1951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (isIPhoneOS()) { 1966cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.1"); 1976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 1986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 1996cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2006cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else if (Args.hasArg(options::OPT_shared_libgcc) || 2016cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // FIXME: -fexceptions -fno-exceptions means no exceptions 2026cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar Args.hasArg(options::OPT_fexceptions) || 2036cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar Args.hasArg(options::OPT_fgnu_runtime)) { 2046cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar // FIXME: This is probably broken on 10.3? 2056cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 2066cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 2076cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 2086cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2096cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2106cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar if (isMacosxVersionLT(MacosxVersionMin, 10, 3, 9)) 2116cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar ; // Do nothing. 2126cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 5)) 2136cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.4"); 2146cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar else if (isMacosxVersionLT(MacosxVersionMin, 10, 6)) 2156cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc_s.10.5"); 2166cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2176cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (isIPhoneOS() || isMacosxVersionLT(MacosxVersionMin, 10, 6)) { 2196cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 2206cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 2216cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } else { 2226cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lSystem"); 2236cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar CmdArgs.push_back("-lgcc"); 2246cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2256cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar } 2266cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar} 2276cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar 2281d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple, 2291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar const unsigned (&DarwinVersion)[3], 2301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar bool IsIPhoneOS) 2311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar : Darwin(Host, Triple, DarwinVersion, IsIPhoneOS) 2321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{ 233a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar // Add the relative libexec dir (for clang-cc). 234a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar // 235a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar // FIXME: We should sink clang-cc into libexec/clang/<version>/. 236a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar std::string Path = getHost().getDriver().Dir; 237a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar Path += "/../libexec"; 238a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar getProgramPaths().push_back(Path); 239a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar 2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // We expect 'as', 'ld', etc. to be adjacent to our install dir. 2411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar getProgramPaths().push_back(getHost().getDriver().Dir); 2421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 2431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args, 2451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 2461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // The Clang toolchain uses explicit paths for internal libraries. 2471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 2481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2491d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, 2501d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar ArgStringList &CmdArgs) const { 2511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Check for static linking. 2521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (Args.hasArg(options::OPT_static)) { 2531d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // FIXME: We need to have compiler-rt available (perhaps as 2541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // libclang_static.a) to link against. 2551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 2561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 2571d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2581d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Reject -static-libgcc for now, we can deal with this when and if someone 2591d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // cares. This is useful in situations where someone wants to statically link 2601d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // something like libstdc++, and needs its runtime support routines. 2611d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) { 2621d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar getHost().getDriver().Diag(clang::diag::err_drv_unsupported_opt) 2631d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar << A->getAsString(Args); 2641d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar return; 2651d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar } 2661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 2671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // Otherwise link libSystem, which should have the support routines. 2681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // 2691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // FIXME: This is only true for 10.6 and beyond. Legacy support isn't 2701d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // critical, but it should work... we should just link in the static 2711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar // compiler-rt library. 2721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar CmdArgs.push_back("-lSystem"); 2731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar} 2741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar 27548d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbarvoid Darwin::getMacosxVersionMin(const ArgList &Args, 27648d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar unsigned (&Res)[3]) const { 27748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) { 27848d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar bool HadExtra; 27948d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar if (!Driver::GetReleaseVersion(A->getValue(Args), Res[0], Res[1], Res[2], 28048d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar HadExtra) || 28148d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar HadExtra) { 28248d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar const Driver &D = getHost().getDriver(); 28348d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar D.Diag(clang::diag::err_drv_invalid_version_number) 28448d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar << A->getAsString(Args); 28548d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar } 28648d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar } else 28748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar return getMacosxVersion(Res); 28848d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar} 28948d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar 2900dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Darwin::TranslateArgs(InputArgList &Args, 2910dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const { 2924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args, false); 293ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar const OptTable &Opts = getHost().getDriver().getOpts(); 294ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 295ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 296ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // translation business, as it makes the driver functionality much 297ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 298ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 299ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // have something that works, we should reevaluate each translation 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // and try to push it down into tool specific logic. 301ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Arg *OSXVersion = 303ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.getLastArg(options::OPT_mmacosx_version_min_EQ, false); 304ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Arg *iPhoneVersion = 3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Args.getLastArg(options::OPT_miphoneos_version_min_EQ, false); 306ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar if (OSXVersion && iPhoneVersion) { 307ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar getHost().getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 308ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump << iPhoneVersion->getAsString(Args); 310ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar } else if (!OSXVersion && !iPhoneVersion) { 311ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar // Chose the default version based on the arch. 312ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar // 31330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // FIXME: Are there iPhone overrides for this? 31430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar 3151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar if (!isIPhoneOS()) { 31630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // Look for MACOSX_DEPLOYMENT_TARGET, otherwise use the version 31730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar // from the host. 31830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const char *Version = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 31930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar if (!Version) 32030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar Version = MacosxVersionMin.c_str(); 32130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 32230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, O, Version)); 32330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } else { 32430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const char *Version = IPhoneOSVersionMin.c_str(); 32530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ); 32630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, O, Version)); 32730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar } 328ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3304e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { 3314e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar Arg *A = *it; 3324e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 3334e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 3344e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: Canonicalize name. 3354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (getArchName() != A->getValue(Args, 0)) 3364e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 3374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 3384e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: The arg is leaked here, and we should have a nicer 3394e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // interface for this. 3404e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar unsigned Prev, Index = Prev = A->getIndex() + 1; 341ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Arg *XarchArg = Opts.ParseOneArg(Args, Index); 3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3434e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 3444e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 3454e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 3464e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 3474e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 3484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 3494e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 3504e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!XarchArg || Index > Prev + 1 || 3524e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar XarchArg->getOption().isDriverOption()) { 353ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar getHost().getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 3544e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 3554e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 3564e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 3574e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 358478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 3594e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar A = XarchArg; 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 3614e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 362ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 363ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 364ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 365ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar options::ID id = A->getOption().getId(); 366ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar switch (id) { 367ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 368ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 369ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 370ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 371ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 372ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 373ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 374478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 375478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 376ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 378ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 379478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF), 380ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar A->getValue(Args))); 381ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 382ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 383ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 384478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 385478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 386ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols))); 387ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 388ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 389ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 390478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 391478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 392ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols))); 393ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 394ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 395ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fterminated_vtables: 396ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_findirect_virtual_calls: 397478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 398478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar Opts.getOption(options::OPT_fapple_kext))); 399478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 400ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 401ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 402ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 403478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib))); 404ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 405ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 406ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 407478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 408ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mconstant_cfstrings))); 409ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 410ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 411ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 412478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 413ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_constant_cfstrings))); 414ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 415ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 416ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 417478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 418ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings))); 419ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 420ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 421ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 422478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 423ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings))); 424ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 425ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 426ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 427478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 428ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mpascal_strings))); 429ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 430ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 431ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 432478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 433ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_pascal_strings))); 434ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 435ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 4364e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 4374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 43884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (getTriple().getArch() == llvm::Triple::x86 || 43984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar getTriple().getArch() == llvm::Triple::x86_64) 44084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (!Args.hasArg(options::OPT_mtune_EQ, false)) 44184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), 44284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar "core2")); 44384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 44484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // Add the arch options based on the particular spelling of -arch, to match 44584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // how the driver driver works. 44684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (BoundArch) { 44784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar llvm::StringRef Name = BoundArch; 44884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ); 44984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar const Option *MArch = Opts.getOption(options::OPT_march_EQ); 45084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 45184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // This code must be kept in sync with LLVM's getArchTypeForDarwinArch, 45284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar // which defines the list of which architectures we accept. 45384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar if (Name == "ppc") 45484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 45584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc601") 45684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "601")); 45784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc603") 45884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "603")); 45984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604") 46084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "604")); 46184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc604e") 46284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "604e")); 46384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc750") 46484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "750")); 46584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7400") 46684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "7400")); 46784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc7450") 46884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "7450")); 46984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc970") 47084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MCpu, "970")); 47184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 47284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "ppc64") 47384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); 47484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 47584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i386") 47684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar ; 47784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i486") 47884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i486")); 47984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i586") 48084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i586")); 48184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "i686") 48284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "i686")); 48384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium") 48484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium")); 48584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentium2") 48684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); 48784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentpro") 48884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentiumpro")); 48984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "pentIIm3") 49084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2")); 49184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 49284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "x86_64") 493478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); 494ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 49584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "arm") 49684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); 49784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv4t") 49884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t")); 49984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv5") 50084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv5tej")); 50184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "xscale") 50284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "xscale")); 50384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv6") 50484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv6k")); 50584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else if (Name == "armv7") 50684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, MArch, "armv7a")); 50784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar 50884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar else 50984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar llvm::llvm_unreachable("invalid Darwin arch"); 51084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar } 511ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 5124e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 5148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 515f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsMathErrnoDefault() const { 5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return false; 5178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 5188eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 519f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const { 5208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 5218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 5228eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return getArchName() == "x86_64"; 5238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 5248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 525f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const { 5268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 5278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 5288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 529f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const { 5308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (getArchName() == "x86_64") 5318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 5328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return 0; 5338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 5348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 5353917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 5363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 5373917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 5383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 539cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple) 5401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : ToolChain(Host, Triple) { 54182fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar std::string Path(getHost().getDriver().Dir); 54282fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path += "/../libexec"; 54382fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar getProgramPaths().push_back(Path); 54482fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getProgramPaths().push_back(getHost().getDriver().Dir); 546c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 547c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 5483917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 5493917608370583fa30c466b6c3893448229aea9adDaniel Dunbar // Free tool implementations. 5503917608370583fa30c466b6c3893448229aea9adDaniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 5513917608370583fa30c466b6c3893448229aea9adDaniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 5523917608370583fa30c466b6c3893448229aea9adDaniel Dunbar delete it->second; 5533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 5543917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 5551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C, 5563917608370583fa30c466b6c3893448229aea9adDaniel Dunbar const JobAction &JA) const { 5573917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Action::ActionClass Key; 558a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 5593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = Action::AnalyzeJobClass; 5603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar else 5613917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = JA.getKind(); 5623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 5633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Tool *&T = Tools[Key]; 5643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar if (!T) { 5653917608370583fa30c466b6c3893448229aea9adDaniel Dunbar switch (Key) { 5668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 5678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 5683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar assert(0 && "Invalid tool kind."); 5693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PreprocessJobClass: 5703917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Preprocess(*this); break; 5713917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PrecompileJobClass: 5723917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Precompile(*this); break; 5733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AnalyzeJobClass: 5743917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::Clang(*this); break; 5753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::CompileJobClass: 5763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Compile(*this); break; 5773917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AssembleJobClass: 5783917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Assemble(*this); break; 5793917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::LinkJobClass: 5803917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Link(*this); break; 5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // This is a bit ungeneric, but the only platform using a driver 5838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // driver is Darwin. 5848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 5858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 5863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 5873917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 5883917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 5893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return *T; 5903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 5913917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 592f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Generic_GCC::IsMathErrnoDefault() const { 5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return true; 5943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 5953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 5963917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 5978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 5988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 5993917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return getArchName() == "x86_64"; 6003917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 6013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 6023917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const { 6033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return "static"; 6043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 6053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 6063917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const { 6073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return 0; 6083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 609f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 6100dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args, 6110dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar const char *BoundArch) const { 612f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar return new DerivedArgList(Args, true); 613f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar} 61475358d267256022475371416654b056ad8531cb3Daniel Dunbar 615f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly. 616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 617f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple) 618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar : Generic_GCC(Host, Triple) { 619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib"); 620f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar getFilePaths().push_back("/usr/lib"); 621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Action::ActionClass Key; 625a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = Action::AnalyzeJobClass; 627f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar else 628f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Key = JA.getKind(); 629f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar Tool *&T = Tools[Key]; 631f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar if (!T) { 632f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar switch (Key) { 633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::AssembleJobClass: 634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Assemble(*this); break; 635f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar case Action::LinkJobClass: 636f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = new tools::openbsd::Link(*this); break; 637f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar default: 638f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 639f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 640f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar } 641f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar return *T; 643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar} 644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar 64575358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 64675358d267256022475371416654b056ad8531cb3Daniel Dunbar 647cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32) 648cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 649bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar if (Lib32) { 65075358d267256022475371416654b056ad8531cb3Daniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib32"); 651bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib32"); 652bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } else { 65375358d267256022475371416654b056ad8531cb3Daniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib"); 654bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib"); 655bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } 65675358d267256022475371416654b056ad8531cb3Daniel Dunbar} 65775358d267256022475371416654b056ad8531cb3Daniel Dunbar 65875358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 65975358d267256022475371416654b056ad8531cb3Daniel Dunbar Action::ActionClass Key; 660a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 66175358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = Action::AnalyzeJobClass; 66275358d267256022475371416654b056ad8531cb3Daniel Dunbar else 66375358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = JA.getKind(); 66475358d267256022475371416654b056ad8531cb3Daniel Dunbar 66575358d267256022475371416654b056ad8531cb3Daniel Dunbar Tool *&T = Tools[Key]; 66675358d267256022475371416654b056ad8531cb3Daniel Dunbar if (!T) { 66775358d267256022475371416654b056ad8531cb3Daniel Dunbar switch (Key) { 66868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar case Action::AssembleJobClass: 66968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar T = new tools::freebsd::Assemble(*this); break; 670008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar case Action::LinkJobClass: 671008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar T = new tools::freebsd::Link(*this); break; 67275358d267256022475371416654b056ad8531cb3Daniel Dunbar default: 67375358d267256022475371416654b056ad8531cb3Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 67475358d267256022475371416654b056ad8531cb3Daniel Dunbar } 67575358d267256022475371416654b056ad8531cb3Daniel Dunbar } 67675358d267256022475371416654b056ad8531cb3Daniel Dunbar 67775358d267256022475371416654b056ad8531cb3Daniel Dunbar return *T; 67875358d267256022475371416654b056ad8531cb3Daniel Dunbar} 67911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 680e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. 681e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 682e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple) 683e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan : Generic_GCC(Host, Triple) { 684e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 685e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan // Path mangling to find libexec 686e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan std::string Path(getHost().getDriver().Dir); 687e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 688e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Path += "/../libexec"; 689e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getProgramPaths().push_back(Path); 6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getProgramPaths().push_back(getHost().getDriver().Dir); 691e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 692e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back(getHost().getDriver().Dir + "/../lib"); 693e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/lib"); 694e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/usr/sfw/lib"); 695e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib"); 6967adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4"); 697e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 698e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 699e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 700e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const { 701e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Action::ActionClass Key; 702a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 703e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = Action::AnalyzeJobClass; 704e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan else 705e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Key = JA.getKind(); 706e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 707e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan Tool *&T = Tools[Key]; 708e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan if (!T) { 709e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan switch (Key) { 710e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::AssembleJobClass: 711e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Assemble(*this); break; 712e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan case Action::LinkJobClass: 713e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = new tools::auroraux::Link(*this); break; 714e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan default: 715e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan T = &Generic_GCC::SelectTool(C, JA); 716e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 717e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan } 718e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 719e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan return *T; 720e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan} 721e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 722e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan 7236b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment). 7246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 7256b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple) 7266b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman : Generic_GCC(Host, Triple) { 7276b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back(getHost().getDriver().Dir + "/../lib/clang/1.0/"); 7286b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/lib/"); 7296b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman getFilePaths().push_back("/usr/lib/"); 730a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 731a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // Depending on the Linux distribution, any combination of lib{,32,64} is 732a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems, 733a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar // openSUSE uses lib and lib64 for the same purpose. 734a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib32/"); 735a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib32/"); 736a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/lib64/"); 737a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar getFilePaths().push_back("/usr/lib64/"); 738a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar 7396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // FIXME: Figure out some way to get gcc's libdir 7406b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need 7416b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // crtbegin.o/crtend.o/etc., and want static versions of various 7426b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably 7436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // get away with using shared versions in /usr/lib, though. 7446b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // We could fall back to the approach we used for includes (a massive 7456b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman // list), but that's messy at best. 7466b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman} 7476b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman 74811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. 74911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 750cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple) 751cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar : Generic_GCC(Host, Triple) { 75211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 75311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar // Path mangling to find libexec 75411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar std::string Path(getHost().getDriver().Dir); 75511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 75611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Path += "/../libexec"; 75711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getProgramPaths().push_back(Path); 7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getProgramPaths().push_back(getHost().getDriver().Dir); 75911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 76011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib"); 76111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib"); 76211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar getFilePaths().push_back("/usr/lib/gcc41"); 76311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 76411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 76511e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const { 76611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Action::ActionClass Key; 767a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple())) 76811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = Action::AnalyzeJobClass; 76911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar else 77011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Key = JA.getKind(); 77111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 77211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar Tool *&T = Tools[Key]; 77311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar if (!T) { 77411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar switch (Key) { 77511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::AssembleJobClass: 77611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Assemble(*this); break; 77711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar case Action::LinkJobClass: 77811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = new tools::dragonfly::Link(*this); break; 77911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar default: 78011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 78111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 78211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar } 78311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar 78411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar return *T; 78511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar} 786