[llvm] 2db5b32 - [ORC] Add LinkGraph& argument to MemoryMapper::prepare. (#163121)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 12 23:20:44 PDT 2025
Author: Lang Hames
Date: 2025-10-13T17:20:39+11:00
New Revision: 2db5b326e18be5e1af57e433b90e8d89cd70b4d5
URL: https://github.com/llvm/llvm-project/commit/2db5b326e18be5e1af57e433b90e8d89cd70b4d5
DIFF: https://github.com/llvm/llvm-project/commit/2db5b326e18be5e1af57e433b90e8d89cd70b4d5.diff
LOG: [ORC] Add LinkGraph& argument to MemoryMapper::prepare. (#163121)
This gives MemoryMapper implementations a chance to allocate working
memory using the LinkGraph's allocator.
Added:
Modified:
llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h
llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp
llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
llvm/tools/llvm-jitlink/llvm-jitlink.cpp
llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp
llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp
llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h b/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h
index 44ef289fc2823..41c3089265a23 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h
@@ -51,7 +51,11 @@ class LLVM_ABI MemoryMapper {
virtual void reserve(size_t NumBytes, OnReservedFunction OnReserved) = 0;
/// Provides working memory
- virtual char *prepare(ExecutorAddr Addr, size_t ContentSize) = 0;
+ /// The LinkGraph parameter is included to allow implementations to allocate
+ /// working memory from the LinkGraph's allocator, in which case it will be
+ /// deallocated when the LinkGraph is destroyed.
+ virtual char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) = 0;
using OnInitializedFunction = unique_function<void(Expected<ExecutorAddr>)>;
@@ -92,7 +96,8 @@ class LLVM_ABI InProcessMemoryMapper : public MemoryMapper {
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override;
- char *prepare(ExecutorAddr Addr, size_t ContentSize) override;
+ char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) override;
void deinitialize(ArrayRef<ExecutorAddr> Allocations,
OnDeinitializedFunction OnDeInitialized) override;
@@ -142,7 +147,8 @@ class LLVM_ABI SharedMemoryMapper final : public MemoryMapper {
void reserve(size_t NumBytes, OnReservedFunction OnReserved) override;
- char *prepare(ExecutorAddr Addr, size_t ContentSize) override;
+ char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) override;
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override;
diff --git a/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp b/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp
index 33734b8253689..bb8d2cbea2d91 100644
--- a/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp
@@ -90,7 +90,7 @@ void MapperJITLinkMemoryManager::allocate(const JITLinkDylib *JD, LinkGraph &G,
auto TotalSize = Seg.ContentSize + Seg.ZeroFillSize;
Seg.Addr = NextSegAddr;
- Seg.WorkingMem = Mapper->prepare(NextSegAddr, TotalSize);
+ Seg.WorkingMem = Mapper->prepare(G, NextSegAddr, TotalSize);
NextSegAddr += alignTo(TotalSize, Mapper->getPageSize());
diff --git a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
index ea3b22a092437..7b327af8aeeb5 100644
--- a/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp
@@ -58,7 +58,8 @@ void InProcessMemoryMapper::reserve(size_t NumBytes,
ExecutorAddrRange(ExecutorAddr::fromPtr(MB.base()), MB.allocatedSize()));
}
-char *InProcessMemoryMapper::prepare(ExecutorAddr Addr, size_t ContentSize) {
+char *InProcessMemoryMapper::prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) {
return Addr.toPtr<char *>();
}
@@ -324,7 +325,8 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
#endif
}
-char *SharedMemoryMapper::prepare(ExecutorAddr Addr, size_t ContentSize) {
+char *SharedMemoryMapper::prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) {
auto R = Reservations.upper_bound(Addr);
assert(R != Reservations.begin() && "Attempt to prepare unreserved range");
R--;
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index 731d64877ac63..b7f898ff23eba 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -623,8 +623,9 @@ class InProcessDeltaMapper final : public InProcessMemoryMapper {
});
}
- char *prepare(ExecutorAddr Addr, size_t ContentSize) override {
- return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize);
+ char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
+ size_t ContentSize) override {
+ return InProcessMemoryMapper::prepare(G, Addr - DeltaAddr, ContentSize);
}
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override {
diff --git a/llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp b/llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp
index c5e9d4368ed93..a5269f79fc1e9 100644
--- a/llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp
@@ -39,8 +39,8 @@ class CounterMapper final : public MemoryMapper {
return Mapper->initialize(AI, std::move(OnInitialized));
}
- char *prepare(ExecutorAddr Addr, size_t ContentSize) override {
- return Mapper->prepare(Addr, ContentSize);
+ char *prepare(LinkGraph &G, ExecutorAddr Addr, size_t ContentSize) override {
+ return Mapper->prepare(G, Addr, ContentSize);
}
void deinitialize(ArrayRef<ExecutorAddr> Allocations,
diff --git a/llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp b/llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp
index fea9eabbb465b..1174493397a62 100644
--- a/llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
+#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/Support/Process.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
@@ -66,6 +67,9 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
{
std::unique_ptr<MemoryMapper> Mapper =
cantFail(InProcessMemoryMapper::Create());
+ jitlink::LinkGraph G("G", std::make_shared<SymbolStringPool>(),
+ Triple("x86_64-apple-darwin"), SubtargetFeatures(),
+ jitlink::getGenericEdgeKindName);
// We will do two separate allocations
auto PageSize = Mapper->getPageSize();
@@ -80,7 +84,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
{
// Provide working memory
- char *WA1 = Mapper->prepare(Mem1->Start, HW.size() + 1);
+ char *WA1 = Mapper->prepare(G, Mem1->Start, HW.size() + 1);
std::strcpy(WA1, HW.c_str());
}
@@ -105,7 +109,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
}
{
- char *WA2 = Mapper->prepare(Mem1->Start + PageSize, HW.size() + 1);
+ char *WA2 = Mapper->prepare(G, Mem1->Start + PageSize, HW.size() + 1);
std::strcpy(WA2, HW.c_str());
}
@@ -158,7 +162,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
auto Mem2 = reserve(*Mapper, PageSize);
EXPECT_THAT_ERROR(Mem2.takeError(), Succeeded());
- char *WA = Mapper->prepare(Mem2->Start, HW.size() + 1);
+ char *WA = Mapper->prepare(G, Mem2->Start, HW.size() + 1);
std::strcpy(WA, HW.c_str());
MemoryMapper::AllocInfo Alloc3;
diff --git a/llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp b/llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp
index 700500f41d885..7775f3cdf31f3 100644
--- a/llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp
@@ -8,6 +8,7 @@
#include "OrcTestCommon.h"
#include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX
+#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
#include "llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h"
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
@@ -67,12 +68,16 @@ TEST(SharedMemoryMapperTest, MemReserveInitializeDeinitializeRelease) {
auto PageSize = Mapper->getPageSize();
size_t ReqSize = PageSize;
+ jitlink::LinkGraph G("G", std::make_shared<SymbolStringPool>(),
+ Triple("x86_64-apple-darwin"), SubtargetFeatures(),
+ jitlink::getGenericEdgeKindName);
Mapper->reserve(ReqSize, [&](Expected<ExecutorAddrRange> Result) {
EXPECT_THAT_ERROR(Result.takeError(), Succeeded());
auto Reservation = std::move(*Result);
{
- char *Addr = Mapper->prepare(Reservation.Start, TestString.size() + 1);
+ char *Addr =
+ Mapper->prepare(G, Reservation.Start, TestString.size() + 1);
std::strcpy(Addr, TestString.c_str());
}
MemoryMapper::AllocInfo AI;
More information about the llvm-commits
mailing list