LLVM 22.0.0git
EPCGenericMemoryAccess.h
Go to the documentation of this file.
1//===- EPCGenericMemoryAccess.h - Generic EPC MemoryAccess impl -*- C++ -*-===//
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//
9// Implements ExecutorProcessControl::MemoryAccess by making calls to
10// ExecutorProcessControl::callWrapperAsync.
11//
12// This simplifies the implementaton of new ExecutorProcessControl instances,
13// as this implementation will always work (at the cost of some performance
14// overhead for the calls).
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
19#define LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
20
22
23namespace llvm {
24namespace orc {
25
27public:
28 /// Function addresses for memory access.
29 struct FuncAddrs {
43 };
44
45 /// Create an EPCGenericMemoryAccess instance from a given set of
46 /// function addrs.
48 : EPC(EPC), FAs(FAs) {}
49
51 WriteResultFn OnWriteComplete) override {
52 using namespace shared;
53 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt8Write>)>(
54 FAs.WriteUInt8s, std::move(OnWriteComplete), Ws);
55 }
56
58 WriteResultFn OnWriteComplete) override {
59 using namespace shared;
60 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt16Write>)>(
61 FAs.WriteUInt16s, std::move(OnWriteComplete), Ws);
62 }
63
65 WriteResultFn OnWriteComplete) override {
66 using namespace shared;
67 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt32Write>)>(
68 FAs.WriteUInt32s, std::move(OnWriteComplete), Ws);
69 }
70
72 WriteResultFn OnWriteComplete) override {
73 using namespace shared;
74 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt64Write>)>(
75 FAs.WriteUInt64s, std::move(OnWriteComplete), Ws);
76 }
77
79 WriteResultFn OnWriteComplete) override {
80 using namespace shared;
81 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessPointerWrite>)>(
82 FAs.WritePointers, std::move(OnWriteComplete), Ws);
83 }
84
86 WriteResultFn OnWriteComplete) override {
87 using namespace shared;
88 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessBufferWrite>)>(
89 FAs.WriteBuffers, std::move(OnWriteComplete), Ws);
90 }
91
93 OnReadUIntsCompleteFn<uint8_t> OnComplete) override {
94 using namespace shared;
95 EPC.callSPSWrapperAsync<SPSSequence<uint8_t>(SPSSequence<SPSExecutorAddr>)>(
96 FAs.ReadUInt8s,
97 [OnComplete = std::move(OnComplete)](
99 if (Err)
100 OnComplete(std::move(Err));
101 else
102 OnComplete(std::move(Result));
103 },
104 Rs);
105 }
106
108 OnReadUIntsCompleteFn<uint16_t> OnComplete) override {
109 using namespace shared;
110 EPC.callSPSWrapperAsync<SPSSequence<uint16_t>(
111 SPSSequence<SPSExecutorAddr>)>(
112 FAs.ReadUInt16s,
113 [OnComplete = std::move(OnComplete)](
115 if (Err)
116 OnComplete(std::move(Err));
117 else
118 OnComplete(std::move(Result));
119 },
120 Rs);
121 }
122
124 OnReadUIntsCompleteFn<uint32_t> OnComplete) override {
125 using namespace shared;
126 EPC.callSPSWrapperAsync<SPSSequence<uint32_t>(
127 SPSSequence<SPSExecutorAddr>)>(
128 FAs.ReadUInt32s,
129 [OnComplete = std::move(OnComplete)](
131 if (Err)
132 OnComplete(std::move(Err));
133 else
134 OnComplete(std::move(Result));
135 },
136 Rs);
137 }
138
140 OnReadUIntsCompleteFn<uint64_t> OnComplete) override {
141 using namespace shared;
142 EPC.callSPSWrapperAsync<SPSSequence<uint64_t>(
143 SPSSequence<SPSExecutorAddr>)>(
144 FAs.ReadUInt64s,
145 [OnComplete = std::move(OnComplete)](
147 if (Err)
148 OnComplete(std::move(Err));
149 else
150 OnComplete(std::move(Result));
151 },
152 Rs);
153 }
154
156 OnReadPointersCompleteFn OnComplete) override {
157 using namespace shared;
158 using SPSSig = SPSSequence<SPSExecutorAddr>(SPSSequence<SPSExecutorAddr>);
159 EPC.callSPSWrapperAsync<SPSSig>(
160 FAs.ReadPointers,
161 [OnComplete = std::move(OnComplete)](
162 Error Err, ReadPointersResult Result) mutable {
163 if (Err)
164 OnComplete(std::move(Err));
165 else
166 OnComplete(std::move(Result));
167 },
168 Rs);
169 }
170
172 OnReadBuffersCompleteFn OnComplete) override {
173 using namespace shared;
174 using SPSSig =
175 SPSSequence<SPSSequence<uint8_t>>(SPSSequence<SPSExecutorAddrRange>);
176 EPC.callSPSWrapperAsync<SPSSig>(
177 FAs.ReadBuffers,
178 [OnComplete = std::move(OnComplete)](Error Err,
179 ReadBuffersResult Result) mutable {
180 if (Err)
181 OnComplete(std::move(Err));
182 else
183 OnComplete(std::move(Result));
184 },
185 Rs);
186 }
187
189 OnReadStringsCompleteFn OnComplete) override {
190 using namespace shared;
191 using SPSSig = SPSSequence<SPSString>(SPSSequence<SPSExecutorAddr>);
192 EPC.callSPSWrapperAsync<SPSSig>(
193 FAs.ReadStrings,
194 [OnComplete = std::move(OnComplete)](Error Err,
195 ReadStringsResult Result) mutable {
196 if (Err)
197 OnComplete(std::move(Err));
198 else
199 OnComplete(std::move(Result));
200 },
201 Rs);
202 }
203
204private:
206 FuncAddrs FAs;
207};
208
209} // end namespace orc
210} // end namespace llvm
211
212#endif // LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Lightweight error class with error context and mandatory checking.
Definition: Error.h:159
void readUInt8sAsync(ArrayRef< ExecutorAddr > Rs, OnReadUIntsCompleteFn< uint8_t > OnComplete) override
void readUInt32sAsync(ArrayRef< ExecutorAddr > Rs, OnReadUIntsCompleteFn< uint32_t > OnComplete) override
void writeUInt16sAsync(ArrayRef< tpctypes::UInt16Write > Ws, WriteResultFn OnWriteComplete) override
void readStringsAsync(ArrayRef< ExecutorAddr > Rs, OnReadStringsCompleteFn OnComplete) override
void readUInt16sAsync(ArrayRef< ExecutorAddr > Rs, OnReadUIntsCompleteFn< uint16_t > OnComplete) override
void readBuffersAsync(ArrayRef< ExecutorAddrRange > Rs, OnReadBuffersCompleteFn OnComplete) override
void writeUInt32sAsync(ArrayRef< tpctypes::UInt32Write > Ws, WriteResultFn OnWriteComplete) override
void writeUInt64sAsync(ArrayRef< tpctypes::UInt64Write > Ws, WriteResultFn OnWriteComplete) override
void writePointersAsync(ArrayRef< tpctypes::PointerWrite > Ws, WriteResultFn OnWriteComplete) override
void readUInt64sAsync(ArrayRef< ExecutorAddr > Rs, OnReadUIntsCompleteFn< uint64_t > OnComplete) override
void readPointersAsync(ArrayRef< ExecutorAddr > Rs, OnReadPointersCompleteFn OnComplete) override
EPCGenericMemoryAccess(ExecutorProcessControl &EPC, FuncAddrs FAs)
Create an EPCGenericMemoryAccess instance from a given set of function addrs.
void writeUInt8sAsync(ArrayRef< tpctypes::UInt8Write > Ws, WriteResultFn OnWriteComplete) override
void writeBuffersAsync(ArrayRef< tpctypes::BufferWrite > Ws, WriteResultFn OnWriteComplete) override
Represents an address in the executor process.
ExecutorProcessControl supports interaction with a JIT target process.
void callSPSWrapperAsync(RunPolicyT &&Runner, ExecutorAddr WrapperFnAddr, SendResultT &&SendResult, const ArgTs &...Args)
Run a wrapper function using SPS to serialize the arguments and deserialize the results.
APIs for manipulating memory in the target process.
Definition: MemoryAccess.h:26
std::vector< std::string > ReadStringsResult
Definition: MemoryAccess.h:44
std::vector< ExecutorAddr > ReadPointersResult
Definition: MemoryAccess.h:36
std::vector< std::vector< uint8_t > > ReadBuffersResult
Definition: MemoryAccess.h:40
std::vector< T > ReadUIntsResult
Definition: MemoryAccess.h:31
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Function addresses for memory access.