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" 182a8cd89dSGordon Henriksen 192a8cd89dSGordon Henriksen using namespace llvm; 202a8cd89dSGordon Henriksen 212a8cd89dSGordon Henriksen /*===-- Operations on generic values --------------------------------------===*/ 222a8cd89dSGordon Henriksen 232a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 242a8cd89dSGordon Henriksen unsigned long long N, 252a8cd89dSGordon Henriksen int IsSigned) { 262a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 272a8cd89dSGordon Henriksen GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned); 282a8cd89dSGordon Henriksen return wrap(GenVal); 292a8cd89dSGordon Henriksen } 302a8cd89dSGordon Henriksen 312a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { 322a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 332a8cd89dSGordon Henriksen GenVal->PointerVal = P; 342a8cd89dSGordon Henriksen return wrap(GenVal); 352a8cd89dSGordon Henriksen } 362a8cd89dSGordon Henriksen 372a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { 382a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 392a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 402a8cd89dSGordon Henriksen case Type::FloatTyID: 412a8cd89dSGordon Henriksen GenVal->FloatVal = N; 422a8cd89dSGordon Henriksen break; 432a8cd89dSGordon Henriksen case Type::DoubleTyID: 442a8cd89dSGordon Henriksen GenVal->DoubleVal = N; 452a8cd89dSGordon Henriksen break; 462a8cd89dSGordon Henriksen default: 472a8cd89dSGordon Henriksen assert(0 && "LLVMGenericValueToFloat supports only float and double."); 482a8cd89dSGordon Henriksen break; 492a8cd89dSGordon Henriksen } 502a8cd89dSGordon Henriksen return wrap(GenVal); 512a8cd89dSGordon Henriksen } 522a8cd89dSGordon Henriksen 532a8cd89dSGordon Henriksen unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { 542a8cd89dSGordon Henriksen return unwrap(GenValRef)->IntVal.getBitWidth(); 552a8cd89dSGordon Henriksen } 562a8cd89dSGordon Henriksen 572a8cd89dSGordon Henriksen unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef, 582a8cd89dSGordon Henriksen int IsSigned) { 592a8cd89dSGordon Henriksen GenericValue *GenVal = unwrap(GenValRef); 602a8cd89dSGordon Henriksen if (IsSigned) 612a8cd89dSGordon Henriksen return GenVal->IntVal.getSExtValue(); 622a8cd89dSGordon Henriksen else 632a8cd89dSGordon Henriksen return GenVal->IntVal.getZExtValue(); 642a8cd89dSGordon Henriksen } 652a8cd89dSGordon Henriksen 662a8cd89dSGordon Henriksen void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) { 672a8cd89dSGordon Henriksen return unwrap(GenVal)->PointerVal; 682a8cd89dSGordon Henriksen } 692a8cd89dSGordon Henriksen 702a8cd89dSGordon Henriksen double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) { 712a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 722a8cd89dSGordon Henriksen case Type::FloatTyID: 732a8cd89dSGordon Henriksen return unwrap(GenVal)->FloatVal; 742a8cd89dSGordon Henriksen case Type::DoubleTyID: 752a8cd89dSGordon Henriksen return unwrap(GenVal)->DoubleVal; 762a8cd89dSGordon Henriksen default: 772a8cd89dSGordon Henriksen assert(0 && "LLVMGenericValueToFloat supports only float and double."); 782a8cd89dSGordon Henriksen break; 792a8cd89dSGordon Henriksen } 802a8cd89dSGordon Henriksen } 812a8cd89dSGordon Henriksen 822a8cd89dSGordon Henriksen void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { 832a8cd89dSGordon Henriksen delete unwrap(GenVal); 842a8cd89dSGordon Henriksen } 852a8cd89dSGordon Henriksen 862a8cd89dSGordon Henriksen /*===-- Operations on execution engines -----------------------------------===*/ 872a8cd89dSGordon Henriksen 882a8cd89dSGordon Henriksen int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, 892a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 902a8cd89dSGordon Henriksen char **OutError) { 912a8cd89dSGordon Henriksen std::string Error; 922a8cd89dSGordon Henriksen if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){ 932a8cd89dSGordon Henriksen *OutEE = wrap(EE); 942a8cd89dSGordon Henriksen return 0; 952a8cd89dSGordon Henriksen } 962a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 972a8cd89dSGordon Henriksen return 1; 982a8cd89dSGordon Henriksen } 992a8cd89dSGordon Henriksen 1002a8cd89dSGordon Henriksen int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 1012a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1022a8cd89dSGordon Henriksen char **OutError) { 1032a8cd89dSGordon Henriksen std::string Error; 104*c50c210dSDuncan Sands if (ExecutionEngine *Interp = 105*c50c210dSDuncan Sands ExecutionEngine::create(unwrap(MP), false, &Error)) { 1062a8cd89dSGordon Henriksen *OutInterp = wrap(Interp); 1072a8cd89dSGordon Henriksen return 0; 1082a8cd89dSGordon Henriksen } 1092a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1102a8cd89dSGordon Henriksen return 1; 1112a8cd89dSGordon Henriksen } 1122a8cd89dSGordon Henriksen 1132a8cd89dSGordon Henriksen int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 1142a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1152a8cd89dSGordon Henriksen char **OutError) { 1162a8cd89dSGordon Henriksen std::string Error; 1172a8cd89dSGordon Henriksen if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) { 1182a8cd89dSGordon Henriksen *OutJIT = wrap(JIT); 1192a8cd89dSGordon Henriksen return 0; 1202a8cd89dSGordon Henriksen } 1212a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1222a8cd89dSGordon Henriksen return 1; 1232a8cd89dSGordon Henriksen } 1242a8cd89dSGordon Henriksen 1252a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) { 1262a8cd89dSGordon Henriksen delete unwrap(EE); 1272a8cd89dSGordon Henriksen } 1282a8cd89dSGordon Henriksen 1292a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) { 1302a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(false); 1312a8cd89dSGordon Henriksen } 1322a8cd89dSGordon Henriksen 1332a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) { 1342a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(true); 1352a8cd89dSGordon Henriksen } 1362a8cd89dSGordon Henriksen 1372a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 1382a8cd89dSGordon Henriksen unsigned ArgC, const char * const *ArgV, 1392a8cd89dSGordon Henriksen const char * const *EnvP) { 1402a8cd89dSGordon Henriksen std::vector<std::string> ArgVec; 1412a8cd89dSGordon Henriksen for (unsigned I = 0; I != ArgC; ++I) 1422a8cd89dSGordon Henriksen ArgVec.push_back(ArgV[I]); 1432a8cd89dSGordon Henriksen 1442a8cd89dSGordon Henriksen return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP); 1452a8cd89dSGordon Henriksen } 1462a8cd89dSGordon Henriksen 1472a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 1482a8cd89dSGordon Henriksen unsigned NumArgs, 1492a8cd89dSGordon Henriksen LLVMGenericValueRef *Args) { 1502a8cd89dSGordon Henriksen std::vector<GenericValue> ArgVec; 1512a8cd89dSGordon Henriksen ArgVec.reserve(NumArgs); 1522a8cd89dSGordon Henriksen for (unsigned I = 0; I != NumArgs; ++I) 1532a8cd89dSGordon Henriksen ArgVec.push_back(*unwrap(Args[I])); 1542a8cd89dSGordon Henriksen 1552a8cd89dSGordon Henriksen GenericValue *Result = new GenericValue(); 1562a8cd89dSGordon Henriksen *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec); 1572a8cd89dSGordon Henriksen return wrap(Result); 1582a8cd89dSGordon Henriksen } 1592a8cd89dSGordon Henriksen 1602a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) { 1612a8cd89dSGordon Henriksen unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F)); 1622a8cd89dSGordon Henriksen } 1632a8cd89dSGordon Henriksen 1642a8cd89dSGordon Henriksen void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ 1652a8cd89dSGordon Henriksen unwrap(EE)->addModuleProvider(unwrap(MP)); 1662a8cd89dSGordon Henriksen } 1672a8cd89dSGordon Henriksen 1682a8cd89dSGordon Henriksen int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 1692a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1702a8cd89dSGordon Henriksen LLVMModuleRef *OutMod, char **OutError) { 1712a8cd89dSGordon Henriksen std::string Error; 1722a8cd89dSGordon Henriksen if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) { 1732a8cd89dSGordon Henriksen *OutMod = wrap(Gone); 1742a8cd89dSGordon Henriksen return 0; 1752a8cd89dSGordon Henriksen } 1762a8cd89dSGordon Henriksen if (OutError) 1772a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1782a8cd89dSGordon Henriksen return 1; 1792a8cd89dSGordon Henriksen } 1802a8cd89dSGordon Henriksen 1812a8cd89dSGordon Henriksen int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 1822a8cd89dSGordon Henriksen LLVMValueRef *OutFn) { 1832a8cd89dSGordon Henriksen if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { 1842a8cd89dSGordon Henriksen *OutFn = wrap(F); 1852a8cd89dSGordon Henriksen return 0; 1862a8cd89dSGordon Henriksen } 1872a8cd89dSGordon Henriksen return 1; 1882a8cd89dSGordon Henriksen } 189