xref: /freebsd/contrib/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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