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 the MemoryAccess interface 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
23
24namespace llvm {
25namespace orc {
26
28public:
29 /// Function addresses for memory access.
45
46 /// Create an EPCGenericMemoryAccess instance from a given set of
47 /// function addrs.
49 : EPC(EPC), FAs(FAs) {}
50
52 WriteResultFn OnWriteComplete) override {
53 using namespace shared;
54 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt8Write>)>(
55 FAs.WriteUInt8s, std::move(OnWriteComplete), Ws);
56 }
57
59 WriteResultFn OnWriteComplete) override {
60 using namespace shared;
61 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt16Write>)>(
62 FAs.WriteUInt16s, std::move(OnWriteComplete), Ws);
63 }
64
66 WriteResultFn OnWriteComplete) override {
67 using namespace shared;
68 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt32Write>)>(
69 FAs.WriteUInt32s, std::move(OnWriteComplete), Ws);
70 }
71
73 WriteResultFn OnWriteComplete) override {
74 using namespace shared;
75 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt64Write>)>(
76 FAs.WriteUInt64s, std::move(OnWriteComplete), Ws);
77 }
78
80 WriteResultFn OnWriteComplete) override {
81 using namespace shared;
82 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessPointerWrite>)>(
83 FAs.WritePointers, std::move(OnWriteComplete), Ws);
84 }
85
87 WriteResultFn OnWriteComplete) override {
88 using namespace shared;
89 EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessBufferWrite>)>(
90 FAs.WriteBuffers, std::move(OnWriteComplete), Ws);
91 }
92
94 OnReadUIntsCompleteFn<uint8_t> OnComplete) override {
95 using namespace shared;
96 EPC.callSPSWrapperAsync<SPSSequence<uint8_t>(SPSSequence<SPSExecutorAddr>)>(
97 FAs.ReadUInt8s,
98 [OnComplete = std::move(OnComplete)](
100 if (Err)
101 OnComplete(std::move(Err));
102 else
103 OnComplete(std::move(Result));
104 },
105 Rs);
106 }
107
109 OnReadUIntsCompleteFn<uint16_t> OnComplete) override {
110 using namespace shared;
111 EPC.callSPSWrapperAsync<SPSSequence<uint16_t>(
112 SPSSequence<SPSExecutorAddr>)>(
113 FAs.ReadUInt16s,
114 [OnComplete = std::move(OnComplete)](
116 if (Err)
117 OnComplete(std::move(Err));
118 else
119 OnComplete(std::move(Result));
120 },
121 Rs);
122 }
123
125 OnReadUIntsCompleteFn<uint32_t> OnComplete) override {
126 using namespace shared;
127 EPC.callSPSWrapperAsync<SPSSequence<uint32_t>(
128 SPSSequence<SPSExecutorAddr>)>(
129 FAs.ReadUInt32s,
130 [OnComplete = std::move(OnComplete)](
132 if (Err)
133 OnComplete(std::move(Err));
134 else
135 OnComplete(std::move(Result));
136 },
137 Rs);
138 }
139
141 OnReadUIntsCompleteFn<uint64_t> OnComplete) override {
142 using namespace shared;
143 EPC.callSPSWrapperAsync<SPSSequence<uint64_t>(
144 SPSSequence<SPSExecutorAddr>)>(
145 FAs.ReadUInt64s,
146 [OnComplete = std::move(OnComplete)](
148 if (Err)
149 OnComplete(std::move(Err));
150 else
151 OnComplete(std::move(Result));
152 },
153 Rs);
154 }
155
157 OnReadPointersCompleteFn OnComplete) override {
158 using namespace shared;
159 using SPSSig = SPSSequence<SPSExecutorAddr>(SPSSequence<SPSExecutorAddr>);
160 EPC.callSPSWrapperAsync<SPSSig>(
161 FAs.ReadPointers,
162 [OnComplete = std::move(OnComplete)](
163 Error Err, ReadPointersResult Result) mutable {
164 if (Err)
165 OnComplete(std::move(Err));
166 else
167 OnComplete(std::move(Result));
168 },
169 Rs);
170 }
171
173 OnReadBuffersCompleteFn OnComplete) override {
174 using namespace shared;
175 using SPSSig =
176 SPSSequence<SPSSequence<uint8_t>>(SPSSequence<SPSExecutorAddrRange>);
177 EPC.callSPSWrapperAsync<SPSSig>(
178 FAs.ReadBuffers,
179 [OnComplete = std::move(OnComplete)](Error Err,
180 ReadBuffersResult Result) mutable {
181 if (Err)
182 OnComplete(std::move(Err));
183 else
184 OnComplete(std::move(Result));
185 },
186 Rs);
187 }
188
190 OnReadStringsCompleteFn OnComplete) override {
191 using namespace shared;
192 using SPSSig = SPSSequence<SPSString>(SPSSequence<SPSExecutorAddr>);
193 EPC.callSPSWrapperAsync<SPSSig>(
194 FAs.ReadStrings,
195 [OnComplete = std::move(OnComplete)](Error Err,
196 ReadStringsResult Result) mutable {
197 if (Err)
198 OnComplete(std::move(Err));
199 else
200 OnComplete(std::move(Result));
201 },
202 Rs);
203 }
204
205private:
207 FuncAddrs FAs;
208};
209
210} // end namespace orc
211} // end namespace llvm
212
213#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.
APIs for manipulating memory in the target process.
unique_function< void(Expected< ReadStringsResult >)> OnReadStringsCompleteFn
unique_function< void(Expected< ReadBuffersResult >)> OnReadBuffersCompleteFn
unique_function< void(Expected< ReadPointersResult >)> OnReadPointersCompleteFn
std::vector< std::vector< uint8_t > > ReadBuffersResult
unique_function< void(Error)> WriteResultFn
Callback function for asynchronous writes.
std::vector< std::string > ReadStringsResult
unique_function< void(Expected< ReadUIntsResult< T > >)> OnReadUIntsCompleteFn
std::vector< ExecutorAddr > ReadPointersResult
std::vector< T > ReadUIntsResult
This is an optimization pass for GlobalISel generic memory operations.
Function addresses for memory access.