1 //===-- SelfExecutorProcessControl.h - EPC for in-process JITs --*- 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 // Executor process control implementation for JITs that run JIT'd code in the 10 // same process. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_EXECUTIONENGINE_ORC_SELFEXECUTORPROCESSCONTROL_H 15 #define LLVM_EXECUTIONENGINE_ORC_SELFEXECUTORPROCESSCONTROL_H 16 17 #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h" 18 #include "llvm/ExecutionEngine/Orc/InProcessMemoryAccess.h" 19 20 #include <memory> 21 22 namespace llvm::orc { 23 24 /// A ExecutorProcessControl implementation targeting the current process. 25 class LLVM_ABI SelfExecutorProcessControl : public ExecutorProcessControl, 26 private DylibManager { 27 public: 28 SelfExecutorProcessControl( 29 std::shared_ptr<SymbolStringPool> SSP, std::unique_ptr<TaskDispatcher> D, 30 Triple TargetTriple, unsigned PageSize, 31 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr); 32 33 /// Create a SelfExecutorProcessControl with the given symbol string pool and 34 /// memory manager. 35 /// If no symbol string pool is given then one will be created. 36 /// If no memory manager is given a jitlink::InProcessMemoryManager will 37 /// be created and used by default. 38 static Expected<std::unique_ptr<SelfExecutorProcessControl>> 39 Create(std::shared_ptr<SymbolStringPool> SSP = nullptr, 40 std::unique_ptr<TaskDispatcher> D = nullptr, 41 std::unique_ptr<jitlink::JITLinkMemoryManager> MemMgr = nullptr); 42 43 Expected<int32_t> runAsMain(ExecutorAddr MainFnAddr, 44 ArrayRef<std::string> Args) override; 45 46 Expected<int32_t> runAsVoidFunction(ExecutorAddr VoidFnAddr) override; 47 48 Expected<int32_t> runAsIntFunction(ExecutorAddr IntFnAddr, int Arg) override; 49 50 void callWrapperAsync(ExecutorAddr WrapperFnAddr, 51 IncomingWFRHandler OnComplete, 52 ArrayRef<char> ArgBuffer) override; 53 54 Error disconnect() override; 55 56 private: 57 static shared::CWrapperFunctionResult 58 jitDispatchViaWrapperFunctionManager(void *Ctx, const void *FnTag, 59 const char *Data, size_t Size); 60 61 Expected<tpctypes::DylibHandle> loadDylib(const char *DylibPath) override; 62 63 void lookupSymbolsAsync(ArrayRef<LookupRequest> Request, 64 SymbolLookupCompleteFn F) override; 65 66 std::unique_ptr<jitlink::JITLinkMemoryManager> OwnedMemMgr; 67 #ifdef __APPLE__ 68 std::unique_ptr<UnwindInfoManager> UnwindInfoMgr; 69 #endif // __APPLE__ 70 char GlobalManglingPrefix = 0; 71 InProcessMemoryAccess IPMA; 72 }; 73 74 } // namespace llvm::orc 75 76 #endif // LLVM_EXECUTIONENGINE_ORC_SELFEXECUTORPROCESSCONTROL_H 77