ToolChain.cpp revision 3ea9e33ea25e0c2b12db56418ba3f994eb662c04
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"
16c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne#include "clang/Driver/SanitizerArgs.h"
17b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "clang/Driver/ToolChain.h"
18c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#include "llvm/ADT/SmallString.h"
1957f6d1946b1026eb4d0bbc1904b2833b254d4caaBob Wilson#include "llvm/ADT/StringSwitch.h"
20b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h"
21b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h"
22b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
239f084a3166b684573ba49df28fc5792bc37d92e1John McCall#include "llvm/Support/ErrorHandling.h"
248e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan#include "llvm/Support/FileSystem.h"
252ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbarusing namespace clang::driver;
265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
27b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt;
282ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
290e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic llvm::opt::Arg *GetRTTIArgument(const ArgList &Args) {
300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return Args.getLastArg(options::OPT_mkernel, options::OPT_fapple_kext,
310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                         options::OPT_fno_rtti, options::OPT_frtti);
320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
340e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic ToolChain::RTTIMode CalculateRTTIMode(const ArgList &Args,
350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                             const llvm::Triple &Triple,
360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                             const Arg *CachedRTTIArg) {
370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Explicit rtti/no-rtti args
380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (CachedRTTIArg) {
390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (CachedRTTIArg->getOption().matches(options::OPT_frtti))
400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return ToolChain::RM_EnabledExplicitly;
410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    else
420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return ToolChain::RM_DisabledExplicitly;
430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // -frtti is default, except for the PS4 CPU.
460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (!Triple.isPS4CPU())
470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return ToolChain::RM_EnabledImplicitly;
480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // On the PS4, turning on c++ exceptions turns on rtti.
500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // We're assuming that, if we see -fexceptions, rtti gets turned on.
513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  Arg *Exceptions = Args.getLastArgNoClaim(
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      options::OPT_fexceptions, options::OPT_fno_exceptions);
540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (Exceptions &&
550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      (Exceptions->getOption().matches(options::OPT_fexceptions) ||
560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines       Exceptions->getOption().matches(options::OPT_fcxx_exceptions)))
570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return ToolChain::RM_EnabledImplicitly;
580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return ToolChain::RM_DisabledImplicitly;
600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
62af370e6e051e505016637e23418354db625dc796Rafael EspindolaToolChain::ToolChain(const Driver &D, const llvm::Triple &T,
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                     const ArgList &Args)
640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    : D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)),
650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) {
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!isThreadModelSupported(A->getValue()))
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      D.Diag(diag::err_drv_invalid_thread_model_for_target)
690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          << A->getValue() << A->getAsString(Args);
702ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
712ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
722ba38ba9a18b8ec88e2509fad622eeec01562769Daniel DunbarToolChain::~ToolChain() {
732ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
742ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
75ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbarconst Driver &ToolChain::getDriver() const {
764d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth return D;
77ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar}
78ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar
79af370e6e051e505016637e23418354db625dc796Rafael Espindolabool ToolChain::useIntegratedAs() const {
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Args.hasFlag(options::OPT_fintegrated_as,
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      options::OPT_fno_integrated_as,
825470cd27e47aea163daaa76dde36010753400663Rafael Espindola                      IsIntegratedAssemblerDefault());
835470cd27e47aea163daaa76dde36010753400663Rafael Espindola}
845470cd27e47aea163daaa76dde36010753400663Rafael Espindola
851b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonovconst SanitizerArgs& ToolChain::getSanitizerArgs() const {
86c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  if (!SanitizerArguments.get())
87c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne    SanitizerArguments.reset(new SanitizerArgs(*this, Args));
88c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  return *SanitizerArguments.get();
891b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov}
901b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesStringRef ToolChain::getDefaultUniversalArchName() const {
92d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // In universal driver terms, the arch name accepted by -arch isn't exactly
93d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // the same as the ones that appear in the triple. Roughly speaking, this is
94d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // an inverse of the darwin::getArchTypeForDarwinArchName() function, but the
95d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  // only interesting special case is powerpc.
96d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  switch (Triple.getArch()) {
97d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc:
98d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc";
99d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  case llvm::Triple::ppc64:
100d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return "ppc64";
101ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  case llvm::Triple::ppc64le:
102ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    return "ppc64le";
103d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  default:
104d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar    return Triple.getArchName();
105d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar  }
106d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar}
107d2a527eae6df377b326e8d764782bc34f1e64189Daniel Dunbar
10803a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindolabool ToolChain::IsUnwindTablesDefault() const {
10903a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola  return false;
11003a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola}
11103a86385d6628398e1671db1d1970eb83ef0f8b3Rafael Espindola
112f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClang() const {
113f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Clang)
114f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Clang.reset(new tools::Clang(*this));
115f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Clang.get();
116f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
117f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
118f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildAssembler() const {
119f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::ClangAs(*this);
120f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
121f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
122f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::buildLinker() const {
123f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  llvm_unreachable("Linking is not supported by this toolchain");
124f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
125f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
126f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getAssemble() const {
127f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Assemble)
128f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Assemble.reset(buildAssembler());
129f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Assemble.get();
130f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
131f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
132f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getClangAs() const {
133f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Assemble)
134f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Assemble.reset(new tools::ClangAs(*this));
135f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Assemble.get();
136f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
137f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
138f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getLink() const {
139f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (!Link)
140f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    Link.reset(buildLinker());
141f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return Link.get();
142f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
143f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
144f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *ToolChain::getTool(Action::ActionClass AC) const {
145c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  switch (AC) {
146c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::AssembleJobClass:
147f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getAssemble();
148f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
149c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::LinkJobClass:
150f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getLink();
151f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
152f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  case Action::InputClass:
153f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  case Action::BindArchClass:
154c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::LipoJobClass:
155c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::DsymutilJobClass:
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case Action::VerifyDebugInfoJobClass:
157c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola    llvm_unreachable("Invalid tool kind.");
158c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola
159c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::CompileJobClass:
160c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::PrecompileJobClass:
161c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::PreprocessJobClass:
162c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::AnalyzeJobClass:
163c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  case Action::MigrateJobClass:
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case Action::VerifyPCHJobClass:
1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  case Action::BackendJobClass:
166f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return getClang();
167c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  }
1684c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer
1694c49f7b473b0158bb6e3534f70143132cc638ce8Benjamin Kramer  llvm_unreachable("Invalid tool kind.");
170c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola}
171c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola
17229511875348c49c9c5a14bb086cd51e17feb01c9Rafael EspindolaTool *ToolChain::SelectTool(const JobAction &JA) const {
1735b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  if (getDriver().ShouldUseClangCompiler(JA))
17429511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola    return getClang();
175f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  Action::ActionClass AC = JA.getKind();
176f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  if (AC == Action::AssembleJobClass && useIntegratedAs())
17729511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola    return getClangAs();
17829511875348c49c9c5a14bb086cd51e17feb01c9Rafael Espindola  return getTool(AC);
1795b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola}
1805b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola
1814a7e88978cf646ad10d654020cb00b3877069210Daniel Dunbarstd::string ToolChain::GetFilePath(const char *Name) const {
1824d7ff6e8639bdce74e39b90370729ad0179ebccaChandler Carruth  return D.GetFilePath(Name, *this);
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1842ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
1852ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar
186fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyanstd::string ToolChain::GetProgramPath(const char *Name) const {
187fc44e88cbdf013d285f2e4e3962fb80dcad56770Simon Atanasyan  return D.GetProgramPath(Name, *this);
1882ba38ba9a18b8ec88e2509fad622eeec01562769Daniel Dunbar}
1894180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
190c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstd::string ToolChain::GetLinkerPath() const {
191c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
192c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    StringRef Suffix = A->getValue();
193c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
194c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // If we're passed -fuse-ld= with no argument, or with the argument ld,
195c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    // then use whatever the default system linker is.
196c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (Suffix.empty() || Suffix == "ld")
197c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return GetProgramPath("ld");
198c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
199c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    llvm::SmallString<8> LinkerName("ld.");
200c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    LinkerName.append(Suffix);
201c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
202c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    std::string LinkerPath(GetProgramPath(LinkerName.c_str()));
203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (llvm::sys::fs::exists(LinkerPath))
204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return LinkerPath;
205c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
206c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    getDriver().Diag(diag::err_drv_invalid_linker_name) << A->getAsString(Args);
207c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return "";
208c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
209c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
210c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return GetProgramPath("ld");
211c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
212c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
213c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
2144180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
2154180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return types::lookupTypeForExtension(Ext);
2164180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
21700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
218b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool ToolChain::HasNativeLLVMSupport() const {
219b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return false;
220b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
221b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ToolChain::isCrossCompiling() const {
223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple HostTriple(LLVM_HOST_TRIPLE);
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  switch (HostTriple.getArch()) {
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // The A32/T32/T16 instruction sets are not separate architectures in this
226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // context.
227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::arm:
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumb:
230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb:
231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return getArch() != llvm::Triple::arm && getArch() != llvm::Triple::thumb &&
232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           getArch() != llvm::Triple::armeb && getArch() != llvm::Triple::thumbeb;
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  default:
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return HostTriple.getArch() != getArch();
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
238260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime ToolChain::getDefaultObjCRuntime(bool isNonFragile) const {
23911d3f4cc27e6b923fc32481dc1bb5ec46c7d1f4bDavid Chisnall  return ObjCRuntime(isNonFragile ? ObjCRuntime::GNUstep : ObjCRuntime::GCC,
240260611a32535c851237926bfcf78869b13c07d5bJohn McCall                     VersionTuple());
2419f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
2429f084a3166b684573ba49df28fc5792bc37d92e1John McCall
243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool ToolChain::isThreadModelSupported(const StringRef Model) const {
244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Model == "single") {
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: 'single' is only supported on ARM so far.
246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return Triple.getArch() == llvm::Triple::arm ||
247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           Triple.getArch() == llvm::Triple::armeb ||
248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           Triple.getArch() == llvm::Triple::thumb ||
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           Triple.getArch() == llvm::Triple::thumbeb;
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  } else if (Model == "posix")
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return true;
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return false;
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25632ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbachstd::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
25761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                         types::ID InputType) const {
25800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  switch (getTriple().getArch()) {
25900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  default:
26000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return getTripleString();
26100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
26232ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach  case llvm::Triple::x86_64: {
26332ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    llvm::Triple Triple = getTriple();
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!Triple.isOSBinFormatMachO())
26532ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      return getTripleString();
26632ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach
26732ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
26832ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      // x86_64h goes in the triple. Other -march options just use the
26932ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      // vanilla triple we already have.
27032ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      StringRef MArch = A->getValue();
27132ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach      if (MArch == "x86_64h")
27232ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach        Triple.setArchName(MArch);
27332ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    }
27432ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    return Triple.getTriple();
27532ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach  }
276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case llvm::Triple::aarch64: {
277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    llvm::Triple Triple = getTriple();
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (!Triple.isOSBinFormatMachO())
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return getTripleString();
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: older versions of ld64 expect the "arm64" component in the actual
282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // triple string and query it to determine whether an LTO file can be
283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // handled. Remove this when we don't care any more.
284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Triple.setArchName("arm64");
285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return Triple.getTriple();
286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
28700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  case llvm::Triple::arm:
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
289651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumb:
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb: {
29100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Factor into subclasses.
29200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    llvm::Triple Triple = getTriple();
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool IsBigEndian = getTriple().getArch() == llvm::Triple::armeb ||
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                       getTriple().getArch() == llvm::Triple::thumbeb;
29500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Handle pseudo-target flags '-mlittle-endian'/'-EL' and
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // '-mbig-endian'/'-EB'.
2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,
2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                 options::OPT_mbig_endian)) {
3003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);
3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
30300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Thumb2 is the default for V7 on Darwin.
30400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    //
30500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // FIXME: Thumb should just be another -target-feaure, not in the triple.
306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    StringRef Suffix = Triple.isOSBinFormatMachO()
307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ? tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMCPUForMArch(Args, Triple))
308651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMTargetCPU(Args, Triple));
309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") ||
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Suffix.startswith("v7em") ||
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO());
3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // FIXME: this is invalid for WindowsCE
3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (getTriple().isOSWindows())
3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ThumbDefault = true;
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::string ArchName;
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (IsBigEndian)
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ArchName = "armeb";
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ArchName = "arm";
32061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier
32161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    // Assembly files should start in ARM mode.
32261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier    if (InputType != types::TY_PP_Asm &&
32361ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier        Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault))
324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    {
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (IsBigEndian)
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ArchName = "thumbeb";
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      else
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ArchName = "thumb";
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
33000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Triple.setArchName(ArchName + Suffix.str());
33100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
33200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
33300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
33400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
33500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
33600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
33761ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string ToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
33861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                   types::ID InputType) const {
33961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  return ComputeLLVMTriple(Args, InputType);
34000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
34100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
34288491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruthvoid ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
34388491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth                                          ArgStringList &CC1Args) const {
34488491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth  // Each toolchain should provide the appropriate include flags.
34588491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth}
34688491fc6dfc7ebbd856d57a9acb49fb83077d6c8Chandler Carruth
347a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruthvoid ToolChain::addClangTargetOptions(const ArgList &DriverArgs,
348a6b2581f9595fb803fe7e2ef1d9f25e75b26d2fbChandler Carruth                                      ArgStringList &CC1Args) const {
3498af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola}
3508af669f2f1d92436fe6dc43144bb084a620e7516Rafael Espindola
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {}
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
353c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel DunbarToolChain::RuntimeLibType ToolChain::GetRuntimeLibType(
354c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  const ArgList &Args) const
355c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar{
356c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
3571d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
358c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "compiler-rt")
359c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_CompilerRT;
360c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    if (Value == "libgcc")
361c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      return ToolChain::RLT_Libgcc;
362c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_invalid_rtlib_name)
363c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar      << A->getAsString(Args);
364c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
365c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
366c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  return GetDefaultRuntimeLibType();
367c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar}
368c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
369641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel DunbarToolChain::CXXStdlibType ToolChain::GetCXXStdlibType(const ArgList &Args) const{
3703f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3711d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    StringRef Value = A->getValue();
3723f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libc++")
3733f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libcxx;
3743f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    if (Value == "libstdc++")
3753f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      return ToolChain::CST_Libstdcxx;
3765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
3773f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar      << A->getAsString(Args);
3783f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  }
3793f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
380641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  return ToolChain::CST_Libstdcxx;
381641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
382641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
38379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory to CC1 arguments.
38479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemInclude(const ArgList &DriverArgs,
38579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            ArgStringList &CC1Args,
38679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                            const Twine &Path) {
38779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-isystem");
38879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
38979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
39079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
39179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a system include directory with extern "C"
39279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// semantics to CC1 arguments.
39379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth///
39479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// Note that this should be used rarely, and only for directories that
39579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// historically and for legacy reasons are treated as having implicit extern
39679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// "C" semantics. These semantics are *ignored* by and large today, but its
39779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// important to preserve the preprocessor changes resulting from the
39879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// classification.
39979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addExternCSystemInclude(const ArgList &DriverArgs,
40079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   ArgStringList &CC1Args,
40179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                   const Twine &Path) {
40279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back("-internal-externc-isystem");
40379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  CC1Args.push_back(DriverArgs.MakeArgString(Path));
40479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
40579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
4068e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanvoid ToolChain::addExternCSystemIncludeIfExists(const ArgList &DriverArgs,
4078e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                                                ArgStringList &CC1Args,
4088e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                                                const Twine &Path) {
4098e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (llvm::sys::fs::exists(Path))
4108e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    addExternCSystemInclude(DriverArgs, CC1Args, Path);
4118e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
4128e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
41379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/// \brief Utility function to add a list of system include directories to CC1.
41479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ void ToolChain::addSystemIncludes(const ArgList &DriverArgs,
41579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArgStringList &CC1Args,
41679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                             ArrayRef<StringRef> Paths) {
41779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  for (ArrayRef<StringRef>::iterator I = Paths.begin(), E = Paths.end();
41879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth       I != E; ++I) {
41979cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back("-internal-isystem");
42079cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth    CC1Args.push_back(DriverArgs.MakeArgString(*I));
42179cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  }
42279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth}
42379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
424ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruthvoid ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
425ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth                                             ArgStringList &CC1Args) const {
426a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Header search paths should be handled by each of the subclasses.
427a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // Historically, they have not been, and instead have been handled inside of
428a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // the CC1-layer frontend. As the logic is hoisted out, this generic function
429a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // will slowly stop being called.
430a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  //
431a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // While it is being called, replicate a bit of a hack to propagate the
432a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // '-stdlib=' flag down to CC1 so that it can in turn customize the C++
433a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // header search paths with it. Once all systems are overriding this
434a461442ed99883d2760833592f65e1e95a4889bbChandler Carruth  // function, the CC1 flag and this line can be removed.
435ab9fcd0ad3202735d5f21f15b2989d65f2747a13Chandler Carruth  DriverArgs.AddAllArgs(CC1Args, options::OPT_stdlib_EQ);
436641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
437641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
438132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
439132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar                                    ArgStringList &CmdArgs) const {
440641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
441641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar
442641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  switch (Type) {
4433f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar  case ToolChain::CST_Libcxx:
4443f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    CmdArgs.push_back("-lc++");
4453f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar    break;
4463f16c959e30b7e7ba8e4b8d597c313fbe457206dDaniel Dunbar
447641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  case ToolChain::CST_Libstdcxx:
448641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    CmdArgs.push_back("-lstdc++");
449641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar    break;
450641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar  }
451641b98b7b52e0067beaf3978f2a8721e5d16c111Daniel Dunbar}
4527433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
4537433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid ToolChain::AddCCKextLibArgs(const ArgList &Args,
4547433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                 ArgStringList &CmdArgs) const {
4557433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  CmdArgs.push_back("-lcc_kext");
4567433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
457e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
458e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramerbool ToolChain::AddFastMathRuntimeIfAvailable(const ArgList &Args,
459e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer                                              ArgStringList &CmdArgs) const {
460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Do not check for -fno-fast-math or -fno-unsafe-math when -Ofast passed
461651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // (to keep the linker options consistent with gcc and clang itself).
462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!isOptimizationLevelFast(Args)) {
463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Check if -ffast-math or -funsafe-math.
464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Arg *A =
465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Args.getLastArg(options::OPT_ffast_math, options::OPT_fno_fast_math,
466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        options::OPT_funsafe_math_optimizations,
467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                        options::OPT_fno_unsafe_math_optimizations);
468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!A || A->getOption().getID() == options::OPT_fno_fast_math ||
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        A->getOption().getID() == options::OPT_fno_unsafe_math_optimizations)
471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return false;
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
473e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  // If crtfastmath.o exists add it to the arguments.
474e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  std::string Path = GetFilePath("crtfastmath.o");
475e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  if (Path == "crtfastmath.o") // Not found.
476e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer    return false;
477e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer
478e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  CmdArgs.push_back(Args.MakeArgString(Path));
479e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer  return true;
480e20e508aecf413f84b0dc4928cbf4bb5ce6c5bdcBenjamin Kramer}
481