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