| //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file 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" | 
 | #include "llvm/Support/ErrorHandling.h" | 
 | #include <cstring> | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | /*===-- Operations on generic values --------------------------------------===*/ | 
 |  | 
 | LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, | 
 |                                                 unsigned long long N, | 
 |                                                 LLVMBool 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: | 
 |     llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); | 
 |   } | 
 |   return wrap(GenVal); | 
 | } | 
 |  | 
 | unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { | 
 |   return unwrap(GenValRef)->IntVal.getBitWidth(); | 
 | } | 
 |  | 
 | unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef, | 
 |                                          LLVMBool 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: | 
 |     llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); | 
 |     break; | 
 |   } | 
 |   return 0; // Not reached | 
 | } | 
 |  | 
 | void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { | 
 |   delete unwrap(GenVal); | 
 | } | 
 |  | 
 | /*===-- Operations on execution engines -----------------------------------===*/ | 
 |  | 
 | LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE, | 
 |                                             LLVMModuleRef M, | 
 |                                             char **OutError) { | 
 |   std::string Error; | 
 |   EngineBuilder builder(unwrap(M)); | 
 |   builder.setEngineKind(EngineKind::Either) | 
 |          .setErrorStr(&Error); | 
 |   if (ExecutionEngine *EE = builder.create()){ | 
 |     *OutEE = wrap(EE); | 
 |     return 0; | 
 |   } | 
 |   *OutError = strdup(Error.c_str()); | 
 |   return 1; | 
 | } | 
 |  | 
 | LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp, | 
 |                                         LLVMModuleRef M, | 
 |                                         char **OutError) { | 
 |   std::string Error; | 
 |   EngineBuilder builder(unwrap(M)); | 
 |   builder.setEngineKind(EngineKind::Interpreter) | 
 |          .setErrorStr(&Error); | 
 |   if (ExecutionEngine *Interp = builder.create()) { | 
 |     *OutInterp = wrap(Interp); | 
 |     return 0; | 
 |   } | 
 |   *OutError = strdup(Error.c_str()); | 
 |   return 1; | 
 | } | 
 |  | 
 | LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT, | 
 |                                         LLVMModuleRef M, | 
 |                                         unsigned OptLevel, | 
 |                                         char **OutError) { | 
 |   std::string Error; | 
 |   EngineBuilder builder(unwrap(M)); | 
 |   builder.setEngineKind(EngineKind::JIT) | 
 |          .setErrorStr(&Error) | 
 |          .setOptLevel((CodeGenOpt::Level)OptLevel); | 
 |   if (ExecutionEngine *JIT = builder.create()) { | 
 |     *OutJIT = wrap(JIT); | 
 |     return 0; | 
 |   } | 
 |   *OutError = strdup(Error.c_str()); | 
 |   return 1; | 
 | } | 
 |  | 
 | LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, | 
 |                                    LLVMModuleProviderRef MP, | 
 |                                    char **OutError) { | 
 |   /* The module provider is now actually a module. */ | 
 |   return LLVMCreateExecutionEngineForModule(OutEE, | 
 |                                             reinterpret_cast<LLVMModuleRef>(MP), | 
 |                                             OutError); | 
 | } | 
 |  | 
 | LLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, | 
 |                                LLVMModuleProviderRef MP, | 
 |                                char **OutError) { | 
 |   /* The module provider is now actually a module. */ | 
 |   return LLVMCreateInterpreterForModule(OutInterp, | 
 |                                         reinterpret_cast<LLVMModuleRef>(MP), | 
 |                                         OutError); | 
 | } | 
 |  | 
 | LLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, | 
 |                                LLVMModuleProviderRef MP, | 
 |                                unsigned OptLevel, | 
 |                                char **OutError) { | 
 |   /* The module provider is now actually a module. */ | 
 |   return LLVMCreateJITCompilerForModule(OutJIT, | 
 |                                         reinterpret_cast<LLVMModuleRef>(MP), | 
 |                                         OptLevel, OutError); | 
 | } | 
 |  | 
 |  | 
 | 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 LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){ | 
 |   unwrap(EE)->addModule(unwrap(M)); | 
 | } | 
 |  | 
 | void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ | 
 |   /* The module provider is now actually a module. */ | 
 |   LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP)); | 
 | } | 
 |  | 
 | LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M, | 
 |                           LLVMModuleRef *OutMod, char **OutError) { | 
 |   Module *Mod = unwrap(M); | 
 |   unwrap(EE)->removeModule(Mod); | 
 |   *OutMod = wrap(Mod); | 
 |   return 0; | 
 | } | 
 |  | 
 | LLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, | 
 |                                   LLVMModuleProviderRef MP, | 
 |                                   LLVMModuleRef *OutMod, char **OutError) { | 
 |   /* The module provider is now actually a module. */ | 
 |   return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod, | 
 |                           OutError); | 
 | } | 
 |  | 
 | LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, | 
 |                           LLVMValueRef *OutFn) { | 
 |   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { | 
 |     *OutFn = wrap(F); | 
 |     return 0; | 
 |   } | 
 |   return 1; | 
 | } | 
 |  | 
 | LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { | 
 |   return wrap(unwrap(EE)->getTargetData()); | 
 | } | 
 |  | 
 | void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, | 
 |                           void* Addr) { | 
 |   unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr); | 
 | } | 
 |  | 
 | void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) { | 
 |   return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global)); | 
 | } |