mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-18 11:24:01 +00:00
C and Ocaml bindings for ExecutionEngine (i.e., the JIT compiler).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45335 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
187
lib/ExecutionEngine/ExecutionEngineBindings.cpp
Normal file
187
lib/ExecutionEngine/ExecutionEngineBindings.cpp
Normal file
@ -0,0 +1,187 @@
|
||||
//===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file was developed by Gordon Henriksen and is distributed under the
|
||||
// University of Illinois Open Source License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the C bindings for the ExecutionEngine library.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#define DEBUG_TYPE "jit"
|
||||
#include "llvm-c/ExecutionEngine.h"
|
||||
#include "llvm/ExecutionEngine/GenericValue.h"
|
||||
#include "llvm/ExecutionEngine/ExecutionEngine.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
/*===-- Operations on generic values --------------------------------------===*/
|
||||
|
||||
LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
|
||||
unsigned long long N,
|
||||
int IsSigned) {
|
||||
GenericValue *GenVal = new GenericValue();
|
||||
GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
|
||||
return wrap(GenVal);
|
||||
}
|
||||
|
||||
LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
|
||||
GenericValue *GenVal = new GenericValue();
|
||||
GenVal->PointerVal = P;
|
||||
return wrap(GenVal);
|
||||
}
|
||||
|
||||
LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
|
||||
GenericValue *GenVal = new GenericValue();
|
||||
switch (unwrap(TyRef)->getTypeID()) {
|
||||
case Type::FloatTyID:
|
||||
GenVal->FloatVal = N;
|
||||
break;
|
||||
case Type::DoubleTyID:
|
||||
GenVal->DoubleVal = N;
|
||||
break;
|
||||
default:
|
||||
assert(0 && "LLVMGenericValueToFloat supports only float and double.");
|
||||
break;
|
||||
}
|
||||
return wrap(GenVal);
|
||||
}
|
||||
|
||||
unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
|
||||
return unwrap(GenValRef)->IntVal.getBitWidth();
|
||||
}
|
||||
|
||||
unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
|
||||
int IsSigned) {
|
||||
GenericValue *GenVal = unwrap(GenValRef);
|
||||
if (IsSigned)
|
||||
return GenVal->IntVal.getSExtValue();
|
||||
else
|
||||
return GenVal->IntVal.getZExtValue();
|
||||
}
|
||||
|
||||
void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
|
||||
return unwrap(GenVal)->PointerVal;
|
||||
}
|
||||
|
||||
double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
|
||||
switch (unwrap(TyRef)->getTypeID()) {
|
||||
case Type::FloatTyID:
|
||||
return unwrap(GenVal)->FloatVal;
|
||||
case Type::DoubleTyID:
|
||||
return unwrap(GenVal)->DoubleVal;
|
||||
default:
|
||||
assert(0 && "LLVMGenericValueToFloat supports only float and double.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
|
||||
delete unwrap(GenVal);
|
||||
}
|
||||
|
||||
/*===-- Operations on execution engines -----------------------------------===*/
|
||||
|
||||
int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
|
||||
LLVMModuleProviderRef MP,
|
||||
char **OutError) {
|
||||
std::string Error;
|
||||
if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){
|
||||
*OutEE = wrap(EE);
|
||||
return 0;
|
||||
}
|
||||
*OutError = strdup(Error.c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
|
||||
LLVMModuleProviderRef MP,
|
||||
char **OutError) {
|
||||
std::string Error;
|
||||
if (ExecutionEngine *Interp = ExecutionEngine::create(unwrap(MP), &Error)) {
|
||||
*OutInterp = wrap(Interp);
|
||||
return 0;
|
||||
}
|
||||
*OutError = strdup(Error.c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
|
||||
LLVMModuleProviderRef MP,
|
||||
char **OutError) {
|
||||
std::string Error;
|
||||
if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) {
|
||||
*OutJIT = wrap(JIT);
|
||||
return 0;
|
||||
}
|
||||
*OutError = strdup(Error.c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
|
||||
delete unwrap(EE);
|
||||
}
|
||||
|
||||
void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
|
||||
unwrap(EE)->runStaticConstructorsDestructors(false);
|
||||
}
|
||||
|
||||
void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
|
||||
unwrap(EE)->runStaticConstructorsDestructors(true);
|
||||
}
|
||||
|
||||
int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
|
||||
unsigned ArgC, const char * const *ArgV,
|
||||
const char * const *EnvP) {
|
||||
std::vector<std::string> ArgVec;
|
||||
for (unsigned I = 0; I != ArgC; ++I)
|
||||
ArgVec.push_back(ArgV[I]);
|
||||
|
||||
return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
|
||||
}
|
||||
|
||||
LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
|
||||
unsigned NumArgs,
|
||||
LLVMGenericValueRef *Args) {
|
||||
std::vector<GenericValue> ArgVec;
|
||||
ArgVec.reserve(NumArgs);
|
||||
for (unsigned I = 0; I != NumArgs; ++I)
|
||||
ArgVec.push_back(*unwrap(Args[I]));
|
||||
|
||||
GenericValue *Result = new GenericValue();
|
||||
*Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
|
||||
return wrap(Result);
|
||||
}
|
||||
|
||||
void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
|
||||
unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
|
||||
}
|
||||
|
||||
void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
|
||||
unwrap(EE)->addModuleProvider(unwrap(MP));
|
||||
}
|
||||
|
||||
int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
|
||||
LLVMModuleProviderRef MP,
|
||||
LLVMModuleRef *OutMod, char **OutError) {
|
||||
std::string Error;
|
||||
if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) {
|
||||
*OutMod = wrap(Gone);
|
||||
return 0;
|
||||
}
|
||||
if (OutError)
|
||||
*OutError = strdup(Error.c_str());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
|
||||
LLVMValueRef *OutFn) {
|
||||
if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
|
||||
*OutFn = wrap(F);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
Reference in New Issue
Block a user