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#include "llvm-c/ExecutionEngine.h"
152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen#include "llvm/ExecutionEngine/ExecutionEngine.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ExecutionEngine/GenericValue.h"
176cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo#include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
1840be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/IR/DerivedTypes.h"
1940be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/IR/Module.h"
20c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
21ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring>
222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenusing namespace llvm;
242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "jit"
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
273e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher// Wrapping the C bindings types.
2840be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
293e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
303e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) {
313e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher  return reinterpret_cast<TargetLibraryInfo*>(P);
323e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher}
333e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
343e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) {
353e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher  TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P);
363e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher  return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
373e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher}
383e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline LLVMTargetMachineRef wrap(const TargetMachine *P) {
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on generic values --------------------------------------===*/
452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
462e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                unsigned long long N,
48d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                                LLVMBool IsSigned) {
492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
542e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->PointerVal = P;
572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
602e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->FloatVal = N;
652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->DoubleVal = N;
682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
70c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenValRef)->IntVal.getBitWidth();
772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
80d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                         LLVMBool IsSigned) {
812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = unwrap(GenValRef);
822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (IsSigned)
832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getSExtValue();
842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  else
852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getZExtValue();
862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenVal)->PointerVal;
902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksendouble LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->FloatVal;
962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->DoubleVal;
982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
99c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
1042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(GenVal);
1052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1062e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1072e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on execution engines -----------------------------------===*/
1082e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
109df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
110df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            LLVMModuleRef M,
111df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            char **OutError) {
1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
113df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  EngineBuilder builder(unwrap(M));
1144b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Either)
1154b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1164b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *EE = builder.create()){
1172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutEE = wrap(EE);
1182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
124df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
125df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
126df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
128df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  EngineBuilder builder(unwrap(M));
1294b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Interpreter)
1304b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1314b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *Interp = builder.create()) {
1322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutInterp = wrap(Interp);
1332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
139df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
140df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
141df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        unsigned OptLevel,
142df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
144df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  EngineBuilder builder(unwrap(M));
1454b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::JIT)
1464b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error)
1474b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setOptLevel((CodeGenOpt::Level)OptLevel);
1484b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *JIT = builder.create()) {
1492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutJIT = wrap(JIT);
1502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1560e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
1570e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                        size_t SizeOfPassedOptions) {
1580e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMMCJITCompilerOptions options;
1596cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  memset(&options, 0, sizeof(options)); // Most fields are zero by default.
1600e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  options.CodeModel = LLVMCodeModelJITDefault;
1610e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1620e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  memcpy(PassedOptions, &options,
1630e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         std::min(sizeof(options), SizeOfPassedOptions));
1640e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo}
1650e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1660e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip PizloLLVMBool LLVMCreateMCJITCompilerForModule(
1670e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
1680e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
1690e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    char **OutError) {
170d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  LLVMMCJITCompilerOptions options;
171d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // If the user passed a larger sized options struct, then they were compiled
172d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // against a newer LLVM. Tell them that something is wrong.
173d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (SizeOfPassedOptions > sizeof(options)) {
174d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutError = strdup(
1750e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "Refusing to use options struct that is larger than my own; assuming "
1760e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "LLVM library mismatch.");
177d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 1;
178d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
179d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
180d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // Defend against the user having an old version of the API by ensuring that
181d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // any fields they didn't see are cleared. We must defend against fields being
182d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // set to the bitwise equivalent of zero, and assume that this means "do the
183d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // default" as if that option hadn't been available.
1840e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
185d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  memcpy(&options, PassedOptions, SizeOfPassedOptions);
186d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
187d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  TargetOptions targetOptions;
188d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  targetOptions.NoFramePointerElim = options.NoFramePointerElim;
1890e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  targetOptions.EnableFastISel = options.EnableFastISel;
190d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
191d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  std::string Error;
192d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  EngineBuilder builder(unwrap(M));
193d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  builder.setEngineKind(EngineKind::JIT)
194d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setErrorStr(&Error)
195d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setUseMCJIT(true)
196d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setOptLevel((CodeGenOpt::Level)options.OptLevel)
1970e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         .setCodeModel(unwrap(options.CodeModel))
198d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setTargetOptions(targetOptions);
1996cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (options.MCJMM)
2006cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    builder.setMCJITMemoryManager(unwrap(options.MCJMM));
201d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (ExecutionEngine *JIT = builder.create()) {
202d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutJIT = wrap(JIT);
203d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 0;
204d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
205d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  *OutError = strdup(Error.c_str());
206d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  return 1;
207d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor}
208d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
209df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
210df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                   LLVMModuleProviderRef MP,
211df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                   char **OutError) {
212df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
213df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateExecutionEngineForModule(OutEE,
214df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            reinterpret_cast<LLVMModuleRef>(MP),
215df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            OutError);
216df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
217df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
218df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
219df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               LLVMModuleProviderRef MP,
220df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               char **OutError) {
221df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
222df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateInterpreterForModule(OutInterp,
223df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        reinterpret_cast<LLVMModuleRef>(MP),
224df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        OutError);
225df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
226df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
227df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
228df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               LLVMModuleProviderRef MP,
229df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               unsigned OptLevel,
230df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               char **OutError) {
231df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
232df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateJITCompilerForModule(OutJIT,
233df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        reinterpret_cast<LLVMModuleRef>(MP),
234df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        OptLevel, OutError);
235df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
236df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
237df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
2382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
2392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(EE);
2402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
2432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(false);
2442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
2472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(true);
2482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenint LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
2512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          unsigned ArgC, const char * const *ArgV,
2522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          const char * const *EnvP) {
253d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
254d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::vector<std::string> ArgVec;
2562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  for (unsigned I = 0; I != ArgC; ++I)
2572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    ArgVec.push_back(ArgV[I]);
2582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
2602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2622e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
2632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    unsigned NumArgs,
2642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    LLVMGenericValueRef *Args) {
265d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
266d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::vector<GenericValue> ArgVec;
2682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ArgVec.reserve(NumArgs);
2692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  for (unsigned I = 0; I != NumArgs; ++I)
2702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    ArgVec.push_back(*unwrap(Args[I]));
2712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *Result = new GenericValue();
2732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
2742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(Result);
2752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
2782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
2792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
281df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaarvoid LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
282df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  unwrap(EE)->addModule(unwrap(M));
283df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
284df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
2852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
286df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
287df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP));
288df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
289df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
290df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
291df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                          LLVMModuleRef *OutMod, char **OutError) {
292df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  Module *Mod = unwrap(M);
293df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  unwrap(EE)->removeModule(Mod);
294df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  *OutMod = wrap(Mod);
295df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return 0;
2962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
298d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
299d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                  LLVMModuleProviderRef MP,
300d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                  LLVMModuleRef *OutMod, char **OutError) {
301df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
302df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod,
303df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                          OutError);
3042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
3052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
306d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
307d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                          LLVMValueRef *OutFn) {
3082e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
3092e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutFn = wrap(F);
3102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
3112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
3122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
3132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
3147c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
3150e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
3160e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                     LLVMValueRef Fn) {
317e117b639737188eba48b1580fca24258ca108b0dDuncan Sands  return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn));
318d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands}
319d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands
3207c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick TryzelaarLLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
3213574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  return wrap(unwrap(EE)->getDataLayout());
3227c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar}
32354227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMTargetMachineRef
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return wrap(unwrap(EE)->getTargetMachine());
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32954227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksenvoid LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
33054227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen                          void* Addr) {
33154227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen  unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
33254227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen}
3331e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner
3341e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattnervoid *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
335d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
336d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
3371e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner  return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
3381e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner}
3396cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3406cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo/*===-- Operations on memory managers -------------------------------------===*/
3416cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3426cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlonamespace {
3436cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3446cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlostruct SimpleBindingMMFunctions {
3455be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
3465be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
3475be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
3485be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy;
3496cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3506cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3516cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloclass SimpleBindingMemoryManager : public RTDyldMemoryManager {
3526cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlopublic:
3536cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
3546cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                             void *Opaque);
3556cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  virtual ~SimpleBindingMemoryManager();
3566cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID,
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               StringRef SectionName) override;
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID, StringRef SectionName,
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               bool isReadOnly) override;
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool finalizeMemory(std::string *ErrMsg) override;
3666cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3676cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloprivate:
3686cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions Functions;
3696cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque;
3706cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3716cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3726cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::SimpleBindingMemoryManager(
3736cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  const SimpleBindingMMFunctions& Functions,
3746cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque)
3756cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  : Functions(Functions), Opaque(Opaque) {
3766cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateCodeSection &&
3776cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateCodeSection function provided!");
3786cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateDataSection &&
3796cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateDataSection function provided!");
3806cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.FinalizeMemory &&
3816cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No FinalizeMemory function provided!");
3826cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.Destroy &&
3836cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No Destroy function provided!");
3846cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3856cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3866cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
3876cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  Functions.Destroy(Opaque);
3886cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3896cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3906cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateCodeSection(
3916eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3926eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName) {
3936eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
3946eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str());
3956cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3966cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3976cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateDataSection(
3986eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3996eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName, bool isReadOnly) {
4006cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
4016eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str(),
4026cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                                       isReadOnly);
4036cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4046cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4056cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlobool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
406dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  char *errMsgCString = nullptr;
4076cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
4086cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert((result || !errMsgCString) &&
4096cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "Did not expect an error message if FinalizeMemory succeeded");
4106cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (errMsgCString) {
4116cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    if (ErrMsg)
4126cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      *ErrMsg = errMsgCString;
4136cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    free(errMsgCString);
4146cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  }
4156cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return result;
4166cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4176cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4186cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo} // anonymous namespace
4196cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4206cfed36338d7728076ddbc1331908b887a4302d3Filip PizloLLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
4216cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque,
4225be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
4235be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
4245be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
4255be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy) {
4266cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4276cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
4286cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      !Destroy)
429dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
4306cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4316cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions functions;
4326cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateCodeSection = AllocateCodeSection;
4336cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateDataSection = AllocateDataSection;
4346cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.FinalizeMemory = FinalizeMemory;
4356cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.Destroy = Destroy;
4366cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return wrap(new SimpleBindingMemoryManager(functions, Opaque));
4376cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4386cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4396cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlovoid LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
4406cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  delete unwrap(MM);
4416cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4426cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
443