ToolChains.cpp revision f36a06a9584cf351e1bb7c5ebf2f707ed416daba
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" 20ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h" 21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h" 22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 23f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv 24f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 253917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver; 263917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains; 273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar/// Darwin_X86 - Darwin tool chain for i386 and x86_64. 298eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 30c50b00dbd843cd929b5f220d4a8699852249f64cDaniel DunbarDarwin_X86::Darwin_X86(const HostInfo &Host, const char *Arch, 31c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar const char *Platform, const char *OS, 32c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar const unsigned (&_DarwinVersion)[3], 33c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar const unsigned (&_GCCVersion)[3]) 34c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar : ToolChain(Host, Arch, Platform, OS) 35c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar{ 36c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[0] = _DarwinVersion[0]; 37c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[1] = _DarwinVersion[1]; 38c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar DarwinVersion[2] = _DarwinVersion[2]; 39c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar GCCVersion[0] = _GCCVersion[0]; 40c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar GCCVersion[1] = _GCCVersion[1]; 41c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar GCCVersion[2] = _GCCVersion[2]; 42c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 4302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar llvm::raw_string_ostream(MacosxVersionMin) 4402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar << "10." << DarwinVersion[0] - 4 << '.' << DarwinVersion[1]; 4502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar 46c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir = "i686-apple-darwin"; 47c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(DarwinVersion[0]); 48c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += "/"; 49c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[0]); 50c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 51c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[1]); 52c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += '.'; 53c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar ToolChainDir += llvm::utostr(GCCVersion[2]); 54c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 55c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar std::string Path; 56c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar if (getArchName() == "x86_64") { 57c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 58c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 59c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 60c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 61c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 62c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 63c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 64c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 65c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/x86_64"; 66c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 67c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar } 68c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 69c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 70c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../lib/gcc/"; 71c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 72c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 73c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 74c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/lib/gcc/"; 75c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 76c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getFilePaths().push_back(Path); 77c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 78c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = getHost().getDriver().Dir; 79c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += "/../libexec/gcc/"; 80c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 81c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 82c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 83c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path = "/usr/libexec/gcc/"; 84c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar Path += getToolChainDir(); 85c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(Path); 86c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 8782fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path = getHost().getDriver().Dir; 8882fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path += "/../libexec"; 8982fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar getProgramPaths().push_back(Path); 9082fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar 91c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(getHost().getDriver().Dir); 92c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 93c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel DunbarDarwin_X86::~Darwin_X86() { 958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // Free tool implementations. 968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar delete it->second; 998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel DunbarTool &Darwin_X86::SelectTool(const Compilation &C, 1028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar const JobAction &JA) const { 1038eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Action::ActionClass Key; 104af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getArchName())) 1058eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = Action::AnalyzeJobClass; 1068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar else 1078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Key = JA.getKind(); 1088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar Tool *&T = Tools[Key]; 1108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (!T) { 1118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar switch (Key) { 1128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 1138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 1148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar assert(0 && "Invalid tool kind."); 1158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::PreprocessJobClass: 1169120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Preprocess(*this); break; 1178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AnalyzeJobClass: 1188eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::Clang(*this); break; 1199120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar case Action::PrecompileJobClass: 1208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::CompileJobClass: 1219120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar T = new tools::darwin::Compile(*this); break; 1228eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::AssembleJobClass: 1238cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar T = new tools::darwin::Assemble(*this); break; 1248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LinkJobClass: 12502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar T = new tools::darwin::Link(*this, MacosxVersionMin.c_str()); break; 1268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 1278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 1288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 1298eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar } 1308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 1318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return *T; 1328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 1338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 134f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const { 1354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar DerivedArgList *DAL = new DerivedArgList(Args, false); 136ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar const OptTable &Opts = getHost().getDriver().getOpts(); 137ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 138ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // FIXME: We really want to get out of the tool chain level argument 139ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // translation business, as it makes the driver functionality much 140ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // more opaque. For now, we follow gcc closely solely for the 141ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // purpose of easily achieving feature parity & testability. Once we 142ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // have something that works, we should reevaluate each translation 143ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // and try to push it down into tool specific logic. 144ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 145ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Arg *OSXVersion = 146ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.getLastArg(options::OPT_mmacosx_version_min_EQ, false); 147ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Arg *iPhoneVersion = 148ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar Args.getLastArg(options::OPT_miphoneos_version_min_EQ, false); 149ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar if (OSXVersion && iPhoneVersion) { 150ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar getHost().getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with) 151ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << OSXVersion->getAsString(Args) 152ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar << iPhoneVersion->getAsString(Args); 153ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar } else if (!OSXVersion && !iPhoneVersion) { 154ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar // Chose the default version based on the arch. 155ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar // 156ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar // FIXME: This will need to be fixed when we merge in arm support. 157f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar 158f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar // Look for MACOSX_DEPLOYMENT_TARGET, otherwise use the version 159f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar // from the host. 160f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar const char *Version = ::getenv("MACOSX_DEPLOYMENT_TARGET"); 161f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar if (!Version) 162f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar Version = MacosxVersionMin.c_str(); 163ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ); 164f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar DAL->append(DAL->MakeJoinedArg(0, O, Version)); 165ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 1664e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 1674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { 1684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar Arg *A = *it; 1694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 1704e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (A->getOption().matches(options::OPT_Xarch__)) { 1714e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: Canonicalize name. 1724e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (getArchName() != A->getValue(Args, 0)) 1734e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 1744e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 1754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // FIXME: The arg is leaked here, and we should have a nicer 1764e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // interface for this. 1774e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar unsigned Prev, Index = Prev = A->getIndex() + 1; 178ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Arg *XarchArg = Opts.ParseOneArg(Args, Index); 1794e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 1804e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // If the argument parsing failed or more than one argument was 1814e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // consumed, the -Xarch_ argument's parameter tried to consume 1824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // extra arguments. Emit an error and ignore. 1834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // 1844e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // We also want to disallow any options which would alter the 1854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // driver behavior; that isn't going to work in our model. We 1864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // use isDriverOption() as an approximation, although things 1874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar // like -O4 are going to slip through. 1884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar if (!XarchArg || Index > Prev + 1 || 1894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar XarchArg->getOption().isDriverOption()) { 190ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar getHost().getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument) 1914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar << A->getAsString(Args); 1924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar continue; 1934e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 1944e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 195478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar XarchArg->setBaseArg(A); 1964e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar A = XarchArg; 1974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 1984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 199ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // Sob. These is strictly gcc compatible for the time being. Apple 200ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // gcc translates options twice, which means that self-expanding 201ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // options add duplicates. 202ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar options::ID id = A->getOption().getId(); 203ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar switch (id) { 204ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar default: 205ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 206ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 207ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 208ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_mkernel: 209ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fapple_kext: 210ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar DAL->append(A); 211478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 212478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 213ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 214ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 215ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_dependency_file: 216478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF), 217ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar A->getValue(Args))); 218ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 219ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 220ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gfull: 221478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 222478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 223ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols))); 224ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 225ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 226ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_gused: 227478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag))); 228478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 229ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_feliminate_unused_debug_symbols))); 230ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 231ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 232ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fterminated_vtables: 233ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_findirect_virtual_calls: 234478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 235478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar Opts.getOption(options::OPT_fapple_kext))); 236478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static))); 237ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 238ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 239ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_shared: 240478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib))); 241ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 242ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 243ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fconstant_cfstrings: 244478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 245ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mconstant_cfstrings))); 246ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 247ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 248ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_constant_cfstrings: 249478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 250ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_constant_cfstrings))); 251ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 252ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 253ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wnonportable_cfstrings: 254478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 255ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mwarn_nonportable_cfstrings))); 256ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 257ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 258ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_Wno_nonportable_cfstrings: 259478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 260ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings))); 261ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 262ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 263ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fpascal_strings: 264478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 265ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mpascal_strings))); 266ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 267ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 268ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar case options::OPT_fno_pascal_strings: 269478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(A, 270ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar Opts.getOption(options::OPT_mno_pascal_strings))); 271ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar break; 272ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar } 2734e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar } 2744e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar 275ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // FIXME: Actually, gcc always adds this, but it is filtered for 276ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // duplicates somewhere. This also changes the order of things, so 277ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar // look it up. 278ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar if (getArchName() == "x86_64") 279ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar if (!Args.hasArg(options::OPT_m64, false)) 280478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64))); 281ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 282ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar if (!Args.hasArg(options::OPT_mtune_EQ, false)) 283478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), 284ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar "core2")); 285ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar 2864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar return DAL; 2878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarbool Darwin_X86::IsMathErrnoDefault() const { 2908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return false; 2918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarbool Darwin_X86::IsUnwindTablesDefault() const { 2948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 2958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 2968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return getArchName() == "x86_64"; 2978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 2988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 2998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarconst char *Darwin_X86::GetDefaultRelocationModel() const { 3008eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 3018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 3028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3038eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarconst char *Darwin_X86::GetForcedPicModel() const { 3048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar if (getArchName() == "x86_64") 3058eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return "pic"; 3068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar return 0; 3078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar} 3088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform 3103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of 3113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options. 3123917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 313c50b00dbd843cd929b5f220d4a8699852249f64cDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const char *Arch, 314c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar const char *Platform, const char *OS) 315c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar : ToolChain(Host, Arch, Platform, OS) 316c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar{ 31782fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar std::string Path(getHost().getDriver().Dir); 31882fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar Path += "/../libexec"; 31982fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar getProgramPaths().push_back(Path); 32082fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar 321c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar getProgramPaths().push_back(getHost().getDriver().Dir); 322c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar} 323c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar 3243917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() { 3253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar // Free tool implementations. 3263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar for (llvm::DenseMap<unsigned, Tool*>::iterator 3273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar it = Tools.begin(), ie = Tools.end(); it != ie; ++it) 3283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar delete it->second; 3293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 3303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3313917608370583fa30c466b6c3893448229aea9adDaniel DunbarTool &Generic_GCC::SelectTool(const Compilation &C, 3323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar const JobAction &JA) const { 3333917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Action::ActionClass Key; 334af80e1ffafeb77929cc0b9ba8940a7f1c0b80d51Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getArchName())) 3353917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = Action::AnalyzeJobClass; 3363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar else 3373917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Key = JA.getKind(); 3383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar Tool *&T = Tools[Key]; 3403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar if (!T) { 3413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar switch (Key) { 3428eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::InputClass: 3438eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::BindArchClass: 3443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar assert(0 && "Invalid tool kind."); 3453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PreprocessJobClass: 3463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Preprocess(*this); break; 3473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::PrecompileJobClass: 3483917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Precompile(*this); break; 3493917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AnalyzeJobClass: 3503917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::Clang(*this); break; 3513917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::CompileJobClass: 3523917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Compile(*this); break; 3533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::AssembleJobClass: 3543917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Assemble(*this); break; 3553917608370583fa30c466b6c3893448229aea9adDaniel Dunbar case Action::LinkJobClass: 3563917608370583fa30c466b6c3893448229aea9adDaniel Dunbar T = new tools::gcc::Link(*this); break; 3578eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar 3588eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // This is a bit ungeneric, but the only platform using a driver 3598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // driver is Darwin. 3608eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar case Action::LipoJobClass: 3618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar T = new tools::darwin::Lipo(*this); break; 3623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 3633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar } 3643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3653917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return *T; 3663917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 3673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3683917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsMathErrnoDefault() const { 3693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return true; 3703917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 3713917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3723917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const { 3738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // FIXME: Gross; we should probably have some separate target 3748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar // definition, possibly even reusing the one in clang. 3753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return getArchName() == "x86_64"; 3763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 3773917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3783917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const { 3793917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return "static"; 3803917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 3813917608370583fa30c466b6c3893448229aea9adDaniel Dunbar 3823917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const { 3833917608370583fa30c466b6c3893448229aea9adDaniel Dunbar return 0; 3843917608370583fa30c466b6c3893448229aea9adDaniel Dunbar} 385f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar 386f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel DunbarDerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args) const { 387f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar return new DerivedArgList(Args, true); 388f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar} 38975358d267256022475371416654b056ad8531cb3Daniel Dunbar 39075358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly. 39175358d267256022475371416654b056ad8531cb3Daniel Dunbar 39275358d267256022475371416654b056ad8531cb3Daniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const char *Arch, 39375358d267256022475371416654b056ad8531cb3Daniel Dunbar const char *Platform, const char *OS, bool Lib32) 39475358d267256022475371416654b056ad8531cb3Daniel Dunbar : Generic_GCC(Host, Arch, Platform, OS) { 395bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar if (Lib32) { 39675358d267256022475371416654b056ad8531cb3Daniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib32"); 397bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib32"); 398bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } else { 39975358d267256022475371416654b056ad8531cb3Daniel Dunbar getFilePaths().push_back(getHost().getDriver().Dir + "/../lib"); 400bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar getFilePaths().push_back("/usr/lib"); 401bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar } 40275358d267256022475371416654b056ad8531cb3Daniel Dunbar} 40375358d267256022475371416654b056ad8531cb3Daniel Dunbar 40475358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const { 40575358d267256022475371416654b056ad8531cb3Daniel Dunbar Action::ActionClass Key; 40675358d267256022475371416654b056ad8531cb3Daniel Dunbar if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getArchName())) 40775358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = Action::AnalyzeJobClass; 40875358d267256022475371416654b056ad8531cb3Daniel Dunbar else 40975358d267256022475371416654b056ad8531cb3Daniel Dunbar Key = JA.getKind(); 41075358d267256022475371416654b056ad8531cb3Daniel Dunbar 41175358d267256022475371416654b056ad8531cb3Daniel Dunbar Tool *&T = Tools[Key]; 41275358d267256022475371416654b056ad8531cb3Daniel Dunbar if (!T) { 41375358d267256022475371416654b056ad8531cb3Daniel Dunbar switch (Key) { 41468a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar case Action::AssembleJobClass: 41568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar T = new tools::freebsd::Assemble(*this); break; 416008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar case Action::LinkJobClass: 417008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar T = new tools::freebsd::Link(*this); break; 41875358d267256022475371416654b056ad8531cb3Daniel Dunbar default: 41975358d267256022475371416654b056ad8531cb3Daniel Dunbar T = &Generic_GCC::SelectTool(C, JA); 42075358d267256022475371416654b056ad8531cb3Daniel Dunbar } 42175358d267256022475371416654b056ad8531cb3Daniel Dunbar } 42275358d267256022475371416654b056ad8531cb3Daniel Dunbar 42375358d267256022475371416654b056ad8531cb3Daniel Dunbar return *T; 42475358d267256022475371416654b056ad8531cb3Daniel Dunbar} 425