1e8d8bef9SDimitry Andric //===--- TargetProcessControlTypes.h -- Shared Core/TPC types ---*- C++ -*-===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric // 9e8d8bef9SDimitry Andric // TargetProcessControl types that are used by both the Orc and 10e8d8bef9SDimitry Andric // OrcTargetProcess libraries. 11e8d8bef9SDimitry Andric // 12e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 13e8d8bef9SDimitry Andric 14e8d8bef9SDimitry Andric #ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H 15e8d8bef9SDimitry Andric #define LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H 16e8d8bef9SDimitry Andric 17e8d8bef9SDimitry Andric #include "llvm/ADT/ArrayRef.h" 18e8d8bef9SDimitry Andric #include "llvm/ADT/StringRef.h" 19e8d8bef9SDimitry Andric #include "llvm/ExecutionEngine/JITSymbol.h" 2004eeddc0SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/AllocationActions.h" 21349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h" 22*bdd1243dSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/MemoryFlags.h" 23349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h" 24349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h" 25349cc55cSDimitry Andric #include "llvm/Support/Memory.h" 26e8d8bef9SDimitry Andric 27e8d8bef9SDimitry Andric #include <vector> 28e8d8bef9SDimitry Andric 29e8d8bef9SDimitry Andric namespace llvm { 30e8d8bef9SDimitry Andric namespace orc { 31e8d8bef9SDimitry Andric namespace tpctypes { 32e8d8bef9SDimitry Andric 33349cc55cSDimitry Andric struct SegFinalizeRequest { 34*bdd1243dSDimitry Andric AllocGroup AG; 35349cc55cSDimitry Andric ExecutorAddr Addr; 36349cc55cSDimitry Andric uint64_t Size; 37349cc55cSDimitry Andric ArrayRef<char> Content; 38349cc55cSDimitry Andric }; 39349cc55cSDimitry Andric 40349cc55cSDimitry Andric struct FinalizeRequest { 41349cc55cSDimitry Andric std::vector<SegFinalizeRequest> Segments; 4204eeddc0SDimitry Andric shared::AllocActions Actions; 43349cc55cSDimitry Andric }; 44349cc55cSDimitry Andric 45fcaf7f86SDimitry Andric struct SharedMemorySegFinalizeRequest { 46*bdd1243dSDimitry Andric AllocGroup AG; 47fcaf7f86SDimitry Andric ExecutorAddr Addr; 48fcaf7f86SDimitry Andric uint64_t Size; 49fcaf7f86SDimitry Andric }; 50fcaf7f86SDimitry Andric 51fcaf7f86SDimitry Andric struct SharedMemoryFinalizeRequest { 52fcaf7f86SDimitry Andric std::vector<SharedMemorySegFinalizeRequest> Segments; 53fcaf7f86SDimitry Andric shared::AllocActions Actions; 54fcaf7f86SDimitry Andric }; 55fcaf7f86SDimitry Andric 56e8d8bef9SDimitry Andric template <typename T> struct UIntWrite { 57e8d8bef9SDimitry Andric UIntWrite() = default; 58349cc55cSDimitry Andric UIntWrite(ExecutorAddr Addr, T Value) : Addr(Addr), Value(Value) {} 59e8d8bef9SDimitry Andric 60349cc55cSDimitry Andric ExecutorAddr Addr; 61e8d8bef9SDimitry Andric T Value = 0; 62e8d8bef9SDimitry Andric }; 63e8d8bef9SDimitry Andric 64e8d8bef9SDimitry Andric /// Describes a write to a uint8_t. 65e8d8bef9SDimitry Andric using UInt8Write = UIntWrite<uint8_t>; 66e8d8bef9SDimitry Andric 67e8d8bef9SDimitry Andric /// Describes a write to a uint16_t. 68e8d8bef9SDimitry Andric using UInt16Write = UIntWrite<uint16_t>; 69e8d8bef9SDimitry Andric 70e8d8bef9SDimitry Andric /// Describes a write to a uint32_t. 71e8d8bef9SDimitry Andric using UInt32Write = UIntWrite<uint32_t>; 72e8d8bef9SDimitry Andric 73e8d8bef9SDimitry Andric /// Describes a write to a uint64_t. 74e8d8bef9SDimitry Andric using UInt64Write = UIntWrite<uint64_t>; 75e8d8bef9SDimitry Andric 76e8d8bef9SDimitry Andric /// Describes a write to a buffer. 77e8d8bef9SDimitry Andric /// For use with TargetProcessControl::MemoryAccess objects. 78e8d8bef9SDimitry Andric struct BufferWrite { 79e8d8bef9SDimitry Andric BufferWrite() = default; 80349cc55cSDimitry Andric BufferWrite(ExecutorAddr Addr, StringRef Buffer) 81349cc55cSDimitry Andric : Addr(Addr), Buffer(Buffer) {} 82e8d8bef9SDimitry Andric 83349cc55cSDimitry Andric ExecutorAddr Addr; 84e8d8bef9SDimitry Andric StringRef Buffer; 85e8d8bef9SDimitry Andric }; 86e8d8bef9SDimitry Andric 87e8d8bef9SDimitry Andric /// A handle used to represent a loaded dylib in the target process. 88*bdd1243dSDimitry Andric using DylibHandle = ExecutorAddr; 89e8d8bef9SDimitry Andric 90*bdd1243dSDimitry Andric using LookupResult = std::vector<ExecutorAddr>; 91e8d8bef9SDimitry Andric 92e8d8bef9SDimitry Andric } // end namespace tpctypes 93349cc55cSDimitry Andric 94349cc55cSDimitry Andric namespace shared { 95349cc55cSDimitry Andric 96*bdd1243dSDimitry Andric class SPSAllocGroup {}; 97349cc55cSDimitry Andric 98349cc55cSDimitry Andric using SPSSegFinalizeRequest = 99*bdd1243dSDimitry Andric SPSTuple<SPSAllocGroup, SPSExecutorAddr, uint64_t, SPSSequence<char>>; 100349cc55cSDimitry Andric 101349cc55cSDimitry Andric using SPSFinalizeRequest = SPSTuple<SPSSequence<SPSSegFinalizeRequest>, 10204eeddc0SDimitry Andric SPSSequence<SPSAllocActionCallPair>>; 103349cc55cSDimitry Andric 104fcaf7f86SDimitry Andric using SPSSharedMemorySegFinalizeRequest = 105*bdd1243dSDimitry Andric SPSTuple<SPSAllocGroup, SPSExecutorAddr, uint64_t>; 106fcaf7f86SDimitry Andric 107fcaf7f86SDimitry Andric using SPSSharedMemoryFinalizeRequest = 108fcaf7f86SDimitry Andric SPSTuple<SPSSequence<SPSSharedMemorySegFinalizeRequest>, 109fcaf7f86SDimitry Andric SPSSequence<SPSAllocActionCallPair>>; 110fcaf7f86SDimitry Andric 111349cc55cSDimitry Andric template <typename T> 112349cc55cSDimitry Andric using SPSMemoryAccessUIntWrite = SPSTuple<SPSExecutorAddr, T>; 113349cc55cSDimitry Andric 114349cc55cSDimitry Andric using SPSMemoryAccessUInt8Write = SPSMemoryAccessUIntWrite<uint8_t>; 115349cc55cSDimitry Andric using SPSMemoryAccessUInt16Write = SPSMemoryAccessUIntWrite<uint16_t>; 116349cc55cSDimitry Andric using SPSMemoryAccessUInt32Write = SPSMemoryAccessUIntWrite<uint32_t>; 117349cc55cSDimitry Andric using SPSMemoryAccessUInt64Write = SPSMemoryAccessUIntWrite<uint64_t>; 118349cc55cSDimitry Andric 119349cc55cSDimitry Andric using SPSMemoryAccessBufferWrite = SPSTuple<SPSExecutorAddr, SPSSequence<char>>; 120349cc55cSDimitry Andric 121*bdd1243dSDimitry Andric template <> class SPSSerializationTraits<SPSAllocGroup, AllocGroup> { 122*bdd1243dSDimitry Andric enum WireBits { 123*bdd1243dSDimitry Andric ReadBit = 1 << 0, 124*bdd1243dSDimitry Andric WriteBit = 1 << 1, 125*bdd1243dSDimitry Andric ExecBit = 1 << 2, 126*bdd1243dSDimitry Andric FinalizeBit = 1 << 3 127*bdd1243dSDimitry Andric }; 128*bdd1243dSDimitry Andric 129349cc55cSDimitry Andric public: 130*bdd1243dSDimitry Andric static size_t size(const AllocGroup &AG) { 131*bdd1243dSDimitry Andric // All AllocGroup values encode to the same size. 132*bdd1243dSDimitry Andric return SPSArgList<uint8_t>::size(uint8_t(0)); 133349cc55cSDimitry Andric } 134349cc55cSDimitry Andric 135*bdd1243dSDimitry Andric static bool serialize(SPSOutputBuffer &OB, const AllocGroup &AG) { 136*bdd1243dSDimitry Andric uint8_t WireValue = 0; 137*bdd1243dSDimitry Andric if ((AG.getMemProt() & MemProt::Read) != MemProt::None) 138*bdd1243dSDimitry Andric WireValue |= ReadBit; 139*bdd1243dSDimitry Andric if ((AG.getMemProt() & MemProt::Write) != MemProt::None) 140*bdd1243dSDimitry Andric WireValue |= WriteBit; 141*bdd1243dSDimitry Andric if ((AG.getMemProt() & MemProt::Exec) != MemProt::None) 142*bdd1243dSDimitry Andric WireValue |= ExecBit; 143*bdd1243dSDimitry Andric if (AG.getMemDeallocPolicy() == MemDeallocPolicy::Finalize) 144*bdd1243dSDimitry Andric WireValue |= FinalizeBit; 145*bdd1243dSDimitry Andric return SPSArgList<uint8_t>::serialize(OB, WireValue); 146349cc55cSDimitry Andric } 147349cc55cSDimitry Andric 148*bdd1243dSDimitry Andric static bool deserialize(SPSInputBuffer &IB, AllocGroup &AG) { 149349cc55cSDimitry Andric uint8_t Val; 150349cc55cSDimitry Andric if (!SPSArgList<uint8_t>::deserialize(IB, Val)) 151349cc55cSDimitry Andric return false; 152*bdd1243dSDimitry Andric MemProt MP = MemProt::None; 153*bdd1243dSDimitry Andric if (Val & ReadBit) 154*bdd1243dSDimitry Andric MP |= MemProt::Read; 155*bdd1243dSDimitry Andric if (Val & WriteBit) 156*bdd1243dSDimitry Andric MP |= MemProt::Write; 157*bdd1243dSDimitry Andric if (Val & ExecBit) 158*bdd1243dSDimitry Andric MP |= MemProt::Exec; 159*bdd1243dSDimitry Andric MemDeallocPolicy MDP = (Val & FinalizeBit) ? MemDeallocPolicy::Finalize 160*bdd1243dSDimitry Andric : MemDeallocPolicy::Standard; 161*bdd1243dSDimitry Andric AG = AllocGroup(MP, MDP); 162349cc55cSDimitry Andric return true; 163349cc55cSDimitry Andric } 164349cc55cSDimitry Andric }; 165349cc55cSDimitry Andric 166349cc55cSDimitry Andric template <> 167349cc55cSDimitry Andric class SPSSerializationTraits<SPSSegFinalizeRequest, 168349cc55cSDimitry Andric tpctypes::SegFinalizeRequest> { 169349cc55cSDimitry Andric using SFRAL = SPSSegFinalizeRequest::AsArgList; 170349cc55cSDimitry Andric 171349cc55cSDimitry Andric public: 172349cc55cSDimitry Andric static size_t size(const tpctypes::SegFinalizeRequest &SFR) { 173*bdd1243dSDimitry Andric return SFRAL::size(SFR.AG, SFR.Addr, SFR.Size, SFR.Content); 174349cc55cSDimitry Andric } 175349cc55cSDimitry Andric 176349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 177349cc55cSDimitry Andric const tpctypes::SegFinalizeRequest &SFR) { 178*bdd1243dSDimitry Andric return SFRAL::serialize(OB, SFR.AG, SFR.Addr, SFR.Size, SFR.Content); 179349cc55cSDimitry Andric } 180349cc55cSDimitry Andric 181349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, 182349cc55cSDimitry Andric tpctypes::SegFinalizeRequest &SFR) { 183*bdd1243dSDimitry Andric return SFRAL::deserialize(IB, SFR.AG, SFR.Addr, SFR.Size, SFR.Content); 184349cc55cSDimitry Andric } 185349cc55cSDimitry Andric }; 186349cc55cSDimitry Andric 187349cc55cSDimitry Andric template <> 188349cc55cSDimitry Andric class SPSSerializationTraits<SPSFinalizeRequest, tpctypes::FinalizeRequest> { 189349cc55cSDimitry Andric using FRAL = SPSFinalizeRequest::AsArgList; 190349cc55cSDimitry Andric 191349cc55cSDimitry Andric public: 192349cc55cSDimitry Andric static size_t size(const tpctypes::FinalizeRequest &FR) { 193349cc55cSDimitry Andric return FRAL::size(FR.Segments, FR.Actions); 194349cc55cSDimitry Andric } 195349cc55cSDimitry Andric 196349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 197349cc55cSDimitry Andric const tpctypes::FinalizeRequest &FR) { 198349cc55cSDimitry Andric return FRAL::serialize(OB, FR.Segments, FR.Actions); 199349cc55cSDimitry Andric } 200349cc55cSDimitry Andric 201349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, tpctypes::FinalizeRequest &FR) { 202349cc55cSDimitry Andric return FRAL::deserialize(IB, FR.Segments, FR.Actions); 203349cc55cSDimitry Andric } 204349cc55cSDimitry Andric }; 205349cc55cSDimitry Andric 206fcaf7f86SDimitry Andric template <> 207fcaf7f86SDimitry Andric class SPSSerializationTraits<SPSSharedMemorySegFinalizeRequest, 208fcaf7f86SDimitry Andric tpctypes::SharedMemorySegFinalizeRequest> { 209fcaf7f86SDimitry Andric using SFRAL = SPSSharedMemorySegFinalizeRequest::AsArgList; 210fcaf7f86SDimitry Andric 211fcaf7f86SDimitry Andric public: 212fcaf7f86SDimitry Andric static size_t size(const tpctypes::SharedMemorySegFinalizeRequest &SFR) { 213*bdd1243dSDimitry Andric return SFRAL::size(SFR.AG, SFR.Addr, SFR.Size); 214fcaf7f86SDimitry Andric } 215fcaf7f86SDimitry Andric 216fcaf7f86SDimitry Andric static bool serialize(SPSOutputBuffer &OB, 217fcaf7f86SDimitry Andric const tpctypes::SharedMemorySegFinalizeRequest &SFR) { 218*bdd1243dSDimitry Andric return SFRAL::serialize(OB, SFR.AG, SFR.Addr, SFR.Size); 219fcaf7f86SDimitry Andric } 220fcaf7f86SDimitry Andric 221fcaf7f86SDimitry Andric static bool deserialize(SPSInputBuffer &IB, 222fcaf7f86SDimitry Andric tpctypes::SharedMemorySegFinalizeRequest &SFR) { 223*bdd1243dSDimitry Andric return SFRAL::deserialize(IB, SFR.AG, SFR.Addr, SFR.Size); 224fcaf7f86SDimitry Andric } 225fcaf7f86SDimitry Andric }; 226fcaf7f86SDimitry Andric 227fcaf7f86SDimitry Andric template <> 228fcaf7f86SDimitry Andric class SPSSerializationTraits<SPSSharedMemoryFinalizeRequest, 229fcaf7f86SDimitry Andric tpctypes::SharedMemoryFinalizeRequest> { 230fcaf7f86SDimitry Andric using FRAL = SPSSharedMemoryFinalizeRequest::AsArgList; 231fcaf7f86SDimitry Andric 232fcaf7f86SDimitry Andric public: 233fcaf7f86SDimitry Andric static size_t size(const tpctypes::SharedMemoryFinalizeRequest &FR) { 234fcaf7f86SDimitry Andric return FRAL::size(FR.Segments, FR.Actions); 235fcaf7f86SDimitry Andric } 236fcaf7f86SDimitry Andric 237fcaf7f86SDimitry Andric static bool serialize(SPSOutputBuffer &OB, 238fcaf7f86SDimitry Andric const tpctypes::SharedMemoryFinalizeRequest &FR) { 239fcaf7f86SDimitry Andric return FRAL::serialize(OB, FR.Segments, FR.Actions); 240fcaf7f86SDimitry Andric } 241fcaf7f86SDimitry Andric 242fcaf7f86SDimitry Andric static bool deserialize(SPSInputBuffer &IB, 243fcaf7f86SDimitry Andric tpctypes::SharedMemoryFinalizeRequest &FR) { 244fcaf7f86SDimitry Andric return FRAL::deserialize(IB, FR.Segments, FR.Actions); 245fcaf7f86SDimitry Andric } 246fcaf7f86SDimitry Andric }; 247fcaf7f86SDimitry Andric 248349cc55cSDimitry Andric template <typename T> 249349cc55cSDimitry Andric class SPSSerializationTraits<SPSMemoryAccessUIntWrite<T>, 250349cc55cSDimitry Andric tpctypes::UIntWrite<T>> { 251349cc55cSDimitry Andric public: 252349cc55cSDimitry Andric static size_t size(const tpctypes::UIntWrite<T> &W) { 253349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, T>::AsArgList::size(W.Addr, W.Value); 254349cc55cSDimitry Andric } 255349cc55cSDimitry Andric 256349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, const tpctypes::UIntWrite<T> &W) { 257349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, T>::AsArgList::serialize(OB, W.Addr, 258349cc55cSDimitry Andric W.Value); 259349cc55cSDimitry Andric } 260349cc55cSDimitry Andric 261349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, tpctypes::UIntWrite<T> &W) { 262349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, T>::AsArgList::deserialize(IB, W.Addr, 263349cc55cSDimitry Andric W.Value); 264349cc55cSDimitry Andric } 265349cc55cSDimitry Andric }; 266349cc55cSDimitry Andric 267349cc55cSDimitry Andric template <> 268349cc55cSDimitry Andric class SPSSerializationTraits<SPSMemoryAccessBufferWrite, 269349cc55cSDimitry Andric tpctypes::BufferWrite> { 270349cc55cSDimitry Andric public: 271349cc55cSDimitry Andric static size_t size(const tpctypes::BufferWrite &W) { 272349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList::size( 273349cc55cSDimitry Andric W.Addr, W.Buffer); 274349cc55cSDimitry Andric } 275349cc55cSDimitry Andric 276349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, const tpctypes::BufferWrite &W) { 277349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList ::serialize( 278349cc55cSDimitry Andric OB, W.Addr, W.Buffer); 279349cc55cSDimitry Andric } 280349cc55cSDimitry Andric 281349cc55cSDimitry Andric static bool deserialize(SPSInputBuffer &IB, tpctypes::BufferWrite &W) { 282349cc55cSDimitry Andric return SPSTuple<SPSExecutorAddr, 283349cc55cSDimitry Andric SPSSequence<char>>::AsArgList ::deserialize(IB, W.Addr, 284349cc55cSDimitry Andric W.Buffer); 285349cc55cSDimitry Andric } 286349cc55cSDimitry Andric }; 287349cc55cSDimitry Andric 288349cc55cSDimitry Andric } // end namespace shared 289e8d8bef9SDimitry Andric } // end namespace orc 290e8d8bef9SDimitry Andric } // end namespace llvm 291e8d8bef9SDimitry Andric 292e8d8bef9SDimitry Andric #endif // LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H 293