xref: /freebsd/contrib/llvm-project/llvm/include/llvm-c/ExecutionEngine.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\
2*0b57cec5SDimitry Andric |*                                                                            *|
3*0b57cec5SDimitry Andric |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
4*0b57cec5SDimitry Andric |* Exceptions.                                                                *|
5*0b57cec5SDimitry Andric |* See https://llvm.org/LICENSE.txt for license information.                  *|
6*0b57cec5SDimitry Andric |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
7*0b57cec5SDimitry Andric |*                                                                            *|
8*0b57cec5SDimitry Andric |*===----------------------------------------------------------------------===*|
9*0b57cec5SDimitry Andric |*                                                                            *|
10*0b57cec5SDimitry Andric |* This header declares the C interface to libLLVMExecutionEngine.o, which    *|
11*0b57cec5SDimitry Andric |* implements various analyses of the LLVM IR.                                *|
12*0b57cec5SDimitry Andric |*                                                                            *|
13*0b57cec5SDimitry Andric |* Many exotic languages can interoperate with C code but have a harder time  *|
14*0b57cec5SDimitry Andric |* with C++ due to name mangling. So in addition to C, this interface enables *|
15*0b57cec5SDimitry Andric |* tools written in such languages.                                           *|
16*0b57cec5SDimitry Andric |*                                                                            *|
17*0b57cec5SDimitry Andric \*===----------------------------------------------------------------------===*/
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric #ifndef LLVM_C_EXECUTIONENGINE_H
20*0b57cec5SDimitry Andric #define LLVM_C_EXECUTIONENGINE_H
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric #include "llvm-c/Target.h"
23*0b57cec5SDimitry Andric #include "llvm-c/TargetMachine.h"
24*0b57cec5SDimitry Andric #include "llvm-c/Types.h"
25*0b57cec5SDimitry Andric 
26*0b57cec5SDimitry Andric #ifdef __cplusplus
27*0b57cec5SDimitry Andric extern "C" {
28*0b57cec5SDimitry Andric #endif
29*0b57cec5SDimitry Andric 
30*0b57cec5SDimitry Andric /**
31*0b57cec5SDimitry Andric  * @defgroup LLVMCExecutionEngine Execution Engine
32*0b57cec5SDimitry Andric  * @ingroup LLVMC
33*0b57cec5SDimitry Andric  *
34*0b57cec5SDimitry Andric  * @{
35*0b57cec5SDimitry Andric  */
36*0b57cec5SDimitry Andric 
37*0b57cec5SDimitry Andric void LLVMLinkInMCJIT(void);
38*0b57cec5SDimitry Andric void LLVMLinkInInterpreter(void);
39*0b57cec5SDimitry Andric 
40*0b57cec5SDimitry Andric typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef;
41*0b57cec5SDimitry Andric typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef;
42*0b57cec5SDimitry Andric typedef struct LLVMOpaqueMCJITMemoryManager *LLVMMCJITMemoryManagerRef;
43*0b57cec5SDimitry Andric 
44*0b57cec5SDimitry Andric struct LLVMMCJITCompilerOptions {
45*0b57cec5SDimitry Andric   unsigned OptLevel;
46*0b57cec5SDimitry Andric   LLVMCodeModel CodeModel;
47*0b57cec5SDimitry Andric   LLVMBool NoFramePointerElim;
48*0b57cec5SDimitry Andric   LLVMBool EnableFastISel;
49*0b57cec5SDimitry Andric   LLVMMCJITMemoryManagerRef MCJMM;
50*0b57cec5SDimitry Andric };
51*0b57cec5SDimitry Andric 
52*0b57cec5SDimitry Andric /*===-- Operations on generic values --------------------------------------===*/
53*0b57cec5SDimitry Andric 
54*0b57cec5SDimitry Andric LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
55*0b57cec5SDimitry Andric                                                 unsigned long long N,
56*0b57cec5SDimitry Andric                                                 LLVMBool IsSigned);
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P);
59*0b57cec5SDimitry Andric 
60*0b57cec5SDimitry Andric LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N);
61*0b57cec5SDimitry Andric 
62*0b57cec5SDimitry Andric unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef);
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal,
65*0b57cec5SDimitry Andric                                          LLVMBool IsSigned);
66*0b57cec5SDimitry Andric 
67*0b57cec5SDimitry Andric void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal);
68*0b57cec5SDimitry Andric 
69*0b57cec5SDimitry Andric double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal);
70*0b57cec5SDimitry Andric 
71*0b57cec5SDimitry Andric void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal);
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric /*===-- Operations on execution engines -----------------------------------===*/
74*0b57cec5SDimitry Andric 
75*0b57cec5SDimitry Andric LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
76*0b57cec5SDimitry Andric                                             LLVMModuleRef M,
77*0b57cec5SDimitry Andric                                             char **OutError);
78*0b57cec5SDimitry Andric 
79*0b57cec5SDimitry Andric LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
80*0b57cec5SDimitry Andric                                         LLVMModuleRef M,
81*0b57cec5SDimitry Andric                                         char **OutError);
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
84*0b57cec5SDimitry Andric                                         LLVMModuleRef M,
85*0b57cec5SDimitry Andric                                         unsigned OptLevel,
86*0b57cec5SDimitry Andric                                         char **OutError);
87*0b57cec5SDimitry Andric 
88*0b57cec5SDimitry Andric void LLVMInitializeMCJITCompilerOptions(
89*0b57cec5SDimitry Andric   struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions);
90*0b57cec5SDimitry Andric 
91*0b57cec5SDimitry Andric /**
92*0b57cec5SDimitry Andric  * Create an MCJIT execution engine for a module, with the given options. It is
93*0b57cec5SDimitry Andric  * the responsibility of the caller to ensure that all fields in Options up to
94*0b57cec5SDimitry Andric  * the given SizeOfOptions are initialized. It is correct to pass a smaller
95*0b57cec5SDimitry Andric  * value of SizeOfOptions that omits some fields. The canonical way of using
96*0b57cec5SDimitry Andric  * this is:
97*0b57cec5SDimitry Andric  *
98*0b57cec5SDimitry Andric  * LLVMMCJITCompilerOptions options;
99*0b57cec5SDimitry Andric  * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
100*0b57cec5SDimitry Andric  * ... fill in those options you care about
101*0b57cec5SDimitry Andric  * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options),
102*0b57cec5SDimitry Andric  *                                  &error);
103*0b57cec5SDimitry Andric  *
104*0b57cec5SDimitry Andric  * Note that this is also correct, though possibly suboptimal:
105*0b57cec5SDimitry Andric  *
106*0b57cec5SDimitry Andric  * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error);
107*0b57cec5SDimitry Andric  */
108*0b57cec5SDimitry Andric LLVMBool LLVMCreateMCJITCompilerForModule(
109*0b57cec5SDimitry Andric   LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
110*0b57cec5SDimitry Andric   struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions,
111*0b57cec5SDimitry Andric   char **OutError);
112*0b57cec5SDimitry Andric 
113*0b57cec5SDimitry Andric void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE);
114*0b57cec5SDimitry Andric 
115*0b57cec5SDimitry Andric void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE);
116*0b57cec5SDimitry Andric 
117*0b57cec5SDimitry Andric void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE);
118*0b57cec5SDimitry Andric 
119*0b57cec5SDimitry Andric int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
120*0b57cec5SDimitry Andric                           unsigned ArgC, const char * const *ArgV,
121*0b57cec5SDimitry Andric                           const char * const *EnvP);
122*0b57cec5SDimitry Andric 
123*0b57cec5SDimitry Andric LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
124*0b57cec5SDimitry Andric                                     unsigned NumArgs,
125*0b57cec5SDimitry Andric                                     LLVMGenericValueRef *Args);
126*0b57cec5SDimitry Andric 
127*0b57cec5SDimitry Andric void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F);
128*0b57cec5SDimitry Andric 
129*0b57cec5SDimitry Andric void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M);
130*0b57cec5SDimitry Andric 
131*0b57cec5SDimitry Andric LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
132*0b57cec5SDimitry Andric                           LLVMModuleRef *OutMod, char **OutError);
133*0b57cec5SDimitry Andric 
134*0b57cec5SDimitry Andric LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
135*0b57cec5SDimitry Andric                           LLVMValueRef *OutFn);
136*0b57cec5SDimitry Andric 
137*0b57cec5SDimitry Andric void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
138*0b57cec5SDimitry Andric                                      LLVMValueRef Fn);
139*0b57cec5SDimitry Andric 
140*0b57cec5SDimitry Andric LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE);
141*0b57cec5SDimitry Andric LLVMTargetMachineRef
142*0b57cec5SDimitry Andric LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE);
143*0b57cec5SDimitry Andric 
144*0b57cec5SDimitry Andric void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
145*0b57cec5SDimitry Andric                           void* Addr);
146*0b57cec5SDimitry Andric 
147*0b57cec5SDimitry Andric void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global);
148*0b57cec5SDimitry Andric 
149*0b57cec5SDimitry Andric uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name);
150*0b57cec5SDimitry Andric 
151*0b57cec5SDimitry Andric uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name);
152*0b57cec5SDimitry Andric 
153*0b57cec5SDimitry Andric /*===-- Operations on memory managers -------------------------------------===*/
154*0b57cec5SDimitry Andric 
155*0b57cec5SDimitry Andric typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)(
156*0b57cec5SDimitry Andric   void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID,
157*0b57cec5SDimitry Andric   const char *SectionName);
158*0b57cec5SDimitry Andric typedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback)(
159*0b57cec5SDimitry Andric   void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID,
160*0b57cec5SDimitry Andric   const char *SectionName, LLVMBool IsReadOnly);
161*0b57cec5SDimitry Andric typedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback)(
162*0b57cec5SDimitry Andric   void *Opaque, char **ErrMsg);
163*0b57cec5SDimitry Andric typedef void (*LLVMMemoryManagerDestroyCallback)(void *Opaque);
164*0b57cec5SDimitry Andric 
165*0b57cec5SDimitry Andric /**
166*0b57cec5SDimitry Andric  * Create a simple custom MCJIT memory manager. This memory manager can
167*0b57cec5SDimitry Andric  * intercept allocations in a module-oblivious way. This will return NULL
168*0b57cec5SDimitry Andric  * if any of the passed functions are NULL.
169*0b57cec5SDimitry Andric  *
170*0b57cec5SDimitry Andric  * @param Opaque An opaque client object to pass back to the callbacks.
171*0b57cec5SDimitry Andric  * @param AllocateCodeSection Allocate a block of memory for executable code.
172*0b57cec5SDimitry Andric  * @param AllocateDataSection Allocate a block of memory for data.
173*0b57cec5SDimitry Andric  * @param FinalizeMemory Set page permissions and flush cache. Return 0 on
174*0b57cec5SDimitry Andric  *   success, 1 on error.
175*0b57cec5SDimitry Andric  */
176*0b57cec5SDimitry Andric LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
177*0b57cec5SDimitry Andric   void *Opaque,
178*0b57cec5SDimitry Andric   LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
179*0b57cec5SDimitry Andric   LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
180*0b57cec5SDimitry Andric   LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
181*0b57cec5SDimitry Andric   LLVMMemoryManagerDestroyCallback Destroy);
182*0b57cec5SDimitry Andric 
183*0b57cec5SDimitry Andric void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM);
184*0b57cec5SDimitry Andric 
185*0b57cec5SDimitry Andric /*===-- JIT Event Listener functions -------------------------------------===*/
186*0b57cec5SDimitry Andric 
187*0b57cec5SDimitry Andric LLVMJITEventListenerRef LLVMCreateGDBRegistrationListener(void);
188*0b57cec5SDimitry Andric LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void);
189*0b57cec5SDimitry Andric LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void);
190*0b57cec5SDimitry Andric LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void);
191*0b57cec5SDimitry Andric 
192*0b57cec5SDimitry Andric /**
193*0b57cec5SDimitry Andric  * @}
194*0b57cec5SDimitry Andric  */
195*0b57cec5SDimitry Andric 
196*0b57cec5SDimitry Andric #ifdef __cplusplus
197*0b57cec5SDimitry Andric }
198*0b57cec5SDimitry Andric #endif /* defined(__cplusplus) */
199*0b57cec5SDimitry Andric 
200*0b57cec5SDimitry Andric #endif
201