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