1 /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
5 |* See https://llvm.org/LICENSE.txt for license information. *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
8 |*===----------------------------------------------------------------------===*|
10 |* This header declares the C interface to libLLVMExecutionEngine.o, which *|
11 |* implements various analyses of the LLVM IR. *|
13 |* Many exotic languages can interoperate with C code but have a harder time *|
14 |* with C++ due to name mangling. So in addition to C, this interface enables *|
15 |* tools written in such languages. *|
17 \*===----------------------------------------------------------------------===*/
19 #ifndef LLVM_C_EXECUTIONENGINE_H
20 #define LLVM_C_EXECUTIONENGINE_H
22 #include "llvm-c/Target.h"
23 #include "llvm-c/TargetMachine.h"
24 #include "llvm-c/Types.h"
31 * @defgroup LLVMCExecutionEngine Execution Engine
37 void LLVMLinkInMCJIT(void);
38 void LLVMLinkInInterpreter(void);
40 typedef struct LLVMOpaqueGenericValue
*LLVMGenericValueRef
;
41 typedef struct LLVMOpaqueExecutionEngine
*LLVMExecutionEngineRef
;
42 typedef struct LLVMOpaqueMCJITMemoryManager
*LLVMMCJITMemoryManagerRef
;
44 struct LLVMMCJITCompilerOptions
{
46 LLVMCodeModel CodeModel
;
47 LLVMBool NoFramePointerElim
;
48 LLVMBool EnableFastISel
;
49 LLVMMCJITMemoryManagerRef MCJMM
;
52 /*===-- Operations on generic values --------------------------------------===*/
54 LLVMGenericValueRef
LLVMCreateGenericValueOfInt(LLVMTypeRef Ty
,
58 LLVMGenericValueRef
LLVMCreateGenericValueOfPointer(void *P
);
60 LLVMGenericValueRef
LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty
, double N
);
62 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef
);
64 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal
,
67 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal
);
69 double LLVMGenericValueToFloat(LLVMTypeRef TyRef
, LLVMGenericValueRef GenVal
);
71 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal
);
73 /*===-- Operations on execution engines -----------------------------------===*/
75 LLVMBool
LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef
*OutEE
,
79 LLVMBool
LLVMCreateInterpreterForModule(LLVMExecutionEngineRef
*OutInterp
,
83 LLVMBool
LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef
*OutJIT
,
88 void LLVMInitializeMCJITCompilerOptions(
89 struct LLVMMCJITCompilerOptions
*Options
, size_t SizeOfOptions
);
92 * Create an MCJIT execution engine for a module, with the given options. It is
93 * the responsibility of the caller to ensure that all fields in Options up to
94 * the given SizeOfOptions are initialized. It is correct to pass a smaller
95 * value of SizeOfOptions that omits some fields. The canonical way of using
98 * LLVMMCJITCompilerOptions options;
99 * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
100 * ... fill in those options you care about
101 * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options),
104 * Note that this is also correct, though possibly suboptimal:
106 * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error);
108 LLVMBool
LLVMCreateMCJITCompilerForModule(
109 LLVMExecutionEngineRef
*OutJIT
, LLVMModuleRef M
,
110 struct LLVMMCJITCompilerOptions
*Options
, size_t SizeOfOptions
,
113 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE
);
115 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE
);
117 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE
);
119 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE
, LLVMValueRef F
,
120 unsigned ArgC
, const char * const *ArgV
,
121 const char * const *EnvP
);
123 LLVMGenericValueRef
LLVMRunFunction(LLVMExecutionEngineRef EE
, LLVMValueRef F
,
125 LLVMGenericValueRef
*Args
);
127 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE
, LLVMValueRef F
);
129 void LLVMAddModule(LLVMExecutionEngineRef EE
, LLVMModuleRef M
);
131 LLVMBool
LLVMRemoveModule(LLVMExecutionEngineRef EE
, LLVMModuleRef M
,
132 LLVMModuleRef
*OutMod
, char **OutError
);
134 LLVMBool
LLVMFindFunction(LLVMExecutionEngineRef EE
, const char *Name
,
135 LLVMValueRef
*OutFn
);
137 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE
,
140 LLVMTargetDataRef
LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE
);
142 LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE
);
144 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE
, LLVMValueRef Global
,
147 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE
, LLVMValueRef Global
);
149 uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE
, const char *Name
);
151 uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE
, const char *Name
);
153 /*===-- Operations on memory managers -------------------------------------===*/
155 typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback
)(
156 void *Opaque
, uintptr_t Size
, unsigned Alignment
, unsigned SectionID
,
157 const char *SectionName
);
158 typedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback
)(
159 void *Opaque
, uintptr_t Size
, unsigned Alignment
, unsigned SectionID
,
160 const char *SectionName
, LLVMBool IsReadOnly
);
161 typedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback
)(
162 void *Opaque
, char **ErrMsg
);
163 typedef void (*LLVMMemoryManagerDestroyCallback
)(void *Opaque
);
166 * Create a simple custom MCJIT memory manager. This memory manager can
167 * intercept allocations in a module-oblivious way. This will return NULL
168 * if any of the passed functions are NULL.
170 * @param Opaque An opaque client object to pass back to the callbacks.
171 * @param AllocateCodeSection Allocate a block of memory for executable code.
172 * @param AllocateDataSection Allocate a block of memory for data.
173 * @param FinalizeMemory Set page permissions and flush cache. Return 0 on
174 * success, 1 on error.
176 LLVMMCJITMemoryManagerRef
LLVMCreateSimpleMCJITMemoryManager(
178 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection
,
179 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection
,
180 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory
,
181 LLVMMemoryManagerDestroyCallback Destroy
);
183 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM
);
185 /*===-- JIT Event Listener functions -------------------------------------===*/
187 LLVMJITEventListenerRef
LLVMCreateGDBRegistrationListener(void);
188 LLVMJITEventListenerRef
LLVMCreateIntelJITEventListener(void);
189 LLVMJITEventListenerRef
LLVMCreateOProfileJITEventListener(void);
190 LLVMJITEventListenerRef
LLVMCreatePerfJITEventListener(void);
198 #endif /* defined(__cplusplus) */