Home | History | Annotate | Download | only in ExecutionEngine
      1 //===-- ExecutionEngineBindings.cpp - C bindings for EEs ------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the C bindings for the ExecutionEngine library.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #define DEBUG_TYPE "jit"
     15 #include "llvm-c/ExecutionEngine.h"
     16 #include "llvm/ExecutionEngine/ExecutionEngine.h"
     17 #include "llvm/ExecutionEngine/GenericValue.h"
     18 #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
     19 #include "llvm/IR/DerivedTypes.h"
     20 #include "llvm/IR/Module.h"
     21 #include "llvm/Support/ErrorHandling.h"
     22 #include <cstring>
     23 
     24 using namespace llvm;
     25 
     26 // Wrapping the C bindings types.
     27 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(GenericValue, LLVMGenericValueRef)
     28 
     29 inline DataLayout *unwrap(LLVMTargetDataRef P) {
     30   return reinterpret_cast<DataLayout*>(P);
     31 }
     32 
     33 inline LLVMTargetDataRef wrap(const DataLayout *P) {
     34   return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P));
     35 }
     36 
     37 inline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) {
     38   return reinterpret_cast<TargetLibraryInfo*>(P);
     39 }
     40 
     41 inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) {
     42   TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P);
     43   return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
     44 }
     45 
     46 /*===-- Operations on generic values --------------------------------------===*/
     47 
     48 LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
     49                                                 unsigned long long N,
     50                                                 LLVMBool IsSigned) {
     51   GenericValue *GenVal = new GenericValue();
     52   GenVal->IntVal = APInt(unwrap<IntegerType>(Ty)->getBitWidth(), N, IsSigned);
     53   return wrap(GenVal);
     54 }
     55 
     56 LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P) {
     57   GenericValue *GenVal = new GenericValue();
     58   GenVal->PointerVal = P;
     59   return wrap(GenVal);
     60 }
     61 
     62 LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef TyRef, double N) {
     63   GenericValue *GenVal = new GenericValue();
     64   switch (unwrap(TyRef)->getTypeID()) {
     65   case Type::FloatTyID:
     66     GenVal->FloatVal = N;
     67     break;
     68   case Type::DoubleTyID:
     69     GenVal->DoubleVal = N;
     70     break;
     71   default:
     72     llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
     73   }
     74   return wrap(GenVal);
     75 }
     76 
     77 unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef) {
     78   return unwrap(GenValRef)->IntVal.getBitWidth();
     79 }
     80 
     81 unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenValRef,
     82                                          LLVMBool IsSigned) {
     83   GenericValue *GenVal = unwrap(GenValRef);
     84   if (IsSigned)
     85     return GenVal->IntVal.getSExtValue();
     86   else
     87     return GenVal->IntVal.getZExtValue();
     88 }
     89 
     90 void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal) {
     91   return unwrap(GenVal)->PointerVal;
     92 }
     93 
     94 double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal) {
     95   switch (unwrap(TyRef)->getTypeID()) {
     96   case Type::FloatTyID:
     97     return unwrap(GenVal)->FloatVal;
     98   case Type::DoubleTyID:
     99     return unwrap(GenVal)->DoubleVal;
    100   default:
    101     llvm_unreachable("LLVMGenericValueToFloat supports only float and double.");
    102   }
    103 }
    104 
    105 void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal) {
    106   delete unwrap(GenVal);
    107 }
    108 
    109 /*===-- Operations on execution engines -----------------------------------===*/
    110 
    111 LLVMBool LLVMCreateExecutionEngineForModule(LLVMExecutionEngineRef *OutEE,
    112                                             LLVMModuleRef M,
    113                                             char **OutError) {
    114   std::string Error;
    115   EngineBuilder builder(unwrap(M));
    116   builder.setEngineKind(EngineKind::Either)
    117          .setErrorStr(&Error);
    118   if (ExecutionEngine *EE = builder.create()){
    119     *OutEE = wrap(EE);
    120     return 0;
    121   }
    122   *OutError = strdup(Error.c_str());
    123   return 1;
    124 }
    125 
    126 LLVMBool LLVMCreateInterpreterForModule(LLVMExecutionEngineRef *OutInterp,
    127                                         LLVMModuleRef M,
    128                                         char **OutError) {
    129   std::string Error;
    130   EngineBuilder builder(unwrap(M));
    131   builder.setEngineKind(EngineKind::Interpreter)
    132          .setErrorStr(&Error);
    133   if (ExecutionEngine *Interp = builder.create()) {
    134     *OutInterp = wrap(Interp);
    135     return 0;
    136   }
    137   *OutError = strdup(Error.c_str());
    138   return 1;
    139 }
    140 
    141 LLVMBool LLVMCreateJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
    142                                         LLVMModuleRef M,
    143                                         unsigned OptLevel,
    144                                         char **OutError) {
    145   std::string Error;
    146   EngineBuilder builder(unwrap(M));
    147   builder.setEngineKind(EngineKind::JIT)
    148          .setErrorStr(&Error)
    149          .setOptLevel((CodeGenOpt::Level)OptLevel);
    150   if (ExecutionEngine *JIT = builder.create()) {
    151     *OutJIT = wrap(JIT);
    152     return 0;
    153   }
    154   *OutError = strdup(Error.c_str());
    155   return 1;
    156 }
    157 
    158 void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
    159                                         size_t SizeOfPassedOptions) {
    160   LLVMMCJITCompilerOptions options;
    161   memset(&options, 0, sizeof(options)); // Most fields are zero by default.
    162   options.CodeModel = LLVMCodeModelJITDefault;
    163 
    164   memcpy(PassedOptions, &options,
    165          std::min(sizeof(options), SizeOfPassedOptions));
    166 }
    167 
    168 LLVMBool LLVMCreateMCJITCompilerForModule(
    169     LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
    170     LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
    171     char **OutError) {
    172   LLVMMCJITCompilerOptions options;
    173   // If the user passed a larger sized options struct, then they were compiled
    174   // against a newer LLVM. Tell them that something is wrong.
    175   if (SizeOfPassedOptions > sizeof(options)) {
    176     *OutError = strdup(
    177       "Refusing to use options struct that is larger than my own; assuming "
    178       "LLVM library mismatch.");
    179     return 1;
    180   }
    181 
    182   // Defend against the user having an old version of the API by ensuring that
    183   // any fields they didn't see are cleared. We must defend against fields being
    184   // set to the bitwise equivalent of zero, and assume that this means "do the
    185   // default" as if that option hadn't been available.
    186   LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
    187   memcpy(&options, PassedOptions, SizeOfPassedOptions);
    188 
    189   TargetOptions targetOptions;
    190   targetOptions.NoFramePointerElim = options.NoFramePointerElim;
    191   targetOptions.EnableFastISel = options.EnableFastISel;
    192 
    193   std::string Error;
    194   EngineBuilder builder(unwrap(M));
    195   builder.setEngineKind(EngineKind::JIT)
    196          .setErrorStr(&Error)
    197          .setUseMCJIT(true)
    198          .setOptLevel((CodeGenOpt::Level)options.OptLevel)
    199          .setCodeModel(unwrap(options.CodeModel))
    200          .setTargetOptions(targetOptions);
    201   if (options.MCJMM)
    202     builder.setMCJITMemoryManager(unwrap(options.MCJMM));
    203   if (ExecutionEngine *JIT = builder.create()) {
    204     *OutJIT = wrap(JIT);
    205     return 0;
    206   }
    207   *OutError = strdup(Error.c_str());
    208   return 1;
    209 }
    210 
    211 LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
    212                                    LLVMModuleProviderRef MP,
    213                                    char **OutError) {
    214   /* The module provider is now actually a module. */
    215   return LLVMCreateExecutionEngineForModule(OutEE,
    216                                             reinterpret_cast<LLVMModuleRef>(MP),
    217                                             OutError);
    218 }
    219 
    220 LLVMBool LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
    221                                LLVMModuleProviderRef MP,
    222                                char **OutError) {
    223   /* The module provider is now actually a module. */
    224   return LLVMCreateInterpreterForModule(OutInterp,
    225                                         reinterpret_cast<LLVMModuleRef>(MP),
    226                                         OutError);
    227 }
    228 
    229 LLVMBool LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
    230                                LLVMModuleProviderRef MP,
    231                                unsigned OptLevel,
    232                                char **OutError) {
    233   /* The module provider is now actually a module. */
    234   return LLVMCreateJITCompilerForModule(OutJIT,
    235                                         reinterpret_cast<LLVMModuleRef>(MP),
    236                                         OptLevel, OutError);
    237 }
    238 
    239 
    240 void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE) {
    241   delete unwrap(EE);
    242 }
    243 
    244 void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE) {
    245   unwrap(EE)->runStaticConstructorsDestructors(false);
    246 }
    247 
    248 void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE) {
    249   unwrap(EE)->runStaticConstructorsDestructors(true);
    250 }
    251 
    252 int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
    253                           unsigned ArgC, const char * const *ArgV,
    254                           const char * const *EnvP) {
    255   unwrap(EE)->finalizeObject();
    256 
    257   std::vector<std::string> ArgVec;
    258   for (unsigned I = 0; I != ArgC; ++I)
    259     ArgVec.push_back(ArgV[I]);
    260 
    261   return unwrap(EE)->runFunctionAsMain(unwrap<Function>(F), ArgVec, EnvP);
    262 }
    263 
    264 LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
    265                                     unsigned NumArgs,
    266                                     LLVMGenericValueRef *Args) {
    267   unwrap(EE)->finalizeObject();
    268 
    269   std::vector<GenericValue> ArgVec;
    270   ArgVec.reserve(NumArgs);
    271   for (unsigned I = 0; I != NumArgs; ++I)
    272     ArgVec.push_back(*unwrap(Args[I]));
    273 
    274   GenericValue *Result = new GenericValue();
    275   *Result = unwrap(EE)->runFunction(unwrap<Function>(F), ArgVec);
    276   return wrap(Result);
    277 }
    278 
    279 void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F) {
    280   unwrap(EE)->freeMachineCodeForFunction(unwrap<Function>(F));
    281 }
    282 
    283 void LLVMAddModule(LLVMExecutionEngineRef EE, LLVMModuleRef M){
    284   unwrap(EE)->addModule(unwrap(M));
    285 }
    286 
    287 void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP){
    288   /* The module provider is now actually a module. */
    289   LLVMAddModule(EE, reinterpret_cast<LLVMModuleRef>(MP));
    290 }
    291 
    292 LLVMBool LLVMRemoveModule(LLVMExecutionEngineRef EE, LLVMModuleRef M,
    293                           LLVMModuleRef *OutMod, char **OutError) {
    294   Module *Mod = unwrap(M);
    295   unwrap(EE)->removeModule(Mod);
    296   *OutMod = wrap(Mod);
    297   return 0;
    298 }
    299 
    300 LLVMBool LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
    301                                   LLVMModuleProviderRef MP,
    302                                   LLVMModuleRef *OutMod, char **OutError) {
    303   /* The module provider is now actually a module. */
    304   return LLVMRemoveModule(EE, reinterpret_cast<LLVMModuleRef>(MP), OutMod,
    305                           OutError);
    306 }
    307 
    308 LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
    309                           LLVMValueRef *OutFn) {
    310   if (Function *F = unwrap(EE)->FindFunctionNamed(Name)) {
    311     *OutFn = wrap(F);
    312     return 0;
    313   }
    314   return 1;
    315 }
    316 
    317 void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
    318                                      LLVMValueRef Fn) {
    319   return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn));
    320 }
    321 
    322 LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
    323   return wrap(unwrap(EE)->getDataLayout());
    324 }
    325 
    326 void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
    327                           void* Addr) {
    328   unwrap(EE)->addGlobalMapping(unwrap<GlobalValue>(Global), Addr);
    329 }
    330 
    331 void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global) {
    332   unwrap(EE)->finalizeObject();
    333 
    334   return unwrap(EE)->getPointerToGlobal(unwrap<GlobalValue>(Global));
    335 }
    336 
    337 /*===-- Operations on memory managers -------------------------------------===*/
    338 
    339 namespace {
    340 
    341 struct SimpleBindingMMFunctions {
    342   uint8_t *(*AllocateCodeSection)(void *Opaque,
    343                                   uintptr_t Size, unsigned Alignment,
    344                                   unsigned SectionID);
    345   uint8_t *(*AllocateDataSection)(void *Opaque,
    346                                   uintptr_t Size, unsigned Alignment,
    347                                   unsigned SectionID, LLVMBool IsReadOnly);
    348   LLVMBool (*FinalizeMemory)(void *Opaque, char **ErrMsg);
    349   void (*Destroy)(void *Opaque);
    350 };
    351 
    352 class SimpleBindingMemoryManager : public RTDyldMemoryManager {
    353 public:
    354   SimpleBindingMemoryManager(const SimpleBindingMMFunctions& Functions,
    355                              void *Opaque);
    356   virtual ~SimpleBindingMemoryManager();
    357 
    358   virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
    359                                        unsigned SectionID);
    360 
    361   virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
    362                                        unsigned SectionID,
    363                                        bool isReadOnly);
    364 
    365   virtual bool finalizeMemory(std::string *ErrMsg);
    366 
    367 private:
    368   SimpleBindingMMFunctions Functions;
    369   void *Opaque;
    370 };
    371 
    372 SimpleBindingMemoryManager::SimpleBindingMemoryManager(
    373   const SimpleBindingMMFunctions& Functions,
    374   void *Opaque)
    375   : Functions(Functions), Opaque(Opaque) {
    376   assert(Functions.AllocateCodeSection &&
    377          "No AllocateCodeSection function provided!");
    378   assert(Functions.AllocateDataSection &&
    379          "No AllocateDataSection function provided!");
    380   assert(Functions.FinalizeMemory &&
    381          "No FinalizeMemory function provided!");
    382   assert(Functions.Destroy &&
    383          "No Destroy function provided!");
    384 }
    385 
    386 SimpleBindingMemoryManager::~SimpleBindingMemoryManager() {
    387   Functions.Destroy(Opaque);
    388 }
    389 
    390 uint8_t *SimpleBindingMemoryManager::allocateCodeSection(
    391   uintptr_t Size, unsigned Alignment, unsigned SectionID) {
    392   return Functions.AllocateCodeSection(Opaque, Size, Alignment, SectionID);
    393 }
    394 
    395 uint8_t *SimpleBindingMemoryManager::allocateDataSection(
    396   uintptr_t Size, unsigned Alignment, unsigned SectionID, bool isReadOnly) {
    397   return Functions.AllocateDataSection(Opaque, Size, Alignment, SectionID,
    398                                        isReadOnly);
    399 }
    400 
    401 bool SimpleBindingMemoryManager::finalizeMemory(std::string *ErrMsg) {
    402   char *errMsgCString = 0;
    403   bool result = Functions.FinalizeMemory(Opaque, &errMsgCString);
    404   assert((result || !errMsgCString) &&
    405          "Did not expect an error message if FinalizeMemory succeeded");
    406   if (errMsgCString) {
    407     if (ErrMsg)
    408       *ErrMsg = errMsgCString;
    409     free(errMsgCString);
    410   }
    411   return result;
    412 }
    413 
    414 } // anonymous namespace
    415 
    416 LLVMMCJITMemoryManagerRef LLVMCreateSimpleMCJITMemoryManager(
    417   void *Opaque,
    418   uint8_t *(*AllocateCodeSection)(void *Opaque,
    419                                   uintptr_t Size, unsigned Alignment,
    420                                   unsigned SectionID),
    421   uint8_t *(*AllocateDataSection)(void *Opaque,
    422                                   uintptr_t Size, unsigned Alignment,
    423                                   unsigned SectionID, LLVMBool IsReadOnly),
    424   LLVMBool (*FinalizeMemory)(void *Opaque, char **ErrMsg),
    425   void (*Destroy)(void *Opaque)) {
    426 
    427   if (!AllocateCodeSection || !AllocateDataSection || !FinalizeMemory ||
    428       !Destroy)
    429     return NULL;
    430 
    431   SimpleBindingMMFunctions functions;
    432   functions.AllocateCodeSection = AllocateCodeSection;
    433   functions.AllocateDataSection = AllocateDataSection;
    434   functions.FinalizeMemory = FinalizeMemory;
    435   functions.Destroy = Destroy;
    436   return wrap(new SimpleBindingMemoryManager(functions, Opaque));
    437 }
    438 
    439 void LLVMDisposeMCJITMemoryManager(LLVMMCJITMemoryManagerRef MM) {
    440   delete unwrap(MM);
    441 }
    442 
    443