[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.
llvm-svn: 314374
diff --git a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
index 24258ec..61ce310 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CompileOnDemandLayerTest.cpp
@@ -49,21 +49,18 @@
};
TEST(CompileOnDemandLayerTest, FindSymbol) {
- auto MockBaseLayer = createMockBaseLayer<int>(
- DoNothingAndReturn<int>(0),
- [](int Handle) { return Error::success(); },
- [](const std::string &Name, bool) {
- if (Name == "foo")
- return JITSymbol(1, JITSymbolFlags::Exported);
- return JITSymbol(nullptr);
- },
- ReturnNullJITSymbol());
+ MockBaseLayer<int, std::shared_ptr<Module>> 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<MockBaseLayerT> COD(
- MockBaseLayer, [](Function &F) { return std::set<Function *>{&F}; },
+ llvm::orc::CompileOnDemandLayer<decltype(TestBaseLayer)> COD(
+ TestBaseLayer, [](Function &F) { return std::set<Function *>{&F}; },
CallbackMgr, [] { return llvm::make_unique<DummyStubsManager>(); }, true);
auto Sym = COD.findSymbol("foo", true);
diff --git a/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp
index 2756999..d093b2a 100644
--- a/llvm/unittests/ExecutionEngine/Orc/GlobalMappingLayerTest.cpp
+++ b/llvm/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 @@
namespace {
-struct MockBaseLayer {
-
- typedef int ModuleHandleT;
-
- JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
- if (Name == "bar")
- return llvm::JITSymbol(0x4567, JITSymbolFlags::Exported);
- return nullptr;
- }
-
-};
-
TEST(GlobalMappingLayerTest, Empty) {
- MockBaseLayer M;
- GlobalMappingLayer<MockBaseLayer> L(M);
+ MockBaseLayer<int, std::shared_ptr<Module>> TestBaseLayer;
+
+ TestBaseLayer.addModuleImpl =
+ [](std::shared_ptr<Module> M, std::shared_ptr<JITSymbolResolver> R) {
+ return 42;
+ };
+
+ TestBaseLayer.findSymbolImpl =
+ [](const std::string &Name, bool ExportedSymbolsOnly) -> JITSymbol {
+ if (Name == "bar")
+ return llvm::JITSymbol(0x4567, JITSymbolFlags::Exported);
+ return nullptr;
+ };
+
+ GlobalMappingLayer<decltype(TestBaseLayer)> L(TestBaseLayer);
+
+ // 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/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
index 6c6b491..28a5f08 100644
--- a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
@@ -105,73 +105,63 @@
}
};
-template <typename HandleT,
- typename AddModuleFtor,
- typename RemoveModuleFtor,
- typename FindSymbolFtor,
- typename FindSymbolInFtor>
+template <typename HandleT, typename ModuleT>
class MockBaseLayer {
public:
- typedef HandleT ModuleHandleT;
+ using ModuleHandleT = HandleT;
- 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))
- {}
+ using AddModuleSignature =
+ Expected<ModuleHandleT>(ModuleT M,
+ std::shared_ptr<JITSymbolResolver> R);
- template <typename ModuleT, typename MemoryManagerPtrT,
- typename SymbolResolverPtrT>
- Expected<ModuleHandleT> addModule(ModuleT Ms, MemoryManagerPtrT MemMgr,
- SymbolResolverPtrT Resolver) {
- return AddModule(std::move(Ms), std::move(MemMgr), std::move(Resolver));
+ 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<AddModuleSignature> addModuleImpl;
+ std::function<RemoveModuleSignature> removeModuleImpl;
+ std::function<FindSymbolSignature> findSymbolImpl;
+ std::function<FindSymbolInSignature> findSymbolInImpl;
+ std::function<EmitAndFinalizeSignature> emitAndFinalizeImpl;
+
+ Expected<ModuleHandleT> addModule(ModuleT M,
+ std::shared_ptr<JITSymbolResolver> 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 <typename ModuleHandleT,
- typename AddModuleFtor,
- typename RemoveModuleFtor,
- typename FindSymbolFtor,
- typename FindSymbolInFtor>
-MockBaseLayer<ModuleHandleT, AddModuleFtor, RemoveModuleFtor,
- FindSymbolFtor, FindSymbolInFtor>
-createMockBaseLayer(AddModuleFtor &&AddModule,
- RemoveModuleFtor &&RemoveModule,
- FindSymbolFtor &&FindSymbol,
- FindSymbolInFtor &&FindSymbolIn) {
- return MockBaseLayer<ModuleHandleT, AddModuleFtor, RemoveModuleFtor,
- FindSymbolFtor, FindSymbolInFtor>(
- std::forward<AddModuleFtor>(AddModule),
- std::forward<RemoveModuleFtor>(RemoveModule),
- std::forward<FindSymbolFtor>(FindSymbol),
- std::forward<FindSymbolInFtor>(FindSymbolIn));
-}
-
-
class ReturnNullJITSymbol {
public:
template <typename... Args>