12a8cd89dSGordon Henriksen //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
22a8cd89dSGordon Henriksen //
32a8cd89dSGordon Henriksen //                     The LLVM Compiler Infrastructure
42a8cd89dSGordon Henriksen //
5*f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source
6*f3ebc3f3SChris 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;
1042a8cd89dSGordon Henriksen   if (ExecutionEngine *Interp = ExecutionEngine::create(unwrap(MP), &Error)) {
1052a8cd89dSGordon Henriksen     *OutInterp = wrap(Interp);
1062a8cd89dSGordon Henriksen     return 0;
1072a8cd89dSGordon Henriksen   }
1082a8cd89dSGordon Henriksen   *OutError = strdup(Error.c_str());
1092a8cd89dSGordon Henriksen   return 1;
1102a8cd89dSGordon Henriksen }
1112a8cd89dSGordon Henriksen 
1122a8cd89dSGordon Henriksen int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
1132a8cd89dSGordon Henriksen                           LLVMModuleProviderRef MP,
1142a8cd89dSGordon Henriksen                           char **OutError) {
1152a8cd89dSGordon Henriksen   std::string Error;
1162a8cd89dSGordon Henriksen   if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) {
1172a8cd89dSGordon Henriksen     *OutJIT = wrap(JIT);
1182a8cd89dSGordon Henriksen     return 0;
1192a8cd89dSGordon Henriksen   }
1202a8cd89dSGordon Henriksen   *OutError = strdup(Error.c_str());
1212a8cd89dSGordon Henriksen   return 1;
1222a8cd89dSGordon Henriksen }
1232a8cd89dSGordon Henriksen 
1242a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
1252a8cd89dSGordon Henriksen   delete unwrap(EE);
1262a8cd89dSGordon Henriksen }
1272a8cd89dSGordon Henriksen 
1282a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
1292a8cd89dSGordon Henriksen   unwrap(EE)->runStaticConstructorsDestructors(false);
1302a8cd89dSGordon Henriksen }
1312a8cd89dSGordon Henriksen 
1322a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
1332a8cd89dSGordon Henriksen   unwrap(EE)->runStaticConstructorsDestructors(true);
1342a8cd89dSGordon Henriksen }
1352a8cd89dSGordon Henriksen 
1362a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
1372a8cd89dSGordon Henriksen                           unsigned ArgC, const char * const *ArgV,
1382a8cd89dSGordon Henriksen                           const char * const *EnvP) {
1392a8cd89dSGordon Henriksen   std::vector<std::string> ArgVec;
1402a8cd89dSGordon Henriksen   for (unsigned I = 0; I != ArgC; ++I)
1412a8cd89dSGordon Henriksen     ArgVec.push_back(ArgV[I]);
1422a8cd89dSGordon Henriksen 
1432a8cd89dSGordon Henriksen   return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
1442a8cd89dSGordon Henriksen }
1452a8cd89dSGordon Henriksen 
1462a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
1472a8cd89dSGordon Henriksen                                     unsigned NumArgs,
1482a8cd89dSGordon Henriksen                                     LLVMGenericValueRef *Args) {
1492a8cd89dSGordon Henriksen   std::vector<GenericValue> ArgVec;
1502a8cd89dSGordon Henriksen   ArgVec.reserve(NumArgs);
1512a8cd89dSGordon Henriksen   for (unsigned I = 0; I != NumArgs; ++I)
1522a8cd89dSGordon Henriksen     ArgVec.push_back(*unwrap(Args[I]));
1532a8cd89dSGordon Henriksen 
1542a8cd89dSGordon Henriksen   GenericValue *Result = new GenericValue();
1552a8cd89dSGordon Henriksen   *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
1562a8cd89dSGordon Henriksen   return wrap(Result);
1572a8cd89dSGordon Henriksen }
1582a8cd89dSGordon Henriksen 
1592a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
1602a8cd89dSGordon Henriksen   unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
1612a8cd89dSGordon Henriksen }
1622a8cd89dSGordon Henriksen 
1632a8cd89dSGordon Henriksen void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
1642a8cd89dSGordon Henriksen   unwrap(EE)->addModuleProvider(unwrap(MP));
1652a8cd89dSGordon Henriksen }
1662a8cd89dSGordon Henriksen 
1672a8cd89dSGordon Henriksen int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
1682a8cd89dSGordon Henriksen                              LLVMModuleProviderRef MP,
1692a8cd89dSGordon Henriksen                              LLVMModuleRef *OutMod, char **OutError) {
1702a8cd89dSGordon Henriksen   std::string Error;
1712a8cd89dSGordon Henriksen   if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) {
1722a8cd89dSGordon Henriksen     *OutMod = wrap(Gone);
1732a8cd89dSGordon Henriksen     return 0;
1742a8cd89dSGordon Henriksen   }
1752a8cd89dSGordon Henriksen   if (OutError)
1762a8cd89dSGordon Henriksen     *OutError = strdup(Error.c_str());
1772a8cd89dSGordon Henriksen   return 1;
1782a8cd89dSGordon Henriksen }
1792a8cd89dSGordon Henriksen 
1802a8cd89dSGordon Henriksen int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
1812a8cd89dSGordon Henriksen                      LLVMValueRef *OutFn) {
1822a8cd89dSGordon Henriksen   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
1832a8cd89dSGordon Henriksen     *OutFn = wrap(F);
1842a8cd89dSGordon Henriksen     return 0;
1852a8cd89dSGordon Henriksen   }
1862a8cd89dSGordon Henriksen   return 1;
1872a8cd89dSGordon Henriksen }
188