12a8cd89dSGordon Henriksen //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===// 22a8cd89dSGordon Henriksen // 32a8cd89dSGordon Henriksen // The LLVM Compiler Infrastructure 42a8cd89dSGordon Henriksen // 5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source 6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details. 72a8cd89dSGordon Henriksen // 82a8cd89dSGordon Henriksen //===----------------------------------------------------------------------===// 92a8cd89dSGordon Henriksen // 102a8cd89dSGordon Henriksen // This file defines the C bindings for the ExecutionEngine library. 112a8cd89dSGordon Henriksen // 122a8cd89dSGordon Henriksen //===----------------------------------------------------------------------===// 132a8cd89dSGordon Henriksen 142a8cd89dSGordon Henriksen #define DEBUG_TYPE "jit" 152a8cd89dSGordon Henriksen #include "llvm-c/ExecutionEngine.h" 162a8cd89dSGordon Henriksen #include "llvm/ExecutionEngine/GenericValue.h" 172a8cd89dSGordon Henriksen #include "llvm/ExecutionEngine/ExecutionEngine.h" 18579f0713SAnton Korobeynikov #include <cstring> 192a8cd89dSGordon Henriksen 202a8cd89dSGordon Henriksen using namespace llvm; 212a8cd89dSGordon Henriksen 222a8cd89dSGordon Henriksen /*===-- Operations on generic values --------------------------------------===*/ 232a8cd89dSGordon Henriksen 242a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 252a8cd89dSGordon Henriksen unsigned long long N, 262a8cd89dSGordon Henriksen int IsSigned) { 272a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 282a8cd89dSGordon Henriksen GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned); 292a8cd89dSGordon Henriksen return wrap(GenVal); 302a8cd89dSGordon Henriksen } 312a8cd89dSGordon Henriksen 322a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { 332a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 342a8cd89dSGordon Henriksen GenVal->PointerVal = P; 352a8cd89dSGordon Henriksen return wrap(GenVal); 362a8cd89dSGordon Henriksen } 372a8cd89dSGordon Henriksen 382a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { 392a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 402a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 412a8cd89dSGordon Henriksen case Type::FloatTyID: 422a8cd89dSGordon Henriksen GenVal->FloatVal = N; 432a8cd89dSGordon Henriksen break; 442a8cd89dSGordon Henriksen case Type::DoubleTyID: 452a8cd89dSGordon Henriksen GenVal->DoubleVal = N; 462a8cd89dSGordon Henriksen break; 472a8cd89dSGordon Henriksen default: 482a8cd89dSGordon Henriksen assert(0 && "LLVMGenericValueToFloat supports only float and double."); 492a8cd89dSGordon Henriksen break; 502a8cd89dSGordon Henriksen } 512a8cd89dSGordon Henriksen return wrap(GenVal); 522a8cd89dSGordon Henriksen } 532a8cd89dSGordon Henriksen 542a8cd89dSGordon Henriksen unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { 552a8cd89dSGordon Henriksen return unwrap(GenValRef)->IntVal.getBitWidth(); 562a8cd89dSGordon Henriksen } 572a8cd89dSGordon Henriksen 582a8cd89dSGordon Henriksen unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef, 592a8cd89dSGordon Henriksen int IsSigned) { 602a8cd89dSGordon Henriksen GenericValue *GenVal = unwrap(GenValRef); 612a8cd89dSGordon Henriksen if (IsSigned) 622a8cd89dSGordon Henriksen return GenVal->IntVal.getSExtValue(); 632a8cd89dSGordon Henriksen else 642a8cd89dSGordon Henriksen return GenVal->IntVal.getZExtValue(); 652a8cd89dSGordon Henriksen } 662a8cd89dSGordon Henriksen 672a8cd89dSGordon Henriksen void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) { 682a8cd89dSGordon Henriksen return unwrap(GenVal)->PointerVal; 692a8cd89dSGordon Henriksen } 702a8cd89dSGordon Henriksen 712a8cd89dSGordon Henriksen double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) { 722a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 732a8cd89dSGordon Henriksen case Type::FloatTyID: 742a8cd89dSGordon Henriksen return unwrap(GenVal)->FloatVal; 752a8cd89dSGordon Henriksen case Type::DoubleTyID: 762a8cd89dSGordon Henriksen return unwrap(GenVal)->DoubleVal; 772a8cd89dSGordon Henriksen default: 782a8cd89dSGordon Henriksen assert(0 && "LLVMGenericValueToFloat supports only float and double."); 792a8cd89dSGordon Henriksen break; 802a8cd89dSGordon Henriksen } 81*0f760dfeSChris Lattner return 0; // Not reached 822a8cd89dSGordon Henriksen } 832a8cd89dSGordon Henriksen 842a8cd89dSGordon Henriksen void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { 852a8cd89dSGordon Henriksen delete unwrap(GenVal); 862a8cd89dSGordon Henriksen } 872a8cd89dSGordon Henriksen 882a8cd89dSGordon Henriksen /*===-- Operations on execution engines -----------------------------------===*/ 892a8cd89dSGordon Henriksen 902a8cd89dSGordon Henriksen int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, 912a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 922a8cd89dSGordon Henriksen char **OutError) { 932a8cd89dSGordon Henriksen std::string Error; 942a8cd89dSGordon Henriksen if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){ 952a8cd89dSGordon Henriksen *OutEE = wrap(EE); 962a8cd89dSGordon Henriksen return 0; 972a8cd89dSGordon Henriksen } 982a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 992a8cd89dSGordon Henriksen return 1; 1002a8cd89dSGordon Henriksen } 1012a8cd89dSGordon Henriksen 1022a8cd89dSGordon Henriksen int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 1032a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1042a8cd89dSGordon Henriksen char **OutError) { 1052a8cd89dSGordon Henriksen std::string Error; 106c50c210dSDuncan Sands if (ExecutionEngine *Interp = 107c50c210dSDuncan Sands ExecutionEngine::create(unwrap(MP), false, &Error)) { 1082a8cd89dSGordon Henriksen *OutInterp = wrap(Interp); 1092a8cd89dSGordon Henriksen return 0; 1102a8cd89dSGordon Henriksen } 1112a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1122a8cd89dSGordon Henriksen return 1; 1132a8cd89dSGordon Henriksen } 1142a8cd89dSGordon Henriksen 1152a8cd89dSGordon Henriksen int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 1162a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1172a8cd89dSGordon Henriksen char **OutError) { 1182a8cd89dSGordon Henriksen std::string Error; 1192a8cd89dSGordon Henriksen if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) { 1202a8cd89dSGordon Henriksen *OutJIT = wrap(JIT); 1212a8cd89dSGordon Henriksen return 0; 1222a8cd89dSGordon Henriksen } 1232a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1242a8cd89dSGordon Henriksen return 1; 1252a8cd89dSGordon Henriksen } 1262a8cd89dSGordon Henriksen 1272a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) { 1282a8cd89dSGordon Henriksen delete unwrap(EE); 1292a8cd89dSGordon Henriksen } 1302a8cd89dSGordon Henriksen 1312a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) { 1322a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(false); 1332a8cd89dSGordon Henriksen } 1342a8cd89dSGordon Henriksen 1352a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) { 1362a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(true); 1372a8cd89dSGordon Henriksen } 1382a8cd89dSGordon Henriksen 1392a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 1402a8cd89dSGordon Henriksen unsigned ArgC, const char * const *ArgV, 1412a8cd89dSGordon Henriksen const char * const *EnvP) { 1422a8cd89dSGordon Henriksen std::vector<std::string> ArgVec; 1432a8cd89dSGordon Henriksen for (unsigned I = 0; I != ArgC; ++I) 1442a8cd89dSGordon Henriksen ArgVec.push_back(ArgV[I]); 1452a8cd89dSGordon Henriksen 1462a8cd89dSGordon Henriksen return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP); 1472a8cd89dSGordon Henriksen } 1482a8cd89dSGordon Henriksen 1492a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 1502a8cd89dSGordon Henriksen unsigned NumArgs, 1512a8cd89dSGordon Henriksen LLVMGenericValueRef *Args) { 1522a8cd89dSGordon Henriksen std::vector<GenericValue> ArgVec; 1532a8cd89dSGordon Henriksen ArgVec.reserve(NumArgs); 1542a8cd89dSGordon Henriksen for (unsigned I = 0; I != NumArgs; ++I) 1552a8cd89dSGordon Henriksen ArgVec.push_back(*unwrap(Args[I])); 1562a8cd89dSGordon Henriksen 1572a8cd89dSGordon Henriksen GenericValue *Result = new GenericValue(); 1582a8cd89dSGordon Henriksen *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec); 1592a8cd89dSGordon Henriksen return wrap(Result); 1602a8cd89dSGordon Henriksen } 1612a8cd89dSGordon Henriksen 1622a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) { 1632a8cd89dSGordon Henriksen unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F)); 1642a8cd89dSGordon Henriksen } 1652a8cd89dSGordon Henriksen 1662a8cd89dSGordon Henriksen void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ 1672a8cd89dSGordon Henriksen unwrap(EE)->addModuleProvider(unwrap(MP)); 1682a8cd89dSGordon Henriksen } 1692a8cd89dSGordon Henriksen 1702a8cd89dSGordon Henriksen int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 1712a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1722a8cd89dSGordon Henriksen LLVMModuleRef *OutMod, char **OutError) { 1732a8cd89dSGordon Henriksen std::string Error; 1742a8cd89dSGordon Henriksen if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) { 1752a8cd89dSGordon Henriksen *OutMod = wrap(Gone); 1762a8cd89dSGordon Henriksen return 0; 1772a8cd89dSGordon Henriksen } 1782a8cd89dSGordon Henriksen if (OutError) 1792a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1802a8cd89dSGordon Henriksen return 1; 1812a8cd89dSGordon Henriksen } 1822a8cd89dSGordon Henriksen 1832a8cd89dSGordon Henriksen int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 1842a8cd89dSGordon Henriksen LLVMValueRef *OutFn) { 1852a8cd89dSGordon Henriksen if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { 1862a8cd89dSGordon Henriksen *OutFn = wrap(F); 1872a8cd89dSGordon Henriksen return 0; 1882a8cd89dSGordon Henriksen } 1892a8cd89dSGordon Henriksen return 1; 1902a8cd89dSGordon Henriksen } 1918ac07c28SErick Tryzelaar 1928ac07c28SErick Tryzelaar LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { 1938ac07c28SErick Tryzelaar return wrap(unwrap(EE)->getTargetData()); 1948ac07c28SErick Tryzelaar } 195