Skip to content

Commit e32b1ee

Browse files
committed
[ORC] Change SPSExecutorAddr serialization, SupportFunctionCall struct.
SPSExecutorAddr will now be serializable to/from ExecutorAddr, rather than uint64_t. This improves type safety when working with serialized addresses. Also updates the SupportFunctionCall to use an ExecutorAddrRange (rather than a separate ExecutorAddr addr and uint64_t size field), and updates the tpctypes::*Write data structures to use ExecutorAddr rather than JITTargetAddress.
1 parent ef922c6 commit e32b1ee

File tree

10 files changed

+61
-59
lines changed

10 files changed

+61
-59
lines changed

llvm/include/llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ struct ExecutorAddrRange {
160160

161161
namespace shared {
162162

163+
class SPSExecutorAddr {};
164+
163165
/// SPS serializatior for ExecutorAddr.
164166
template <> class SPSSerializationTraits<SPSExecutorAddr, ExecutorAddr> {
165167
public:

llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,6 @@ template <typename SPSElementTagT> class SPSSequence;
195195
/// SPS tag type for strings, which are equivalent to sequences of chars.
196196
using SPSString = SPSSequence<char>;
197197

198-
/// SPS tag type for executor addresseses.
199-
class SPSExecutorAddr {};
200-
201-
template <>
202-
class SPSSerializationTraits<SPSExecutorAddr, uint64_t>
203-
: public SPSSerializationTraits<uint64_t, uint64_t> {};
204-
205198
/// SPS tag type for maps.
206199
///
207200
/// SPS maps are just sequences of (Key, Value) tuples.

llvm/include/llvm/ExecutionEngine/Orc/Shared/TargetProcessControlTypes.h

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,19 @@ struct SupportFunctionCall {
7373
using FnTy = shared::detail::CWrapperFunctionResult(const char *ArgData,
7474
size_t ArgSize);
7575
ExecutorAddr Func;
76-
ExecutorAddr ArgData;
77-
uint64_t ArgSize;
76+
ExecutorAddrRange ArgDataRange;
77+
78+
SupportFunctionCall() = default;
79+
SupportFunctionCall(ExecutorAddr Func, ExecutorAddr ArgData,
80+
ExecutorAddrDiff ArgSize)
81+
: Func(Func), ArgDataRange(ArgData, ArgSize) {}
82+
SupportFunctionCall(ExecutorAddr Func, ExecutorAddrRange ArgDataRange)
83+
: Func(Func), ArgDataRange(ArgDataRange) {}
7884

7985
Error run() {
80-
shared::WrapperFunctionResult WFR(
81-
Func.toPtr<FnTy *>()(ArgData.toPtr<const char *>(), ArgSize));
86+
shared::WrapperFunctionResult WFR(Func.toPtr<FnTy *>()(
87+
ArgDataRange.Start.toPtr<const char *>(),
88+
static_cast<size_t>(ArgDataRange.size().getValue())));
8289
if (const char *ErrMsg = WFR.getOutOfBandError())
8390
return make_error<StringError>(ErrMsg, inconvertibleErrorCode());
8491
if (!WFR.empty())
@@ -108,10 +115,9 @@ struct FinalizeRequest {
108115

109116
template <typename T> struct UIntWrite {
110117
UIntWrite() = default;
111-
UIntWrite(JITTargetAddress Address, T Value)
112-
: Address(Address), Value(Value) {}
118+
UIntWrite(ExecutorAddr Addr, T Value) : Addr(Addr), Value(Value) {}
113119

114-
JITTargetAddress Address = 0;
120+
ExecutorAddr Addr;
115121
T Value = 0;
116122
};
117123

@@ -131,10 +137,10 @@ using UInt64Write = UIntWrite<uint64_t>;
131137
/// For use with TargetProcessControl::MemoryAccess objects.
132138
struct BufferWrite {
133139
BufferWrite() = default;
134-
BufferWrite(JITTargetAddress Address, StringRef Buffer)
135-
: Address(Address), Buffer(Buffer) {}
140+
BufferWrite(ExecutorAddr Addr, StringRef Buffer)
141+
: Addr(Addr), Buffer(Buffer) {}
136142

137-
JITTargetAddress Address = 0;
143+
ExecutorAddr Addr;
138144
StringRef Buffer;
139145
};
140146

@@ -149,8 +155,7 @@ namespace shared {
149155

150156
class SPSMemoryProtectionFlags {};
151157

152-
using SPSSupportFunctionCall =
153-
SPSTuple<SPSExecutorAddr, SPSExecutorAddr, uint64_t>;
158+
using SPSSupportFunctionCall = SPSTuple<SPSExecutorAddr, SPSExecutorAddrRange>;
154159

155160
using SPSSegFinalizeRequest =
156161
SPSTuple<SPSMemoryProtectionFlags, SPSExecutorAddr, uint64_t,
@@ -202,17 +207,17 @@ class SPSSerializationTraits<SPSSupportFunctionCall,
202207

203208
public:
204209
static size_t size(const tpctypes::SupportFunctionCall &SFC) {
205-
return AL::size(SFC.Func, SFC.ArgData, SFC.ArgSize);
210+
return AL::size(SFC.Func, SFC.ArgDataRange);
206211
}
207212

208213
static bool serialize(SPSOutputBuffer &OB,
209214
const tpctypes::SupportFunctionCall &SFC) {
210-
return AL::serialize(OB, SFC.Func, SFC.ArgData, SFC.ArgSize);
215+
return AL::serialize(OB, SFC.Func, SFC.ArgDataRange);
211216
}
212217

213218
static bool deserialize(SPSInputBuffer &IB,
214219
tpctypes::SupportFunctionCall &SFC) {
215-
return AL::deserialize(IB, SFC.Func, SFC.ArgData, SFC.ArgSize);
220+
return AL::deserialize(IB, SFC.Func, SFC.ArgDataRange);
216221
}
217222
};
218223

@@ -282,16 +287,16 @@ class SPSSerializationTraits<SPSMemoryAccessUIntWrite<T>,
282287
tpctypes::UIntWrite<T>> {
283288
public:
284289
static size_t size(const tpctypes::UIntWrite<T> &W) {
285-
return SPSTuple<SPSExecutorAddr, T>::AsArgList::size(W.Address, W.Value);
290+
return SPSTuple<SPSExecutorAddr, T>::AsArgList::size(W.Addr, W.Value);
286291
}
287292

288293
static bool serialize(SPSOutputBuffer &OB, const tpctypes::UIntWrite<T> &W) {
289-
return SPSTuple<SPSExecutorAddr, T>::AsArgList::serialize(OB, W.Address,
294+
return SPSTuple<SPSExecutorAddr, T>::AsArgList::serialize(OB, W.Addr,
290295
W.Value);
291296
}
292297

293298
static bool deserialize(SPSInputBuffer &IB, tpctypes::UIntWrite<T> &W) {
294-
return SPSTuple<SPSExecutorAddr, T>::AsArgList::deserialize(IB, W.Address,
299+
return SPSTuple<SPSExecutorAddr, T>::AsArgList::deserialize(IB, W.Addr,
295300
W.Value);
296301
}
297302
};
@@ -302,17 +307,17 @@ class SPSSerializationTraits<SPSMemoryAccessBufferWrite,
302307
public:
303308
static size_t size(const tpctypes::BufferWrite &W) {
304309
return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList::size(
305-
W.Address, W.Buffer);
310+
W.Addr, W.Buffer);
306311
}
307312

308313
static bool serialize(SPSOutputBuffer &OB, const tpctypes::BufferWrite &W) {
309314
return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList ::serialize(
310-
OB, W.Address, W.Buffer);
315+
OB, W.Addr, W.Buffer);
311316
}
312317

313318
static bool deserialize(SPSInputBuffer &IB, tpctypes::BufferWrite &W) {
314319
return SPSTuple<SPSExecutorAddr,
315-
SPSSequence<char>>::AsArgList ::deserialize(IB, W.Address,
320+
SPSSequence<char>>::AsArgList ::deserialize(IB, W.Addr,
316321
W.Buffer);
317322
}
318323
};

llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ EPCEHFrameRegistrar::Create(ExecutionSession &ES) {
5959
Error EPCEHFrameRegistrar::registerEHFrames(JITTargetAddress EHFrameSectionAddr,
6060
size_t EHFrameSectionSize) {
6161
return ES.callSPSWrapper<void(SPSExecutorAddr, uint64_t)>(
62-
RegisterEHFrameWrapperFnAddr, EHFrameSectionAddr,
62+
RegisterEHFrameWrapperFnAddr, ExecutorAddr(EHFrameSectionAddr),
6363
static_cast<uint64_t>(EHFrameSectionSize));
6464
}
6565

6666
Error EPCEHFrameRegistrar::deregisterEHFrames(
6767
JITTargetAddress EHFrameSectionAddr, size_t EHFrameSectionSize) {
6868
return ES.callSPSWrapper<void(SPSExecutorAddr, uint64_t)>(
69-
DeregisterEHFrameWrapperFnAddr, EHFrameSectionAddr,
69+
DeregisterEHFrameWrapperFnAddr, ExecutorAddr(EHFrameSectionAddr),
7070
static_cast<uint64_t>(EHFrameSectionSize));
7171
}
7272

llvm/lib/ExecutionEngine/Orc/EPCGenericJITLinkMemoryManager.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,12 @@ class EPCGenericJITLinkMemoryManager::InFlightAlloc
6060
// turn this into a std::swap.
6161
FR.Actions.reserve(G.allocActions().size());
6262
for (auto &ActPair : G.allocActions())
63-
FR.Actions.push_back(
64-
{{ExecutorAddr(ActPair.Finalize.FnAddr),
65-
ExecutorAddr(ActPair.Finalize.CtxAddr), ActPair.Finalize.CtxSize},
66-
{ExecutorAddr(ActPair.Dealloc.FnAddr),
67-
ExecutorAddr(ActPair.Dealloc.CtxAddr), ActPair.Dealloc.CtxSize}});
63+
FR.Actions.push_back({{ExecutorAddr(ActPair.Finalize.FnAddr),
64+
{ExecutorAddr(ActPair.Finalize.CtxAddr),
65+
ExecutorAddrDiff(ActPair.Finalize.CtxSize)}},
66+
{ExecutorAddr(ActPair.Dealloc.FnAddr),
67+
{ExecutorAddr(ActPair.Dealloc.CtxAddr),
68+
ExecutorAddrDiff(ActPair.Dealloc.CtxSize)}}});
6869
G.allocActions().clear();
6970

7071
Parent.EPC.callSPSWrapperAsync<

llvm/lib/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,11 @@ bool EPCGenericRTDyldMemoryManager::finalizeMemory(std::string *ErrMsg) {
262262
}
263263

264264
for (auto &Frame : ObjAllocs.UnfinalizedEHFrames)
265-
FR.Actions.push_back({{SAs.RegisterEHFrame, Frame.Addr, Frame.Size},
266-
{SAs.DeregisterEHFrame, Frame.Addr, Frame.Size}});
265+
FR.Actions.push_back(
266+
{{SAs.RegisterEHFrame,
267+
{ExecutorAddr(Frame.Addr), ExecutorAddrDiff(Frame.Size)}},
268+
{SAs.DeregisterEHFrame,
269+
{ExecutorAddr(Frame.Addr), ExecutorAddrDiff(Frame.Size)}}});
267270

268271
// We'll also need to make an extra allocation for the eh-frame wrapper call
269272
// arguments.

llvm/lib/ExecutionEngine/Orc/EPCIndirectionUtils.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,18 @@ Error EPCIndirectStubsManager::createStubs(const StubInitsMap &StubInits) {
161161
unsigned ASIdx = 0;
162162
std::vector<tpctypes::UInt32Write> PtrUpdates;
163163
for (auto &SI : StubInits)
164-
PtrUpdates.push_back({(*AvailableStubInfos)[ASIdx++].PointerAddress,
165-
static_cast<uint32_t>(SI.second.first)});
164+
PtrUpdates.push_back(
165+
{ExecutorAddr((*AvailableStubInfos)[ASIdx++].PointerAddress),
166+
static_cast<uint32_t>(SI.second.first)});
166167
return MemAccess.writeUInt32s(PtrUpdates);
167168
}
168169
case 8: {
169170
unsigned ASIdx = 0;
170171
std::vector<tpctypes::UInt64Write> PtrUpdates;
171172
for (auto &SI : StubInits)
172-
PtrUpdates.push_back({(*AvailableStubInfos)[ASIdx++].PointerAddress,
173-
static_cast<uint64_t>(SI.second.first)});
173+
PtrUpdates.push_back(
174+
{ExecutorAddr((*AvailableStubInfos)[ASIdx++].PointerAddress),
175+
static_cast<uint64_t>(SI.second.first)});
174176
return MemAccess.writeUInt64s(PtrUpdates);
175177
}
176178
default:
@@ -212,11 +214,11 @@ Error EPCIndirectStubsManager::updatePointer(StringRef Name,
212214
auto &MemAccess = EPCIU.getExecutorProcessControl().getMemoryAccess();
213215
switch (EPCIU.getABISupport().getPointerSize()) {
214216
case 4: {
215-
tpctypes::UInt32Write PUpdate(PtrAddr, NewAddr);
217+
tpctypes::UInt32Write PUpdate(ExecutorAddr(PtrAddr), NewAddr);
216218
return MemAccess.writeUInt32s(PUpdate);
217219
}
218220
case 8: {
219-
tpctypes::UInt64Write PUpdate(PtrAddr, NewAddr);
221+
tpctypes::UInt64Write PUpdate(ExecutorAddr(PtrAddr), NewAddr);
220222
return MemAccess.writeUInt64s(PUpdate);
221223
}
222224
default:

llvm/lib/ExecutionEngine/Orc/ExecutorProcessControl.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,36 +138,35 @@ Error SelfExecutorProcessControl::disconnect() {
138138
void SelfExecutorProcessControl::writeUInt8sAsync(
139139
ArrayRef<tpctypes::UInt8Write> Ws, WriteResultFn OnWriteComplete) {
140140
for (auto &W : Ws)
141-
*jitTargetAddressToPointer<uint8_t *>(W.Address) = W.Value;
141+
*W.Addr.toPtr<uint8_t *>() = W.Value;
142142
OnWriteComplete(Error::success());
143143
}
144144

145145
void SelfExecutorProcessControl::writeUInt16sAsync(
146146
ArrayRef<tpctypes::UInt16Write> Ws, WriteResultFn OnWriteComplete) {
147147
for (auto &W : Ws)
148-
*jitTargetAddressToPointer<uint16_t *>(W.Address) = W.Value;
148+
*W.Addr.toPtr<uint16_t *>() = W.Value;
149149
OnWriteComplete(Error::success());
150150
}
151151

152152
void SelfExecutorProcessControl::writeUInt32sAsync(
153153
ArrayRef<tpctypes::UInt32Write> Ws, WriteResultFn OnWriteComplete) {
154154
for (auto &W : Ws)
155-
*jitTargetAddressToPointer<uint32_t *>(W.Address) = W.Value;
155+
*W.Addr.toPtr<uint32_t *>() = W.Value;
156156
OnWriteComplete(Error::success());
157157
}
158158

159159
void SelfExecutorProcessControl::writeUInt64sAsync(
160160
ArrayRef<tpctypes::UInt64Write> Ws, WriteResultFn OnWriteComplete) {
161161
for (auto &W : Ws)
162-
*jitTargetAddressToPointer<uint64_t *>(W.Address) = W.Value;
162+
*W.Addr.toPtr<uint64_t *>() = W.Value;
163163
OnWriteComplete(Error::success());
164164
}
165165

166166
void SelfExecutorProcessControl::writeBuffersAsync(
167167
ArrayRef<tpctypes::BufferWrite> Ws, WriteResultFn OnWriteComplete) {
168168
for (auto &W : Ws)
169-
memcpy(jitTargetAddressToPointer<char *>(W.Address), W.Buffer.data(),
170-
W.Buffer.size());
169+
memcpy(W.Addr.toPtr<char *>(), W.Buffer.data(), W.Buffer.size());
171170
OnWriteComplete(Error::success());
172171
}
173172

llvm/lib/ExecutionEngine/Orc/TargetProcess/OrcRTBootstrap.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ writeUIntsWrapper(const char *ArgData, size_t ArgSize) {
2828
ArgData, ArgSize,
2929
[](std::vector<WriteT> Ws) {
3030
for (auto &W : Ws)
31-
*jitTargetAddressToPointer<decltype(W.Value) *>(W.Address) =
32-
W.Value;
31+
*W.Addr.template toPtr<decltype(W.Value) *>() = W.Value;
3332
})
3433
.release();
3534
}
@@ -40,8 +39,8 @@ writeBuffersWrapper(const char *ArgData, size_t ArgSize) {
4039
ArgData, ArgSize,
4140
[](std::vector<tpctypes::BufferWrite> Ws) {
4241
for (auto &W : Ws)
43-
memcpy(jitTargetAddressToPointer<char *>(W.Address),
44-
W.Buffer.data(), W.Buffer.size());
42+
memcpy(W.Addr.template toPtr<char *>(), W.Buffer.data(),
43+
W.Buffer.size());
4544
})
4645
.release();
4746
}

llvm/lib/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,12 @@ llvm_orc_deregisterEHFrameSectionCustomDirectWrapper(
176176
return llvm::orc::shared::detail::CWrapperFunctionResult();
177177
}
178178

179-
static Error registerEHFrameWrapper(JITTargetAddress Addr, uint64_t Size) {
180-
return llvm::orc::registerEHFrameSection(
181-
jitTargetAddressToPointer<const void *>(Addr), Size);
179+
static Error registerEHFrameWrapper(ExecutorAddr Addr, uint64_t Size) {
180+
return llvm::orc::registerEHFrameSection(Addr.toPtr<const void *>(), Size);
182181
}
183182

184-
static Error deregisterEHFrameWrapper(JITTargetAddress Addr, uint64_t Size) {
185-
return llvm::orc::deregisterEHFrameSection(
186-
jitTargetAddressToPointer<const void *>(Addr), Size);
183+
static Error deregisterEHFrameWrapper(ExecutorAddr Addr, uint64_t Size) {
184+
return llvm::orc::deregisterEHFrameSection(Addr.toPtr<const void *>(), Size);
187185
}
188186

189187
extern "C" orc::shared::detail::CWrapperFunctionResult

0 commit comments

Comments
 (0)