- /*===-- llvm-c/ExecutionEngine.h - ExecutionEngine Lib C Iface --*- C++ -*-===*\ 
- |*                                                                            *| 
- |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *| 
- |* Exceptions.                                                                *| 
- |* See https://llvm.org/LICENSE.txt for license information.                  *| 
- |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *| 
- |*                                                                            *| 
- |*===----------------------------------------------------------------------===*| 
- |*                                                                            *| 
- |* This header declares the C interface to libLLVMExecutionEngine.o, which    *| 
- |* implements various analyses of the LLVM IR.                                *| 
- |*                                                                            *| 
- |* Many exotic languages can interoperate with C code but have a harder time  *| 
- |* with C++ due to name mangling. So in addition to C, this interface enables *| 
- |* tools written in such languages.                                           *| 
- |*                                                                            *| 
- \*===----------------------------------------------------------------------===*/ 
-   
- #ifndef LLVM_C_EXECUTIONENGINE_H 
- #define LLVM_C_EXECUTIONENGINE_H 
-   
- #include "llvm-c/ExternC.h" 
- #include "llvm-c/Target.h" 
- #include "llvm-c/TargetMachine.h" 
- #include "llvm-c/Types.h" 
-   
- LLVM_C_EXTERN_C_BEGIN 
-   
- /** 
-  * @defgroup LLVMCExecutionEngine Execution Engine 
-  * @ingroup LLVMC 
-  * 
-  * @{ 
-  */ 
-   
- void LLVMLinkInMCJIT(void); 
- void LLVMLinkInInterpreter(void); 
-   
- typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef; 
- typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef; 
- typedef struct LLVMOpaqueMCJITMemoryManager *LLVMMCJITMemoryManagerRef; 
-   
- struct LLVMMCJITCompilerOptions { 
-   unsigned OptLevel; 
-   LLVMCodeModel CodeModel; 
-   LLVMBool NoFramePointerElim; 
-   LLVMBool EnableFastISel; 
-   LLVMMCJITMemoryManagerRef MCJMM; 
- }; 
-   
- /*===-- Operations on generic values --------------------------------------===*/ 
-   
- LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 
-                                                 unsigned long long N, 
-                                                 LLVMBool IsSigned); 
-   
- LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P); 
-   
- LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N); 
-   
- unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef); 
-   
- unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal, 
-                                          LLVMBool IsSigned); 
-   
- void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal); 
-   
- double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal); 
-   
- void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal); 
-   
- /*===-- Operations on execution engines -----------------------------------===*/ 
-   
- LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE, 
-                                             LLVMModuleRef M, 
-                                             char **OutError); 
-   
- LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp, 
-                                         LLVMModuleRef M, 
-                                         char **OutError); 
-   
- LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT, 
-                                         LLVMModuleRef M, 
-                                         unsigned OptLevel, 
-                                         char **OutError); 
-   
- void LLVMInitializeMCJITCompilerOptions( 
-   struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions); 
-   
- /** 
-  * Create an MCJIT execution engine for a module, with the given options. It is 
-  * the responsibility of the caller to ensure that all fields in Options up to 
-  * the given SizeOfOptions are initialized. It is correct to pass a smaller 
-  * value of SizeOfOptions that omits some fields. The canonical way of using 
-  * this is: 
-  * 
-  * LLVMMCJITCompilerOptions options; 
-  * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options)); 
-  * ... fill in those options you care about 
-  * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options), 
-  *                                  &error); 
-  * 
-  * Note that this is also correct, though possibly suboptimal: 
-  * 
-  * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error); 
-  */ 
- LLVMBool LLVMCreateMCJITCompilerForModule( 
-   LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M, 
-   struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions, 
-   char **OutError); 
-   
- void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE); 
-   
- void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE); 
-   
- void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE); 
-   
- int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 
-                           unsigned ArgC, const char * const *ArgV, 
-                           const char * const *EnvP); 
-   
- LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 
-                                     unsigned NumArgs, 
-                                     LLVMGenericValueRef *Args); 
-   
- void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F); 
-   
- void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M); 
-   
- LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M, 
-                           LLVMModuleRef *OutMod, char **OutError); 
-   
- LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 
-                           LLVMValueRef *OutFn); 
-   
- void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, 
-                                      LLVMValueRef Fn); 
-   
- LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE); 
- LLVMTargetMachineRef 
- LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE); 
-   
- void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 
-                           void* Addr); 
-   
- void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global); 
-   
- uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name); 
-   
- uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name); 
-   
- /// Returns true on error, false on success. If true is returned then the error 
- /// message is copied to OutStr and cleared in the ExecutionEngine instance. 
- LLVMBool LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE, 
-                                       char **OutError); 
-   
- /*===-- Operations on memory managers -------------------------------------===*/ 
-   
- typedef uint8_t *(*LLVMMemoryManagerAllocateCodeSectionCallback)( 
-   void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 
-   const char *SectionName); 
- typedef uint8_t *(*LLVMMemoryManagerAllocateDataSectionCallback)( 
-   void *Opaque, uintptr_t Size, unsigned Alignment, unsigned SectionID, 
-   const char *SectionName, LLVMBool IsReadOnly); 
- typedef LLVMBool (*LLVMMemoryManagerFinalizeMemoryCallback)( 
-   void *Opaque, char **ErrMsg); 
- typedef void (*LLVMMemoryManagerDestroyCallback)(void *Opaque); 
-   
- /** 
-  * Create a simple custom MCJIT memory manager. This memory manager can 
-  * intercept allocations in a module-oblivious way. This will return NULL 
-  * if any of the passed functions are NULL. 
-  * 
-  * @param Opaque An opaque client object to pass back to the callbacks. 
-  * @param AllocateCodeSection Allocate a block of memory for executable code. 
-  * @param AllocateDataSection Allocate a block of memory for data. 
-  * @param FinalizeMemory Set page permissions and flush cache. Return 0 on 
-  *   success, 1 on error. 
-  */ 
- LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager( 
-   void *Opaque, 
-   LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection, 
-   LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection, 
-   LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory, 
-   LLVMMemoryManagerDestroyCallback Destroy); 
-   
- void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM); 
-   
- /*===-- JIT Event Listener functions -------------------------------------===*/ 
-   
- LLVMJITEventListenerRef LLVMCreateGDBRegistrationListener(void); 
- LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void); 
- LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void); 
- LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void); 
-   
- /** 
-  * @} 
-  */ 
-   
- LLVM_C_EXTERN_C_END 
-   
- #endif 
-