12e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen//===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===// 22e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// 32e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// The LLVM Compiler Infrastructure 42e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// 82e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen//===----------------------------------------------------------------------===// 92e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// 102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// This file defines the C bindings for the ExecutionEngine library. 112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen// 122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen//===----------------------------------------------------------------------===// 132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#define DEBUG_TYPE "jit" 152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "llvm-c/ExecutionEngine.h" 162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "llvm/ExecutionEngine/GenericValue.h" 172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "llvm/ExecutionEngine/ExecutionEngine.h" 18c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 19ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring> 202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenusing namespace llvm; 222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on generic values --------------------------------------===*/ 242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 252e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty, 262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned long long N, 27d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMBool IsSigned) { 282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenericValue *GenVal = new GenericValue(); 292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned); 302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return wrap(GenVal); 312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 332e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) { 342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenericValue *GenVal = new GenericValue(); 352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenVal->PointerVal = P; 362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return wrap(GenVal); 372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 392e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) { 402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenericValue *GenVal = new GenericValue(); 412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen case Type::FloatTyID: 432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenVal->FloatVal = N; 442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen break; 452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen case Type::DoubleTyID: 462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenVal->DoubleVal = N; 472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen break; 482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen default: 49c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); 502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return wrap(GenVal); 522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) { 552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return unwrap(GenValRef)->IntVal.getBitWidth(); 562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef, 59d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMBool IsSigned) { 602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenericValue *GenVal = unwrap(GenValRef); 612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen if (IsSigned) 622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return GenVal->IntVal.getSExtValue(); 632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen else 642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return GenVal->IntVal.getZExtValue(); 652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) { 682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return unwrap(GenVal)->PointerVal; 692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksendouble LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) { 722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen switch (unwrap(TyRef)->getTypeID()) { 732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen case Type::FloatTyID: 742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return unwrap(GenVal)->FloatVal; 752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen case Type::DoubleTyID: 762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return unwrap(GenVal)->DoubleVal; 772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen default: 78c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double."); 792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) { 832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen delete unwrap(GenVal); 842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on execution engines -----------------------------------===*/ 872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 88df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE, 89df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 90df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen std::string Error; 92df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar EngineBuilder builder(unwrap(M)); 934b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner builder.setEngineKind(EngineKind::Either) 944b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner .setErrorStr(&Error); 954b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner if (ExecutionEngine *EE = builder.create()){ 962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutEE = wrap(EE); 972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 0; 982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutError = strdup(Error.c_str()); 1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 1; 1012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 103df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp, 104df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 105df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 1062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen std::string Error; 107df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar EngineBuilder builder(unwrap(M)); 1084b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner builder.setEngineKind(EngineKind::Interpreter) 1094b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner .setErrorStr(&Error); 1104b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner if (ExecutionEngine *Interp = builder.create()) { 1112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutInterp = wrap(Interp); 1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 0; 1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutError = strdup(Error.c_str()); 1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 1; 1162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 118df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT, 119df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef M, 120df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar unsigned OptLevel, 121df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 1222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen std::string Error; 123df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar EngineBuilder builder(unwrap(M)); 1244b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner builder.setEngineKind(EngineKind::JIT) 1254b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner .setErrorStr(&Error) 1264b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner .setOptLevel((CodeGenOpt::Level)OptLevel); 1274b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner if (ExecutionEngine *JIT = builder.create()) { 1282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutJIT = wrap(JIT); 1292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 0; 1302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 1312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutError = strdup(Error.c_str()); 1322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 1; 1332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 135df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE, 136df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleProviderRef MP, 137df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 138df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar /* The module provider is now actually a module. */ 139df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMCreateExecutionEngineForModule(OutEE, 140df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar reinterpret_cast<LLVMModuleRef>(MP), 141df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutError); 142df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 143df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 144df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp, 145df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleProviderRef MP, 146df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 147df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar /* The module provider is now actually a module. */ 148df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMCreateInterpreterForModule(OutInterp, 149df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar reinterpret_cast<LLVMModuleRef>(MP), 150df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutError); 151df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 152df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 153df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT, 154df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleProviderRef MP, 155df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar unsigned OptLevel, 156df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutError) { 157df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar /* The module provider is now actually a module. */ 158df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMCreateJITCompilerForModule(OutJIT, 159df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar reinterpret_cast<LLVMModuleRef>(MP), 160df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OptLevel, OutError); 161df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 162df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 163df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 1642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) { 1652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen delete unwrap(EE); 1662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) { 1692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(false); 1702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) { 1732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(true); 1742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenint LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F, 1772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned ArgC, const char * const *ArgV, 1782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen const char * const *EnvP) { 1792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen std::vector<std::string> ArgVec; 1802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (unsigned I = 0; I != ArgC; ++I) 1812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen ArgVec.push_back(ArgV[I]); 1822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP); 1842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1862e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F, 1872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unsigned NumArgs, 1882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen LLVMGenericValueRef *Args) { 1892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen std::vector<GenericValue> ArgVec; 1902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen ArgVec.reserve(NumArgs); 1912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen for (unsigned I = 0; I != NumArgs; ++I) 1922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen ArgVec.push_back(*unwrap(Args[I])); 1932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen GenericValue *Result = new GenericValue(); 1952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec); 1962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return wrap(Result); 1972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 1982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 1992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) { 2002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F)); 2012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 203df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaarvoid LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){ 204df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar unwrap(EE)->addModule(unwrap(M)); 205df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 206df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 2072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){ 208df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar /* The module provider is now actually a module. */ 209df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP)); 210df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 211df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 212df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M, 213df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef *OutMod, char **OutError) { 214df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar Module *Mod = unwrap(M); 215df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar unwrap(EE)->removeModule(Mod); 216df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar *OutMod = wrap(Mod); 217df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return 0; 2182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 220d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE, 221d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleProviderRef MP, 222d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleRef *OutMod, char **OutError) { 223df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar /* The module provider is now actually a module. */ 224df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod, 225df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutError); 2262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen 228d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name, 229d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMValueRef *OutFn) { 2302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) { 2312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen *OutFn = wrap(F); 2322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 0; 2332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen } 2342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen return 1; 2352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen} 2367c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar 237d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sandsvoid *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn) { 238e117b639737188eba48b1580fca24258ca108b0dDuncan Sands return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn)); 239d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands} 240d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands 2417c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick TryzelaarLLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) { 2427c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar return wrap(unwrap(EE)->getTargetData()); 2437c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar} 24454227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen 24554227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksenvoid LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global, 24654227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen void* Addr) { 24754227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr); 24854227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen} 2491e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner 2501e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattnervoid *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) { 2511e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global)); 2521e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner} 253