ToolChain.cpp revision ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1f
13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- ToolChain.cpp - Collections of tools for one platform ------------===// 22ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 32ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// The LLVM Compiler Infrastructure 42ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 52ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// This file is distributed under the University of Illinois Open Source 62ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// License. See LICENSE.TXT for details. 72ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar// 82ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar//===----------------------------------------------------------------------===// 92ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 105b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola#include "Tools.h" 1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h" 122ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Action.h" 132ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Driver.h" 1400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/DriverDiagnostic.h" 1500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Options.h" 16b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "clang/Driver/ToolChain.h" 1757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson#include "llvm/ADT/StringSwitch.h" 18b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h" 19b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h" 20b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h" 219f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "llvm/Support/ErrorHandling.h" 228e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan#include "llvm/Support/FileSystem.h" 232ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbarusing namespace clang::driver; 245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang; 25b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt; 262ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 27af370e6e051e505016637e23418354db625dc796Rafael EspindolaToolChain::ToolChain(const Driver &D, const llvm::Triple &T, 28af370e6e051e505016637e23418354db625dc796Rafael Espindola const ArgList &A) 29af370e6e051e505016637e23418354db625dc796Rafael Espindola : D(D), Triple(T), Args(A) { 302ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 312ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 322ba38ba9a18b8ec88e2509fad622eeec01562769Daniel DunbarToolChain::~ToolChain() { 332ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 342ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 35ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbarconst Driver &ToolChain::getDriver() const { 364d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D; 37ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar} 38ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar 39af370e6e051e505016637e23418354db625dc796Rafael Espindolabool ToolChain::useIntegratedAs() const { 405470cd27e47aea163daaa76dde36010753400663Rafael Espindola return Args.hasFlag(options::OPT_integrated_as, 415470cd27e47aea163daaa76dde36010753400663Rafael Espindola options::OPT_no_integrated_as, 425470cd27e47aea163daaa76dde36010753400663Rafael Espindola IsIntegratedAssemblerDefault()); 435470cd27e47aea163daaa76dde36010753400663Rafael Espindola} 445470cd27e47aea163daaa76dde36010753400663Rafael Espindola 45d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbarstd::string ToolChain::getDefaultUniversalArchName() const { 46d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // In universal driver terms, the arch name accepted by -arch isn't exactly 47d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // the same as the ones that appear in the triple. Roughly speaking, this is 48d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // an inverse of the darwin::getArchTypeForDarwinArchName() function, but the 49d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar // only interesting special case is powerpc. 50d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar switch (Triple.getArch()) { 51d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar case llvm::Triple::ppc: 52d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return "ppc"; 53d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar case llvm::Triple::ppc64: 54d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return "ppc64"; 55ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt case llvm::Triple::ppc64le: 56ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt return "ppc64le"; 57d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar default: 58d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar return Triple.getArchName(); 59d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar } 60d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar} 61d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar 6203a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindolabool ToolChain::IsUnwindTablesDefault() const { 6303a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola return false; 6403a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola} 6503a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola 66f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClang() const { 67f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Clang) 68f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Clang.reset(new tools::Clang(*this)); 69f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Clang.get(); 70f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 71f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 72f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildAssembler() const { 73f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return new tools::ClangAs(*this); 74f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 75f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 76f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildLinker() const { 77f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola llvm_unreachable("Linking is not supported by this toolchain"); 78f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 79f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 80f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getAssemble() const { 81f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Assemble) 82f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Assemble.reset(buildAssembler()); 83f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Assemble.get(); 84f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 85f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 86f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClangAs() const { 87f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Assemble) 88f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Assemble.reset(new tools::ClangAs(*this)); 89f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Assemble.get(); 90f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 91f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 92f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getLink() const { 93f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (!Link) 94f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Link.reset(buildLinker()); 95f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return Link.get(); 96f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola} 97f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 98f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getTool(Action::ActionClass AC) const { 99c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola switch (AC) { 100c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::AssembleJobClass: 101f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return getAssemble(); 102f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 103c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::LinkJobClass: 104f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return getLink(); 105f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola 106f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola case Action::InputClass: 107f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola case Action::BindArchClass: 108c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::LipoJobClass: 109c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::DsymutilJobClass: 110c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::VerifyJobClass: 111c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola llvm_unreachable("Invalid tool kind."); 112c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola 113c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::CompileJobClass: 114c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::PrecompileJobClass: 115c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::PreprocessJobClass: 116c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::AnalyzeJobClass: 117c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola case Action::MigrateJobClass: 118f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola return getClang(); 119c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola } 1204c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer 1214c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer llvm_unreachable("Invalid tool kind."); 122c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola} 123c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola 12429511875348c49c9c5a14bb086cd51e17feb01c9Rafael EspindolaTool *ToolChain::SelectTool(const JobAction &JA) const { 1255b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola if (getDriver().ShouldUseClangCompiler(JA)) 12629511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola return getClang(); 127f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola Action::ActionClass AC = JA.getKind(); 128f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola if (AC == Action::AssembleJobClass && useIntegratedAs()) 12929511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola return getClangAs(); 13029511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola return getTool(AC); 1315b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola} 1325b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola 1334a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbarstd::string ToolChain::GetFilePath(const char *Name) const { 1344d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D.GetFilePath(Name, *this); 1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1362ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 1372ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar 138fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyanstd::string ToolChain::GetProgramPath(const char *Name) const { 139fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyan return D.GetProgramPath(Name, *this); 1402ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar} 1414180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar 1424180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID ToolChain::LookupTypeForExtension(const char *Ext) const { 1434180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar return types::lookupTypeForExtension(Ext); 1444180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar} 14500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 146b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool ToolChain::HasNativeLLVMSupport() const { 147b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar return false; 148b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar} 149b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar 150260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime ToolChain::getDefaultObjCRuntime(bool isNonFragile) const { 15111d3f4cc27e6b923fc32481dc1bb5ec46c7d1f4bDavid Chisnall return ObjCRuntime(isNonFragile ? ObjCRuntime::GNUstep : ObjCRuntime::GCC, 152260611a32535c851237926bfcf78869b13c07d5bJohn McCall VersionTuple()); 1539f084a3166b684573ba49df28fc5792bc37d92e1John McCall} 1549f084a3166b684573ba49df28fc5792bc37d92e1John McCall 155fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. 15600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// 15700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this. 15800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args, 15900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar const llvm::Triple &Triple) { 160677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // For Darwin targets, the -arch option (which is translated to a 161677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // corresponding -march option) should determine the architecture 162677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // (and the Mach-O slice) regardless of any -mcpu options. 163677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson if (!Triple.isOSDarwin()) { 164677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // FIXME: Warn on inconsistent use of -mcpu and -march. 165677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson // If we have -mcpu=, use that. 166677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) 1671d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith return A->getValue(); 168677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson } 16900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 1705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef MArch; 17100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) { 17200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Otherwise, if we have -march= choose the base CPU for that arch. 1731d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith MArch = A->getValue(); 17400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } else { 17500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Otherwise, use the Arch from the triple. 17600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar MArch = Triple.getArchName(); 17700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 17800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 17957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson return llvm::StringSwitch<const char *>(MArch) 18057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv2", "armv2a","arm2") 18157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv3", "arm6") 18257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv3m", "arm7m") 1834889a1fe91b0fd590e7beff16017086336064e6cTim Northover .Case("armv4", "strongarm") 1844889a1fe91b0fd590e7beff16017086336064e6cTim Northover .Case("armv4t", "arm7tdmi") 18557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv5", "armv5t", "arm10tdmi") 18657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv5e", "armv5te", "arm1026ejs") 18757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv5tej", "arm926ej-s") 18857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv6", "armv6k", "arm1136jf-s") 18957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv6j", "arm1136j-s") 19057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv6z", "armv6zk", "arm1176jzf-s") 19157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("armv6t2", "arm1156t2-s") 1922503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv6m", "armv6-m", "cortex-m0") 19357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv7", "armv7a", "armv7-a", "cortex-a8") 19440a94e299eadc5b80bd1dabf948d25d7c8cc4aa5Renato Golin .Cases("armv7l", "armv7-l", "cortex-a8") 195336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7f", "armv7-f", "cortex-a9-mp") 196336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Cases("armv7s", "armv7-s", "swift") 197532f5a9d64212ae9dbaa19f25b223ecb4ed680baBob Wilson .Cases("armv7r", "armv7-r", "cortex-r4") 19857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("armv7m", "armv7-m", "cortex-m3") 1992503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Cases("armv7em", "armv7e-m", "cortex-m4") 2004ec8d5b63d3e2a2c0d9f35243e5f798a89cd97bdJoey Gouly .Cases("armv8", "armv8a", "armv8-a", "cortex-a53") 20157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("ep9312", "ep9312") 20257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("iwmmxt", "iwmmxt") 20357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("xscale", "xscale") 2044889a1fe91b0fd590e7beff16017086336064e6cTim Northover // If all else failed, return the most base CPU with thumb interworking 2054889a1fe91b0fd590e7beff16017086336064e6cTim Northover // supported by LLVM. 20657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Default("arm7tdmi"); 20700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 20800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 20900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular 21000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// CPU. 21100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// 21200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this. 21300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this, or kill it! 2145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) { 21557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson return llvm::StringSwitch<const char *>(CPU) 2164889a1fe91b0fd590e7beff16017086336064e6cTim Northover .Case("strongarm", "v4") 21757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t") 21857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm720t", "arm9", "arm9tdmi", "v4t") 21957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm920", "arm920t", "arm922t", "v4t") 22057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm940t", "ep9312","v4t") 22157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm10tdmi", "arm1020t", "v5") 22257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e") 22357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e") 22457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e") 22557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6") 22657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6") 22757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2") 228fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7") 229fc55345144f636f7687fd37649f0302914981fffBob Wilson .Cases("cortex-a9", "cortex-a15", "v7") 230fc55345144f636f7687fd37649f0302914981fffBob Wilson .Case("cortex-r5", "v7r") 23157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Case("cortex-m0", "v6m") 2322503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m3", "v7m") 2332503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson .Case("cortex-m4", "v7em") 234336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("cortex-a9-mp", "v7f") 235336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson .Case("swift", "v7s") 2364ec8d5b63d3e2a2c0d9f35243e5f798a89cd97bdJoey Gouly .Case("cortex-a53", "v8") 23757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson .Default(""); 23800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 23900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 24061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeLLVMTriple(const ArgList &Args, 24161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const { 24200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar switch (getTriple().getArch()) { 24300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar default: 24400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return getTripleString(); 24500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 24600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar case llvm::Triple::arm: 24700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar case llvm::Triple::thumb: { 24800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // FIXME: Factor into subclasses. 24900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar llvm::Triple Triple = getTriple(); 25000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 25100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // Thumb2 is the default for V7 on Darwin. 25200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // 25300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar // FIXME: Thumb should just be another -target-feaure, not in the triple. 2545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef Suffix = 25500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple)); 2562503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson bool ThumbDefault = Suffix.startswith("v6m") || 2572503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson (Suffix.startswith("v7") && getTriple().isOSDarwin()); 25800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar std::string ArchName = "arm"; 25961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier 26061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier // Assembly files should start in ARM mode. 26161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier if (InputType != types::TY_PP_Asm && 26261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault)) 26300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar ArchName = "thumb"; 26400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar Triple.setArchName(ArchName + Suffix.str()); 26500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 26600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar return Triple.getTriple(); 26700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 26800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar } 26900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 27000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 27161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args, 27261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier types::ID InputType) const { 2739d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar // Diagnose use of Darwin OS deployment target arguments on non-Darwin. 27400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ, 2759d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_miphoneos_version_min_EQ, 2769d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar options::OPT_mios_simulator_version_min_EQ)) 2775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_clang_unsupported) 27800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar << A->getAsString(Args); 27900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 28061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier return ComputeLLVMTriple(Args, InputType); 28100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar} 28200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar 28388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruthvoid ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs, 28488491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth ArgStringList &CC1Args) const { 28588491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth // Each toolchain should provide the appropriate include flags. 28688491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth} 28788491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth 288a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid ToolChain::addClangTargetOptions(const ArgList &DriverArgs, 289a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth ArgStringList &CC1Args) const { 2908af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola} 2918af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola 292c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel DunbarToolChain::RuntimeLibType ToolChain::GetRuntimeLibType( 293c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar const ArgList &Args) const 294c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar{ 295c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) { 2961d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value = A->getValue(); 297c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Value == "compiler-rt") 298c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_CompilerRT; 299c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar if (Value == "libgcc") 300c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return ToolChain::RLT_Libgcc; 301c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar getDriver().Diag(diag::err_drv_invalid_rtlib_name) 302c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar << A->getAsString(Args); 303c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar } 304c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar 305c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar return GetDefaultRuntimeLibType(); 306c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar} 307c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar 308641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel DunbarToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{ 3093f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) { 3101d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith StringRef Value = A->getValue(); 3113f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Value == "libc++") 3123f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar return ToolChain::CST_Libcxx; 3133f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar if (Value == "libstdc++") 3143f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar return ToolChain::CST_Libstdcxx; 3155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner getDriver().Diag(diag::err_drv_invalid_stdlib_name) 3163f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar << A->getAsString(Args); 3173f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar } 3183f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar 319641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar return ToolChain::CST_Libstdcxx; 320641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 321641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 32279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments. 32379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs, 32479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 32579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const Twine &Path) { 32679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-isystem"); 32779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(Path)); 32879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 32979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 33079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory with extern "C" 33179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// semantics to CC1 arguments. 33279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// 33379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// Note that this should be used rarely, and only for directories that 33479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// historically and for legacy reasons are treated as having implicit extern 33579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its 33679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// important to preserve the preprocessor changes resulting from the 33779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// classification. 33879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addExternCSystemInclude(const ArgList &DriverArgs, 33979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 34079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth const Twine &Path) { 34179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-externc-isystem"); 34279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(Path)); 34379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 34479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 3458e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanvoid ToolChain::addExternCSystemIncludeIfExists(const ArgList &DriverArgs, 3468e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan ArgStringList &CC1Args, 3478e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan const Twine &Path) { 3488e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan if (llvm::sys::fs::exists(Path)) 3498e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan addExternCSystemInclude(DriverArgs, CC1Args, Path); 3508e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan} 3518e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan 35279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a list of system include directories to CC1. 35379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemIncludes(const ArgList &DriverArgs, 35479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArgStringList &CC1Args, 35579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth ArrayRef<StringRef> Paths) { 35679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end(); 35779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth I != E; ++I) { 35879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back("-internal-isystem"); 35979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth CC1Args.push_back(DriverArgs.MakeArgString(*I)); 36079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth } 36179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth} 36279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth 363ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruthvoid ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, 364ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth ArgStringList &CC1Args) const { 365a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // Header search paths should be handled by each of the subclasses. 366a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // Historically, they have not been, and instead have been handled inside of 367a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // the CC1-layer frontend. As the logic is hoisted out, this generic function 368a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // will slowly stop being called. 369a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // 370a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // While it is being called, replicate a bit of a hack to propagate the 371a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // '-stdlib=' flag down to CC1 so that it can in turn customize the C++ 372a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // header search paths with it. Once all systems are overriding this 373a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth // function, the CC1 flag and this line can be removed. 374ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ); 375641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 376641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 377132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid ToolChain::AddCXXStdlibLibArgs(const ArgList &Args, 378132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar ArgStringList &CmdArgs) const { 379641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar CXXStdlibType Type = GetCXXStdlibType(Args); 380641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar 381641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar switch (Type) { 3823f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar case ToolChain::CST_Libcxx: 3833f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar CmdArgs.push_back("-lc++"); 3843f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar break; 3853f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar 386641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar case ToolChain::CST_Libstdcxx: 387641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar CmdArgs.push_back("-lstdc++"); 388641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar break; 389641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar } 390641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar} 3917433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen 3927433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid ToolChain::AddCCKextLibArgs(const ArgList &Args, 3937433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen ArgStringList &CmdArgs) const { 3947433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen CmdArgs.push_back("-lcc_kext"); 3957433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen} 396e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 397e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramerbool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args, 398e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer ArgStringList &CmdArgs) const { 399e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer // Check if -ffast-math or -funsafe-math is enabled. 400e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer Arg *A = Args.getLastArg(options::OPT_ffast_math, 401e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_fno_fast_math, 402e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_funsafe_math_optimizations, 403e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer options::OPT_fno_unsafe_math_optimizations); 404e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 405e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer if (!A || A->getOption().getID() == options::OPT_fno_fast_math || 406e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations) 407e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return false; 408e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 409e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer // If crtfastmath.o exists add it to the arguments. 410e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer std::string Path = GetFilePath("crtfastmath.o"); 411e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer if (Path == "crtfastmath.o") // Not found. 412e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return false; 413e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer 414e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer CmdArgs.push_back(Args.MakeArgString(Path)); 415e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer return true; 416e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer} 417