12a8cd89dSGordon Henriksen //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
22a8cd89dSGordon Henriksen //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62a8cd89dSGordon Henriksen //
72a8cd89dSGordon Henriksen //===----------------------------------------------------------------------===//
82a8cd89dSGordon Henriksen //
92a8cd89dSGordon Henriksen // This file defines the C bindings for the ExecutionEngine library.
102a8cd89dSGordon Henriksen //
112a8cd89dSGordon Henriksen //===----------------------------------------------------------------------===//
122a8cd89dSGordon Henriksen
132a8cd89dSGordon Henriksen #include "llvm-c/ExecutionEngine.h"
142a8cd89dSGordon Henriksen #include "llvm/ExecutionEngine/ExecutionEngine.h"
15ed0881b2SChandler Carruth #include "llvm/ExecutionEngine/GenericValue.h"
16ee10ce71SAndres Freund #include "llvm/ExecutionEngine/JITEventListener.h"
173fdbaff3SFilip Pizlo #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
18dec20e43SFilip Pizlo #include "llvm/IR/DerivedTypes.h"
19dec20e43SFilip Pizlo #include "llvm/IR/Module.h"
2056d06597STorok Edwin #include "llvm/Support/ErrorHandling.h"
21bf121cf4SDavid Blaikie #include "llvm/Target/CodeGenCWrappers.h"
22d9fb62eeSSanjay Patel #include "llvm/Target/TargetOptions.h"
23579f0713SAnton Korobeynikov #include <cstring>
242a8cd89dSGordon Henriksen
252a8cd89dSGordon Henriksen using namespace llvm;
262a8cd89dSGordon Henriksen
27f58e376dSChandler Carruth #define DEBUG_TYPE "jit"
28f58e376dSChandler Carruth
2904d4e931SEric Christopher // Wrapping the C bindings types.
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue,LLVMGenericValueRef)3004d4e931SEric Christopher DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
3104d4e931SEric Christopher
3204d4e931SEric Christopher
33cd973c4fSDiego Novillo static LLVMTargetMachineRef wrap(const TargetMachine *P) {
345fe955cbSJuergen Ributzka return
355fe955cbSJuergen Ributzka reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
365fe955cbSJuergen Ributzka }
375fe955cbSJuergen Ributzka
382a8cd89dSGordon Henriksen /*===-- Operations on generic values --------------------------------------===*/
392a8cd89dSGordon Henriksen
LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,unsigned long long N,LLVMBool IsSigned)402a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
412a8cd89dSGordon Henriksen unsigned long long N,
4225963c61SChris Lattner LLVMBool IsSigned) {
432a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue();
442a8cd89dSGordon Henriksen GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
452a8cd89dSGordon Henriksen return wrap(GenVal);
462a8cd89dSGordon Henriksen }
472a8cd89dSGordon Henriksen
LLVMCreateGenericValueOfPointer(void * P)482a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
492a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue();
502a8cd89dSGordon Henriksen GenVal->PointerVal = P;
512a8cd89dSGordon Henriksen return wrap(GenVal);
522a8cd89dSGordon Henriksen }
532a8cd89dSGordon Henriksen
LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef,double N)542a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
552a8cd89dSGordon Henriksen GenericValue *GenVal = new GenericValue();
562a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) {
572a8cd89dSGordon Henriksen case Type::FloatTyID:
582a8cd89dSGordon Henriksen GenVal->FloatVal = N;
592a8cd89dSGordon Henriksen break;
602a8cd89dSGordon Henriksen case Type::DoubleTyID:
612a8cd89dSGordon Henriksen GenVal->DoubleVal = N;
622a8cd89dSGordon Henriksen break;
632a8cd89dSGordon Henriksen default:
64fbcc663cSTorok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
652a8cd89dSGordon Henriksen }
662a8cd89dSGordon Henriksen return wrap(GenVal);
672a8cd89dSGordon Henriksen }
682a8cd89dSGordon Henriksen
LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef)692a8cd89dSGordon Henriksen unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
702a8cd89dSGordon Henriksen return unwrap(GenValRef)->IntVal.getBitWidth();
712a8cd89dSGordon Henriksen }
722a8cd89dSGordon Henriksen
LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,LLVMBool IsSigned)732a8cd89dSGordon Henriksen unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
7425963c61SChris Lattner LLVMBool IsSigned) {
752a8cd89dSGordon Henriksen GenericValue *GenVal = unwrap(GenValRef);
762a8cd89dSGordon Henriksen if (IsSigned)
772a8cd89dSGordon Henriksen return GenVal->IntVal.getSExtValue();
782a8cd89dSGordon Henriksen else
792a8cd89dSGordon Henriksen return GenVal->IntVal.getZExtValue();
802a8cd89dSGordon Henriksen }
812a8cd89dSGordon Henriksen
LLVMGenericValueToPointer(LLVMGenericValueRef GenVal)822a8cd89dSGordon Henriksen void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
832a8cd89dSGordon Henriksen return unwrap(GenVal)->PointerVal;
842a8cd89dSGordon Henriksen }
852a8cd89dSGordon Henriksen
LLVMGenericValueToFloat(LLVMTypeRef TyRef,LLVMGenericValueRef GenVal)862a8cd89dSGordon Henriksen double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
872a8cd89dSGordon Henriksen switch (unwrap(TyRef)->getTypeID()) {
882a8cd89dSGordon Henriksen case Type::FloatTyID:
892a8cd89dSGordon Henriksen return unwrap(GenVal)->FloatVal;
902a8cd89dSGordon Henriksen case Type::DoubleTyID:
912a8cd89dSGordon Henriksen return unwrap(GenVal)->DoubleVal;
922a8cd89dSGordon Henriksen default:
93fbcc663cSTorok Edwin llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
942a8cd89dSGordon Henriksen }
952a8cd89dSGordon Henriksen }
962a8cd89dSGordon Henriksen
LLVMDisposeGenericValue(LLVMGenericValueRef GenVal)972a8cd89dSGordon Henriksen void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
982a8cd89dSGordon Henriksen delete unwrap(GenVal);
992a8cd89dSGordon Henriksen }
1002a8cd89dSGordon Henriksen
1012a8cd89dSGordon Henriksen /*===-- Operations on execution engines -----------------------------------===*/
1022a8cd89dSGordon Henriksen
LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef * OutEE,LLVMModuleRef M,char ** OutError)103ad0e0cb0SErick Tryzelaar LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
104ad0e0cb0SErick Tryzelaar LLVMModuleRef M,
1052a8cd89dSGordon Henriksen char **OutError) {
1062a8cd89dSGordon Henriksen std::string Error;
1072a8a2795SRafael Espindola EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
108fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::Either)
109fc8a2d5aSReid Kleckner .setErrorStr(&Error);
110fc8a2d5aSReid Kleckner if (ExecutionEngine *EE = builder.create()){
1112a8cd89dSGordon Henriksen *OutEE = wrap(EE);
1122a8cd89dSGordon Henriksen return 0;
1132a8cd89dSGordon Henriksen }
1142a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str());
1152a8cd89dSGordon Henriksen return 1;
1162a8cd89dSGordon Henriksen }
1172a8cd89dSGordon Henriksen
LLVMCreateInterpreterForModule(LLVMExecutionEngineRef * OutInterp,LLVMModuleRef M,char ** OutError)118ad0e0cb0SErick Tryzelaar LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
119ad0e0cb0SErick Tryzelaar LLVMModuleRef M,
1202a8cd89dSGordon Henriksen char **OutError) {
1212a8cd89dSGordon Henriksen std::string Error;
1222a8a2795SRafael Espindola EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
123fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::Interpreter)
124fc8a2d5aSReid Kleckner .setErrorStr(&Error);
125fc8a2d5aSReid Kleckner if (ExecutionEngine *Interp = builder.create()) {
1262a8cd89dSGordon Henriksen *OutInterp = wrap(Interp);
1272a8cd89dSGordon Henriksen return 0;
1282a8cd89dSGordon Henriksen }
1292a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str());
1302a8cd89dSGordon Henriksen return 1;
1312a8cd89dSGordon Henriksen }
1322a8cd89dSGordon Henriksen
LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef * OutJIT,LLVMModuleRef M,unsigned OptLevel,char ** OutError)133ad0e0cb0SErick Tryzelaar LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
134ad0e0cb0SErick Tryzelaar LLVMModuleRef M,
135352ee2cbSBill Wendling unsigned OptLevel,
1365225cd66SGordon Henriksen char **OutError) {
1372a8cd89dSGordon Henriksen std::string Error;
1382a8a2795SRafael Espindola EngineBuilder builder(std::unique_ptr<Module>(unwrap(M)));
139fc8a2d5aSReid Kleckner builder.setEngineKind(EngineKind::JIT)
140fc8a2d5aSReid Kleckner .setErrorStr(&Error)
141fc8a2d5aSReid Kleckner .setOptLevel((CodeGenOpt::Level)OptLevel);
142fc8a2d5aSReid Kleckner if (ExecutionEngine *JIT = builder.create()) {
1432a8cd89dSGordon Henriksen *OutJIT = wrap(JIT);
1442a8cd89dSGordon Henriksen return 0;
1452a8cd89dSGordon Henriksen }
1462a8cd89dSGordon Henriksen *OutError = strdup(Error.c_str());
1472a8cd89dSGordon Henriksen return 1;
1482a8cd89dSGordon Henriksen }
1492a8cd89dSGordon Henriksen
LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions * PassedOptions,size_t SizeOfPassedOptions)15085e0d273SFilip Pizlo void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
15185e0d273SFilip Pizlo size_t SizeOfPassedOptions) {
15285e0d273SFilip Pizlo LLVMMCJITCompilerOptions options;
1533fdbaff3SFilip Pizlo memset(&options, 0, sizeof(options)); // Most fields are zero by default.
15485e0d273SFilip Pizlo options.CodeModel = LLVMCodeModelJITDefault;
15585e0d273SFilip Pizlo
15685e0d273SFilip Pizlo memcpy(PassedOptions, &options,
15785e0d273SFilip Pizlo std::min(sizeof(options), SizeOfPassedOptions));
15885e0d273SFilip Pizlo }
15985e0d273SFilip Pizlo
LLVMCreateMCJITCompilerForModule(LLVMExecutionEngineRef * OutJIT,LLVMModuleRef M,LLVMMCJITCompilerOptions * PassedOptions,size_t SizeOfPassedOptions,char ** OutError)16085e0d273SFilip Pizlo LLVMBool LLVMCreateMCJITCompilerForModule(
16185e0d273SFilip Pizlo LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
16285e0d273SFilip Pizlo LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
16331be5effSAndrew Kaylor char **OutError) {
16431be5effSAndrew Kaylor LLVMMCJITCompilerOptions options;
16531be5effSAndrew Kaylor // If the user passed a larger sized options struct, then they were compiled
16631be5effSAndrew Kaylor // against a newer LLVM. Tell them that something is wrong.
16731be5effSAndrew Kaylor if (SizeOfPassedOptions > sizeof(options)) {
16831be5effSAndrew Kaylor *OutError = strdup(
16985e0d273SFilip Pizlo "Refusing to use options struct that is larger than my own; assuming "
17085e0d273SFilip Pizlo "LLVM library mismatch.");
17131be5effSAndrew Kaylor return 1;
17231be5effSAndrew Kaylor }
17331be5effSAndrew Kaylor
17431be5effSAndrew Kaylor // Defend against the user having an old version of the API by ensuring that
17531be5effSAndrew Kaylor // any fields they didn't see are cleared. We must defend against fields being
17631be5effSAndrew Kaylor // set to the bitwise equivalent of zero, and assume that this means "do the
17731be5effSAndrew Kaylor // default" as if that option hadn't been available.
17885e0d273SFilip Pizlo LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
17931be5effSAndrew Kaylor memcpy(&options, PassedOptions, SizeOfPassedOptions);
18031be5effSAndrew Kaylor
18131be5effSAndrew Kaylor TargetOptions targetOptions;
18285e0d273SFilip Pizlo targetOptions.EnableFastISel = options.EnableFastISel;
183ddf76aa3SAkira Hatanaka std::unique_ptr<Module> Mod(unwrap(M));
184ddf76aa3SAkira Hatanaka
185ddf76aa3SAkira Hatanaka if (Mod)
186583ef13fSFangrui Song // Set function attribute "frame-pointer" based on
187ddf76aa3SAkira Hatanaka // NoFramePointerElim.
188e36505c7SAkira Hatanaka for (auto &F : *Mod) {
189e36505c7SAkira Hatanaka auto Attrs = F.getAttributes();
190583ef13fSFangrui Song StringRef Value = options.NoFramePointerElim ? "all" : "none";
191*de0ae9e8SArthur Eubanks Attrs = Attrs.addFnAttribute(F.getContext(), "frame-pointer", Value);
192e36505c7SAkira Hatanaka F.setAttributes(Attrs);
193e36505c7SAkira Hatanaka }
19431be5effSAndrew Kaylor
19531be5effSAndrew Kaylor std::string Error;
196ddf76aa3SAkira Hatanaka EngineBuilder builder(std::move(Mod));
19731be5effSAndrew Kaylor builder.setEngineKind(EngineKind::JIT)
19831be5effSAndrew Kaylor .setErrorStr(&Error)
19931be5effSAndrew Kaylor .setOptLevel((CodeGenOpt::Level)options.OptLevel)
20031be5effSAndrew Kaylor .setTargetOptions(targetOptions);
20179e238afSRafael Espindola bool JIT;
20279e238afSRafael Espindola if (Optional<CodeModel::Model> CM = unwrap(options.CodeModel, JIT))
20379e238afSRafael Espindola builder.setCodeModel(*CM);
2043fdbaff3SFilip Pizlo if (options.MCJMM)
2054a5697e6SLang Hames builder.setMCJITMemoryManager(
2064a5697e6SLang Hames std::unique_ptr<RTDyldMemoryManager>(unwrap(options.MCJMM)));
20731be5effSAndrew Kaylor if (ExecutionEngine *JIT = builder.create()) {
20831be5effSAndrew Kaylor *OutJIT = wrap(JIT);
20931be5effSAndrew Kaylor return 0;
21031be5effSAndrew Kaylor }
21131be5effSAndrew Kaylor *OutError = strdup(Error.c_str());
21231be5effSAndrew Kaylor return 1;
21331be5effSAndrew Kaylor }
21431be5effSAndrew Kaylor
LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE)2152a8cd89dSGordon Henriksen void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
2162a8cd89dSGordon Henriksen delete unwrap(EE);
2172a8cd89dSGordon Henriksen }
2182a8cd89dSGordon Henriksen
LLVMRunStaticConstructors(LLVMExecutionEngineRef EE)2192a8cd89dSGordon Henriksen void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
22074f4ce61SAmaury Sechet unwrap(EE)->finalizeObject();
2212a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(false);
2222a8cd89dSGordon Henriksen }
2232a8cd89dSGordon Henriksen
LLVMRunStaticDestructors(LLVMExecutionEngineRef EE)2242a8cd89dSGordon Henriksen void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
22574f4ce61SAmaury Sechet unwrap(EE)->finalizeObject();
2262a8cd89dSGordon Henriksen unwrap(EE)->runStaticConstructorsDestructors(true);
2272a8cd89dSGordon Henriksen }
2282a8cd89dSGordon Henriksen
LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE,LLVMValueRef F,unsigned ArgC,const char * const * ArgV,const char * const * EnvP)2292a8cd89dSGordon Henriksen int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
2302a8cd89dSGordon Henriksen unsigned ArgC, const char * const *ArgV,
2312a8cd89dSGordon Henriksen const char * const *EnvP) {
23231be5effSAndrew Kaylor unwrap(EE)->finalizeObject();
23331be5effSAndrew Kaylor
234f5e2fc47SBenjamin Kramer std::vector<std::string> ArgVec(ArgV, ArgV + ArgC);
2352a8cd89dSGordon Henriksen return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
2362a8cd89dSGordon Henriksen }
2372a8cd89dSGordon Henriksen
LLVMRunFunction(LLVMExecutionEngineRef EE,LLVMValueRef F,unsigned NumArgs,LLVMGenericValueRef * Args)2382a8cd89dSGordon Henriksen LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
2392a8cd89dSGordon Henriksen unsigned NumArgs,
2402a8cd89dSGordon Henriksen LLVMGenericValueRef *Args) {
24131be5effSAndrew Kaylor unwrap(EE)->finalizeObject();
24231be5effSAndrew Kaylor
2432a8cd89dSGordon Henriksen std::vector<GenericValue> ArgVec;
2442a8cd89dSGordon Henriksen ArgVec.reserve(NumArgs);
2452a8cd89dSGordon Henriksen for (unsigned I = 0; I != NumArgs; ++I)
2462a8cd89dSGordon Henriksen ArgVec.push_back(*unwrap(Args[I]));
2472a8cd89dSGordon Henriksen
2482a8cd89dSGordon Henriksen GenericValue *Result = new GenericValue();
2492a8cd89dSGordon Henriksen *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
2502a8cd89dSGordon Henriksen return wrap(Result);
2512a8cd89dSGordon Henriksen }
2522a8cd89dSGordon Henriksen
LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE,LLVMValueRef F)2532a8cd89dSGordon Henriksen void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
2542a8cd89dSGordon Henriksen }
2552a8cd89dSGordon Henriksen
LLVMAddModule(LLVMExecutionEngineRef EE,LLVMModuleRef M)256ad0e0cb0SErick Tryzelaar void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
2572a8a2795SRafael Espindola unwrap(EE)->addModule(std::unique_ptr<Module>(unwrap(M)));
258ad0e0cb0SErick Tryzelaar }
259ad0e0cb0SErick Tryzelaar
LLVMRemoveModule(LLVMExecutionEngineRef EE,LLVMModuleRef M,LLVMModuleRef * OutMod,char ** OutError)260ad0e0cb0SErick Tryzelaar LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
261ad0e0cb0SErick Tryzelaar LLVMModuleRef *OutMod, char **OutError) {
262ad0e0cb0SErick Tryzelaar Module *Mod = unwrap(M);
263ad0e0cb0SErick Tryzelaar unwrap(EE)->removeModule(Mod);
264ad0e0cb0SErick Tryzelaar *OutMod = wrap(Mod);
265ad0e0cb0SErick Tryzelaar return 0;
2662a8cd89dSGordon Henriksen }
2672a8cd89dSGordon Henriksen
LLVMFindFunction(LLVMExecutionEngineRef EE,const char * Name,LLVMValueRef * OutFn)26825963c61SChris Lattner LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
2692a8cd89dSGordon Henriksen LLVMValueRef *OutFn) {
2702a8cd89dSGordon Henriksen if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
2712a8cd89dSGordon Henriksen *OutFn = wrap(F);
2722a8cd89dSGordon Henriksen return 0;
2732a8cd89dSGordon Henriksen }
2742a8cd89dSGordon Henriksen return 1;
2752a8cd89dSGordon Henriksen }
2768ac07c28SErick Tryzelaar
LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,LLVMValueRef Fn)27785e0d273SFilip Pizlo void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
27885e0d273SFilip Pizlo LLVMValueRef Fn) {
27979cc1e3aSEric Christopher return nullptr;
280330134bfSDuncan Sands }
281330134bfSDuncan Sands
LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE)2828ac07c28SErick Tryzelaar LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
283a3fcefb6SMehdi Amini return wrap(&unwrap(EE)->getDataLayout());
2848ac07c28SErick Tryzelaar }
2859f337549SGordon Henriksen
2865fe955cbSJuergen Ributzka LLVMTargetMachineRef
LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE)2875fe955cbSJuergen Ributzka LLVMGetExecutionEngineTargetMachine(LLVMExecutionEngineRef EE) {
2885fe955cbSJuergen Ributzka return wrap(unwrap(EE)->getTargetMachine());
2895fe955cbSJuergen Ributzka }
2905fe955cbSJuergen Ributzka
LLVMAddGlobalMapping(LLVMExecutionEngineRef EE,LLVMValueRef Global,void * Addr)2919f337549SGordon Henriksen void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
2929f337549SGordon Henriksen void* Addr) {
2939f337549SGordon Henriksen unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
2949f337549SGordon Henriksen }
29541b43da2SChris Lattner
LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE,LLVMValueRef Global)29641b43da2SChris Lattner void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
29731be5effSAndrew Kaylor unwrap(EE)->finalizeObject();
29831be5effSAndrew Kaylor
29941b43da2SChris Lattner return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
30041b43da2SChris Lattner }
3013fdbaff3SFilip Pizlo
LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE,const char * Name)302c433cd7bSPeter Zotov uint64_t LLVMGetGlobalValueAddress(LLVMExecutionEngineRef EE, const char *Name) {
303c433cd7bSPeter Zotov return unwrap(EE)->getGlobalValueAddress(Name);
304c433cd7bSPeter Zotov }
305c433cd7bSPeter Zotov
LLVMGetFunctionAddress(LLVMExecutionEngineRef EE,const char * Name)306c433cd7bSPeter Zotov uint64_t LLVMGetFunctionAddress(LLVMExecutionEngineRef EE, const char *Name) {
307c433cd7bSPeter Zotov return unwrap(EE)->getFunctionAddress(Name);
308c433cd7bSPeter Zotov }
309c433cd7bSPeter Zotov
LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE,char ** OutError)310906a91aaSLang Hames LLVMBool LLVMExecutionEngineGetErrMsg(LLVMExecutionEngineRef EE,
311906a91aaSLang Hames char **OutError) {
312906a91aaSLang Hames assert(OutError && "OutError must be non-null");
313906a91aaSLang Hames auto *ExecEngine = unwrap(EE);
314906a91aaSLang Hames if (ExecEngine->hasError()) {
315906a91aaSLang Hames *OutError = strdup(ExecEngine->getErrorMessage().c_str());
316906a91aaSLang Hames ExecEngine->clearErrorMessage();
317906a91aaSLang Hames return true;
318906a91aaSLang Hames }
319906a91aaSLang Hames return false;
320906a91aaSLang Hames }
321906a91aaSLang Hames
3223fdbaff3SFilip Pizlo /*===-- Operations on memory managers -------------------------------------===*/
3233fdbaff3SFilip Pizlo
3243fdbaff3SFilip Pizlo namespace {
3253fdbaff3SFilip Pizlo
3263fdbaff3SFilip Pizlo struct SimpleBindingMMFunctions {
3279515b310SAnders Waldenborg LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection;
3289515b310SAnders Waldenborg LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection;
3299515b310SAnders Waldenborg LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory;
3309515b310SAnders Waldenborg LLVMMemoryManagerDestroyCallback Destroy;
3313fdbaff3SFilip Pizlo };
3323fdbaff3SFilip Pizlo
3333fdbaff3SFilip Pizlo class SimpleBindingMemoryManager : public RTDyldMemoryManager {
3343fdbaff3SFilip Pizlo public:
3353fdbaff3SFilip Pizlo SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
3363fdbaff3SFilip Pizlo void *Opaque);
337f817c1cbSAlexander Kornienko ~SimpleBindingMemoryManager() override;
3383fdbaff3SFilip Pizlo
339b51ff603SCraig Topper uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
340b51ff603SCraig Topper unsigned SectionID,
341b51ff603SCraig Topper StringRef SectionName) override;
3423fdbaff3SFilip Pizlo
343b51ff603SCraig Topper uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
344b51ff603SCraig Topper unsigned SectionID, StringRef SectionName,
345b51ff603SCraig Topper bool isReadOnly) override;
3463fdbaff3SFilip Pizlo
347b51ff603SCraig Topper bool finalizeMemory(std::string *ErrMsg) override;
3483fdbaff3SFilip Pizlo
3493fdbaff3SFilip Pizlo private:
3503fdbaff3SFilip Pizlo SimpleBindingMMFunctions Functions;
3513fdbaff3SFilip Pizlo void *Opaque;
3523fdbaff3SFilip Pizlo };
3533fdbaff3SFilip Pizlo
SimpleBindingMemoryManager(const SimpleBindingMMFunctions & Functions,void * Opaque)3543fdbaff3SFilip Pizlo SimpleBindingMemoryManager::SimpleBindingMemoryManager(
3553fdbaff3SFilip Pizlo const SimpleBindingMMFunctions& Functions,
3563fdbaff3SFilip Pizlo void *Opaque)
3573fdbaff3SFilip Pizlo : Functions(Functions), Opaque(Opaque) {
3583fdbaff3SFilip Pizlo assert(Functions.AllocateCodeSection &&
3593fdbaff3SFilip Pizlo "No AllocateCodeSection function provided!");
3603fdbaff3SFilip Pizlo assert(Functions.AllocateDataSection &&
3613fdbaff3SFilip Pizlo "No AllocateDataSection function provided!");
3623fdbaff3SFilip Pizlo assert(Functions.FinalizeMemory &&
3633fdbaff3SFilip Pizlo "No FinalizeMemory function provided!");
3643fdbaff3SFilip Pizlo assert(Functions.Destroy &&
3653fdbaff3SFilip Pizlo "No Destroy function provided!");
3663fdbaff3SFilip Pizlo }
3673fdbaff3SFilip Pizlo
~SimpleBindingMemoryManager()3683fdbaff3SFilip Pizlo SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
3693fdbaff3SFilip Pizlo Functions.Destroy(Opaque);
3703fdbaff3SFilip Pizlo }
3713fdbaff3SFilip Pizlo
allocateCodeSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName)3723fdbaff3SFilip Pizlo uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
3737aa695e0SFilip Pizlo uintptr_t Size, unsigned Alignment, unsigned SectionID,
3747aa695e0SFilip Pizlo StringRef SectionName) {
3757aa695e0SFilip Pizlo return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID,
3767aa695e0SFilip Pizlo SectionName.str().c_str());
3773fdbaff3SFilip Pizlo }
3783fdbaff3SFilip Pizlo
allocateDataSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName,bool isReadOnly)3793fdbaff3SFilip Pizlo uint8_t *SimpleBindingMemoryManager::allocateDataSection(
3807aa695e0SFilip Pizlo uintptr_t Size, unsigned Alignment, unsigned SectionID,
3817aa695e0SFilip Pizlo StringRef SectionName, bool isReadOnly) {
3823fdbaff3SFilip Pizlo return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
3837aa695e0SFilip Pizlo SectionName.str().c_str(),
3843fdbaff3SFilip Pizlo isReadOnly);
3853fdbaff3SFilip Pizlo }
3863fdbaff3SFilip Pizlo
finalizeMemory(std::string * ErrMsg)3873fdbaff3SFilip Pizlo bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
3882617dcceSCraig Topper char *errMsgCString = nullptr;
3893fdbaff3SFilip Pizlo bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
3903fdbaff3SFilip Pizlo assert((result || !errMsgCString) &&
3913fdbaff3SFilip Pizlo "Did not expect an error message if FinalizeMemory succeeded");
3923fdbaff3SFilip Pizlo if (errMsgCString) {
3933fdbaff3SFilip Pizlo if (ErrMsg)
3943fdbaff3SFilip Pizlo *ErrMsg = errMsgCString;
3953fdbaff3SFilip Pizlo free(errMsgCString);
3963fdbaff3SFilip Pizlo }
3973fdbaff3SFilip Pizlo return result;
3983fdbaff3SFilip Pizlo }
3993fdbaff3SFilip Pizlo
4003fdbaff3SFilip Pizlo } // anonymous namespace
4013fdbaff3SFilip Pizlo
LLVMCreateSimpleMCJITMemoryManager(void * Opaque,LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,LLVMMemoryManagerDestroyCallback Destroy)4023fdbaff3SFilip Pizlo LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
4033fdbaff3SFilip Pizlo void *Opaque,
4049515b310SAnders Waldenborg LLVMMemoryManagerAllocateCodeSectionCallback AllocateCodeSection,
4059515b310SAnders Waldenborg LLVMMemoryManagerAllocateDataSectionCallback AllocateDataSection,
4069515b310SAnders Waldenborg LLVMMemoryManagerFinalizeMemoryCallback FinalizeMemory,
4079515b310SAnders Waldenborg LLVMMemoryManagerDestroyCallback Destroy) {
4083fdbaff3SFilip Pizlo
4093fdbaff3SFilip Pizlo if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
4103fdbaff3SFilip Pizlo !Destroy)
4112617dcceSCraig Topper return nullptr;
4123fdbaff3SFilip Pizlo
4133fdbaff3SFilip Pizlo SimpleBindingMMFunctions functions;
4143fdbaff3SFilip Pizlo functions.AllocateCodeSection = AllocateCodeSection;
4153fdbaff3SFilip Pizlo functions.AllocateDataSection = AllocateDataSection;
4163fdbaff3SFilip Pizlo functions.FinalizeMemory = FinalizeMemory;
4173fdbaff3SFilip Pizlo functions.Destroy = Destroy;
4183fdbaff3SFilip Pizlo return wrap(new SimpleBindingMemoryManager(functions, Opaque));
4193fdbaff3SFilip Pizlo }
4203fdbaff3SFilip Pizlo
LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM)4213fdbaff3SFilip Pizlo void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
4223fdbaff3SFilip Pizlo delete unwrap(MM);
4233fdbaff3SFilip Pizlo }
4243fdbaff3SFilip Pizlo
425ee10ce71SAndres Freund /*===-- JIT Event Listener functions -------------------------------------===*/
426ee10ce71SAndres Freund
427ee10ce71SAndres Freund
428ee10ce71SAndres Freund #if !LLVM_USE_INTEL_JITEVENTS
LLVMCreateIntelJITEventListener(void)429ee10ce71SAndres Freund LLVMJITEventListenerRef LLVMCreateIntelJITEventListener(void)
430ee10ce71SAndres Freund {
431ee10ce71SAndres Freund return nullptr;
432ee10ce71SAndres Freund }
433ee10ce71SAndres Freund #endif
434ee10ce71SAndres Freund
435ee10ce71SAndres Freund #if !LLVM_USE_OPROFILE
LLVMCreateOProfileJITEventListener(void)436ee10ce71SAndres Freund LLVMJITEventListenerRef LLVMCreateOProfileJITEventListener(void)
437ee10ce71SAndres Freund {
438ee10ce71SAndres Freund return nullptr;
439ee10ce71SAndres Freund }
440ee10ce71SAndres Freund #endif
441ee10ce71SAndres Freund
442ee10ce71SAndres Freund #if !LLVM_USE_PERF
LLVMCreatePerfJITEventListener(void)443ee10ce71SAndres Freund LLVMJITEventListenerRef LLVMCreatePerfJITEventListener(void)
444ee10ce71SAndres Freund {
445ee10ce71SAndres Freund return nullptr;
446ee10ce71SAndres Freund }
447ee10ce71SAndres Freund #endif
448