#include "llvm-c/ExecutionEngine.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/JITEventListener.h"
#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/CodeGenCWrappers.h"
#include "llvm/Target/TargetOptions.h"
#include <cstring>
#include <optional>
usingnamespacellvm;
#define DEBUG_TYPE …
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(…)
static LLVMTargetMachineRef wrap(const TargetMachine *P) { … }
LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
unsigned long long N,
LLVMBool IsSigned) { … }
LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { … }
LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { … }
unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { … }
unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
LLVMBool IsSigned) { … }
void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) { … }
double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) { … }
void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { … }
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(LLVMMCJITCompilerOptions *PassedOptions,
size_t SizeOfPassedOptions) { … }
LLVMBool LLVMCreateMCJITCompilerForModule(
LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
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) { … }
LLVMBool LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE,
char **OutError) { … }
namespace {
struct SimpleBindingMMFunctions { … };
class SimpleBindingMemoryManager : public RTDyldMemoryManager { … };
SimpleBindingMemoryManager::SimpleBindingMemoryManager(
const SimpleBindingMMFunctions& Functions,
void *Opaque)
: … { … }
SimpleBindingMemoryManager::~SimpleBindingMemoryManager() { … }
uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
uintptr_t Size, unsigned Alignment, unsigned SectionID,
StringRef SectionName) { … }
uint8_t *SimpleBindingMemoryManager::allocateDataSection(
uintptr_t Size, unsigned Alignment, unsigned SectionID,
StringRef SectionName, bool isReadOnly) { … }
bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) { … }
}
LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
void *Opaque,
LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
LLVMMemoryManagerDestroyCallback Destroy) { … }
void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) { … }
#if !LLVM_USE_INTEL_JITEVENTS
LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void)
{ … }
#endif
#if !LLVM_USE_OPROFILE
LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void)
{ … }
#endif
#if !LLVM_USE_PERF
LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void)
{ … }
#endif