LLVM 22.0.0git
EPCGenericJITLinkMemoryManager.cpp
Go to the documentation of this file.
1//===---- EPCGenericJITLinkMemoryManager.cpp -- Mem management via EPC ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
13
14#include <limits>
15
16using namespace llvm::jitlink;
17
18namespace llvm {
19namespace orc {
20
23public:
24
25 // FIXME: The C++98 initializer is an attempt to work around compile failures
26 // due to http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1397.
27 // We should be able to switch this back to member initialization once that
28 // issue is fixed.
37
39
41 ExecutorAddr AllocAddr, SegInfoMap Segs)
42 : Parent(Parent), G(G), AllocAddr(AllocAddr), Segs(std::move(Segs)) {}
43
44 void finalize(OnFinalizedFunction OnFinalize) override {
46 for (auto &KV : Segs) {
47 assert(KV.second.ContentSize <= std::numeric_limits<size_t>::max());
49 KV.first,
50 KV.second.Addr,
51 alignTo(KV.second.ContentSize + KV.second.ZeroFillSize,
52 Parent.EPC.getPageSize()),
53 {KV.second.WorkingMem, static_cast<size_t>(KV.second.ContentSize)}});
54 }
55
56 // Transfer allocation actions.
57 std::swap(FR.Actions, G.allocActions());
58
59 Parent.EPC.callSPSWrapperAsync<
61 Parent.SAs.Finalize,
62 [OnFinalize = std::move(OnFinalize), AllocAddr = this->AllocAddr](
63 Error SerializationErr, Error FinalizeErr) mutable {
64 // FIXME: Release abandoned alloc.
65 if (SerializationErr) {
66 cantFail(std::move(FinalizeErr));
67 OnFinalize(std::move(SerializationErr));
68 } else if (FinalizeErr)
69 OnFinalize(std::move(FinalizeErr));
70 else
71 OnFinalize(FinalizedAlloc(AllocAddr));
72 },
73 Parent.SAs.Allocator, std::move(FR));
74 }
75
76 void abandon(OnAbandonedFunction OnAbandoned) override {
77 // FIXME: Return memory to pool instead.
78 Parent.EPC.callSPSWrapperAsync<
80 Parent.SAs.Deallocate,
81 [OnAbandoned = std::move(OnAbandoned)](Error SerializationErr,
82 Error DeallocateErr) mutable {
83 if (SerializationErr) {
84 cantFail(std::move(DeallocateErr));
85 OnAbandoned(std::move(SerializationErr));
86 } else
87 OnAbandoned(std::move(DeallocateErr));
88 },
89 Parent.SAs.Allocator, ArrayRef<ExecutorAddr>(AllocAddr));
90 }
91
92private:
94 LinkGraph &G;
95 ExecutorAddr AllocAddr;
96 SegInfoMap Segs;
97};
98
100 LinkGraph &G,
101 OnAllocatedFunction OnAllocated) {
102 BasicLayout BL(G);
103
104 auto Pages = BL.getContiguousPageBasedLayoutSizes(EPC.getPageSize());
105 if (!Pages)
106 return OnAllocated(Pages.takeError());
107
109 SAs.Reserve,
110 [this, BL = std::move(BL), OnAllocated = std::move(OnAllocated)](
111 Error SerializationErr, Expected<ExecutorAddr> AllocAddr) mutable {
112 if (SerializationErr) {
113 cantFail(AllocAddr.takeError());
114 return OnAllocated(std::move(SerializationErr));
115 }
116 if (!AllocAddr)
117 return OnAllocated(AllocAddr.takeError());
118
119 completeAllocation(*AllocAddr, std::move(BL), std::move(OnAllocated));
120 },
121 SAs.Allocator, Pages->total());
122}
123
125 std::vector<FinalizedAlloc> Allocs, OnDeallocatedFunction OnDeallocated) {
126 EPC.callSPSWrapperAsync<
128 SAs.Deallocate,
129 [OnDeallocated = std::move(OnDeallocated)](Error SerErr,
130 Error DeallocErr) mutable {
131 if (SerErr) {
132 cantFail(std::move(DeallocErr));
133 OnDeallocated(std::move(SerErr));
134 } else
135 OnDeallocated(std::move(DeallocErr));
136 },
137 SAs.Allocator, Allocs);
138 for (auto &A : Allocs)
139 A.release();
140}
141
142void EPCGenericJITLinkMemoryManager::completeAllocation(
143 ExecutorAddr AllocAddr, BasicLayout BL, OnAllocatedFunction OnAllocated) {
144
146
147 ExecutorAddr NextSegAddr = AllocAddr;
148 for (auto &KV : BL.segments()) {
149 const auto &AG = KV.first;
150 auto &Seg = KV.second;
151
152 Seg.Addr = NextSegAddr;
153 KV.second.WorkingMem = BL.getGraph().allocateBuffer(Seg.ContentSize).data();
154 NextSegAddr += ExecutorAddrDiff(
155 alignTo(Seg.ContentSize + Seg.ZeroFillSize, EPC.getPageSize()));
156
157 auto &SegInfo = SegInfos[AG];
158 SegInfo.ContentSize = Seg.ContentSize;
159 SegInfo.ZeroFillSize = Seg.ZeroFillSize;
160 SegInfo.Addr = Seg.Addr;
161 SegInfo.WorkingMem = Seg.WorkingMem;
162 }
163
164 if (auto Err = BL.apply())
165 return OnAllocated(std::move(Err));
166
167 OnAllocated(std::make_unique<InFlightAlloc>(*this, BL.getGraph(), AllocAddr,
168 std::move(SegInfos)));
169}
170
171} // end namespace orc
172} // end namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define G(x, y, z)
Definition MD5.cpp:56
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
A specialized small-map for AllocGroups.
void finalize(OnFinalizedFunction OnFinalize) override
Called to transfer working memory to the target and apply finalization.
void abandon(OnAbandonedFunction OnAbandoned) override
Called prior to finalization if the allocation should be abandoned.
InFlightAlloc(EPCGenericJITLinkMemoryManager &Parent, LinkGraph &G, ExecutorAddr AllocAddr, SegInfoMap Segs)
void deallocate(std::vector< FinalizedAlloc > Allocs, OnDeallocatedFunction OnDeallocated) override
Deallocate a list of allocation objects.
void allocate(const jitlink::JITLinkDylib *JD, jitlink::LinkGraph &G, OnAllocatedFunction OnAllocated) override
Start the allocation process.
EPCGenericJITLinkMemoryManager(ExecutorProcessControl &EPC, SymbolAddrs SAs)
Create an EPCGenericJITLinkMemoryManager instance from a given set of function addrs.
Represents an address in the executor process.
unsigned getPageSize() const
Get the page size for the target process.
shared::SPSExpected< shared::SPSExecutorAddr >(shared::SPSExecutorAddr, uint64_t) SPSSimpleExecutorMemoryManagerReserveSignature
Definition OrcRTBridge.h:74
shared::SPSError(shared::SPSExecutorAddr, shared::SPSFinalizeRequest) SPSSimpleExecutorMemoryManagerFinalizeSignature
Definition OrcRTBridge.h:77
shared::SPSError( shared::SPSExecutorAddr, shared::SPSSequence< shared::SPSExecutorAddr >) SPSSimpleExecutorMemoryManagerDeallocateSignature
Definition OrcRTBridge.h:79
uint64_t ExecutorAddrDiff
This is an optimization pass for GlobalISel generic memory operations.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Definition Error.h:769
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:155
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1847
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:851
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:853
std::vector< SegFinalizeRequest > Segments