diff options
| author | Lang Hames <lhames@gmail.com> | 2017-07-04 04:42:30 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2017-07-04 04:42:30 +0000 |
| commit | 5b51816020a0daf35f8c24ca06ddffb24d1d493e (patch) | |
| tree | e31025566467d993f049a6ed82299fc64fe83401 /llvm/unittests/ExecutionEngine | |
| parent | b224d985940212e4f8986a5f505d7c7bff563fb4 (diff) | |
| download | bcm5719-llvm-5b51816020a0daf35f8c24ca06ddffb24d1d493e.tar.gz bcm5719-llvm-5b51816020a0daf35f8c24ca06ddffb24d1d493e.zip | |
[Orc] Remove the memory manager argument to addModule, and de-templatize the
symbol resolver argument.
De-templatizing the symbol resolver is part of the ongoing simplification of
ORC layer API.
Removing the memory management argument (and delegating construction of memory
managers for RTDyldObjectLinkingLayer to a functor passed in to the constructor)
allows us to build JITs whose base object layers need not be compatible with
RTDyldObjectLinkingLayer's memory mangement scheme. For example, a 'remote
object layer' that sends fully relocatable objects directly to the remote does
not need a memory management scheme at all (that will be handled by the remote).
llvm-svn: 307058
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
3 files changed, 47 insertions, 54 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp index f65dc0cd609..26d13e2dbc6 100644 --- a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp @@ -27,7 +27,7 @@ struct MockBaseLayer { TEST(LazyEmittingLayerTest, Empty) { MockBaseLayer M; llvm::orc::LazyEmittingLayer<MockBaseLayer> L(M); - L.addModule(std::unique_ptr<llvm::Module>(), nullptr, nullptr); + L.addModule(std::unique_ptr<llvm::Module>(), nullptr); } } diff --git a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp index 2fdf9e8b737..6671442db42 100644 --- a/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/ObjectTransformLayerTest.cpp @@ -14,6 +14,7 @@ #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/NullResolver.h" #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" +#include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/Object/ObjectFile.h" #include "gtest/gtest.h" @@ -21,12 +22,6 @@ using namespace llvm::orc; namespace { -// Stand-in for RuntimeDyld::MemoryManager -typedef int MockMemoryManager; - -// Stand-in for RuntimeDyld::SymbolResolver -typedef int MockSymbolResolver; - // stand-in for object::ObjectFile typedef int MockObjectFile; @@ -54,24 +49,24 @@ public: MockBaseLayer() : MockSymbol(nullptr) { resetExpectations(); } - template <typename ObjPtrT, typename MemoryManagerPtrT, - typename SymbolResolverPtrT> - ObjHandleT addObject(ObjPtrT Obj, MemoryManagerPtrT MemMgr, - SymbolResolverPtrT Resolver) { - EXPECT_EQ(MockManager, *MemMgr) << "MM should pass through"; - EXPECT_EQ(MockResolver, *Resolver) << "Resolver should pass through"; + template <typename ObjPtrT> + ObjHandleT addObject(ObjPtrT Obj, + std::shared_ptr<llvm::JITSymbolResolver> Resolver) { + EXPECT_EQ(MockResolver, Resolver) << "Resolver should pass through"; EXPECT_EQ(MockObject + 1, *Obj) << "Transform should be applied"; LastCalled = "addObject"; MockObjHandle = 111; return MockObjHandle; } + template <typename ObjPtrT> - void expectAddObject(ObjPtrT Obj, MockMemoryManager *MemMgr, - MockSymbolResolver *Resolver) { - MockManager = *MemMgr; - MockResolver = *Resolver; + void expectAddObject(ObjPtrT Obj, + std::shared_ptr<llvm::JITSymbolResolver> Resolver) { + MockResolver = Resolver; MockObject = *Obj; } + + void verifyAddObject(ObjHandleT Returned) { EXPECT_EQ("addObject", LastCalled); EXPECT_EQ(MockObjHandle, Returned) << "Return should pass through"; @@ -160,8 +155,7 @@ public: private: // Backing fields for remembering parameter/return values std::string LastCalled; - MockMemoryManager MockManager; - MockSymbolResolver MockResolver; + std::shared_ptr<llvm::JITSymbolResolver> MockResolver; MockObjectFile MockObject; ObjHandleT MockObjHandle; std::string MockName; @@ -174,8 +168,7 @@ private: // Clear remembered parameters between calls void resetExpectations() { LastCalled = "nothing"; - MockManager = 0; - MockResolver = 0; + MockResolver = nullptr; MockObject = 0; MockObjHandle = 0; MockName = "bogus"; @@ -204,22 +197,17 @@ TEST(ObjectTransformLayerTest, Main) { return Obj; }); - // Instantiate some mock objects to use below - MockMemoryManager MockManager = 233; - MockSymbolResolver MockResolver = 244; - // Test addObject with T1 (allocating) auto Obj1 = std::make_shared<MockObjectFile>(211); - auto MM = llvm::make_unique<MockMemoryManager>(MockManager); - auto SR = llvm::make_unique<MockSymbolResolver>(MockResolver); - M.expectAddObject(Obj1, MM.get(), SR.get()); - auto H = T1.addObject(std::move(Obj1), std::move(MM), std::move(SR)); + auto SR = std::make_shared<NullResolver>(); + M.expectAddObject(Obj1, SR); + auto H = T1.addObject(std::move(Obj1), SR); M.verifyAddObject(H); // Test addObjectSet with T2 (mutating) auto Obj2 = std::make_shared<MockObjectFile>(222); - M.expectAddObject(Obj2, &MockManager, &MockResolver); - H = T2.addObject(Obj2, &MockManager, &MockResolver); + M.expectAddObject(Obj2, SR); + H = T2.addObject(Obj2, SR); M.verifyAddObject(H); EXPECT_EQ(223, *Obj2) << "Expected mutation"; @@ -295,7 +283,11 @@ TEST(ObjectTransformLayerTest, Main) { }; // Construct the jit layers. - RTDyldObjectLinkingLayer BaseLayer; + RTDyldObjectLinkingLayer BaseLayer( + []() { + return std::make_shared<llvm::SectionMemoryManager>(); + }); + auto IdentityTransform = [](std::shared_ptr<llvm::object::OwningBinary<llvm::object::ObjectFile>> Obj) { @@ -312,9 +304,8 @@ TEST(ObjectTransformLayerTest, Main) { // Make sure that the calls from IRCompileLayer to ObjectTransformLayer // compile. - NullResolver Resolver; - NullManager Manager; - CompileLayer.addModule(std::shared_ptr<llvm::Module>(), &Manager, &Resolver); + auto Resolver = std::make_shared<NullResolver>(); + CompileLayer.addModule(std::shared_ptr<llvm::Module>(), Resolver); // Make sure that the calls from ObjectTransformLayer to ObjectLinkingLayer // compile. diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp index 7c821bc2c34..383ce8fe54c 100644 --- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp @@ -45,9 +45,9 @@ public: }; TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { - class SectionMemoryManagerWrapper : public SectionMemoryManager { + class MemoryManagerWrapper : public SectionMemoryManager { public: - SectionMemoryManagerWrapper(bool &DebugSeen) : DebugSeen(DebugSeen) {} + MemoryManagerWrapper(bool &DebugSeen) : DebugSeen(DebugSeen) {} uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName, @@ -63,7 +63,10 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { bool &DebugSeen; }; - RTDyldObjectLinkingLayer ObjLayer; + bool DebugSectionSeen = false; + auto MM = std::make_shared<MemoryManagerWrapper>(DebugSectionSeen); + + RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; }); LLVMContext Context; auto M = llvm::make_unique<Module>("", Context); @@ -89,9 +92,6 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { std::make_shared<object::OwningBinary<object::ObjectFile>>( SimpleCompiler(*TM)(*M)); - bool DebugSectionSeen = false; - auto SMMW = - std::make_shared<SectionMemoryManagerWrapper>(DebugSectionSeen); auto Resolver = createLambdaResolver( [](const std::string &Name) { @@ -103,7 +103,7 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { { // Test with ProcessAllSections = false (the default). - auto H = ObjLayer.addObject(Obj, SMMW, &*Resolver); + auto H = ObjLayer.addObject(Obj, Resolver); ObjLayer.emitAndFinalize(H); EXPECT_EQ(DebugSectionSeen, false) << "Unexpected debug info section"; @@ -113,7 +113,7 @@ TEST(RTDyldObjectLinkingLayerTest, TestSetProcessAllSections) { { // Test with ProcessAllSections = true. ObjLayer.setProcessAllSections(true); - auto H = ObjLayer.addObject(Obj, SMMW, &*Resolver); + auto H = ObjLayer.addObject(Obj, Resolver); ObjLayer.emitAndFinalize(H); EXPECT_EQ(DebugSectionSeen, true) << "Expected debug info section not seen"; @@ -125,7 +125,9 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoDuplicateFinalization) { if (!TM) return; - RTDyldObjectLinkingLayer ObjLayer; + auto MM = std::make_shared<SectionMemoryManagerWrapper>(); + + RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; }); SimpleCompiler Compile(*TM); // Create a pair of modules that will trigger recursive finalization: @@ -179,15 +181,14 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoDuplicateFinalization) { return JITSymbol(nullptr); }); - auto SMMW = std::make_shared<SectionMemoryManagerWrapper>(); - ObjLayer.addObject(std::move(Obj1), SMMW, &*Resolver); - auto H = ObjLayer.addObject(std::move(Obj2), SMMW, &*Resolver); + ObjLayer.addObject(std::move(Obj1), Resolver); + auto H = ObjLayer.addObject(std::move(Obj2), Resolver); ObjLayer.emitAndFinalize(H); ObjLayer.removeObject(H); // Finalization of module 2 should trigger finalization of module 1. // Verify that finalize on SMMW is only called once. - EXPECT_EQ(SMMW->FinalizationCount, 1) + EXPECT_EQ(MM->FinalizationCount, 1) << "Extra call to finalize"; } @@ -195,7 +196,9 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoPrematureAllocation) { if (!TM) return; - RTDyldObjectLinkingLayer ObjLayer; + auto MM = std::make_shared<SectionMemoryManagerWrapper>(); + + RTDyldObjectLinkingLayer ObjLayer([&MM]() { return MM; }); SimpleCompiler Compile(*TM); // Create a pair of unrelated modules: @@ -240,15 +243,14 @@ TEST_F(RTDyldObjectLinkingLayerExecutionTest, NoPrematureAllocation) { std::make_shared<object::OwningBinary<object::ObjectFile>>( Compile(*MB2.getModule())); - auto SMMW = std::make_shared<SectionMemoryManagerWrapper>(); - NullResolver NR; - auto H = ObjLayer.addObject(std::move(Obj1), SMMW, &NR); - ObjLayer.addObject(std::move(Obj2), SMMW, &NR); + auto NR = std::make_shared<NullResolver>(); + auto H = ObjLayer.addObject(std::move(Obj1), NR); + ObjLayer.addObject(std::move(Obj2), NR); ObjLayer.emitAndFinalize(H); ObjLayer.removeObject(H); // Only one call to needsToReserveAllocationSpace should have been made. - EXPECT_EQ(SMMW->NeedsToReserveAllocationSpaceCount, 1) + EXPECT_EQ(MM->NeedsToReserveAllocationSpaceCount, 1) << "More than one call to needsToReserveAllocationSpace " "(multiple unrelated objects loaded prior to finalization)"; } |

