From: David Blaikie Date: Fri, 13 Jan 2017 18:53:43 +0000 (+0000) Subject: unique_ptrify Driver::ToolChains X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48c6249f03ecb5c0418e4319384d699be29a793e;p=clang unique_ptrify Driver::ToolChains git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291938 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index a5e0d5387d..13ab38addd 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -14,6 +14,7 @@ #include "clang/Basic/LLVM.h" #include "clang/Driver/Action.h" #include "clang/Driver/Phases.h" +#include "clang/Driver/ToolChain.h" #include "clang/Driver/Types.h" #include "clang/Driver/Util.h" #include "llvm/ADT/StringMap.h" @@ -227,7 +228,7 @@ private: /// This maps from the string representation of a triple to a ToolChain /// created targeting that triple. The driver owns all the ToolChain objects /// stored in it, and will clean them up when torn down. - mutable llvm::StringMap ToolChains; + mutable llvm::StringMap> ToolChains; private: /// TranslateInputArgs - Create a new derived argument list from the input @@ -264,7 +265,6 @@ public: Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple, DiagnosticsEngine &Diags, IntrusiveRefCntPtr VFS = nullptr); - ~Driver(); /// @name Accessors /// @{ diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 729209cf50..917ccdc5ba 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -85,10 +85,6 @@ Driver::Driver(StringRef ClangExecutable, StringRef DefaultTargetTriple, ResourceDir = P.str(); } -Driver::~Driver() { - llvm::DeleteContainerSeconds(ToolChains); -} - void Driver::ParseDriverMode(StringRef ProgramName, ArrayRef Args) { auto Default = ToolChain::getTargetAndModeFromProgramName(ProgramName); @@ -477,12 +473,12 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, : "nvptx-nvidia-cuda"); // Use the CUDA and host triples as the key into the ToolChains map, because // the device toolchain we create depends on both. - ToolChain *&CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()]; + auto &CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()]; if (!CudaTC) { - CudaTC = new toolchains::CudaToolChain(*this, CudaTriple, *HostTC, - C.getInputArgs()); + CudaTC = llvm::make_unique( + *this, CudaTriple, *HostTC, C.getInputArgs()); } - C.addOffloadDeviceToolChain(CudaTC, Action::OFK_Cuda); + C.addOffloadDeviceToolChain(CudaTC.get(), Action::OFK_Cuda); } // @@ -3655,125 +3651,130 @@ std::string Driver::GetClPchPath(Compilation &C, StringRef BaseName) const { const ToolChain &Driver::getToolChain(const ArgList &Args, const llvm::Triple &Target) const { - ToolChain *&TC = ToolChains[Target.str()]; + auto &TC = ToolChains[Target.str()]; if (!TC) { switch (Target.getOS()) { case llvm::Triple::Haiku: - TC = new toolchains::Haiku(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::CloudABI: - TC = new toolchains::CloudABI(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Darwin: case llvm::Triple::MacOSX: case llvm::Triple::IOS: case llvm::Triple::TvOS: case llvm::Triple::WatchOS: - TC = new toolchains::DarwinClang(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::DragonFly: - TC = new toolchains::DragonFly(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::OpenBSD: - TC = new toolchains::OpenBSD(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Bitrig: - TC = new toolchains::Bitrig(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::NetBSD: - TC = new toolchains::NetBSD(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::FreeBSD: - TC = new toolchains::FreeBSD(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Minix: - TC = new toolchains::Minix(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Linux: case llvm::Triple::ELFIAMCU: if (Target.getArch() == llvm::Triple::hexagon) - TC = new toolchains::HexagonToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, + Args); else if ((Target.getVendor() == llvm::Triple::MipsTechnologies) && !Target.hasEnvironment()) - TC = new toolchains::MipsLLVMToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, + Args); else - TC = new toolchains::Linux(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::NaCl: - TC = new toolchains::NaClToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Fuchsia: - TC = new toolchains::Fuchsia(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Solaris: - TC = new toolchains::Solaris(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::AMDHSA: - TC = new toolchains::AMDGPUToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Win32: switch (Target.getEnvironment()) { default: if (Target.isOSBinFormatELF()) - TC = new toolchains::Generic_ELF(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); else if (Target.isOSBinFormatMachO()) - TC = new toolchains::MachO(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); else - TC = new toolchains::Generic_GCC(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::GNU: - TC = new toolchains::MinGW(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Itanium: - TC = new toolchains::CrossWindowsToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, + Args); break; case llvm::Triple::MSVC: case llvm::Triple::UnknownEnvironment: - TC = new toolchains::MSVCToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; } break; case llvm::Triple::PS4: - TC = new toolchains::PS4CPU(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::Contiki: - TC = new toolchains::Contiki(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; default: // Of these targets, Hexagon is the only one that might have // an OS of Linux, in which case it got handled above already. switch (Target.getArch()) { case llvm::Triple::tce: - TC = new toolchains::TCEToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::tcele: - TC = new toolchains::TCELEToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::hexagon: - TC = new toolchains::HexagonToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, + Args); break; case llvm::Triple::lanai: - TC = new toolchains::LanaiToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::xcore: - TC = new toolchains::XCoreToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::wasm32: case llvm::Triple::wasm64: - TC = new toolchains::WebAssembly(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; case llvm::Triple::avr: - TC = new toolchains::AVRToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); break; default: if (Target.getVendor() == llvm::Triple::Myriad) - TC = new toolchains::MyriadToolChain(*this, Target, Args); + TC = llvm::make_unique(*this, Target, + Args); else if (Target.isOSBinFormatELF()) - TC = new toolchains::Generic_ELF(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); else if (Target.isOSBinFormatMachO()) - TC = new toolchains::MachO(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); else - TC = new toolchains::Generic_GCC(*this, Target, Args); + TC = llvm::make_unique(*this, Target, Args); } } }