LLVM 23.0.0git
SimpleRemoteEPC.h
Go to the documentation of this file.
1//===---- SimpleRemoteEPC.h - Simple remote executor control ----*- 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// Simple remote executor process control.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEEPC_H
14#define LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEEPC_H
15
16#include "llvm/ADT/DenseMap.h"
21#include "llvm/Support/Error.h"
23
24#include <future>
25
26namespace llvm {
27namespace orc {
28
31public:
32 /// A setup object containing a callback to construct a memory manager.
33 /// If not specified, EPCGenericJITLinkMemoryManager will be used.
41
42 /// Create a SimpleRemoteEPC using the given transport type and args.
43 template <typename TransportT, typename... TransportTCtorArgTs>
45 Create(std::unique_ptr<TaskDispatcher> D, Setup S,
46 TransportTCtorArgTs &&...TransportTCtorArgs) {
47 std::unique_ptr<SimpleRemoteEPC> SREPC(
48 new SimpleRemoteEPC(std::make_shared<SymbolStringPool>(),
49 std::move(D)));
50 auto T = TransportT::Create(
51 *SREPC, std::forward<TransportTCtorArgTs>(TransportTCtorArgs)...);
52 if (!T)
53 return T.takeError();
54 SREPC->T = std::move(*T);
55 if (auto Err = SREPC->setup(std::move(S)))
56 return joinErrors(std::move(Err), SREPC->disconnect());
57 return std::move(SREPC);
58 }
59
64 ~SimpleRemoteEPC() override;
65
67 ArrayRef<std::string> Args) override;
68
70
71 Expected<int32_t> runAsIntFunction(ExecutorAddr IntFnAddr, int Arg) override;
72
73 void callWrapperAsync(ExecutorAddr WrapperFnAddr,
74 IncomingWFRHandler OnComplete,
75 ArrayRef<char> ArgBuffer) override;
76
78
80
81 Error disconnect() override;
82
85 shared::WrapperFunctionBuffer ArgBytes) override;
86
87 void handleDisconnect(Error Err) override;
88
89private:
90 SimpleRemoteEPC(std::shared_ptr<SymbolStringPool> SSP,
91 std::unique_ptr<TaskDispatcher> D)
93
95 createDefaultMemoryManager(SimpleRemoteEPC &SREPC);
96
97 Error sendMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo,
98 ExecutorAddr TagAddr, ArrayRef<char> ArgBytes);
99
100 Error handleSetup(uint64_t SeqNo, ExecutorAddr TagAddr,
102 Error setup(Setup S);
103
104 Error handleResult(uint64_t SeqNo, ExecutorAddr TagAddr,
106 void handleCallWrapper(uint64_t RemoteSeqNo, ExecutorAddr TagAddr,
108 Error handleHangup(shared::WrapperFunctionBuffer ArgBytes);
109
110 uint64_t getNextSeqNo() { return NextSeqNo++; }
111 void releaseSeqNo(uint64_t SeqNo) {}
112
113 using PendingCallWrapperResultsMap =
114 DenseMap<uint64_t, IncomingWFRHandler>;
115
116 std::mutex SimpleRemoteEPCMutex;
117 std::condition_variable DisconnectCV;
118 bool Disconnected = false;
119 Error DisconnectErr = Error::success();
120
121 std::unique_ptr<SimpleRemoteEPCTransport> T;
122 std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr;
123
124 ExecutorAddr RunAsMainAddr;
125 ExecutorAddr RunAsVoidFunctionAddr;
126 ExecutorAddr RunAsIntFunctionAddr;
127
128 uint64_t NextSeqNo = 0;
129 PendingCallWrapperResultsMap PendingCallWrapperResults;
130};
131
132} // end namespace orc
133} // end namespace llvm
134
135#endif // LLVM_EXECUTIONENGINE_ORC_SIMPLEREMOTEEPC_H
#define LLVM_ABI
Definition Compiler.h:213
This file defines the DenseMap class.
This file provides a collection of function (or more generally, callable) type erasure utilities supp...
#define T
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
Represents an address in the executor process.
A handler or incoming WrapperFunctionBuffers – either return values from callWrapper* calls,...
std::unique_ptr< TaskDispatcher > D
std::shared_ptr< SymbolStringPool > SSP
ExecutorProcessControl(std::shared_ptr< SymbolStringPool > SSP, std::unique_ptr< TaskDispatcher > D)
void handleDisconnect(Error Err) override
Handle a disconnection from the underlying transport.
SimpleRemoteEPC & operator=(const SimpleRemoteEPC &)=delete
Expected< std::unique_ptr< MemoryAccess > > createDefaultMemoryAccess() override
Create a default MemoryAccess for the target process.
Expected< int32_t > runAsMain(ExecutorAddr MainFnAddr, ArrayRef< std::string > Args) override
Run function with a main-like signature.
static Expected< std::unique_ptr< SimpleRemoteEPC > > Create(std::unique_ptr< TaskDispatcher > D, Setup S, TransportTCtorArgTs &&...TransportTCtorArgs)
Create a SimpleRemoteEPC using the given transport type and args.
SimpleRemoteEPC(const SimpleRemoteEPC &)=delete
Expected< HandleMessageAction > handleMessage(SimpleRemoteEPCOpcode OpC, uint64_t SeqNo, ExecutorAddr TagAddr, shared::WrapperFunctionBuffer ArgBytes) override
Handle receipt of a message.
Expected< std::unique_ptr< DylibManager > > createDefaultDylibMgr() override
Create a default DylibManager for the target process.
Error disconnect() override
Disconnect from the target process.
Expected< int32_t > runAsVoidFunction(ExecutorAddr VoidFnAddr) override
Run function with a int (*)(void) signature.
SimpleRemoteEPC(SimpleRemoteEPC &&)=delete
SimpleRemoteEPC & operator=(SimpleRemoteEPC &&)=delete
void callWrapperAsync(ExecutorAddr WrapperFnAddr, IncomingWFRHandler OnComplete, ArrayRef< char > ArgBuffer) override
Run a wrapper function in the executor.
Expected< int32_t > runAsIntFunction(ExecutorAddr IntFnAddr, int Arg) override
Run function with a int (*)(int) signature.
C++ wrapper function buffer: Same as CWrapperFunctionBuffer but auto-releases memory.
unique_function is a type-erasing functor similar to std::function.
This is an optimization pass for GlobalISel generic memory operations.
Error joinErrors(Error E1, Error E2)
Concatenate errors.
Definition Error.h:442
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
A setup object containing a callback to construct a memory manager.
Expected< std::unique_ptr< jitlink::JITLinkMemoryManager > >( SimpleRemoteEPC &) CreateMemoryManagerFn
unique_function< CreateMemoryManagerFn > CreateMemoryManager