Skip to content

Commit 2db5b32

Browse files
authored
[ORC] Add LinkGraph& argument to MemoryMapper::prepare. (#163121)
This gives MemoryMapper implementations a chance to allocate working memory using the LinkGraph's allocator.
1 parent 678303c commit 2db5b32

File tree

7 files changed

+32
-14
lines changed

7 files changed

+32
-14
lines changed

llvm/include/llvm/ExecutionEngine/Orc/MemoryMapper.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ class LLVM_ABI MemoryMapper {
5151
virtual void reserve(size_t NumBytes, OnReservedFunction OnReserved) = 0;
5252

5353
/// Provides working memory
54-
virtual char *prepare(ExecutorAddr Addr, size_t ContentSize) = 0;
54+
/// The LinkGraph parameter is included to allow implementations to allocate
55+
/// working memory from the LinkGraph's allocator, in which case it will be
56+
/// deallocated when the LinkGraph is destroyed.
57+
virtual char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
58+
size_t ContentSize) = 0;
5559

5660
using OnInitializedFunction = unique_function<void(Expected<ExecutorAddr>)>;
5761

@@ -92,7 +96,8 @@ class LLVM_ABI InProcessMemoryMapper : public MemoryMapper {
9296

9397
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override;
9498

95-
char *prepare(ExecutorAddr Addr, size_t ContentSize) override;
99+
char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
100+
size_t ContentSize) override;
96101

97102
void deinitialize(ArrayRef<ExecutorAddr> Allocations,
98103
OnDeinitializedFunction OnDeInitialized) override;
@@ -142,7 +147,8 @@ class LLVM_ABI SharedMemoryMapper final : public MemoryMapper {
142147

143148
void reserve(size_t NumBytes, OnReservedFunction OnReserved) override;
144149

145-
char *prepare(ExecutorAddr Addr, size_t ContentSize) override;
150+
char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
151+
size_t ContentSize) override;
146152

147153
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override;
148154

llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void MapperJITLinkMemoryManager::allocate(const JITLinkDylib *JD, LinkGraph &G,
9090
auto TotalSize = Seg.ContentSize + Seg.ZeroFillSize;
9191

9292
Seg.Addr = NextSegAddr;
93-
Seg.WorkingMem = Mapper->prepare(NextSegAddr, TotalSize);
93+
Seg.WorkingMem = Mapper->prepare(G, NextSegAddr, TotalSize);
9494

9595
NextSegAddr += alignTo(TotalSize, Mapper->getPageSize());
9696

llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ void InProcessMemoryMapper::reserve(size_t NumBytes,
5858
ExecutorAddrRange(ExecutorAddr::fromPtr(MB.base()), MB.allocatedSize()));
5959
}
6060

61-
char *InProcessMemoryMapper::prepare(ExecutorAddr Addr, size_t ContentSize) {
61+
char *InProcessMemoryMapper::prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
62+
size_t ContentSize) {
6263
return Addr.toPtr<char *>();
6364
}
6465

@@ -324,7 +325,8 @@ void SharedMemoryMapper::reserve(size_t NumBytes,
324325
#endif
325326
}
326327

327-
char *SharedMemoryMapper::prepare(ExecutorAddr Addr, size_t ContentSize) {
328+
char *SharedMemoryMapper::prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
329+
size_t ContentSize) {
328330
auto R = Reservations.upper_bound(Addr);
329331
assert(R != Reservations.begin() && "Attempt to prepare unreserved range");
330332
R--;

llvm/tools/llvm-jitlink/llvm-jitlink.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -623,8 +623,9 @@ class InProcessDeltaMapper final : public InProcessMemoryMapper {
623623
});
624624
}
625625

626-
char *prepare(ExecutorAddr Addr, size_t ContentSize) override {
627-
return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize);
626+
char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr,
627+
size_t ContentSize) override {
628+
return InProcessMemoryMapper::prepare(G, Addr - DeltaAddr, ContentSize);
628629
}
629630

