-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Pass memory buffer to RuntimeDyld::MemoryManager factory #142930
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
✅ With the latest revision this PR passed the C/C++ code formatter. |
069d089
to
387aac1
Compare
387aac1
to
8f50006
Compare
@llvm/pr-subscribers-mlir-execution-engine Author: Karlo Basioli (basioli-k) Changes
In this PR I am passing the MemoryBuffer that will be emitted to the MemoryManager so that the user can use it to configure the behaviour of the MemoryManager. Full diff: https://github.com/llvm/llvm-project/pull/142930.diff 11 Files Affected:
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
index bb9e6b8c99d28..73a7b5b38a385 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
@@ -47,7 +47,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
MainJD(this->ES->createBareJITDylib("<main>")) {
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
index 2f7846e7ee2cb..d2bedd2c7270f 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
@@ -53,7 +53,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
index fee2d26e5d925..09b87b0181f92 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
@@ -66,7 +66,9 @@ class KaleidoscopeJIT {
: ES(std::move(ES)), EPCIU(std::move(EPCIU)), DL(std::move(DL)),
Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
index 136e88505a1d3..30c0e239a6cb4 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
@@ -151,7 +151,9 @@ class KaleidoscopeJIT {
: ES(std::move(ES)), EPCIU(std::move(EPCIU)), DL(std::move(DL)),
Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
index 778437cd8a3d6..65f94ed7a80d6 100644
--- a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
@@ -48,7 +48,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
MainJD(this->ES->createBareJITDylib("<main>")) {
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
index 05c9b574aa0f0..1fb472a177d6d 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
@@ -50,7 +50,8 @@ class LLVM_ABI RTDyldObjectLinkingLayer
MaterializationResponsibility &R, std::unique_ptr<MemoryBuffer>)>;
using GetMemoryManagerFunction =
- unique_function<std::unique_ptr<RuntimeDyld::MemoryManager>()>;
+ unique_function<std::unique_ptr<RuntimeDyld::MemoryManager>(
+ const MemoryBuffer &)>;
/// Construct an ObjectLinkingLayer with the given NotifyLoaded,
/// and NotifyEmitted functors.
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 21ebe82c8a71a..f1a71e4acb46d 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -269,9 +269,8 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
}
void registerInitFunc(JITDylib &JD, SymbolStringPtr InitName) {
- getExecutionSession().runSessionLocked([&]() {
- InitFunctions[&JD].add(InitName);
- });
+ getExecutionSession().runSessionLocked(
+ [&]() { InitFunctions[&JD].add(InitName); });
}
void registerDeInitFunc(JITDylib &JD, SymbolStringPtr DeInitName) {
@@ -935,8 +934,8 @@ Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
Expected<ExecutorAddr> LLJIT::lookupLinkerMangled(JITDylib &JD,
SymbolStringPtr Name) {
if (auto Sym = ES->lookup(
- makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),
- Name))
+ makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),
+ Name))
return Sym->getAddress();
else
return Sym.takeError();
@@ -951,7 +950,9 @@ LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) {
// Otherwise default to creating an RTDyldObjectLinkingLayer that constructs
// a new SectionMemoryManager for each object.
- auto GetMemMgr = []() { return std::make_unique<SectionMemoryManager>(); };
+ auto GetMemMgr = [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ };
auto Layer =
std::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr));
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
index d44199f1698e9..9999e1ff3bf00 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
@@ -1021,8 +1021,10 @@ LLVMOrcObjectLayerRef
LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(
LLVMOrcExecutionSessionRef ES) {
assert(ES && "ES must not be null");
- return wrap(new RTDyldObjectLinkingLayer(
- *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); }));
+ return wrap(
+ new RTDyldObjectLinkingLayer(*unwrap(ES), [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }));
}
LLVMOrcObjectLayerRef
@@ -1128,9 +1130,10 @@ LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(
CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection,
AllocateDataSection, FinalizeMemory, Destroy);
- return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] {
- return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);
- }));
+ return wrap(new RTDyldObjectLinkingLayer(
+ *unwrap(ES), [CBs = std::move(CBs)](const MemoryBuffer &) {
+ return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);
+ }));
return nullptr;
}
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
index 88cceacb71184..4d4a705ced64e 100644
--- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -22,7 +22,8 @@ class JITDylibSearchOrderResolver : public JITSymbolResolver {
SymbolDependenceMap &Deps)
: MR(MR), Deps(Deps) {}
- void lookup(const LookupSet &Symbols, OnResolvedFunction OnResolved) override {
+ void lookup(const LookupSet &Symbols,
+ OnResolvedFunction OnResolved) override {
auto &ES = MR.getTargetJITDylib().getExecutionSession();
SymbolLookupSet InternedSymbols;
@@ -181,7 +182,7 @@ void RTDyldObjectLinkingLayer::emit(
}
}
- auto MemMgr = GetMemoryManager();
+ auto MemMgr = GetMemoryManager(*O);
auto &MemMgrRef = *MemMgr;
// Switch to shared ownership of MR so that it can be captured by both
diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
index ed1feed6a5a9e..a0ae9308d33ab 100644
--- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
@@ -50,9 +50,10 @@ static bool testSetProcessAllSections(std::unique_ptr<MemoryBuffer> Obj,
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(ES, [&NonAllocSectionSeen]() {
- return std::make_unique<MemoryManagerWrapper>(NonAllocSectionSeen);
- });
+ RTDyldObjectLinkingLayer ObjLayer(
+ ES, [&NonAllocSectionSeen](const MemoryBuffer &) {
+ return std::make_unique<MemoryManagerWrapper>(NonAllocSectionSeen);
+ });
auto OnResolveDoNothing = [](Expected<SymbolMap> R) {
cantFail(std::move(R));
@@ -156,8 +157,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestOverrideObjectFlags) {
ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(
- ES, []() { return std::make_unique<SectionMemoryManager>(); });
+ RTDyldObjectLinkingLayer ObjLayer(ES, [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ });
IRCompileLayer CompileLayer(ES, ObjLayer,
std::make_unique<FunkySimpleCompiler>(*TM));
@@ -226,8 +228,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestAutoClaimResponsibilityForSymbols) {
ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(
- ES, []() { return std::make_unique<SectionMemoryManager>(); });
+ RTDyldObjectLinkingLayer ObjLayer(ES, [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ });
IRCompileLayer CompileLayer(ES, ObjLayer,
std::make_unique<FunkySimpleCompiler>(*TM));
@@ -244,4 +247,63 @@ TEST(RTDyldObjectLinkingLayerTest, TestAutoClaimResponsibilityForSymbols) {
ES.reportError(std::move(Err));
}
+TEST(RTDyldObjectLinkingLayerTest, TestMemoryBufferNamePropagation) {
+ OrcNativeTarget::initialize();
+
+ std::unique_ptr<TargetMachine> TM(
+ EngineBuilder().selectTarget(Triple("x86_64-unknown-linux-gnu"), "", "",
+ SmallVector<std::string, 1>()));
+
+ if (!TM)
+ GTEST_SKIP();
+
+ // Create a module with two void() functions: foo and bar.
+ ThreadSafeContext TSCtx(std::make_unique<LLVMContext>());
+ ThreadSafeModule M;
+ {
+ ModuleBuilder MB(*TSCtx.getContext(), TM->getTargetTriple().str(), "dummy");
+ MB.getModule()->setDataLayout(TM->createDataLayout());
+
+ Function *FooImpl = MB.createFunctionDecl(
+ FunctionType::get(Type::getVoidTy(*TSCtx.getContext()), {}, false),
+ "foo");
+ BasicBlock *FooEntry =
+ BasicBlock::Create(*TSCtx.getContext(), "entry", FooImpl);
+ IRBuilder<> B1(FooEntry);
+ B1.CreateRetVoid();
+
+ M = ThreadSafeModule(MB.takeModule(), std::move(TSCtx));
+ }
+
+ ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+ auto &JD = ES.createBareJITDylib("main");
+ auto Foo = ES.intern("foo");
+ std::string ObjectIdentifer;
+
+ RTDyldObjectLinkingLayer ObjLayer(
+ ES, [&ObjectIdentifer](const MemoryBuffer &Obj) {
+ // Capture the name of the object so that we can confirm that it
+ // contains the module name.
+ ObjectIdentifer = Obj.getBufferIdentifier().str();
+ return std::make_unique<SectionMemoryManager>();
+ });
+ IRCompileLayer CompileLayer(ES, ObjLayer,
+ std::make_unique<SimpleCompiler>(*TM));
+
+ // Capture the module name before we move the module.
+ std::string ModuleName = M.getModuleUnlocked()->getName().str();
+
+ cantFail(CompileLayer.add(JD, std::move(M)));
+ ES.lookup(
+ LookupKind::Static, makeJITDylibSearchOrder(&JD), SymbolLookupSet(Foo),
+ SymbolState::Resolved,
+ [](Expected<SymbolMap> R) { cantFail(std::move(R)); },
+ NoDependenciesToRegister);
+
+ if (auto Err = ES.endSession())
+ ES.reportError(std::move(Err));
+
+ EXPECT_TRUE(ObjectIdentifer.find(ModuleName) != std::string::npos);
+}
+
} // end anonymous namespace
diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
index 39f5c003320da..f704fbfbe8fff 100644
--- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -315,7 +315,8 @@ ExecutionEngine::create(Operation *m, const ExecutionEngineOptions &options,
// process and dynamically linked libraries.
auto objectLinkingLayerCreator = [&](ExecutionSession &session) {
auto objectLayer = std::make_unique<RTDyldObjectLinkingLayer>(
- session, [sectionMemoryMapper = options.sectionMemoryMapper]() {
+ session, [sectionMemoryMapper =
+ options.sectionMemoryMapper](const MemoryBuffer &) {
return std::make_unique<SectionMemoryManager>(sectionMemoryMapper);
});
|
@llvm/pr-subscribers-mlir Author: Karlo Basioli (basioli-k) Changes
In this PR I am passing the MemoryBuffer that will be emitted to the MemoryManager so that the user can use it to configure the behaviour of the MemoryManager. Full diff: https://github.com/llvm/llvm-project/pull/142930.diff 11 Files Affected:
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
index bb9e6b8c99d28..73a7b5b38a385 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter1/KaleidoscopeJIT.h
@@ -47,7 +47,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
MainJD(this->ES->createBareJITDylib("<main>")) {
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
index 2f7846e7ee2cb..d2bedd2c7270f 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter2/KaleidoscopeJIT.h
@@ -53,7 +53,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
index fee2d26e5d925..09b87b0181f92 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter3/KaleidoscopeJIT.h
@@ -66,7 +66,9 @@ class KaleidoscopeJIT {
: ES(std::move(ES)), EPCIU(std::move(EPCIU)), DL(std::move(DL)),
Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
index 136e88505a1d3..30c0e239a6cb4 100644
--- a/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/BuildingAJIT/Chapter4/KaleidoscopeJIT.h
@@ -151,7 +151,9 @@ class KaleidoscopeJIT {
: ES(std::move(ES)), EPCIU(std::move(EPCIU)), DL(std::move(DL)),
Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
OptimizeLayer(*this->ES, CompileLayer, optimizeModule),
diff --git a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
index 778437cd8a3d6..65f94ed7a80d6 100644
--- a/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
+++ b/llvm/examples/Kaleidoscope/include/KaleidoscopeJIT.h
@@ -48,7 +48,9 @@ class KaleidoscopeJIT {
JITTargetMachineBuilder JTMB, DataLayout DL)
: ES(std::move(ES)), DL(std::move(DL)), Mangle(*this->ES, this->DL),
ObjectLayer(*this->ES,
- []() { return std::make_unique<SectionMemoryManager>(); }),
+ [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }),
CompileLayer(*this->ES, ObjectLayer,
std::make_unique<ConcurrentIRCompiler>(std::move(JTMB))),
MainJD(this->ES->createBareJITDylib("<main>")) {
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
index 05c9b574aa0f0..1fb472a177d6d 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
@@ -50,7 +50,8 @@ class LLVM_ABI RTDyldObjectLinkingLayer
MaterializationResponsibility &R, std::unique_ptr<MemoryBuffer>)>;
using GetMemoryManagerFunction =
- unique_function<std::unique_ptr<RuntimeDyld::MemoryManager>()>;
+ unique_function<std::unique_ptr<RuntimeDyld::MemoryManager>(
+ const MemoryBuffer &)>;
/// Construct an ObjectLinkingLayer with the given NotifyLoaded,
/// and NotifyEmitted functors.
diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 21ebe82c8a71a..f1a71e4acb46d 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -269,9 +269,8 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
}
void registerInitFunc(JITDylib &JD, SymbolStringPtr InitName) {
- getExecutionSession().runSessionLocked([&]() {
- InitFunctions[&JD].add(InitName);
- });
+ getExecutionSession().runSessionLocked(
+ [&]() { InitFunctions[&JD].add(InitName); });
}
void registerDeInitFunc(JITDylib &JD, SymbolStringPtr DeInitName) {
@@ -935,8 +934,8 @@ Error LLJIT::addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj) {
Expected<ExecutorAddr> LLJIT::lookupLinkerMangled(JITDylib &JD,
SymbolStringPtr Name) {
if (auto Sym = ES->lookup(
- makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),
- Name))
+ makeJITDylibSearchOrder(&JD, JITDylibLookupFlags::MatchAllSymbols),
+ Name))
return Sym->getAddress();
else
return Sym.takeError();
@@ -951,7 +950,9 @@ LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) {
// Otherwise default to creating an RTDyldObjectLinkingLayer that constructs
// a new SectionMemoryManager for each object.
- auto GetMemMgr = []() { return std::make_unique<SectionMemoryManager>(); };
+ auto GetMemMgr = [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ };
auto Layer =
std::make_unique<RTDyldObjectLinkingLayer>(ES, std::move(GetMemMgr));
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
index d44199f1698e9..9999e1ff3bf00 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp
@@ -1021,8 +1021,10 @@ LLVMOrcObjectLayerRef
LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(
LLVMOrcExecutionSessionRef ES) {
assert(ES && "ES must not be null");
- return wrap(new RTDyldObjectLinkingLayer(
- *unwrap(ES), [] { return std::make_unique<SectionMemoryManager>(); }));
+ return wrap(
+ new RTDyldObjectLinkingLayer(*unwrap(ES), [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ }));
}
LLVMOrcObjectLayerRef
@@ -1128,9 +1130,10 @@ LLVMOrcCreateRTDyldObjectLinkingLayerWithMCJITMemoryManagerLikeCallbacks(
CreateContextCtx, CreateContext, NotifyTerminating, AllocateCodeSection,
AllocateDataSection, FinalizeMemory, Destroy);
- return wrap(new RTDyldObjectLinkingLayer(*unwrap(ES), [CBs = std::move(CBs)] {
- return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);
- }));
+ return wrap(new RTDyldObjectLinkingLayer(
+ *unwrap(ES), [CBs = std::move(CBs)](const MemoryBuffer &) {
+ return std::make_unique<MCJITMemoryManagerLikeCallbacksMemMgr>(CBs);
+ }));
return nullptr;
}
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
index 88cceacb71184..4d4a705ced64e 100644
--- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -22,7 +22,8 @@ class JITDylibSearchOrderResolver : public JITSymbolResolver {
SymbolDependenceMap &Deps)
: MR(MR), Deps(Deps) {}
- void lookup(const LookupSet &Symbols, OnResolvedFunction OnResolved) override {
+ void lookup(const LookupSet &Symbols,
+ OnResolvedFunction OnResolved) override {
auto &ES = MR.getTargetJITDylib().getExecutionSession();
SymbolLookupSet InternedSymbols;
@@ -181,7 +182,7 @@ void RTDyldObjectLinkingLayer::emit(
}
}
- auto MemMgr = GetMemoryManager();
+ auto MemMgr = GetMemoryManager(*O);
auto &MemMgrRef = *MemMgr;
// Switch to shared ownership of MR so that it can be captured by both
diff --git a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
index ed1feed6a5a9e..a0ae9308d33ab 100644
--- a/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/RTDyldObjectLinkingLayerTest.cpp
@@ -50,9 +50,10 @@ static bool testSetProcessAllSections(std::unique_ptr<MemoryBuffer> Obj,
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(ES, [&NonAllocSectionSeen]() {
- return std::make_unique<MemoryManagerWrapper>(NonAllocSectionSeen);
- });
+ RTDyldObjectLinkingLayer ObjLayer(
+ ES, [&NonAllocSectionSeen](const MemoryBuffer &) {
+ return std::make_unique<MemoryManagerWrapper>(NonAllocSectionSeen);
+ });
auto OnResolveDoNothing = [](Expected<SymbolMap> R) {
cantFail(std::move(R));
@@ -156,8 +157,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestOverrideObjectFlags) {
ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(
- ES, []() { return std::make_unique<SectionMemoryManager>(); });
+ RTDyldObjectLinkingLayer ObjLayer(ES, [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ });
IRCompileLayer CompileLayer(ES, ObjLayer,
std::make_unique<FunkySimpleCompiler>(*TM));
@@ -226,8 +228,9 @@ TEST(RTDyldObjectLinkingLayerTest, TestAutoClaimResponsibilityForSymbols) {
ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
auto &JD = ES.createBareJITDylib("main");
auto Foo = ES.intern("foo");
- RTDyldObjectLinkingLayer ObjLayer(
- ES, []() { return std::make_unique<SectionMemoryManager>(); });
+ RTDyldObjectLinkingLayer ObjLayer(ES, [](const MemoryBuffer &) {
+ return std::make_unique<SectionMemoryManager>();
+ });
IRCompileLayer CompileLayer(ES, ObjLayer,
std::make_unique<FunkySimpleCompiler>(*TM));
@@ -244,4 +247,63 @@ TEST(RTDyldObjectLinkingLayerTest, TestAutoClaimResponsibilityForSymbols) {
ES.reportError(std::move(Err));
}
+TEST(RTDyldObjectLinkingLayerTest, TestMemoryBufferNamePropagation) {
+ OrcNativeTarget::initialize();
+
+ std::unique_ptr<TargetMachine> TM(
+ EngineBuilder().selectTarget(Triple("x86_64-unknown-linux-gnu"), "", "",
+ SmallVector<std::string, 1>()));
+
+ if (!TM)
+ GTEST_SKIP();
+
+ // Create a module with two void() functions: foo and bar.
+ ThreadSafeContext TSCtx(std::make_unique<LLVMContext>());
+ ThreadSafeModule M;
+ {
+ ModuleBuilder MB(*TSCtx.getContext(), TM->getTargetTriple().str(), "dummy");
+ MB.getModule()->setDataLayout(TM->createDataLayout());
+
+ Function *FooImpl = MB.createFunctionDecl(
+ FunctionType::get(Type::getVoidTy(*TSCtx.getContext()), {}, false),
+ "foo");
+ BasicBlock *FooEntry =
+ BasicBlock::Create(*TSCtx.getContext(), "entry", FooImpl);
+ IRBuilder<> B1(FooEntry);
+ B1.CreateRetVoid();
+
+ M = ThreadSafeModule(MB.takeModule(), std::move(TSCtx));
+ }
+
+ ExecutionSession ES{std::make_unique<UnsupportedExecutorProcessControl>()};
+ auto &JD = ES.createBareJITDylib("main");
+ auto Foo = ES.intern("foo");
+ std::string ObjectIdentifer;
+
+ RTDyldObjectLinkingLayer ObjLayer(
+ ES, [&ObjectIdentifer](const MemoryBuffer &Obj) {
+ // Capture the name of the object so that we can confirm that it
+ // contains the module name.
+ ObjectIdentifer = Obj.getBufferIdentifier().str();
+ return std::make_unique<SectionMemoryManager>();
+ });
+ IRCompileLayer CompileLayer(ES, ObjLayer,
+ std::make_unique<SimpleCompiler>(*TM));
+
+ // Capture the module name before we move the module.
+ std::string ModuleName = M.getModuleUnlocked()->getName().str();
+
+ cantFail(CompileLayer.add(JD, std::move(M)));
+ ES.lookup(
+ LookupKind::Static, makeJITDylibSearchOrder(&JD), SymbolLookupSet(Foo),
+ SymbolState::Resolved,
+ [](Expected<SymbolMap> R) { cantFail(std::move(R)); },
+ NoDependenciesToRegister);
+
+ if (auto Err = ES.endSession())
+ ES.reportError(std::move(Err));
+
+ EXPECT_TRUE(ObjectIdentifer.find(ModuleName) != std::string::npos);
+}
+
} // end anonymous namespace
diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
index 39f5c003320da..f704fbfbe8fff 100644
--- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -315,7 +315,8 @@ ExecutionEngine::create(Operation *m, const ExecutionEngineOptions &options,
// process and dynamically linked libraries.
auto objectLinkingLayerCreator = [&](ExecutionSession &session) {
auto objectLayer = std::make_unique<RTDyldObjectLinkingLayer>(
- session, [sectionMemoryMapper = options.sectionMemoryMapper]() {
+ session, [sectionMemoryMapper =
+ options.sectionMemoryMapper](const MemoryBuffer &) {
return std::make_unique<SectionMemoryManager>(sectionMemoryMapper);
});
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, though please note that RTDyldObjectLinkingLayer will be deprecated soon in favor of ObjectLinkingLayer
.
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/153/builds/33974 Here is the relevant piece of the build log for the reference
|
`RTDyldObjectLinkingLayer` is currently creating a memory manager without any parameters. In this PR I am passing the MemoryBuffer that will be emitted to the MemoryManager so that the user can use it to configure the behaviour of the MemoryManager.
`RTDyldObjectLinkingLayer` is currently creating a memory manager without any parameters. In this PR I am passing the MemoryBuffer that will be emitted to the MemoryManager so that the user can use it to configure the behaviour of the MemoryManager.
RTDyldObjectLinkingLayer
is currently creating a memory manager without any parameters.In this PR I am passing the MemoryBuffer that will be emitted to the MemoryManager so that the user can use it to configure the behaviour of the MemoryManager.