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