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