LLVM API Documentation

ExecutionEngineBindings.cpp

Go to the documentation of this file.
00001 //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file defines the C bindings for the ExecutionEngine library.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #define DEBUG_TYPE "jit"
00015 #include "llvm-c/ExecutionEngine.h"
00016 #include "llvm/ExecutionEngine/GenericValue.h"
00017 #include "llvm/ExecutionEngine/ExecutionEngine.h"
00018 #include <cstring>
00019 
00020 using namespace llvm;
00021 
00022 /*===-- Operations on generic values --------------------------------------===*/
00023 
00024 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
00025                                                 unsigned long long N,
00026                                                 int IsSigned) {
00027   GenericValue *GenVal = new GenericValue();
00028   GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
00029   return wrap(GenVal);
00030 }
00031 
00032 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
00033   GenericValue *GenVal = new GenericValue();
00034   GenVal->PointerVal = P;
00035   return wrap(GenVal);
00036 }
00037 
00038 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
00039   GenericValue *GenVal = new GenericValue();
00040   switch (unwrap(TyRef)->getTypeID()) {
00041   case Type::FloatTyID:
00042     GenVal->FloatVal = N;
00043     break;
00044   case Type::DoubleTyID:
00045     GenVal->DoubleVal = N;
00046     break;
00047   default:
00048     assert(0 && "LLVMGenericValueToFloat supports only float and double.");
00049     break;
00050   }
00051   return wrap(GenVal);
00052 }
00053 
00054 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
00055   return unwrap(GenValRef)->IntVal.getBitWidth();
00056 }
00057 
00058 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
00059                                          int IsSigned) {
00060   GenericValue *GenVal = unwrap(GenValRef);
00061   if (IsSigned)
00062     return GenVal->IntVal.getSExtValue();
00063   else
00064     return GenVal->IntVal.getZExtValue();
00065 }
00066 
00067 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
00068   return unwrap(GenVal)->PointerVal;
00069 }
00070 
00071 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
00072   switch (unwrap(TyRef)->getTypeID()) {
00073   case Type::FloatTyID:
00074     return unwrap(GenVal)->FloatVal;
00075   case Type::DoubleTyID:
00076     return unwrap(GenVal)->DoubleVal;
00077   default:
00078     assert(0 && "LLVMGenericValueToFloat supports only float and double.");
00079     break;
00080   }
00081   return 0; // Not reached
00082 }
00083 
00084 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
00085   delete unwrap(GenVal);
00086 }
00087 
00088 /*===-- Operations on execution engines -----------------------------------===*/
00089 
00090 int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
00091                               LLVMModuleProviderRef MP,
00092                               char **OutError) {
00093   std::string Error;
00094   if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){
00095     *OutEE = wrap(EE);
00096     return 0;
00097   }
00098   *OutError = strdup(Error.c_str());
00099   return 1;
00100 }
00101 
00102 int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
00103                           LLVMModuleProviderRef MP,
00104                           char **OutError) {
00105   std::string Error;
00106   if (ExecutionEngine *Interp =
00107       ExecutionEngine::create(unwrap(MP), true, &Error)) {
00108     *OutInterp = wrap(Interp);
00109     return 0;
00110   }
00111   *OutError = strdup(Error.c_str());
00112   return 1;
00113 }
00114 
00115 int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
00116                           LLVMModuleProviderRef MP,
00117                           int Fast,
00118                           char **OutError) {
00119   std::string Error;
00120   if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error, 0,
00121                                                         Fast != 0)) {
00122     *OutJIT = wrap(JIT);
00123     return 0;
00124   }
00125   *OutError = strdup(Error.c_str());
00126   return 1;
00127 }
00128 
00129 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
00130   delete unwrap(EE);
00131 }
00132 
00133 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
00134   unwrap(EE)->runStaticConstructorsDestructors(false);
00135 }
00136 
00137 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
00138   unwrap(EE)->runStaticConstructorsDestructors(true);
00139 }
00140 
00141 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
00142                           unsigned ArgC, const char * const *ArgV,
00143                           const char * const *EnvP) {
00144   std::vector<std::string> ArgVec;
00145   for (unsigned I = 0; I != ArgC; ++I)
00146     ArgVec.push_back(ArgV[I]);
00147   
00148   return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
00149 }
00150 
00151 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
00152                                     unsigned NumArgs,
00153                                     LLVMGenericValueRef *Args) {
00154   std::vector<GenericValue> ArgVec;
00155   ArgVec.reserve(NumArgs);
00156   for (unsigned I = 0; I != NumArgs; ++I)
00157     ArgVec.push_back(*unwrap(Args[I]));
00158   
00159   GenericValue *Result = new GenericValue();
00160   *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
00161   return wrap(Result);
00162 }
00163 
00164 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
00165   unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
00166 }
00167 
00168 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
00169   unwrap(EE)->addModuleProvider(unwrap(MP));
00170 }
00171 
00172 int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
00173                              LLVMModuleProviderRef MP,
00174                              LLVMModuleRef *OutMod, char **OutError) {
00175   std::string Error;
00176   if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) {
00177     *OutMod = wrap(Gone);
00178     return 0;
00179   }
00180   if (OutError)
00181     *OutError = strdup(Error.c_str());
00182   return 1;
00183 }
00184 
00185 int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
00186                      LLVMValueRef *OutFn) {
00187   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
00188     *OutFn = wrap(F);
00189     return 0;
00190   }
00191   return 1;
00192 }
00193 
00194 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
00195   return wrap(unwrap(EE)->getTargetData());
00196 }
00197 
00198 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
00199                           void* Addr) {
00200   unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
00201 }
00202 
00203 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
00204   return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
00205 }