diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-03-20 03:05:54 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-03-20 03:05:54 +0000 |
commit | f48b93cb2054e83e43ca4391b8ec70be89fa2e30 (patch) | |
tree | 66cebd47ee2682a2d1f4a9fbef598012dfb8b915 | |
parent | 83c546afef39d6b7be69f3f399804ebf037c4022 (diff) |
Remove the Tools DensMap from the toolchain.
Each toolchain has a set of tools, but they are all of known types. It can
have a linker, an assembler, a "clang" (compile, analyze, ...) a non-clang
compiler, etc.
Instead of keeping a map, just have member variable for each type of tool.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177479 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Driver/ToolChain.h | 13 | ||||
-rw-r--r-- | lib/Driver/ToolChain.cpp | 70 | ||||
-rw-r--r-- | lib/Driver/ToolChains.cpp | 205 | ||||
-rw-r--r-- | lib/Driver/ToolChains.h | 74 | ||||
-rw-r--r-- | lib/Driver/WindowsToolChain.cpp | 20 |
5 files changed, 215 insertions, 167 deletions
diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 3733d45eeb..68d0db176d 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -13,6 +13,7 @@ #include "clang/Driver/Action.h" #include "clang/Driver/Types.h" #include "clang/Driver/Util.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Triple.h" #include "llvm/Support/Path.h" @@ -58,12 +59,20 @@ private: /// programs. path_list ProgramPaths; - mutable llvm::DenseMap<unsigned, Tool*> Tools; + mutable OwningPtr<Tool> Clang; + mutable OwningPtr<Tool> Assemble; + mutable OwningPtr<Tool> Link; + Tool *getClang() const; + Tool *getAssemble() const; + Tool *getLink() const; + Tool *getClangAs() const; protected: ToolChain(const Driver &D, const llvm::Triple &T, const ArgList &Args); - virtual Tool *constructTool(Action::ActionClass AC) const; + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; + virtual Tool *getTool(Action::ActionClass AC) const; /// \name Utilities for implementing subclasses. ///@{ diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index def3b3ddea..59932f611e 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -28,10 +28,6 @@ ToolChain::ToolChain(const Driver &D, const llvm::Triple &T, } ToolChain::~ToolChain() { - // Free tool implementations. - for (llvm::DenseMap<unsigned, Tool*>::iterator - it = Tools.begin(), ie = Tools.end(); it != ie; ++it) - delete it->second; } const Driver &ToolChain::getDriver() const { @@ -63,12 +59,48 @@ bool ToolChain::IsUnwindTablesDefault() const { return false; } -Tool *ToolChain::constructTool(Action::ActionClass AC) const { +Tool *ToolChain::getClang() const { + if (!Clang) + Clang.reset(new tools::Clang(*this)); + return Clang.get(); +} + +Tool *ToolChain::buildAssembler() const { + return new tools::ClangAs(*this); +} + +Tool *ToolChain::buildLinker() const { + llvm_unreachable("Linking is not supported by this toolchain"); +} + +Tool *ToolChain::getAssemble() const { + if (!Assemble) + Assemble.reset(buildAssembler()); + return Assemble.get(); +} + +Tool *ToolChain::getClangAs() const { + if (!Assemble) + Assemble.reset(new tools::ClangAs(*this)); + return Assemble.get(); +} + +Tool *ToolChain::getLink() const { + if (!Link) + Link.reset(buildLinker()); + return Link.get(); +} + +Tool *ToolChain::getTool(Action::ActionClass AC) const { switch (AC) { - case Action::InputClass: - case Action::BindArchClass: case Action::AssembleJobClass: + return getAssemble(); + case Action::LinkJobClass: + return getLink(); + + case Action::InputClass: + case Action::BindArchClass: case Action::LipoJobClass: case Action::DsymutilJobClass: case Action::VerifyJobClass: @@ -79,29 +111,17 @@ Tool *ToolChain::constructTool(Action::ActionClass AC) const { case Action::PreprocessJobClass: case Action::AnalyzeJobClass: case Action::MigrateJobClass: - return new tools::Clang(*this); + return getClang(); } } Tool &ToolChain::SelectTool(const JobAction &JA) const { - Action::ActionClass Key; if (getDriver().ShouldUseClangCompiler(JA)) - Key = Action::AnalyzeJobClass; - else - Key = JA.getKind(); - - Tool *&T = Tools[Key]; - if (T) - return *T; - - if (getDriver().ShouldUseClangCompiler(JA)) - T = new tools::Clang(*this); - else if (Key == Action::AssembleJobClass && useIntegratedAs()) - T = new tools::ClangAs(*this); - else - T = constructTool(Key); - - return *T; + return *getClang(); + Action::ActionClass AC = JA.getKind(); + if (AC == Action::AssembleJobClass && useIntegratedAs()) + return *getClangAs(); + return *getTool(AC); } std::string ToolChain::GetFilePath(const char *Name) const { diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 0e29ba026d..e28f80114c 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -172,23 +172,32 @@ std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args, void Generic_ELF::anchor() {} -Tool *Darwin::constructTool(Action::ActionClass AC) const { +Tool *Darwin::getTool(Action::ActionClass AC) const { switch (AC) { - case Action::AssembleJobClass: - return new tools::darwin::Assemble(*this); - case Action::LinkJobClass: - return new tools::darwin::Link(*this); case Action::LipoJobClass: - return new tools::darwin::Lipo(*this); + if (!Lipo) + Lipo.reset(new tools::darwin::Lipo(*this)); + return Lipo.get(); case Action::DsymutilJobClass: - return new tools::darwin::Dsymutil(*this); + if (!Dsymutil) + Dsymutil.reset(new tools::darwin::Dsymutil(*this)); + return Dsymutil.get(); case Action::VerifyJobClass: - return new tools::darwin::VerifyDebug(*this); + if (!VerifyDebug) + VerifyDebug.reset(new tools::darwin::VerifyDebug(*this)); + return VerifyDebug.get(); default: - return ToolChain::constructTool(AC); + return ToolChain::getTool(AC); } } +Tool *Darwin::buildLinker() const { + return new tools::darwin::Link(*this); +} + +Tool *Darwin::buildAssembler() const { + return new tools::darwin::Assemble(*this); +} DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) @@ -1350,23 +1359,33 @@ Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple, Generic_GCC::~Generic_GCC() { } -Tool *Generic_GCC::constructTool(Action::ActionClass AC) const { +Tool *Generic_GCC::getTool(Action::ActionClass AC) const { switch (AC) { case Action::PreprocessJobClass: - return new tools::gcc::Preprocess(*this); + if (!Preprocess) + Preprocess.reset(new tools::gcc::Preprocess(*this)); + return Preprocess.get(); case Action::PrecompileJobClass: - return new tools::gcc::Precompile(*this); + if (!Precompile) + Precompile.reset(new tools::gcc::Precompile(*this)); + return Precompile.get(); case Action::CompileJobClass: - return new tools::gcc::Compile(*this); - case Action::AssembleJobClass: - return new tools::gcc::Assemble(*this); - case Action::LinkJobClass: - return new tools::gcc::Link(*this); + if (!Compile) + Compile.reset(new tools::gcc::Compile(*this)); + return Compile.get(); default: - return ToolChain::constructTool(AC); + return ToolChain::getTool(AC); } } +Tool *Generic_GCC::buildAssembler() const { + return new tools::gcc::Assemble(*this); +} + +Tool *Generic_GCC::buildLinker() const { + return new tools::gcc::Link(*this); +} + bool Generic_GCC::IsUnwindTablesDefault() const { return getArch() == llvm::Triple::x86_64; } @@ -1491,15 +1510,12 @@ Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple, Hexagon_TC::~Hexagon_TC() { } -Tool *Hexagon_TC::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::hexagon::Assemble(*this); - case Action::LinkJobClass: - return new tools::hexagon::Link(*this); - default: - return Linux::constructTool(AC); - } +Tool *Hexagon_TC::buildAssembler() const { + return new tools::hexagon::Assemble(*this); +} + +Tool *Hexagon_TC::buildLinker() const { + return new tools::hexagon::Link(*this); } void Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs, @@ -1624,15 +1640,12 @@ OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Arg getFilePaths().push_back("/usr/lib"); } -Tool *OpenBSD::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::openbsd::Assemble(*this); - case Action::LinkJobClass: - return new tools::openbsd::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *OpenBSD::buildAssembler() const { + return new tools::openbsd::Assemble(*this); +} + +Tool *OpenBSD::buildLinker() const { + return new tools::openbsd::Link(*this); } /// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly. @@ -1643,15 +1656,12 @@ Bitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) getFilePaths().push_back("/usr/lib"); } -Tool *Bitrig::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::bitrig::Assemble(*this); - case Action::LinkJobClass: - return new tools::bitrig::Link(*this); break; - default: - return Generic_GCC::constructTool(AC); - } +Tool *Bitrig::buildAssembler() const { + return new tools::bitrig::Assemble(*this); +} + +Tool *Bitrig::buildLinker() const { + return new tools::bitrig::Link(*this); } void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, @@ -1714,15 +1724,12 @@ FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Arg getFilePaths().push_back(getDriver().SysRoot + "/usr/lib"); } -Tool *FreeBSD::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::freebsd::Assemble(*this); - case Action::LinkJobClass: - return new tools::freebsd::Link(*this); break; - default: - return Generic_GCC::constructTool(AC); - } +Tool *FreeBSD::buildAssembler() const { + return new tools::freebsd::Assemble(*this); +} + +Tool *FreeBSD::buildLinker() const { + return new tools::freebsd::Link(*this); } bool FreeBSD::UseSjLjExceptions() const { @@ -1756,15 +1763,12 @@ NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) } } -Tool *NetBSD::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::netbsd::Assemble(*this); - case Action::LinkJobClass: - return new tools::netbsd::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *NetBSD::buildAssembler() const { + return new tools::netbsd::Assemble(*this); +} + +Tool *NetBSD::buildLinker() const { + return new tools::netbsd::Link(*this); } /// Minix - Minix tool chain which can call as(1) and ld(1) directly. @@ -1775,15 +1779,12 @@ Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) getFilePaths().push_back("/usr/lib"); } -Tool *Minix::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::minix::Assemble(*this); - case Action::LinkJobClass: - return new tools::minix::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *Minix::buildAssembler() const { + return new tools::minix::Assemble(*this); +} + +Tool *Minix::buildLinker() const { + return new tools::minix::Link(*this); } /// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly. @@ -1804,15 +1805,12 @@ AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple, } -Tool *AuroraUX::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::auroraux::Assemble(*this); - case Action::LinkJobClass: - return new tools::auroraux::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *AuroraUX::buildAssembler() const { + return new tools::auroraux::Assemble(*this); +} + +Tool *AuroraUX::buildLinker() const { + return new tools::auroraux::Link(*this); } /// Solaris - Solaris tool chain which can call as(1) and ld(1) directly. @@ -1829,15 +1827,12 @@ Solaris::Solaris(const Driver &D, const llvm::Triple& Triple, getFilePaths().push_back("/usr/lib"); } -Tool *Solaris::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::solaris::Assemble(*this); - case Action::LinkJobClass: - return new tools::solaris::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *Solaris::buildAssembler() const { + return new tools::solaris::Assemble(*this); +} + +Tool *Solaris::buildLinker() const { + return new tools::solaris::Link(*this); } /// Linux toolchain (very bare-bones at the moment). @@ -2206,15 +2201,12 @@ bool Linux::HasNativeLLVMSupport() const { return true; } -Tool *Linux::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::linuxtools::Assemble(*this); - case Action::LinkJobClass: - return new tools::linuxtools::Link(*this); break; - default: - return Generic_GCC::constructTool(AC); - } +Tool *Linux::buildLinker() const { + return new tools::linuxtools::Link(*this); +} + +Tool *Linux::buildAssembler() const { + return new tools::linuxtools::Assemble(*this); } void Linux::addClangTargetOptions(const ArgList &DriverArgs, @@ -2443,13 +2435,10 @@ DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList getFilePaths().push_back("/usr/lib/gcc41"); } -Tool *DragonFly::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - return new tools::dragonfly::Assemble(*this); - case Action::LinkJobClass: - return new tools::dragonfly::Link(*this); - default: - return Generic_GCC::constructTool(AC); - } +Tool *DragonFly::buildAssembler() const { + return new tools::dragonfly::Assemble(*this); +} + +Tool *DragonFly::buildLinker() const { + return new tools::dragonfly::Link(*this); } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index fb40a61b88..3421c53eb2 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -121,13 +121,15 @@ public: Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); ~Generic_GCC(); - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual bool IsUnwindTablesDefault() const; virtual bool isPICDefault() const; virtual bool isPICDefaultForced() const; protected: + virtual Tool *getTool(Action::ActionClass AC) const; + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; + /// \name ToolChain Implementation Helper Functions /// @{ @@ -138,6 +140,11 @@ protected: bool isTarget32Bit() const { return getTriple().isArch32Bit(); } /// @} + +private: + mutable OwningPtr<tools::gcc::Preprocess> Preprocess; + mutable OwningPtr<tools::gcc::Precompile> Precompile; + mutable OwningPtr<tools::gcc::Compile> Compile; }; /// Darwin - The base Darwin tool chain. @@ -146,7 +153,16 @@ public: /// The host version. unsigned DarwinVersion[3]; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; + virtual Tool *getTool(Action::ActionClass AC) const; + private: + mutable OwningPtr<tools::darwin::Lipo> Lipo; + mutable OwningPtr<tools::darwin::Dsymutil> Dsymutil; + mutable OwningPtr<tools::darwin::VerifyDebug> VerifyDebug; + /// Whether the information on the target has been initialized. // // FIXME: This should be eliminated. What we want to do is make this part of @@ -264,8 +280,6 @@ public: virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args, const char *BoundArch) const; - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual bool IsBlocksDefault() const { // Always allow blocks on Darwin; users interested in versioning are // expected to use /usr/include/Blocks.h. @@ -388,16 +402,20 @@ class LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC { public: AuroraUX(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); - virtual Tool *constructTool(Action::ActionClass AC) const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC { public: Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual bool IsIntegratedAssemblerDefault() const { return true; } +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; + }; @@ -408,7 +426,9 @@ public: virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } - virtual Tool *constructTool(Action::ActionClass AC) const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF { @@ -419,8 +439,6 @@ public: virtual bool IsObjCNonFragileABIDefault() const { return true; } virtual bool IsObjCLegacyDispatchDefault() const { return false; } - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const; virtual void AddCXXStdlibLibArgs(const ArgList &Args, @@ -428,6 +446,10 @@ public: virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const { return 1; } + +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF { @@ -437,8 +459,10 @@ public: virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } - virtual Tool *constructTool(Action::ActionClass AC) const; virtual bool UseSjLjExceptions() const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF { @@ -448,14 +472,18 @@ public: virtual bool IsMathErrnoDefault() const { return false; } virtual bool IsObjCNonFragileABIDefault() const { return true; } - virtual Tool *constructTool(Action::ActionClass AC) const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF { public: Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); - virtual Tool *constructTool(Action::ActionClass AC) const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF { @@ -464,7 +492,9 @@ public: virtual bool IsMathErrnoDefault() const { return false; } - virtual Tool *constructTool(Action::ActionClass AC) const; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; }; class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { @@ -473,8 +503,6 @@ public: virtual bool HasNativeLLVMSupport() const; - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const; virtual void addClangTargetOptions(const ArgList &DriverArgs, @@ -485,6 +513,10 @@ public: std::string Linker; std::vector<std::string> ExtraOpts; +protected: + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; + private: static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix, Twine TargetArchDir, @@ -499,14 +531,14 @@ private: class LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux { protected: GCCVersion GCCLibAndIncVersion; + virtual Tool *buildAssembler() const; + virtual Tool *buildLinker() const; public: Hexagon_TC(const Driver &D, const llvm::Triple &Triple, const ArgList &Args); ~Hexagon_TC(); - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const; virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, @@ -537,8 +569,6 @@ class LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { public: Windows(const Driver &D, const llvm::Triple& Triple, const ArgList &Args); - virtual Tool *constructTool(Action::ActionClass AC) const; - virtual bool IsIntegratedAssemblerDefault() const; virtual bool IsUnwindTablesDefault() const; virtual bool isPICDefault() const; @@ -548,7 +578,9 @@ public: ArgStringList &CC1Args) const; virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const; - +protected: + virtual Tool *buildLinker() const; + virtual Tool *buildAssembler() const; }; } // end namespace toolchains diff --git a/lib/Driver/WindowsToolChain.cpp b/lib/Driver/WindowsToolChain.cpp index ae782727e4..cc52c00710 100644 --- a/lib/Driver/WindowsToolChain.cpp +++ b/lib/Driver/WindowsToolChain.cpp @@ -36,19 +36,17 @@ Windows::Windows(const Driver &D, const llvm::Triple& Triple, : ToolChain(D, Triple, Args) { } -Tool *Windows::constructTool(Action::ActionClass AC) const { - switch (AC) { - case Action::AssembleJobClass: - if (getTriple().getEnvironment() == llvm::Triple::MachO) - return new tools::darwin::Assemble(*this); +Tool *Windows::buildLinker() const { + return new tools::visualstudio::Link(*this); +} + +Tool *Windows::buildAssembler() const { + if (getTriple().getEnvironment() == llvm::Triple::MachO) + return new tools::darwin::Assemble(*this); + else // There no assembler we can use on windows other than the integrated // assembler, so we ignore -no-integrated-as. - return new tools::ClangAs(*this); - case Action::LinkJobClass: - return new tools::visualstudio::Link(*this); - default: - return ToolChain::constructTool(AC); - } + return ToolChain::buildAssembler(); } bool Windows::IsIntegratedAssemblerDefault() const { |