Home | History | Annotate | Download | only in Orc
      1 //===--- OrcRemoteTargetRPCAPI.h - Orc Remote-target RPC API ----*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the Orc remote-target RPC API. It should not be used
     11 // directly, but is used by the RemoteTargetClient and RemoteTargetServer
     12 // classes.
     13 //
     14 //===----------------------------------------------------------------------===//
     15 
     16 #ifndef LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
     17 #define LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
     18 
     19 #include "JITSymbol.h"
     20 #include "RPCChannel.h"
     21 #include "RPCUtils.h"
     22 
     23 namespace llvm {
     24 namespace orc {
     25 namespace remote {
     26 
     27 class DirectBufferWriter {
     28 public:
     29   DirectBufferWriter() = default;
     30   DirectBufferWriter(const char *Src, TargetAddress Dst, uint64_t Size)
     31       : Src(Src), Dst(Dst), Size(Size) {}
     32 
     33   const char *getSrc() const { return Src; }
     34   TargetAddress getDst() const { return Dst; }
     35   uint64_t getSize() const { return Size; }
     36 
     37 private:
     38   const char *Src;
     39   TargetAddress Dst;
     40   uint64_t Size;
     41 };
     42 
     43 inline Error serialize(RPCChannel &C, const DirectBufferWriter &DBW) {
     44   if (auto EC = serialize(C, DBW.getDst()))
     45     return EC;
     46   if (auto EC = serialize(C, DBW.getSize()))
     47     return EC;
     48   return C.appendBytes(DBW.getSrc(), DBW.getSize());
     49 }
     50 
     51 inline Error deserialize(RPCChannel &C, DirectBufferWriter &DBW) {
     52   TargetAddress Dst;
     53   if (auto EC = deserialize(C, Dst))
     54     return EC;
     55   uint64_t Size;
     56   if (auto EC = deserialize(C, Size))
     57     return EC;
     58   char *Addr = reinterpret_cast<char *>(static_cast<uintptr_t>(Dst));
     59 
     60   DBW = DirectBufferWriter(0, Dst, Size);
     61 
     62   return C.readBytes(Addr, Size);
     63 }
     64 
     65 class OrcRemoteTargetRPCAPI : public RPC<RPCChannel> {
     66 protected:
     67   class ResourceIdMgr {
     68   public:
     69     typedef uint64_t ResourceId;
     70     static const ResourceId InvalidId = ~0U;
     71 
     72     ResourceId getNext() {
     73       if (!FreeIds.empty()) {
     74         ResourceId I = FreeIds.back();
     75         FreeIds.pop_back();
     76         return I;
     77       }
     78       return NextId++;
     79     }
     80     void release(ResourceId I) { FreeIds.push_back(I); }
     81 
     82   private:
     83     ResourceId NextId = 0;
     84     std::vector<ResourceId> FreeIds;
     85   };
     86 
     87 public:
     88   // FIXME: Remove constructors once MSVC supports synthesizing move-ops.
     89   OrcRemoteTargetRPCAPI() = default;
     90   OrcRemoteTargetRPCAPI(const OrcRemoteTargetRPCAPI &) = delete;
     91   OrcRemoteTargetRPCAPI &operator=(const OrcRemoteTargetRPCAPI &) = delete;
     92 
     93   OrcRemoteTargetRPCAPI(OrcRemoteTargetRPCAPI &&) {}
     94   OrcRemoteTargetRPCAPI &operator=(OrcRemoteTargetRPCAPI &&) { return *this; }
     95 
     96   enum JITFuncId : uint32_t {
     97     InvalidId = RPCFunctionIdTraits<JITFuncId>::InvalidId,
     98     CallIntVoidId = RPCFunctionIdTraits<JITFuncId>::FirstValidId,
     99     CallMainId,
    100     CallVoidVoidId,
    101     CreateRemoteAllocatorId,
    102     CreateIndirectStubsOwnerId,
    103     DeregisterEHFramesId,
    104     DestroyRemoteAllocatorId,
    105     DestroyIndirectStubsOwnerId,
    106     EmitIndirectStubsId,
    107     EmitResolverBlockId,
    108     EmitTrampolineBlockId,
    109     GetSymbolAddressId,
    110     GetRemoteInfoId,
    111     ReadMemId,
    112     RegisterEHFramesId,
    113     ReserveMemId,
    114     RequestCompileId,
    115     SetProtectionsId,
    116     TerminateSessionId,
    117     WriteMemId,
    118     WritePtrId
    119   };
    120 
    121   static const char *getJITFuncIdName(JITFuncId Id);
    122 
    123   typedef Function<CallIntVoidId, int32_t(TargetAddress Addr)> CallIntVoid;
    124 
    125   typedef Function<CallMainId,
    126                    int32_t(TargetAddress Addr, std::vector<std::string> Args)>
    127       CallMain;
    128 
    129   typedef Function<CallVoidVoidId, void(TargetAddress FnAddr)> CallVoidVoid;
    130 
    131   typedef Function<CreateRemoteAllocatorId,
    132                    void(ResourceIdMgr::ResourceId AllocatorID)>
    133       CreateRemoteAllocator;
    134 
    135   typedef Function<CreateIndirectStubsOwnerId,
    136                    void(ResourceIdMgr::ResourceId StubOwnerID)>
    137       CreateIndirectStubsOwner;
    138 
    139   typedef Function<DeregisterEHFramesId,
    140                    void(TargetAddress Addr, uint32_t Size)>
    141       DeregisterEHFrames;
    142 
    143   typedef Function<DestroyRemoteAllocatorId,
    144                    void(ResourceIdMgr::ResourceId AllocatorID)>
    145       DestroyRemoteAllocator;
    146 
    147   typedef Function<DestroyIndirectStubsOwnerId,
    148                    void(ResourceIdMgr::ResourceId StubsOwnerID)>
    149       DestroyIndirectStubsOwner;
    150 
    151   /// EmitIndirectStubs result is (StubsBase, PtrsBase, NumStubsEmitted).
    152   typedef Function<EmitIndirectStubsId,
    153                    std::tuple<TargetAddress, TargetAddress, uint32_t>(
    154                        ResourceIdMgr::ResourceId StubsOwnerID,
    155                        uint32_t NumStubsRequired)>
    156       EmitIndirectStubs;
    157 
    158   typedef Function<EmitResolverBlockId, void()> EmitResolverBlock;
    159 
    160   /// EmitTrampolineBlock result is (BlockAddr, NumTrampolines).
    161   typedef Function<EmitTrampolineBlockId, std::tuple<TargetAddress, uint32_t>()>
    162       EmitTrampolineBlock;
    163 
    164   typedef Function<GetSymbolAddressId, TargetAddress(std::string SymbolName)>
    165       GetSymbolAddress;
    166 
    167   /// GetRemoteInfo result is (Triple, PointerSize, PageSize, TrampolineSize,
    168   ///                          IndirectStubsSize).
    169   typedef Function<GetRemoteInfoId, std::tuple<std::string, uint32_t, uint32_t,
    170                                                uint32_t, uint32_t>()>
    171       GetRemoteInfo;
    172 
    173   typedef Function<ReadMemId,
    174                    std::vector<char>(TargetAddress Src, uint64_t Size)>
    175       ReadMem;
    176 
    177   typedef Function<RegisterEHFramesId, void(TargetAddress Addr, uint32_t Size)>
    178       RegisterEHFrames;
    179 
    180   typedef Function<ReserveMemId,
    181                    TargetAddress(ResourceIdMgr::ResourceId AllocID,
    182                                  uint64_t Size, uint32_t Align)>
    183       ReserveMem;
    184 
    185   typedef Function<RequestCompileId,
    186                    TargetAddress(TargetAddress TrampolineAddr)>
    187       RequestCompile;
    188 
    189   typedef Function<SetProtectionsId,
    190                    void(ResourceIdMgr::ResourceId AllocID, TargetAddress Dst,
    191                         uint32_t ProtFlags)>
    192       SetProtections;
    193 
    194   typedef Function<TerminateSessionId, void()> TerminateSession;
    195 
    196   typedef Function<WriteMemId, void(DirectBufferWriter DB)> WriteMem;
    197 
    198   typedef Function<WritePtrId, void(TargetAddress Dst, TargetAddress Val)>
    199       WritePtr;
    200 };
    201 
    202 } // end namespace remote
    203 } // end namespace orc
    204 } // end namespace llvm
    205 
    206 #endif
    207