ExecutionEngineBindings.cpp revision ebe69fe11e48d322045d5949c83283927a0d790b
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 Christopher
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline LLVMTargetMachineRef wrap(const TargetMachine *P) {
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on generic values --------------------------------------===*/
372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
382e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                unsigned long long N,
40d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                                LLVMBool IsSigned) {
412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
462e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->PointerVal = P;
492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
522e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->FloatVal = N;
572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->DoubleVal = N;
602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
62c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenValRef)->IntVal.getBitWidth();
692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
72d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                         LLVMBool IsSigned) {
732e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = unwrap(GenValRef);
742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (IsSigned)
752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getSExtValue();
762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  else
772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getZExtValue();
782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenVal)->PointerVal;
822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksendouble LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->FloatVal;
882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->DoubleVal;
902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
91c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
922e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(GenVal);
972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on execution engines -----------------------------------===*/
1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
101df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
102df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            LLVMModuleRef M,
103df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            char **OutError) {
1042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1064b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Either)
1074b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1084b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *EE = builder.create()){
1092e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutEE = wrap(EE);
1102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
116df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
117df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
118df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1214b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Interpreter)
1224b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1234b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *Interp = builder.create()) {
1242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutInterp = wrap(Interp);
1252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
131df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
132df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
133df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        unsigned OptLevel,
134df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1374b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::JIT)
1384b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error)
1394b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setOptLevel((CodeGenOpt::Level)OptLevel);
1404b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *JIT = builder.create()) {
1412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutJIT = wrap(JIT);
1422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1480e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
1490e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                        size_t SizeOfPassedOptions) {
1500e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMMCJITCompilerOptions options;
1516cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  memset(&options, 0, sizeof(options)); // Most fields are zero by default.
1520e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  options.CodeModel = LLVMCodeModelJITDefault;
1530e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1540e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  memcpy(PassedOptions, &options,
1550e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         std::min(sizeof(options), SizeOfPassedOptions));
1560e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo}
1570e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1580e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip PizloLLVMBool LLVMCreateMCJITCompilerForModule(
1590e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
1600e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
1610e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    char **OutError) {
162d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  LLVMMCJITCompilerOptions options;
163d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // If the user passed a larger sized options struct, then they were compiled
164d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // against a newer LLVM. Tell them that something is wrong.
165d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (SizeOfPassedOptions > sizeof(options)) {
166d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutError = strdup(
1670e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "Refusing to use options struct that is larger than my own; assuming "
1680e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "LLVM library mismatch.");
169d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 1;
170d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
171d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
172d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // Defend against the user having an old version of the API by ensuring that
173d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // any fields they didn't see are cleared. We must defend against fields being
174d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // set to the bitwise equivalent of zero, and assume that this means "do the
175d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // default" as if that option hadn't been available.
1760e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
177d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  memcpy(&options, PassedOptions, SizeOfPassedOptions);
178d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
179d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  TargetOptions targetOptions;
180d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  targetOptions.NoFramePointerElim = options.NoFramePointerElim;
1810e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  targetOptions.EnableFastISel = options.EnableFastISel;
182d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
183d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  std::string Error;
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
185d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  builder.setEngineKind(EngineKind::JIT)
186d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setErrorStr(&Error)
187d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setOptLevel((CodeGenOpt::Level)options.OptLevel)
1880e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         .setCodeModel(unwrap(options.CodeModel))
189d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setTargetOptions(targetOptions);
1906cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (options.MCJMM)
191ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    builder.setMCJITMemoryManager(
192ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      std::unique_ptr<RTDyldMemoryManager>(unwrap(options.MCJMM)));
193d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (ExecutionEngine *JIT = builder.create()) {
194d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutJIT = wrap(JIT);
195d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 0;
196d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
197d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  *OutError = strdup(Error.c_str());
198d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  return 1;
199d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor}
200d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
201df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
202df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                   LLVMModuleProviderRef MP,
203df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                   char **OutError) {
204df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
205df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateExecutionEngineForModule(OutEE,
206df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            reinterpret_cast<LLVMModuleRef>(MP),
207df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            OutError);
208df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
209df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
210df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
211df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               LLVMModuleProviderRef MP,
212df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               char **OutError) {
213df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
214df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateInterpreterForModule(OutInterp,
215df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        reinterpret_cast<LLVMModuleRef>(MP),
216df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        OutError);
217df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
218df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
219df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
220df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               LLVMModuleProviderRef MP,
221df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               unsigned OptLevel,
222df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                               char **OutError) {
223df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
224df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMCreateJITCompilerForModule(OutJIT,
225df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        reinterpret_cast<LLVMModuleRef>(MP),
226df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        OptLevel, OutError);
227df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
228df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
229df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
2302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
2312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(EE);
2322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2342e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
2352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(false);
2362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
2392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(true);
2402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenint LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
2432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          unsigned ArgC, const char * const *ArgV,
2442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          const char * const *EnvP) {
245d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
246d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::vector<std::string> ArgVec;
2482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  for (unsigned I = 0; I != ArgC; ++I)
2492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    ArgVec.push_back(ArgV[I]);
2502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
2522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2532e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2542e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
2552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    unsigned NumArgs,
2562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    LLVMGenericValueRef *Args) {
257d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
258d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::vector<GenericValue> ArgVec;
2602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ArgVec.reserve(NumArgs);
2612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  for (unsigned I = 0; I != NumArgs; ++I)
2622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    ArgVec.push_back(*unwrap(Args[I]));
2632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *Result = new GenericValue();
2652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
2662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(Result);
2672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
2702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
272df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaarvoid LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
27337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unwrap(EE)->addModule(std::unique_ptr<Module>(unwrap(M)));
274df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
275df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
2762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
277df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
278df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP));
279df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
280df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
281df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
282df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                          LLVMModuleRef *OutMod, char **OutError) {
283df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  Module *Mod = unwrap(M);
284df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  unwrap(EE)->removeModule(Mod);
285df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  *OutMod = wrap(Mod);
286df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return 0;
2872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
289d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
290d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                  LLVMModuleProviderRef MP,
291d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                  LLVMModuleRef *OutMod, char **OutError) {
292df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  /* The module provider is now actually a module. */
293df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod,
294df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                          OutError);
2952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
297d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
298d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                          LLVMValueRef *OutFn) {
2992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
3002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutFn = wrap(F);
3012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
3022e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
3032e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
3042e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
3057c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
3060e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
3070e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                     LLVMValueRef Fn) {
30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return nullptr;
309d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands}
310d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands
3117c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick TryzelaarLLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
3123574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  return wrap(unwrap(EE)->getDataLayout());
3137c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar}
31454227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen
31536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMTargetMachineRef
31636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return wrap(unwrap(EE)->getTargetMachine());
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32054227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksenvoid LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
32154227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen                          void* Addr) {
32254227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen  unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
32354227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen}
3241e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner
3251e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattnervoid *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
326d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
327d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
3281e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner  return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
3291e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner}
3306cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
331ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name) {
332ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return unwrap(EE)->getGlobalValueAddress(Name);
333ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
334ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
335ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name) {
336ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return unwrap(EE)->getFunctionAddress(Name);
337ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
338ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
3396cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo/*===-- Operations on memory managers -------------------------------------===*/
3406cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3416cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlonamespace {
3426cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3436cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlostruct SimpleBindingMMFunctions {
3445be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
3455be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
3465be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
3475be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy;
3486cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3496cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3506cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloclass SimpleBindingMemoryManager : public RTDyldMemoryManager {
3516cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlopublic:
3526cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
3536cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                             void *Opaque);
3546cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  virtual ~SimpleBindingMemoryManager();
3556cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
35636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID,
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               StringRef SectionName) override;
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID, StringRef SectionName,
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               bool isReadOnly) override;
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool finalizeMemory(std::string *ErrMsg) override;
3656cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3666cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloprivate:
3676cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions Functions;
3686cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque;
3696cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3706cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3716cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::SimpleBindingMemoryManager(
3726cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  const SimpleBindingMMFunctions& Functions,
3736cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque)
3746cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  : Functions(Functions), Opaque(Opaque) {
3756cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateCodeSection &&
3766cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateCodeSection function provided!");
3776cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateDataSection &&
3786cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateDataSection function provided!");
3796cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.FinalizeMemory &&
3806cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No FinalizeMemory function provided!");
3816cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.Destroy &&
3826cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No Destroy function provided!");
3836cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3846cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3856cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
3866cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  Functions.Destroy(Opaque);
3876cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3886cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3896cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateCodeSection(
3906eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3916eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName) {
3926eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
3936eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str());
3946cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3956cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3966cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateDataSection(
3976eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3986eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName, bool isReadOnly) {
3996cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
4006eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str(),
4016cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                                       isReadOnly);
4026cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4036cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4046cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlobool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
405dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  char *errMsgCString = nullptr;
4066cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
4076cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert((result || !errMsgCString) &&
4086cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "Did not expect an error message if FinalizeMemory succeeded");
4096cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (errMsgCString) {
4106cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    if (ErrMsg)
4116cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      *ErrMsg = errMsgCString;
4126cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    free(errMsgCString);
4136cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  }
4146cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return result;
4156cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4166cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4176cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo} // anonymous namespace
4186cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4196cfed36338d7728076ddbc1331908b887a4302d3Filip PizloLLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
4206cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque,
4215be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
4225be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
4235be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
4245be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy) {
4256cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4266cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
4276cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      !Destroy)
428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
4296cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4306cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions functions;
4316cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateCodeSection = AllocateCodeSection;
4326cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateDataSection = AllocateDataSection;
4336cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.FinalizeMemory = FinalizeMemory;
4346cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.Destroy = Destroy;
4356cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return wrap(new SimpleBindingMemoryManager(functions, Opaque));
4366cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4376cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4386cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlovoid LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
4396cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  delete unwrap(MM);
4406cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4416cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
442