123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- /*===-- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|