17#define DEBUG_TYPE "orc"
27 std::shared_ptr<SymbolStringPool> SSP, std::unique_ptr<TaskDispatcher>
D,
29 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr)
32 OwnedMemMgr = std::move(
MemMgr);
34 OwnedMemMgr = std::make_unique<jitlink::InProcessMemoryManager>(
39 this->MemMgr = OwnedMemMgr.get();
44 GlobalManglingPrefix =
'_';
49 std::shared_ptr<SymbolStringPool> SSP,
50 std::unique_ptr<TaskDispatcher>
D,
51 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr) {
54 SSP = std::make_shared<SymbolStringPool>();
57#if LLVM_ENABLE_THREADS
58 D = std::make_unique<DynamicThreadPoolTaskDispatcher>();
60 D = std::make_unique<InPlaceTaskDispatcher>();
70 return std::make_unique<SelfExecutorProcessControl>(
86 std::vector<tpctypes::LookupResult> R;
88 for (
auto &Elem : Request) {
90 R.push_back(std::vector<ExecutorAddr>());
91 for (
auto &KV : Elem.Symbols) {
93 std::string Tmp((*Sym).data() + !!GlobalManglingPrefix,
94 (*Sym).size() - !!GlobalManglingPrefix);
99 MissingSymbols.push_back(Sym);
100 return make_error<SymbolsNotFound>(
SSP, std::move(MissingSymbols));
112 using MainTy = int (*)(int,
char *[]);
118 using VoidTy = int (*)();
124 using IntTy = int (*)(int);
133 auto *WrapperFn = WrapperFnAddr.
toPtr<WrapperFnTy>();
134 SendResult(WrapperFn(ArgBuffer.
data(), ArgBuffer.
size()));
142void SelfExecutorProcessControl::writeUInt8sAsync(
145 *W.Addr.toPtr<uint8_t *>() = W.Value;
149void SelfExecutorProcessControl::writeUInt16sAsync(
152 *W.Addr.toPtr<
uint16_t *>() = W.Value;
156void SelfExecutorProcessControl::writeUInt32sAsync(
157 ArrayRef<tpctypes::UInt32Write> Ws, WriteResultFn OnWriteComplete) {
159 *W.Addr.toPtr<
uint32_t *>() = W.Value;
163void SelfExecutorProcessControl::writeUInt64sAsync(
164 ArrayRef<tpctypes::UInt64Write> Ws, WriteResultFn OnWriteComplete) {
170void SelfExecutorProcessControl::writeBuffersAsync(
171 ArrayRef<tpctypes::BufferWrite> Ws, WriteResultFn OnWriteComplete) {
173 memcpy(
W.Addr.toPtr<
char *>(),
W.Buffer.data(),
W.Buffer.size());
177shared::CWrapperFunctionResult
178SelfExecutorProcessControl::jitDispatchViaWrapperFunctionManager(
179 void *Ctx,
const void *FnTag,
const char *
Data,
size_t Size) {
182 dbgs() <<
"jit-dispatch call with tag " << FnTag <<
" and " <<
Size
183 <<
" byte payload.\n";
186 std::promise<shared::WrapperFunctionResult> ResultP;
187 auto ResultF = ResultP.get_future();
191 [ResultP = std::move(ResultP)](
192 shared::WrapperFunctionResult
Result)
mutable {
193 ResultP.set_value(std::move(
Result));
197 return ResultF.get().release();
amdgpu Simplify well known AMD library false FunctionCallee Value * Arg
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static cl::opt< int > PageSize("imp-null-check-page-size", cl::desc("The page size of the target in bytes"), cl::init(4096), cl::Hidden)
Provides a library for accessing information about this process and other processes on the operating ...
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Triple - Helper class for working with autoconf configuration names.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
void runJITDispatchHandler(SendResultFunction SendResult, JITTargetAddress HandlerFnTagAddr, ArrayRef< char > ArgBuffer)
Run a registered jit-side wrapper function.
Represents an address in the executor process.
static ExecutorAddr fromPtr(T *Ptr, UnwrapFn &&Unwrap=UnwrapFn())
Create an ExecutorAddr from the given pointer.
std::enable_if_t< std::is_pointer< T >::value, T > toPtr(WrapFn &&Wrap=WrapFn()) const
Cast this ExecutorAddr to a pointer of the given type.
A handler or incoming WrapperFunctionResults – either return values from callWrapper* calls,...
ExecutorProcessControl supports interaction with a JIT target process.
std::unique_ptr< TaskDispatcher > D
std::shared_ptr< SymbolStringPool > SSP
jitlink::JITLinkMemoryManager * MemMgr
ExecutionSession & getExecutionSession()
Return the ExecutionSession associated with this instance.
virtual ~ExecutorProcessControl()
SelfExecutorProcessControl(std::shared_ptr< SymbolStringPool > SSP, std::unique_ptr< TaskDispatcher > D, Triple TargetTriple, unsigned PageSize, std::unique_ptr< jitlink::JITLinkMemoryManager > MemMgr)
Expected< tpctypes::DylibHandle > loadDylib(const char *DylibPath) override
Load the dynamic library at the given path and return a handle to it.
Error disconnect() override
Disconnect from the target process.
Expected< int32_t > runAsVoidFunction(ExecutorAddr VoidFnAddr) override
Run function with a int (*)(void) signature.
Expected< int32_t > runAsMain(ExecutorAddr MainFnAddr, ArrayRef< std::string > Args) override
Run function with a main-like signature.
void callWrapperAsync(ExecutorAddr WrapperFnAddr, IncomingWFRHandler OnComplete, ArrayRef< char > ArgBuffer) override
Run a wrapper function in the executor.
Expected< std::vector< tpctypes::LookupResult > > lookupSymbols(ArrayRef< LookupRequest > Request) override
Search for symbols in the target process.
static Expected< std::unique_ptr< SelfExecutorProcessControl > > Create(std::shared_ptr< SymbolStringPool > SSP=nullptr, std::unique_ptr< TaskDispatcher > D=nullptr, std::unique_ptr< jitlink::JITLinkMemoryManager > MemMgr=nullptr)
Create a SelfExecutorProcessControl with the given symbol string pool and memory manager.
Expected< int32_t > runAsIntFunction(ExecutorAddr IntFnAddr, int Arg) override
Run function with a int (*)(int) signature.
This class provides a portable interface to dynamic libraries which also might be known as shared lib...
static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg=nullptr)
This function permanently loads the dynamic library at the given path using the library load operatio...
void * getAddressOfSymbol(const char *symbolName)
Searches through the library for the symbol symbolName.
static Expected< unsigned > getPageSize()
Get the process's page size.
static unsigned getPageSizeEstimate()
Get the process's estimated page size.
int runAsVoidFunction(int(*Func)(void))
int runAsIntFunction(int(*Func)(int), int Arg)
std::vector< SymbolStringPtr > SymbolNameVector
A vector of symbol names.
int runAsMain(int(*Main)(int, char *[]), ArrayRef< std::string > Args, std::optional< StringRef > ProgramName=std::nullopt)
Run a main function, returning the result.
std::string getProcessTriple()
getProcessTriple() - Return an appropriate target triple for generating code to be loaded into the cu...
This is an optimization pass for GlobalISel generic memory operations.
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
JITTargetAddress pointerToJITTargetAddress(T *Ptr)
Convert a pointer to a JITTargetAddress.