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"
112ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/ToolChain.h"
1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h"
132ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Action.h"
1400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Arg.h"
1500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/ArgList.h"
162ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar#include "clang/Driver/Driver.h"
1700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
18e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer#include "clang/Driver/Option.h"
1900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "clang/Driver/Options.h"
2057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson#include "llvm/ADT/StringSwitch.h"
219f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "llvm/Support/ErrorHandling.h"
222ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbarusing namespace clang::driver;
235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
242ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
25af370e6e051e505016637e23418354db625dc796Rafael EspindolaToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
26af370e6e051e505016637e23418354db625dc796Rafael Espindola                     const ArgList &A)
27af370e6e051e505016637e23418354db625dc796Rafael Espindola  : D(D), Triple(T), Args(A) {
282ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
292ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
302ba38ba9a18b8ec88e2509fad622eeec01562769Daniel DunbarToolChain::~ToolChain() {
315b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  // Free tool implementations.
325b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  for (llvm::DenseMap<unsigned, Tool*>::iterator
335b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola       it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
345b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    delete it->second;
352ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
362ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
37ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbarconst Driver &ToolChain::getDriver() const {
384d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D;
39ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar}
40ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar
41af370e6e051e505016637e23418354db625dc796Rafael Espindolabool ToolChain::useIntegratedAs() const {
425470cd27e47aea163daaa76dde36010753400663Rafael Espindola  return Args.hasFlag(options::OPT_integrated_as,
435470cd27e47aea163daaa76dde36010753400663Rafael Espindola                      options::OPT_no_integrated_as,
445470cd27e47aea163daaa76dde36010753400663Rafael Espindola                      IsIntegratedAssemblerDefault());
455470cd27e47aea163daaa76dde36010753400663Rafael Espindola}
465470cd27e47aea163daaa76dde36010753400663Rafael Espindola
47d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbarstd::string ToolChain::getDefaultUniversalArchName() const {
48d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // In universal driver terms, the arch name accepted by -arch isn't exactly
49d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // the same as the ones that appear in the triple. Roughly speaking, this is
50d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // an inverse of the darwin::getArchTypeForDarwinArchName() function, but the
51d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // only interesting special case is powerpc.
52d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  switch (Triple.getArch()) {
53d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc:
54d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc";
55d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc64:
56d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc64";
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
665b222059399ec9cccba7a393dc470adfb8a3db0fRafael EspindolaTool &ToolChain::SelectTool(const JobAction &JA) const {
675b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  Action::ActionClass Key;
685b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  if (getDriver().ShouldUseClangCompiler(JA))
695b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    Key = Action::AnalyzeJobClass;
705b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  else
715b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    Key = JA.getKind();
725b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
735b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  Tool *&T = Tools[Key];
745b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  if (T)
755b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    return *T;
765b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
775b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  if (getDriver().ShouldUseClangCompiler(JA))
785b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    T = new tools::Clang(*this);
795b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  else
805b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola    T = constructTool(Key);
815b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
825b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  return *T;
835b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola}
845b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
854a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbarstd::string ToolChain::GetFilePath(const char *Name) const {
864d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth  return D.GetFilePath(Name, *this);
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
882ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
892ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
90fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyanstd::string ToolChain::GetProgramPath(const char *Name) const {
91fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyan  return D.GetProgramPath(Name, *this);
922ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
934180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
944180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
954180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return types::lookupTypeForExtension(Ext);
964180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
9700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
98b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool ToolChain::HasNativeLLVMSupport() const {
99b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return false;
100b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
101b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
102260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime ToolChain::getDefaultObjCRuntime(bool isNonFragile) const {
10311d3f4cc27e6b923fc32481dc1bb5ec46c7d1f4bDavid Chisnall  return ObjCRuntime(isNonFragile ? ObjCRuntime::GNUstep : ObjCRuntime::GCC,
104260611a32535c851237926bfcf78869b13c07d5bJohn McCall                     VersionTuple());
1059f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
1069f084a3166b684573ba49df28fc5792bc37d92e1John McCall
107fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
10800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar//
10900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this.
11000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstatic const char *getARMTargetCPU(const ArgList &Args,
11100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar                                   const llvm::Triple &Triple) {
112677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson  // For Darwin targets, the -arch option (which is translated to a
113677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson  // corresponding -march option) should determine the architecture
114677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson  // (and the Mach-O slice) regardless of any -mcpu options.
115677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson  if (!Triple.isOSDarwin()) {
116677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson    // FIXME: Warn on inconsistent use of -mcpu and -march.
117677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson    // If we have -mcpu=, use that.
118677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson    if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1191d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      return A->getValue();
120677a35b628c8a9f0cef9277dbb78e6e8509d13e4Bob Wilson  }
12100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
1225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  StringRef MArch;
12300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
12400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Otherwise, if we have -march= choose the base CPU for that arch.
1251d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    MArch = A->getValue();
12600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  } else {
12700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Otherwise, use the Arch from the triple.
12800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    MArch = Triple.getArchName();
12900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
13000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
13157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson  return llvm::StringSwitch<const char *>(MArch)
13257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv2", "armv2a","arm2")
13357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("armv3", "arm6")
13457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("armv3m", "arm7m")
13557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv4", "armv4t", "arm7tdmi")
13657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv5", "armv5t", "arm10tdmi")
13757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv5e", "armv5te", "arm1026ejs")
13857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("armv5tej", "arm926ej-s")
13957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv6", "armv6k", "arm1136jf-s")
14057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("armv6j", "arm1136j-s")
14157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv6z", "armv6zk", "arm1176jzf-s")
14257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("armv6t2", "arm1156t2-s")
1432503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv6m", "armv6-m", "cortex-m0")
14457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv7", "armv7a", "armv7-a", "cortex-a8")
14540a94e299eadc5b80bd1dabf948d25d7c8cc4aa5Renato Golin    .Cases("armv7l", "armv7-l", "cortex-a8")
146336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7f", "armv7-f", "cortex-a9-mp")
147336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7s", "armv7-s", "swift")
148532f5a9d64212ae9dbaa19f25b223ecb4ed680baBob Wilson    .Cases("armv7r", "armv7-r", "cortex-r4")
14957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("armv7m", "armv7-m", "cortex-m3")
1502503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7em", "armv7e-m", "cortex-m4")
15157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("ep9312", "ep9312")
15257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("iwmmxt", "iwmmxt")
15357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("xscale", "xscale")
15457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    // If all else failed, return the most base CPU LLVM supports.
15557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Default("arm7tdmi");
15600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
15700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
15800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
15900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar/// CPU.
16000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar//
16100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: This is redundant with -mcpu, why does LLVM use this.
16200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar// FIXME: tblgen this, or kill it!
1635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *getLLVMArchSuffixForARM(StringRef CPU) {
16457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson  return llvm::StringSwitch<const char *>(CPU)
16557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
16657f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
16757f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm920", "arm920t", "arm922t", "v4t")
16857f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm940t", "ep9312","v4t")
16957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm10tdmi",  "arm1020t", "v5")
17057f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm9e",  "arm926ej-s",  "arm946e-s", "v5e")
17157f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm966e-s",  "arm968e-s",  "arm10e", "v5e")
17257f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm1020e",  "arm1022e",  "xscale", "iwmmxt", "v5e")
17357f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm1136j-s",  "arm1136jf-s",  "arm1176jz-s", "v6")
17457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm1176jzf-s",  "mpcorenovfp",  "mpcore", "v6")
17557f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Cases("arm1156t2-s",  "arm1156t2f-s", "v6t2")
176fc55345144f636f7687fd37649f0302914981fffBob Wilson    .Cases("cortex-a5", "cortex-a7", "cortex-a8", "v7")
177fc55345144f636f7687fd37649f0302914981fffBob Wilson    .Cases("cortex-a9", "cortex-a15", "v7")
178fc55345144f636f7687fd37649f0302914981fffBob Wilson    .Case("cortex-r5", "v7r")
17957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Case("cortex-m0", "v6m")
1802503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m3", "v7m")
1812503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m4", "v7em")
182336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("cortex-a9-mp", "v7f")
183336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("swift", "v7s")
18457f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson    .Default("");
18500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
18600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
18761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
18861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                         types::ID InputType) const {
18900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  switch (getTriple().getArch()) {
19000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  default:
19100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return getTripleString();
19200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
19300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  case llvm::Triple::arm:
19400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  case llvm::Triple::thumb: {
19500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Factor into subclasses.
19600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    llvm::Triple Triple = getTriple();
19700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
19800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Thumb2 is the default for V7 on Darwin.
19900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    //
20000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
2015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Suffix =
20200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar      getLLVMArchSuffixForARM(getARMTargetCPU(Args, Triple));
2032503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    bool ThumbDefault = Suffix.startswith("v6m") ||
2042503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson      (Suffix.startswith("v7") && getTriple().isOSDarwin());
20500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    std::string ArchName = "arm";
20661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier
20761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    // Assembly files should start in ARM mode.
20861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    if (InputType != types::TY_PP_Asm &&
20961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier        Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
21000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar      ArchName = "thumb";
21100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
21200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
21300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
21400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
21500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
21600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
21700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
21861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
21961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                   types::ID InputType) const {
2209d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  // Diagnose use of Darwin OS deployment target arguments on non-Darwin.
22100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ,
2229d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar                               options::OPT_miphoneos_version_min_EQ,
2239d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar                               options::OPT_mios_simulator_version_min_EQ))
2245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_clang_unsupported)
22500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar      << A->getAsString(Args);
22600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
22761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
22800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
22900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
23088491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruthvoid ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
23188491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth                                          ArgStringList &CC1Args) const {
23288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth  // Each toolchain should provide the appropriate include flags.
23388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth}
23488491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth
235a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid ToolChain::addClangTargetOptions(const ArgList &DriverArgs,
236a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                      ArgStringList &CC1Args) const {
2378af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
2388af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
239c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel DunbarToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
240c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  const ArgList &Args) const
241c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar{
242c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
2431d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
244c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "compiler-rt")
245c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_CompilerRT;
246c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "libgcc")
247c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_Libgcc;
248c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_invalid_rtlib_name)
249c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      << A->getAsString(Args);
250c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
251c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
252c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  return GetDefaultRuntimeLibType();
253c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar}
254c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
255641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel DunbarToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
2563f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2571d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
2583f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libc++")
2593f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libcxx;
2603f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libstdc++")
2613f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libstdcxx;
2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2633f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      << A->getAsString(Args);
2643f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  }
2653f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
266641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  return ToolChain::CST_Libstdcxx;
267641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
268641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
26979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments.
27079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs,
27179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            ArgStringList &CC1Args,
27279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            const Twine &Path) {
27379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-isystem");
27479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
27579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
27679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
27779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory with extern "C"
27879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// semantics to CC1 arguments.
27979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth///
28079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// Note that this should be used rarely, and only for directories that
28179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// historically and for legacy reasons are treated as having implicit extern
28279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its
28379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// important to preserve the preprocessor changes resulting from the
28479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// classification.
28579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addExternCSystemInclude(const ArgList &DriverArgs,
28679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   ArgStringList &CC1Args,
28779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   const Twine &Path) {
28879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-externc-isystem");
28979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
29079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
29179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
29279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a list of system include directories to CC1.
29379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemIncludes(const ArgList &DriverArgs,
29479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArgStringList &CC1Args,
29579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArrayRef<StringRef> Paths) {
29679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
29779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth       I != E; ++I) {
29879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back("-internal-isystem");
29979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(*I));
30079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  }
30179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
30279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
303ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruthvoid ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
304ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth                                             ArgStringList &CC1Args) const {
305a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Header search paths should be handled by each of the subclasses.
306a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Historically, they have not been, and instead have been handled inside of
307a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // the CC1-layer frontend. As the logic is hoisted out, this generic function
308a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // will slowly stop being called.
309a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  //
310a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // While it is being called, replicate a bit of a hack to propagate the
311a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // '-stdlib=' flag down to CC1 so that it can in turn customize the C++
312a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // header search paths with it. Once all systems are overriding this
313a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // function, the CC1 flag and this line can be removed.
314ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth  DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
315641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
316641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
317132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
318132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar                                    ArgStringList &CmdArgs) const {
319641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
320641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
321641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  switch (Type) {
3223f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  case ToolChain::CST_Libcxx:
3233f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    CmdArgs.push_back("-lc++");
3243f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    break;
3253f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
326641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  case ToolChain::CST_Libstdcxx:
327641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    CmdArgs.push_back("-lstdc++");
328641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    break;
329641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  }
330641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
3317433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
3327433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid ToolChain::AddCCKextLibArgs(const ArgList &Args,
3337433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                 ArgStringList &CmdArgs) const {
3347433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  CmdArgs.push_back("-lcc_kext");
3357433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
336e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
337e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramerbool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args,
338e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                                              ArgStringList &CmdArgs) const {
339e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  // Check if -ffast-math or -funsafe-math is enabled.
340e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  Arg *A = Args.getLastArg(options::OPT_ffast_math,
341e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                           options::OPT_fno_fast_math,
342e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                           options::OPT_funsafe_math_optimizations,
343e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                           options::OPT_fno_unsafe_math_optimizations);
344e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
345e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
346e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer      A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
347e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    return false;
348e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
349e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  // If crtfastmath.o exists add it to the arguments.
350e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  std::string Path = GetFilePath("crtfastmath.o");
351e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  if (Path == "crtfastmath.o") // Not found.
352e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    return false;
353e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
354e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  CmdArgs.push_back(Args.MakeArgString(Path));
355e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  return true;
356e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer}
357