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"
216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Target/TargetOptions.h"
22ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring>
232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenusing namespace llvm;
252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "jit"
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
283e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher// Wrapping the C bindings types.
2940be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
303e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
313e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
32cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarstatic LLVMTargetMachineRef wrap(const TargetMachine *P) {
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
372e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on generic values --------------------------------------===*/
382e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
392e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                                unsigned long long N,
41d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                                LLVMBool IsSigned) {
422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
472e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenVal->PointerVal = P;
502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
522e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
532e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
542e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = new GenericValue();
552e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
562e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
572e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->FloatVal = N;
582e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
592e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
602e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    GenVal->DoubleVal = N;
612e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    break;
622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
63c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
642e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
652e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(GenVal);
662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenValRef)->IntVal.getBitWidth();
702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
722e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenunsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
73d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                         LLVMBool IsSigned) {
742e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *GenVal = unwrap(GenValRef);
752e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (IsSigned)
762e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getSExtValue();
772e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  else
782e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return GenVal->IntVal.getZExtValue();
792e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
802e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
812e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
822e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(GenVal)->PointerVal;
832e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
842e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
852e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksendouble LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
862e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  switch (unwrap(TyRef)->getTypeID()) {
872e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::FloatTyID:
882e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->FloatVal;
892e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  case Type::DoubleTyID:
902e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return unwrap(GenVal)->DoubleVal;
912e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  default:
92c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
932e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
942e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
952e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
962e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
972e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(GenVal);
982e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
992e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1002e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen/*===-- Operations on execution engines -----------------------------------===*/
1012e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
102df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
103df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            LLVMModuleRef M,
104df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                            char **OutError) {
1052e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1074b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Either)
1084b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1094b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *EE = builder.create()){
1102e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutEE = wrap(EE);
1112e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1122e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
117df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
118df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
119df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1224b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::Interpreter)
1234b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error);
1244b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *Interp = builder.create()) {
1252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutInterp = wrap(Interp);
1262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1282e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1292e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1302e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
132df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
133df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        LLVMModuleRef M,
134df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        unsigned OptLevel,
135df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                        char **OutError) {
1362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::string Error;
13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
1384b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  builder.setEngineKind(EngineKind::JIT)
1394b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setErrorStr(&Error)
1404b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner         .setOptLevel((CodeGenOpt::Level)OptLevel);
1414b1511b027ce0b648b3379f2891816c25b46f515Reid Kleckner  if (ExecutionEngine *JIT = builder.create()) {
1422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutJIT = wrap(JIT);
1432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
1442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
1452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *OutError = strdup(Error.c_str());
1462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
1472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
1482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
1490e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
1500e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                        size_t SizeOfPassedOptions) {
1510e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMMCJITCompilerOptions options;
1526cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  memset(&options, 0, sizeof(options)); // Most fields are zero by default.
1530e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  options.CodeModel = LLVMCodeModelJITDefault;
1540e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1550e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  memcpy(PassedOptions, &options,
1560e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         std::min(sizeof(options), SizeOfPassedOptions));
1570e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo}
1580e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo
1590e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip PizloLLVMBool LLVMCreateMCJITCompilerForModule(
1600e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
1610e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
1620e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo    char **OutError) {
163d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  LLVMMCJITCompilerOptions options;
164d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // If the user passed a larger sized options struct, then they were compiled
165d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // against a newer LLVM. Tell them that something is wrong.
166d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (SizeOfPassedOptions > sizeof(options)) {
167d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutError = strdup(
1680e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "Refusing to use options struct that is larger than my own; assuming "
1690e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo      "LLVM library mismatch.");
170d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 1;
171d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
172d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
173d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // Defend against the user having an old version of the API by ensuring that
174d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // any fields they didn't see are cleared. We must defend against fields being
175d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // set to the bitwise equivalent of zero, and assume that this means "do the
176d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  // default" as if that option hadn't been available.
1770e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
178d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  memcpy(&options, PassedOptions, SizeOfPassedOptions);
179d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
180d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  TargetOptions targetOptions;
1810e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo  targetOptions.EnableFastISel = options.EnableFastISel;
1826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  std::unique_ptr<Module> Mod(unwrap(M));
1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Mod)
1856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Set function attribute "no-frame-pointer-elim" based on
1866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // NoFramePointerElim.
1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (auto &F : *Mod) {
1886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      auto Attrs = F.getAttributes();
1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      auto Value = options.NoFramePointerElim ? "true" : "false";
1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Attrs = Attrs.addAttribute(F.getContext(), AttributeSet::FunctionIndex,
1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                 "no-frame-pointer-elim", Value);
1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      F.setAttributes(Attrs);
1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
194d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
195d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  std::string Error;
1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  EngineBuilder builder(std::move(Mod));
197d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  builder.setEngineKind(EngineKind::JIT)
198d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setErrorStr(&Error)
199d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setOptLevel((CodeGenOpt::Level)options.OptLevel)
2000e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo         .setCodeModel(unwrap(options.CodeModel))
201d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor         .setTargetOptions(targetOptions);
2026cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (options.MCJMM)
203ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    builder.setMCJITMemoryManager(
204ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      std::unique_ptr<RTDyldMemoryManager>(unwrap(options.MCJMM)));
205d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  if (ExecutionEngine *JIT = builder.create()) {
206d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    *OutJIT = wrap(JIT);
207d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor    return 0;
208d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  }
209d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  *OutError = strdup(Error.c_str());
210d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  return 1;
211d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor}
212d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2132e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
2142e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  delete unwrap(EE);
2152e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2162e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2172e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
2182e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(false);
2192e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2202e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2212e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
2222e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  unwrap(EE)->runStaticConstructorsDestructors(true);
2232e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2242e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2252e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenint LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
2262e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          unsigned ArgC, const char * const *ArgV,
2272e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                          const char * const *EnvP) {
228d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  std::vector<std::string> ArgVec(ArgV, ArgV + ArgC);
2312e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
2322e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2332e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2342e855e68d861224c9b61e2bc9cecad1536b1534bGordon HenriksenLLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
2352e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    unsigned NumArgs,
2362e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen                                    LLVMGenericValueRef *Args) {
237d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
238d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2392e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  std::vector<GenericValue> ArgVec;
2402e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  ArgVec.reserve(NumArgs);
2412e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  for (unsigned I = 0; I != NumArgs; ++I)
2422e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    ArgVec.push_back(*unwrap(Args[I]));
2432e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2442e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  GenericValue *Result = new GenericValue();
2452e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
2462e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return wrap(Result);
2472e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2482e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
2492e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksenvoid LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
2502e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2512e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
252df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaarvoid LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unwrap(EE)->addModule(std::unique_ptr<Module>(unwrap(M)));
254df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
255df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
256df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
257df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                          LLVMModuleRef *OutMod, char **OutError) {
258df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  Module *Mod = unwrap(M);
259df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  unwrap(EE)->removeModule(Mod);
260df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  *OutMod = wrap(Mod);
261df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return 0;
2622e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2632e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen
264d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
265d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                          LLVMValueRef *OutFn) {
2662e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
2672e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    *OutFn = wrap(F);
2682e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen    return 0;
2692e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  }
2702e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen  return 1;
2712e855e68d861224c9b61e2bc9cecad1536b1534bGordon Henriksen}
2727c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar
2730e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlovoid *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
2740e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo                                     LLVMValueRef Fn) {
27537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return nullptr;
276d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands}
277d90fee9b4205c92786c8ae6fa574624b8d157f1cDuncan Sands
2787c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick TryzelaarLLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
279cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar  return wrap(&unwrap(EE)->getDataLayout());
2807c1483bc6f009318ce66c4d37d1ba930e01a6d13Erick Tryzelaar}
28154227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMTargetMachineRef
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return wrap(unwrap(EE)->getTargetMachine());
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28754227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksenvoid LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
28854227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen                          void* Addr) {
28954227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen  unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
29054227f6752befd3196e078b83e4c440ecaff2dd7Gordon Henriksen}
2911e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner
2921e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattnervoid *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
293d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor  unwrap(EE)->finalizeObject();
294d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor
2951e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner  return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
2961e42c5bdf50b54e33afa840b5dbb2d7c7d861a44Chris Lattner}
2976cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name) {
299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return unwrap(EE)->getGlobalValueAddress(Name);
300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesuint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name) {
303ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return unwrap(EE)->getFunctionAddress(Name);
304ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
305ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
3066cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo/*===-- Operations on memory managers -------------------------------------===*/
3076cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3086cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlonamespace {
3096cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3106cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlostruct SimpleBindingMMFunctions {
3115be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
3125be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
3135be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
3145be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy;
3156cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3166cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3176cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloclass SimpleBindingMemoryManager : public RTDyldMemoryManager {
3186cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlopublic:
3196cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
3206cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                             void *Opaque);
3210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  ~SimpleBindingMemoryManager() override;
3226cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID,
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               StringRef SectionName) override;
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               unsigned SectionID, StringRef SectionName,
32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               bool isReadOnly) override;
33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool finalizeMemory(std::string *ErrMsg) override;
3326cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3336cfed36338d7728076ddbc1331908b887a4302d3Filip Pizloprivate:
3346cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions Functions;
3356cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque;
3366cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo};
3376cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3386cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::SimpleBindingMemoryManager(
3396cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  const SimpleBindingMMFunctions& Functions,
3406cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque)
3416cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  : Functions(Functions), Opaque(Opaque) {
3426cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateCodeSection &&
3436cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateCodeSection function provided!");
3446cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.AllocateDataSection &&
3456cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No AllocateDataSection function provided!");
3466cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.FinalizeMemory &&
3476cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No FinalizeMemory function provided!");
3486cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert(Functions.Destroy &&
3496cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "No Destroy function provided!");
3506cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3516cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3526cfed36338d7728076ddbc1331908b887a4302d3Filip PizloSimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
3536cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  Functions.Destroy(Opaque);
3546cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3556cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3566cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateCodeSection(
3576eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3586eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName) {
3596eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
3606eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str());
3616cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3626cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3636cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlouint8_t *SimpleBindingMemoryManager::allocateDataSection(
3646eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  uintptr_t Size, unsigned Alignment, unsigned SectionID,
3656eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo  StringRef SectionName, bool isReadOnly) {
3666cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
3676eb43d295625cd2ff314c59b49d4fd11f3348cadFilip Pizlo                                       SectionName.str().c_str(),
3686cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo                                       isReadOnly);
3696cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3706cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3716cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlobool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  char *errMsgCString = nullptr;
3736cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
3746cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  assert((result || !errMsgCString) &&
3756cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo         "Did not expect an error message if FinalizeMemory succeeded");
3766cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (errMsgCString) {
3776cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    if (ErrMsg)
3786cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      *ErrMsg = errMsgCString;
3796cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo    free(errMsgCString);
3806cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  }
3816cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return result;
3826cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
3836cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3846cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo} // anonymous namespace
3856cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3866cfed36338d7728076ddbc1331908b887a4302d3Filip PizloLLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
3876cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  void *Opaque,
3885be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
3895be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
3905be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
3915be81238f0683d0533f747124aa420e4e79440b1Anders Waldenborg  LLVMMemoryManagerDestroyCallback Destroy) {
3926cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3936cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
3946cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo      !Destroy)
395dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return nullptr;
3966cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
3976cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  SimpleBindingMMFunctions functions;
3986cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateCodeSection = AllocateCodeSection;
3996cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.AllocateDataSection = AllocateDataSection;
4006cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.FinalizeMemory = FinalizeMemory;
4016cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  functions.Destroy = Destroy;
4026cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  return wrap(new SimpleBindingMemoryManager(functions, Opaque));
4036cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4046cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
4056cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlovoid LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
4066cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo  delete unwrap(MM);
4076cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo}
4086cfed36338d7728076ddbc1331908b887a4302d3Filip Pizlo
409