/*===-- 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