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" 1856d06597STorok Edwin #include "llvm/Support/ErrorHandling.h" 19579f0713SAnton Korobeynikov #include <cstring> 202a8cd89dSGordon Henriksen 212a8cd89dSGordon Henriksen using namespace llvm; 222a8cd89dSGordon Henriksen 232a8cd89dSGordon Henriksen /*===-- Operations on generic values --------------------------------------===*/ 242a8cd89dSGordon Henriksen 252a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 262a8cd89dSGordon Henriksen unsigned long long N, 272a8cd89dSGordon Henriksen int IsSigned) { 282a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 292a8cd89dSGordon Henriksen GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned); 302a8cd89dSGordon Henriksen return wrap(GenVal); 312a8cd89dSGordon Henriksen } 322a8cd89dSGordon Henriksen 332a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { 342a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 352a8cd89dSGordon Henriksen GenVal->PointerVal = P; 362a8cd89dSGordon Henriksen return wrap(GenVal); 372a8cd89dSGordon Henriksen } 382a8cd89dSGordon Henriksen 392a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { 402a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue(); 412a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 422a8cd89dSGordon Henriksen case Type::FloatTyID: 432a8cd89dSGordon Henriksen GenVal->FloatVal = N; 442a8cd89dSGordon Henriksen break; 452a8cd89dSGordon Henriksen case Type::DoubleTyID: 462a8cd89dSGordon Henriksen GenVal->DoubleVal = N; 472a8cd89dSGordon Henriksen break; 482a8cd89dSGordon Henriksen default: 49fbcc663cSTorok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); 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: 78fbcc663cSTorok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); 792a8cd89dSGordon Henriksen break; 802a8cd89dSGordon Henriksen } 810f760dfeSChris 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; 94*fc8a2d5aSReid Kleckner EngineBuilder builder(unwrap(MP)); 95*fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::Either) 96*fc8a2d5aSReid Kleckner .setErrorStr(&Error); 97*fc8a2d5aSReid Kleckner if (ExecutionEngine *EE = builder.create()){ 982a8cd89dSGordon Henriksen *OutEE = wrap(EE); 992a8cd89dSGordon Henriksen return 0; 1002a8cd89dSGordon Henriksen } 1012a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1022a8cd89dSGordon Henriksen return 1; 1032a8cd89dSGordon Henriksen } 1042a8cd89dSGordon Henriksen 1052a8cd89dSGordon Henriksen int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 1062a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1072a8cd89dSGordon Henriksen char **OutError) { 1082a8cd89dSGordon Henriksen std::string Error; 109*fc8a2d5aSReid Kleckner EngineBuilder builder(unwrap(MP)); 110*fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::Interpreter) 111*fc8a2d5aSReid Kleckner .setErrorStr(&Error); 112*fc8a2d5aSReid Kleckner if (ExecutionEngine *Interp = builder.create()) { 1132a8cd89dSGordon Henriksen *OutInterp = wrap(Interp); 1142a8cd89dSGordon Henriksen return 0; 1152a8cd89dSGordon Henriksen } 1162a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1172a8cd89dSGordon Henriksen return 1; 1182a8cd89dSGordon Henriksen } 1192a8cd89dSGordon Henriksen 1202a8cd89dSGordon Henriksen int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 1212a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 122352ee2cbSBill Wendling unsigned OptLevel, 1235225cd66SGordon Henriksen char **OutError) { 1242a8cd89dSGordon Henriksen std::string Error; 125*fc8a2d5aSReid Kleckner EngineBuilder builder(unwrap(MP)); 126*fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::JIT) 127*fc8a2d5aSReid Kleckner .setErrorStr(&Error) 128*fc8a2d5aSReid Kleckner .setOptLevel((CodeGenOpt::Level)OptLevel); 129*fc8a2d5aSReid Kleckner if (ExecutionEngine *JIT = builder.create()) { 1302a8cd89dSGordon Henriksen *OutJIT = wrap(JIT); 1312a8cd89dSGordon Henriksen return 0; 1322a8cd89dSGordon Henriksen } 1332a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1342a8cd89dSGordon Henriksen return 1; 1352a8cd89dSGordon Henriksen } 1362a8cd89dSGordon Henriksen 1372a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) { 1382a8cd89dSGordon Henriksen delete unwrap(EE); 1392a8cd89dSGordon Henriksen } 1402a8cd89dSGordon Henriksen 1412a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) { 1422a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(false); 1432a8cd89dSGordon Henriksen } 1442a8cd89dSGordon Henriksen 1452a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) { 1462a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(true); 1472a8cd89dSGordon Henriksen } 1482a8cd89dSGordon Henriksen 1492a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 1502a8cd89dSGordon Henriksen unsigned ArgC, const char * const *ArgV, 1512a8cd89dSGordon Henriksen const char * const *EnvP) { 1522a8cd89dSGordon Henriksen std::vector<std::string> ArgVec; 1532a8cd89dSGordon Henriksen for (unsigned I = 0; I != ArgC; ++I) 1542a8cd89dSGordon Henriksen ArgVec.push_back(ArgV[I]); 1552a8cd89dSGordon Henriksen 1562a8cd89dSGordon Henriksen return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP); 1572a8cd89dSGordon Henriksen } 1582a8cd89dSGordon Henriksen 1592a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 1602a8cd89dSGordon Henriksen unsigned NumArgs, 1612a8cd89dSGordon Henriksen LLVMGenericValueRef *Args) { 1622a8cd89dSGordon Henriksen std::vector<GenericValue> ArgVec; 1632a8cd89dSGordon Henriksen ArgVec.reserve(NumArgs); 1642a8cd89dSGordon Henriksen for (unsigned I = 0; I != NumArgs; ++I) 1652a8cd89dSGordon Henriksen ArgVec.push_back(*unwrap(Args[I])); 1662a8cd89dSGordon Henriksen 1672a8cd89dSGordon Henriksen GenericValue *Result = new GenericValue(); 1682a8cd89dSGordon Henriksen *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec); 1692a8cd89dSGordon Henriksen return wrap(Result); 1702a8cd89dSGordon Henriksen } 1712a8cd89dSGordon Henriksen 1722a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) { 1732a8cd89dSGordon Henriksen unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F)); 1742a8cd89dSGordon Henriksen } 1752a8cd89dSGordon Henriksen 1762a8cd89dSGordon Henriksen void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ 1772a8cd89dSGordon Henriksen unwrap(EE)->addModuleProvider(unwrap(MP)); 1782a8cd89dSGordon Henriksen } 1792a8cd89dSGordon Henriksen 1802a8cd89dSGordon Henriksen int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 1812a8cd89dSGordon Henriksen LLVMModuleProviderRef MP, 1822a8cd89dSGordon Henriksen LLVMModuleRef *OutMod, char **OutError) { 1832a8cd89dSGordon Henriksen std::string Error; 1842a8cd89dSGordon Henriksen if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) { 1852a8cd89dSGordon Henriksen *OutMod = wrap(Gone); 1862a8cd89dSGordon Henriksen return 0; 1872a8cd89dSGordon Henriksen } 1882a8cd89dSGordon Henriksen if (OutError) 1892a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str()); 1902a8cd89dSGordon Henriksen return 1; 1912a8cd89dSGordon Henriksen } 1922a8cd89dSGordon Henriksen 1932a8cd89dSGordon Henriksen int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 1942a8cd89dSGordon Henriksen LLVMValueRef *OutFn) { 1952a8cd89dSGordon Henriksen if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { 1962a8cd89dSGordon Henriksen *OutFn = wrap(F); 1972a8cd89dSGordon Henriksen return 0; 1982a8cd89dSGordon Henriksen } 1992a8cd89dSGordon Henriksen return 1; 2002a8cd89dSGordon Henriksen } 2018ac07c28SErick Tryzelaar 2028ac07c28SErick Tryzelaar LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { 2038ac07c28SErick Tryzelaar return wrap(unwrap(EE)->getTargetData()); 2048ac07c28SErick Tryzelaar } 2059f337549SGordon Henriksen 2069f337549SGordon Henriksen void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 2079f337549SGordon Henriksen void* Addr) { 2089f337549SGordon Henriksen unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr); 2099f337549SGordon Henriksen } 21041b43da2SChris Lattner 21141b43da2SChris Lattner void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) { 21241b43da2SChris Lattner return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global)); 21341b43da2SChris Lattner } 214