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