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