1 /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\ 2 |* *| 3 |* The LLVM Compiler Infrastructure *| 4 |* *| 5 |* This file is distributed under the University of Illinois Open Source *| 6 |* License. See LICENSE.TXT for details. *| 7 |* *| 8 |*===----------------------------------------------------------------------===*| 9 |* *| 10 |* This header declares the C interface to libLLVMExecutionEngine.o, which *| 11 |* implements various analyses of the LLVM IR. *| 12 |* *| 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. *| 16 |* *| 17 \*===----------------------------------------------------------------------===*/ 18 19 #ifndef LLVM_C_EXECUTIONENGINE_H 20 #define LLVM_C_EXECUTIONENGINE_H 21 22 #include "llvm-c/Core.h" 23 #include "llvm-c/Target.h" 24 #include "llvm-c/TargetMachine.h" 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 /** 31 * @defgroup LLVMCExecutionEngine Execution Engine 32 * @ingroup LLVMC 33 * 34 * @{ 35 */ 36 37 void LLVMLinkInMCJIT(void); 38 void LLVMLinkInInterpreter(void); 39 40 typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef; 41 typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef; 42 typedef struct LLVMOpaqueMCJITMemoryManager *LLVMMCJITMemoryManagerRef; 43 44 struct LLVMMCJITCompilerOptions { 45 unsigned OptLevel; 46 LLVMCodeModel CodeModel; 47 LLVMBool NoFramePointerElim; 48 LLVMBool EnableFastISel; 49 LLVMMCJITMemoryManagerRef MCJMM; 50 }; 51 52 /*===-- Operations on generic values --------------------------------------===*/ 53 54 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 55 unsigned long long N, 56 LLVMBool IsSigned); 57 58 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P); 59 60 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N); 61 62 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef); 63 64 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal, 65 LLVMBool IsSigned); 66 67 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal); 68 69 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal); 70 71 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal); 72 73 /*===-- Operations on execution engines -----------------------------------===*/ 74 75 LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE, 76 LLVMModuleRef M, 77 char **OutError); 78 79 LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp, 80 LLVMModuleRef M, 81 char **OutError); 82 83 LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT, 84 LLVMModuleRef M, 85 unsigned OptLevel, 86 char **OutError); 87 88 void LLVMInitializeMCJITCompilerOptions( 89 struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions); 90 91 /** 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 96 * this is: 97 * 98 * LLVMMCJITCompilerOptions options; 99 * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options)); 100 * ... fill in those options you care about 101 * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options), 102 * &error); 103 * 104 * Note that this is also correct, though possibly suboptimal: 105 * 106 * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error); 107 */ 108 LLVMBool LLVMCreateMCJITCompilerForModule( 109 LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M, 110 struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions, 111 char **OutError); 112 113 /** Deprecated: Use LLVMCreateExecutionEngineForModule instead. */ 114 LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, 115 LLVMModuleProviderRef MP, 116 char **OutError); 117 118 /** Deprecated: Use LLVMCreateInterpreterForModule instead. */ 119 LLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 120 LLVMModuleProviderRef MP, 121 char **OutError); 122 123 /** Deprecated: Use LLVMCreateJITCompilerForModule instead. */ 124 LLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 125 LLVMModuleProviderRef MP, 126 unsigned OptLevel, 127 char **OutError); 128 129 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE); 130 131 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE); 132 133 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE); 134 135 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 136 unsigned ArgC, const char * const *ArgV, 137 const char * const *EnvP); 138 139 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 140 unsigned NumArgs, 141 LLVMGenericValueRef *Args); 142 143 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F); 144 145 void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M); 146 147 /** Deprecated: Use LLVMAddModule instead. */ 148 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP); 149 150 LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M, 151 LLVMModuleRef *OutMod, char **OutError); 152 153 /** Deprecated: Use LLVMRemoveModule instead. */ 154 LLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 155 LLVMModuleProviderRef MP, 156 LLVMModuleRef *OutMod, char **OutError); 157 158 LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 159 LLVMValueRef *OutFn); 160 161 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, 162 LLVMValueRef Fn); 163 164 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE); 165 LLVMTargetMachineRef 166 LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE); 167 168 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 169 void* Addr); 170 171 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global); 172 173 uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name); 174 175 uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name); 176 177 /*===-- Operations on memory managers -------------------------------------===*/ 178 179 typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)( 180 void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 181 const char *SectionName); 182 typedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback)( 183 void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 184 const char *SectionName, LLVMBool IsReadOnly); 185 typedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback)( 186 void *Opaque, char **ErrMsg); 187 typedef void (*LLVMMemoryManagerDestroyCallback)(void *Opaque); 188 189 /** 190 * Create a simple custom MCJIT memory manager. This memory manager can 191 * intercept allocations in a module-oblivious way. This will return NULL 192 * if any of the passed functions are NULL. 193 * 194 * @param Opaque An opaque client object to pass back to the callbacks. 195 * @param AllocateCodeSection Allocate a block of memory for executable code. 196 * @param AllocateDataSection Allocate a block of memory for data. 197 * @param FinalizeMemory Set page permissions and flush cache. Return 0 on 198 * success, 1 on error. 199 */ 200 LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager( 201 void *Opaque, 202 LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 203 LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 204 LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 205 LLVMMemoryManagerDestroyCallback Destroy); 206 207 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM); 208 209 /** 210 * @} 211 */ 212 213 #ifdef __cplusplus 214 } 215 #endif /* defined(__cplusplus) */ 216 217 #endif 218