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"
18579f0713SAnton Korobeynikov #include <cstring>
192a8cd89dSGordon Henriksen 
202a8cd89dSGordon Henriksen using namespace llvm;
212a8cd89dSGordon Henriksen 
222a8cd89dSGordon Henriksen /*===-- Operations on generic values --------------------------------------===*/
232a8cd89dSGordon Henriksen 
242a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
252a8cd89dSGordon Henriksen                                                 unsigned long long N,
262a8cd89dSGordon Henriksen                                                 int IsSigned) {
272a8cd89dSGordon Henriksen   GenericValue *GenVal = new GenericValue();
282a8cd89dSGordon Henriksen   GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
292a8cd89dSGordon Henriksen   return wrap(GenVal);
302a8cd89dSGordon Henriksen }
312a8cd89dSGordon Henriksen 
322a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
332a8cd89dSGordon Henriksen   GenericValue *GenVal = new GenericValue();
342a8cd89dSGordon Henriksen   GenVal->PointerVal = P;
352a8cd89dSGordon Henriksen   return wrap(GenVal);
362a8cd89dSGordon Henriksen }
372a8cd89dSGordon Henriksen 
382a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
392a8cd89dSGordon Henriksen   GenericValue *GenVal = new GenericValue();
402a8cd89dSGordon Henriksen   switch (unwrap(TyRef)->getTypeID()) {
412a8cd89dSGordon Henriksen   case Type::FloatTyID:
422a8cd89dSGordon Henriksen     GenVal->FloatVal = N;
432a8cd89dSGordon Henriksen     break;
442a8cd89dSGordon Henriksen   case Type::DoubleTyID:
452a8cd89dSGordon Henriksen     GenVal->DoubleVal = N;
462a8cd89dSGordon Henriksen     break;
472a8cd89dSGordon Henriksen   default:
482a8cd89dSGordon Henriksen     assert(0 && "LLVMGenericValueToFloat supports only float and double.");
492a8cd89dSGordon Henriksen     break;
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:
782a8cd89dSGordon Henriksen     assert(0 && "LLVMGenericValueToFloat supports only float and double.");
792a8cd89dSGordon Henriksen     break;
802a8cd89dSGordon Henriksen   }
81*0f760dfeSChris 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;
942a8cd89dSGordon Henriksen   if (ExecutionEngine *EE = ExecutionEngine::create(unwrap(MP), false, &Error)){
952a8cd89dSGordon Henriksen     *OutEE = wrap(EE);
962a8cd89dSGordon Henriksen     return 0;
972a8cd89dSGordon Henriksen   }
982a8cd89dSGordon Henriksen   *OutError = strdup(Error.c_str());
992a8cd89dSGordon Henriksen   return 1;
1002a8cd89dSGordon Henriksen }
1012a8cd89dSGordon Henriksen 
1022a8cd89dSGordon Henriksen int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
1032a8cd89dSGordon Henriksen                           LLVMModuleProviderRef MP,
1042a8cd89dSGordon Henriksen                           char **OutError) {
1052a8cd89dSGordon Henriksen   std::string Error;
106c50c210dSDuncan Sands   if (ExecutionEngine *Interp =
107c50c210dSDuncan Sands       ExecutionEngine::create(unwrap(MP), false, &Error)) {
1082a8cd89dSGordon Henriksen     *OutInterp = wrap(Interp);
1092a8cd89dSGordon Henriksen     return 0;
1102a8cd89dSGordon Henriksen   }
1112a8cd89dSGordon Henriksen   *OutError = strdup(Error.c_str());
1122a8cd89dSGordon Henriksen   return 1;
1132a8cd89dSGordon Henriksen }
1142a8cd89dSGordon Henriksen 
1152a8cd89dSGordon Henriksen int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
1162a8cd89dSGordon Henriksen                           LLVMModuleProviderRef MP,
1172a8cd89dSGordon Henriksen                           char **OutError) {
1182a8cd89dSGordon Henriksen   std::string Error;
1192a8cd89dSGordon Henriksen   if (ExecutionEngine *JIT = ExecutionEngine::createJIT(unwrap(MP), &Error)) {
1202a8cd89dSGordon Henriksen     *OutJIT = wrap(JIT);
1212a8cd89dSGordon Henriksen     return 0;
1222a8cd89dSGordon Henriksen   }
1232a8cd89dSGordon Henriksen   *OutError = strdup(Error.c_str());
1242a8cd89dSGordon Henriksen   return 1;
1252a8cd89dSGordon Henriksen }
1262a8cd89dSGordon Henriksen 
1272a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
1282a8cd89dSGordon Henriksen   delete unwrap(EE);
1292a8cd89dSGordon Henriksen }
1302a8cd89dSGordon Henriksen 
1312a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
1322a8cd89dSGordon Henriksen   unwrap(EE)->runStaticConstructorsDestructors(false);
1332a8cd89dSGordon Henriksen }
1342a8cd89dSGordon Henriksen 
1352a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
1362a8cd89dSGordon Henriksen   unwrap(EE)->runStaticConstructorsDestructors(true);
1372a8cd89dSGordon Henriksen }
1382a8cd89dSGordon Henriksen 
1392a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
1402a8cd89dSGordon Henriksen                           unsigned ArgC, const char * const *ArgV,
1412a8cd89dSGordon Henriksen                           const char * const *EnvP) {
1422a8cd89dSGordon Henriksen   std::vector<std::string> ArgVec;
1432a8cd89dSGordon Henriksen   for (unsigned I = 0; I != ArgC; ++I)
1442a8cd89dSGordon Henriksen     ArgVec.push_back(ArgV[I]);
1452a8cd89dSGordon Henriksen 
1462a8cd89dSGordon Henriksen   return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
1472a8cd89dSGordon Henriksen }
1482a8cd89dSGordon Henriksen 
1492a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
1502a8cd89dSGordon Henriksen                                     unsigned NumArgs,
1512a8cd89dSGordon Henriksen                                     LLVMGenericValueRef *Args) {
1522a8cd89dSGordon Henriksen   std::vector<GenericValue> ArgVec;
1532a8cd89dSGordon Henriksen   ArgVec.reserve(NumArgs);
1542a8cd89dSGordon Henriksen   for (unsigned I = 0; I != NumArgs; ++I)
1552a8cd89dSGordon Henriksen     ArgVec.push_back(*unwrap(Args[I]));
1562a8cd89dSGordon Henriksen 
1572a8cd89dSGordon Henriksen   GenericValue *Result = new GenericValue();
1582a8cd89dSGordon Henriksen   *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
1592a8cd89dSGordon Henriksen   return wrap(Result);
1602a8cd89dSGordon Henriksen }
1612a8cd89dSGordon Henriksen 
1622a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
1632a8cd89dSGordon Henriksen   unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
1642a8cd89dSGordon Henriksen }
1652a8cd89dSGordon Henriksen 
1662a8cd89dSGordon Henriksen void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
1672a8cd89dSGordon Henriksen   unwrap(EE)->addModuleProvider(unwrap(MP));
1682a8cd89dSGordon Henriksen }
1692a8cd89dSGordon Henriksen 
1702a8cd89dSGordon Henriksen int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
1712a8cd89dSGordon Henriksen                              LLVMModuleProviderRef MP,
1722a8cd89dSGordon Henriksen                              LLVMModuleRef *OutMod, char **OutError) {
1732a8cd89dSGordon Henriksen   std::string Error;
1742a8cd89dSGordon Henriksen   if (Module *Gone = unwrap(EE)->removeModuleProvider(unwrap(MP), &Error)) {
1752a8cd89dSGordon Henriksen     *OutMod = wrap(Gone);
1762a8cd89dSGordon Henriksen     return 0;
1772a8cd89dSGordon Henriksen   }
1782a8cd89dSGordon Henriksen   if (OutError)
1792a8cd89dSGordon Henriksen     *OutError = strdup(Error.c_str());
1802a8cd89dSGordon Henriksen   return 1;
1812a8cd89dSGordon Henriksen }
1822a8cd89dSGordon Henriksen 
1832a8cd89dSGordon Henriksen int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
1842a8cd89dSGordon Henriksen                      LLVMValueRef *OutFn) {
1852a8cd89dSGordon Henriksen   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
1862a8cd89dSGordon Henriksen     *OutFn = wrap(F);
1872a8cd89dSGordon Henriksen     return 0;
1882a8cd89dSGordon Henriksen   }
1892a8cd89dSGordon Henriksen   return 1;
1902a8cd89dSGordon Henriksen }
1918ac07c28SErick Tryzelaar 
1928ac07c28SErick Tryzelaar LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
1938ac07c28SErick Tryzelaar   return wrap(unwrap(EE)->getTargetData());
1948ac07c28SErick Tryzelaar }
195