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