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