630631
void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override {

llvm/unittests/ExecutionEngine/Orc/MapperJITLinkMemoryManagerTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ class CounterMapper final : public MemoryMapper {
3939
return Mapper->initialize(AI, std::move(OnInitialized));
4040
}
4141

42-
char *prepare(ExecutorAddr Addr, size_t ContentSize) override {
43-
return Mapper->prepare(Addr, ContentSize);
42+
char *prepare(LinkGraph &G, ExecutorAddr Addr, size_t ContentSize) override {
43+
return Mapper->prepare(G, Addr, ContentSize);
4444
}
4545

4646
void deinitialize(ArrayRef<ExecutorAddr> Allocations,

llvm/unittests/ExecutionEngine/Orc/MemoryMapperTest.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
10+
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
1011
#include "llvm/Support/Process.h"
1112
#include "llvm/Testing/Support/Error.h"
1213
#include "gtest/gtest.h"
@@ -66,6 +67,9 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
6667
{
6768
std::unique_ptr<MemoryMapper> Mapper =
6869
cantFail(InProcessMemoryMapper::Create());
70+
jitlink::LinkGraph G("G", std::make_shared<SymbolStringPool>(),
71+
Triple("x86_64-apple-darwin"), SubtargetFeatures(),
72+
jitlink::getGenericEdgeKindName);
6973

7074
// We will do two separate allocations
7175
auto PageSize = Mapper->getPageSize();
@@ -80,7 +84,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
8084

8185
{
8286
// Provide working memory
83-
char *WA1 = Mapper->prepare(Mem1->Start, HW.size() + 1);
87+
char *WA1 = Mapper->prepare(G, Mem1->Start, HW.size() + 1);
8488
std::strcpy(WA1, HW.c_str());
8589
}
8690

@@ -105,7 +109,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
105109
}
106110

107111
{
108-
char *WA2 = Mapper->prepare(Mem1->Start + PageSize, HW.size() + 1);
112+
char *WA2 = Mapper->prepare(G, Mem1->Start + PageSize, HW.size() + 1);
109113
std::strcpy(WA2, HW.c_str());
110114
}
111115

@@ -158,7 +162,7 @@ TEST(MemoryMapperTest, InitializeDeinitialize) {
158162
auto Mem2 = reserve(*Mapper, PageSize);
159163
EXPECT_THAT_ERROR(Mem2.takeError(), Succeeded());
160164

161-
char *WA = Mapper->prepare(Mem2->Start, HW.size() + 1);
165+
char *WA = Mapper->prepare(G, Mem2->Start, HW.size() + 1);
162166
std::strcpy(WA, HW.c_str());
163167

164168
MemoryMapper::AllocInfo Alloc3;

llvm/unittests/ExecutionEngine/Orc/SharedMemoryMapperTest.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "OrcTestCommon.h"
1010
#include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX
11+
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
1112
#include "llvm/ExecutionEngine/Orc/MemoryMapper.h"
1213
#include "llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h"
1314
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
@@ -67,12 +68,16 @@ TEST(SharedMemoryMapperTest, MemReserveInitializeDeinitializeRelease) {
6768

6869
auto PageSize = Mapper->getPageSize();
6970
size_t ReqSize = PageSize;
71+
jitlink::LinkGraph G("G", std::make_shared<SymbolStringPool>(),
72+
Triple("x86_64-apple-darwin"), SubtargetFeatures(),
73+
jitlink::getGenericEdgeKindName);
7074

7175
Mapper->reserve(ReqSize, [&](Expected<ExecutorAddrRange> Result) {
7276
EXPECT_THAT_ERROR(Result.takeError(), Succeeded());
7377
auto Reservation = std::move(*Result);
7478
{
75-
char *Addr = Mapper->prepare(Reservation.Start, TestString.size() + 1);
79+
char *Addr =
80+
Mapper->prepare(G, Reservation.Start, TestString.size() + 1);
7681
std::strcpy(Addr, TestString.c_str());
7782
}
7883
MemoryMapper::AllocInfo AI;

0 commit comments

Comments
 (0)