12e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\ 22e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 32e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* The LLVM Compiler Infrastructure *| 42e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner|* This file is distributed under the University of Illinois Open Source *| 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner|* License. See LICENSE.TXT for details. *| 72e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 82e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|*===----------------------------------------------------------------------===*| 92e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* This header declares the C interface to libLLVMExecutionEngine.o, which *| 112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* implements various analyses of the LLVM IR. *| 122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* Many exotic languages can interoperate with C code but have a harder time *| 142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* with C++ due to name mangling. So in addition to C, this interface enables *| 152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* tools written in such languages. *| 162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen|* *| 172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen\*===----------------------------------------------------------------------===*/ 182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#ifndef LLVM_C_EXECUTIONENGINE_H 202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#define LLVM_C_EXECUTIONENGINE_H 212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm-c/Types.h" 237c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar#include "llvm-c/Target.h" 240e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo#include "llvm-c/TargetMachine.h" 252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#ifdef __cplusplus 272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenextern "C" { 282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#endif 292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 306244b518880842f2c15200ee041e06799e4cc779Gregory Szorc/** 316244b518880842f2c15200ee041e06799e4cc779Gregory Szorc * @defgroup LLVMCExecutionEngine Execution Engine 326244b518880842f2c15200ee041e06799e4cc779Gregory Szorc * @ingroup LLVMC 336244b518880842f2c15200ee041e06799e4cc779Gregory Szorc * 346244b518880842f2c15200ee041e06799e4cc779Gregory Szorc * @{ 356244b518880842f2c15200ee041e06799e4cc779Gregory Szorc */ 366244b518880842f2c15200ee041e06799e4cc779Gregory Szorc 37d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylorvoid LLVMLinkInMCJIT(void); 38e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilsonvoid LLVMLinkInInterpreter(void); 39e46161f10c3e0c640b22e446b873df8b01413f52Bob Wilson 402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksentypedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef; 412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksentypedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef; 426cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlotypedef struct LLVMOpaqueMCJITMemoryManager *LLVMMCJITMemoryManagerRef; 432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 44d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylorstruct LLVMMCJITCompilerOptions { 45d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor unsigned OptLevel; 460e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo LLVMCodeModel CodeModel; 47d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor LLVMBool NoFramePointerElim; 480e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo LLVMBool EnableFastISel; 496cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo LLVMMCJITMemoryManagerRef MCJMM; 50d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor}; 51d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor 522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on generic values --------------------------------------===*/ 532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 542e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned long long N, 56d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMBool IsSigned); 572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 582e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P); 592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 602e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N); 612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef); 632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal, 65d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMBool IsSigned); 662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal); 682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksendouble LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal); 702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeGenericValue(LLVMGenericValueRef GenVal); 722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on execution engines -----------------------------------===*/ 742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 75df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE, 76df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 77df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError); 78df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 79df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp, 80df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 81df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError); 82df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 83df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT, 84df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 85df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar unsigned OptLevel, 86df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError); 87df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 880e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid LLVMInitializeMCJITCompilerOptions( 890e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions); 900e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo 91d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor/** 92d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * Create an MCJIT execution engine for a module, with the given options. It is 93d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * the responsibility of the caller to ensure that all fields in Options up to 940e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * the given SizeOfOptions are initialized. It is correct to pass a smaller 950e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * value of SizeOfOptions that omits some fields. The canonical way of using 960e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * this is: 97d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * 98d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * LLVMMCJITCompilerOptions options; 990e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options)); 100d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * ... fill in those options you care about 1010e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options), 1020e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo * &error); 103d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * 104d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * Note that this is also correct, though possibly suboptimal: 105d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * 106d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error); 107d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor */ 1080e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip PizloLLVMBool LLVMCreateMCJITCompilerForModule( 1090e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M, 1100e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions, 1110e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo char **OutError); 112d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor 1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE); 1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticConstructors(LLVMExecutionEngineRef EE); 1162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticDestructors(LLVMExecutionEngineRef EE); 1182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenint LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 1202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned ArgC, const char * const *ArgV, 1212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen const char * const *EnvP); 1222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1232e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 1242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned NumArgs, 1252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMGenericValueRef *Args); 1262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F); 1282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 129df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaarvoid LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M); 130df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 131df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M, 132df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef *OutMod, char **OutError); 133df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 134d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 135d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMValueRef *OutFn); 1362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1370e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, 1380e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo LLVMValueRef Fn); 139d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands 1407c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick TryzelaarLLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE); 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMTargetMachineRef 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE); 1437c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar 14454227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksenvoid LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 14554227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen void* Addr); 14654227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen 1471e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattnervoid *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global); 1481e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner 149ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name); 150ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 151ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name); 152ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 1536cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo/*===-- Operations on memory managers -------------------------------------===*/ 1546cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo 1556eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlotypedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)( 1566eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 1576eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo const char *SectionName); 1586eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlotypedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback)( 1596eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 1606eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo const char *SectionName, LLVMBool IsReadOnly); 1616eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlotypedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback)( 1626eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo void *Opaque, char **ErrMsg); 1635be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborgtypedef void (*LLVMMemoryManagerDestroyCallback)(void *Opaque); 1645be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg 1656cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo/** 1666cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * Create a simple custom MCJIT memory manager. This memory manager can 1676cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * intercept allocations in a module-oblivious way. This will return NULL 1686cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * if any of the passed functions are NULL. 1696cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * 1706cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * @param Opaque An opaque client object to pass back to the callbacks. 1716cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * @param AllocateCodeSection Allocate a block of memory for executable code. 1726cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * @param AllocateDataSection Allocate a block of memory for data. 1736cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * @param FinalizeMemory Set page permissions and flush cache. Return 0 on 1746cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo * success, 1 on error. 1756cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo */ 1766cfed36338d7728076ddbc1331908b887a4302d3Filip PizloLLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager( 1776cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo void *Opaque, 1785be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 1795be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 1805be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 181135fe6ac5f5b80ef68c19b3ec7bb0063e28f2babBenjamin Kramer LLVMMemoryManagerDestroyCallback Destroy); 1826cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo 1836cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlovoid LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM); 1846cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo 1856244b518880842f2c15200ee041e06799e4cc779Gregory Szorc/** 1866244b518880842f2c15200ee041e06799e4cc779Gregory Szorc * @} 1876244b518880842f2c15200ee041e06799e4cc779Gregory Szorc */ 1886244b518880842f2c15200ee041e06799e4cc779Gregory Szorc 1892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#ifdef __cplusplus 190e21c3137e1dfcd9644d3870a0a4528374375271fNAKAMURA Takumi} 1919313da5a90838c7242101dae250e86dcfc708e6aEvan Cheng#endif /* defined(__cplusplus) */ 1922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#endif 194