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