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