Home | History | Annotate | Download | only in llvm-c
      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