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