1349cc55cSDimitry Andric //===- EPCGenericMemoryAccess.h - Generic EPC MemoryAccess impl -*- C++ -*-===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric //
9349cc55cSDimitry Andric // Implements ExecutorProcessControl::MemoryAccess by making calls to
10349cc55cSDimitry Andric // ExecutorProcessControl::callWrapperAsync.
11349cc55cSDimitry Andric //
12349cc55cSDimitry Andric // This simplifies the implementaton of new ExecutorProcessControl instances,
13349cc55cSDimitry Andric // as this implementation will always work (at the cost of some performance
14349cc55cSDimitry Andric // overhead for the calls).
15349cc55cSDimitry Andric //
16349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
17349cc55cSDimitry Andric 
18349cc55cSDimitry Andric #ifndef LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
19349cc55cSDimitry Andric #define LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
20349cc55cSDimitry Andric 
21349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
22349cc55cSDimitry Andric 
23349cc55cSDimitry Andric namespace llvm {
24349cc55cSDimitry Andric namespace orc {
25349cc55cSDimitry Andric 
26349cc55cSDimitry Andric class EPCGenericMemoryAccess : public ExecutorProcessControl::MemoryAccess {
27349cc55cSDimitry Andric public:
28349cc55cSDimitry Andric   /// Function addresses for memory access.
29349cc55cSDimitry Andric   struct FuncAddrs {
30349cc55cSDimitry Andric     ExecutorAddr WriteUInt8s;
31349cc55cSDimitry Andric     ExecutorAddr WriteUInt16s;
32349cc55cSDimitry Andric     ExecutorAddr WriteUInt32s;
33349cc55cSDimitry Andric     ExecutorAddr WriteUInt64s;
34349cc55cSDimitry Andric     ExecutorAddr WriteBuffers;
35*5f757f3fSDimitry Andric     ExecutorAddr WritePointers;
36349cc55cSDimitry Andric   };
37349cc55cSDimitry Andric 
38349cc55cSDimitry Andric   /// Create an EPCGenericMemoryAccess instance from a given set of
39349cc55cSDimitry Andric   /// function addrs.
EPCGenericMemoryAccess(ExecutorProcessControl & EPC,FuncAddrs FAs)40349cc55cSDimitry Andric   EPCGenericMemoryAccess(ExecutorProcessControl &EPC, FuncAddrs FAs)
41349cc55cSDimitry Andric       : EPC(EPC), FAs(FAs) {}
42349cc55cSDimitry Andric 
writeUInt8sAsync(ArrayRef<tpctypes::UInt8Write> Ws,WriteResultFn OnWriteComplete)43349cc55cSDimitry Andric   void writeUInt8sAsync(ArrayRef<tpctypes::UInt8Write> Ws,
44349cc55cSDimitry Andric                         WriteResultFn OnWriteComplete) override {
45349cc55cSDimitry Andric     using namespace shared;
46349cc55cSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt8Write>)>(
47349cc55cSDimitry Andric         FAs.WriteUInt8s, std::move(OnWriteComplete), Ws);
48349cc55cSDimitry Andric   }
49349cc55cSDimitry Andric 
writeUInt16sAsync(ArrayRef<tpctypes::UInt16Write> Ws,WriteResultFn OnWriteComplete)50349cc55cSDimitry Andric   void writeUInt16sAsync(ArrayRef<tpctypes::UInt16Write> Ws,
51349cc55cSDimitry Andric                          WriteResultFn OnWriteComplete) override {
52349cc55cSDimitry Andric     using namespace shared;
53349cc55cSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt16Write>)>(
54349cc55cSDimitry Andric         FAs.WriteUInt16s, std::move(OnWriteComplete), Ws);
55349cc55cSDimitry Andric   }
56349cc55cSDimitry Andric 
writeUInt32sAsync(ArrayRef<tpctypes::UInt32Write> Ws,WriteResultFn OnWriteComplete)57349cc55cSDimitry Andric   void writeUInt32sAsync(ArrayRef<tpctypes::UInt32Write> Ws,
58349cc55cSDimitry Andric                          WriteResultFn OnWriteComplete) override {
59349cc55cSDimitry Andric     using namespace shared;
60349cc55cSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt32Write>)>(
61349cc55cSDimitry Andric         FAs.WriteUInt32s, std::move(OnWriteComplete), Ws);
62349cc55cSDimitry Andric   }
63349cc55cSDimitry Andric 
writeUInt64sAsync(ArrayRef<tpctypes::UInt64Write> Ws,WriteResultFn OnWriteComplete)64349cc55cSDimitry Andric   void writeUInt64sAsync(ArrayRef<tpctypes::UInt64Write> Ws,
65349cc55cSDimitry Andric                          WriteResultFn OnWriteComplete) override {
66349cc55cSDimitry Andric     using namespace shared;
67349cc55cSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessUInt64Write>)>(
68349cc55cSDimitry Andric         FAs.WriteUInt64s, std::move(OnWriteComplete), Ws);
69349cc55cSDimitry Andric   }
70349cc55cSDimitry Andric 
writeBuffersAsync(ArrayRef<tpctypes::BufferWrite> Ws,WriteResultFn OnWriteComplete)71349cc55cSDimitry Andric   void writeBuffersAsync(ArrayRef<tpctypes::BufferWrite> Ws,
72349cc55cSDimitry Andric                          WriteResultFn OnWriteComplete) override {
73349cc55cSDimitry Andric     using namespace shared;
74349cc55cSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessBufferWrite>)>(
75349cc55cSDimitry Andric         FAs.WriteBuffers, std::move(OnWriteComplete), Ws);
76349cc55cSDimitry Andric   }
77349cc55cSDimitry Andric 
writePointersAsync(ArrayRef<tpctypes::PointerWrite> Ws,WriteResultFn OnWriteComplete)78*5f757f3fSDimitry Andric   void writePointersAsync(ArrayRef<tpctypes::PointerWrite> Ws,
79*5f757f3fSDimitry Andric                           WriteResultFn OnWriteComplete) override {
80*5f757f3fSDimitry Andric     using namespace shared;
81*5f757f3fSDimitry Andric     EPC.callSPSWrapperAsync<void(SPSSequence<SPSMemoryAccessPointerWrite>)>(
82*5f757f3fSDimitry Andric         FAs.WritePointers, std::move(OnWriteComplete), Ws);
83*5f757f3fSDimitry Andric   }
84*5f757f3fSDimitry Andric 
85349cc55cSDimitry Andric private:
86349cc55cSDimitry Andric   ExecutorProcessControl &EPC;
87349cc55cSDimitry Andric   FuncAddrs FAs;
88349cc55cSDimitry Andric };
89349cc55cSDimitry Andric 
90349cc55cSDimitry Andric } // end namespace orc
91349cc55cSDimitry Andric } // end namespace llvm
92349cc55cSDimitry Andric 
93349cc55cSDimitry Andric #endif // LLVM_EXECUTIONENGINE_ORC_EPCGENERICMEMORYACCESS_H
94