From: Lang Hames Date: Thu, 28 Sep 2017 02:17:35 +0000 (+0000) Subject: [ORC] Update the GlobalMappingLayer interface to fit the error-ized layer X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a420002dfe273464f9482252b32dcf2297c95bd5;p=llvm [ORC] Update the GlobalMappingLayer interface to fit the error-ized layer concept. Add a unit-test to make sure we don't backslide, and tweak the MockBaseLayer utility to make it easier to test this kind of thing in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314374 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ExecutionEngine/Orc/GlobalMappingLayer.h b/include/llvm/ExecutionEngine/Orc/GlobalMappingLayer.h index ff54ef625eb..8a48c36f414 100644 --- a/include/llvm/ExecutionEngine/Orc/GlobalMappingLayer.h +++ b/include/llvm/ExecutionEngine/Orc/GlobalMappingLayer.h @@ -46,13 +46,14 @@ public: /// @brief Add the given module to the JIT. /// @return A handle for the added modules. - ModuleHandleT addModule(std::shared_ptr M, - std::shared_ptr Resolver) { + Expected + addModule(std::shared_ptr M, + std::shared_ptr Resolver) { return BaseLayer.addModule(std::move(M), std::move(Resolver)); } /// @brief Remove the module set associated with the handle H. - void removeModule(ModuleHandleT H) { BaseLayer.removeModule(H); } + Error removeModule(ModuleHandleT H) { return BaseLayer.removeModule(H); } /// @brief Manually set the address to return for the given symbol. void setGlobalMapping(const std::string &Name, JITTargetAddress Addr) { @@ -96,8 +97,8 @@ public: /// @brief Immediately emit and finalize the module set represented by the /// given handle. /// @param H Handle for module set to emit/finalize. - void emitAndFinalize(ModuleHandleT H) { - BaseLayer.emitAndFinalize(H); + Error emitAndFinalize(ModuleHandleT H) { + return BaseLayer.emitAndFinalize(H); } private: diff --git a/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp b/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp index 24258ec2979..61ce310e631 100644 --- a/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp @@ -49,21 +49,18 @@ public: }; TEST(CompileOnDemandLayerTest, FindSymbol) { - auto MockBaseLayer = createMockBaseLayer( - DoNothingAndReturn(0), - [](int Handle) { return Error::success(); }, - [](const std::string &Name, bool) { - if (Name == "foo") - return JITSymbol(1, JITSymbolFlags::Exported); - return JITSymbol(nullptr); - }, - ReturnNullJITSymbol()); + MockBaseLayer> TestBaseLayer; + TestBaseLayer.findSymbolImpl = + [](const std::string &Name, bool) { + if (Name == "foo") + return JITSymbol(1, JITSymbolFlags::Exported); + return JITSymbol(nullptr); + }; - typedef decltype(MockBaseLayer) MockBaseLayerT; DummyCallbackManager CallbackMgr; - llvm::orc::CompileOnDemandLayer COD( - MockBaseLayer, [](Function &F) { return std::set{&F}; }, + llvm::orc::CompileOnDemandLayer COD( + TestBaseLayer, [](Function &F) { return std::set{&F}; }, CallbackMgr, [] { return llvm::make_unique(); }, true); auto Sym = COD.findSymbol("foo", true); diff --git a/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp b/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp index 2756999c216..d093b2a99bd 100644 --- a/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp +++ b/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ExecutionEngine/Orc/GlobalMappingLayer.h" +#include "OrcTestCommon.h" #include "gtest/gtest.h" using namespace llvm; @@ -15,21 +16,26 @@ using namespace llvm::orc; namespace { -struct MockBaseLayer { +TEST(GlobalMappingLayerTest, Empty) { + MockBaseLayer> TestBaseLayer; - typedef int ModuleHandleT; + TestBaseLayer.addModuleImpl = + [](std::shared_ptr M, std::shared_ptr R) { + return 42; + }; - JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) { - if (Name == "bar") - return llvm::JITSymbol(0x4567, JITSymbolFlags::Exported); - return nullptr; - } + TestBaseLayer.findSymbolImpl = + [](const std::string &Name, bool ExportedSymbolsOnly) -> JITSymbol { + if (Name == "bar") + return llvm::JITSymbol(0x4567, JITSymbolFlags::Exported); + return nullptr; + }; -}; + GlobalMappingLayer L(TestBaseLayer); -TEST(GlobalMappingLayerTest, Empty) { - MockBaseLayer M; - GlobalMappingLayer L(M); + // Test addModule interface. + int H = cantFail(L.addModule(nullptr, nullptr)); + EXPECT_EQ(H, 42) << "Incorrect result from addModule"; // Test fall-through for missing symbol. auto FooSym = L.findSymbol("foo", true); diff --git a/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/unittests/ExecutionEngine/Orc/OrcTestCommon.h index 6c6b4918c20..28a5f08ee43 100644 --- a/unittests/ExecutionEngine/Orc/OrcTestCommon.h +++ b/unittests/ExecutionEngine/Orc/OrcTestCommon.h @@ -105,73 +105,63 @@ public: } }; -template +template class MockBaseLayer { public: - typedef HandleT ModuleHandleT; - - MockBaseLayer(AddModuleFtor &&AddModule, - RemoveModuleFtor &&RemoveModule, - FindSymbolFtor &&FindSymbol, - FindSymbolInFtor &&FindSymbolIn) - : AddModule(std::move(AddModule)), - RemoveModule(std::move(RemoveModule)), - FindSymbol(std::move(FindSymbol)), - FindSymbolIn(std::move(FindSymbolIn)) - {} - - template - Expected addModule(ModuleT Ms, MemoryManagerPtrT MemMgr, - SymbolResolverPtrT Resolver) { - return AddModule(std::move(Ms), std::move(MemMgr), std::move(Resolver)); + using ModuleHandleT = HandleT; + + using AddModuleSignature = + Expected(ModuleT M, + std::shared_ptr R); + + using RemoveModuleSignature = Error(ModuleHandleT H); + using FindSymbolSignature = JITSymbol(const std::string &Name, + bool ExportedSymbolsOnly); + using FindSymbolInSignature = JITSymbol(ModuleHandleT H, + const std::string &Name, + bool ExportedSymbolsONly); + using EmitAndFinalizeSignature = Error(ModuleHandleT H); + + std::function addModuleImpl; + std::function removeModuleImpl; + std::function findSymbolImpl; + std::function findSymbolInImpl; + std::function emitAndFinalizeImpl; + + Expected addModule(ModuleT M, + std::shared_ptr R) { + assert(addModuleImpl && + "addModule called, but no mock implementation was provided"); + return addModuleImpl(std::move(M), std::move(R)); } Error removeModule(ModuleHandleT H) { - return RemoveModule(H); + assert(removeModuleImpl && + "removeModule called, but no mock implementation was provided"); + return removeModuleImpl(H); } JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) { - return FindSymbol(Name, ExportedSymbolsOnly); + assert(findSymbolImpl && + "findSymbol called, but no mock implementation was provided"); + return findSymbolImpl(Name, ExportedSymbolsOnly); } JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name, bool ExportedSymbolsOnly) { - return FindSymbolIn(H, Name, ExportedSymbolsOnly); + assert(findSymbolInImpl && + "findSymbolIn called, but no mock implementation was provided"); + return findSymbolInImpl(H, Name, ExportedSymbolsOnly); } -private: - AddModuleFtor AddModule; - RemoveModuleFtor RemoveModule; - FindSymbolFtor FindSymbol; - FindSymbolInFtor FindSymbolIn; + Error emitAndFinaliez(ModuleHandleT H) { + assert(emitAndFinalizeImpl && + "emitAndFinalize called, but no mock implementation was provided"); + return emitAndFinalizeImpl(H); + } }; -template -MockBaseLayer -createMockBaseLayer(AddModuleFtor &&AddModule, - RemoveModuleFtor &&RemoveModule, - FindSymbolFtor &&FindSymbol, - FindSymbolInFtor &&FindSymbolIn) { - return MockBaseLayer( - std::forward(AddModule), - std::forward(RemoveModule), - std::forward(FindSymbol), - std::forward(FindSymbolIn)); -} - - class ReturnNullJITSymbol { public: template