[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
diff --git a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
index f65dc0c..26d13e2 100644
--- a/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/LazyEmittingLayerTest.cpp
@@ -27,7 +27,7 @@
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 2fdf9e8..6671442 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 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
};
// 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 @@
// 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 7c821bc..383ce8f 100644
--- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
@@ -45,9 +45,9 @@
};
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 @@
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 @@
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 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 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 @@
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 @@
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 @@
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 @@
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)";
}