Home | History | Annotate | Line # | Download | only in MCJIT
      1 //===-- MCJIT.cpp - MC-based Just-in-Time Compiler ------------------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #include "MCJIT.h"
     10 #include "llvm/ADT/STLExtras.h"
     11 #include "llvm/ExecutionEngine/GenericValue.h"
     12 #include "llvm/ExecutionEngine/JITEventListener.h"
     13 #include "llvm/ExecutionEngine/MCJIT.h"
     14 #include "llvm/ExecutionEngine/ObjectCache.h"
     15 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
     16 #include "llvm/IR/DataLayout.h"
     17 #include "llvm/IR/DerivedTypes.h"
     18 #include "llvm/IR/Function.h"
     19 #include "llvm/IR/LegacyPassManager.h"
     20 #include "llvm/IR/Mangler.h"
     21 #include "llvm/IR/Module.h"
     22 #include "llvm/Object/Archive.h"
     23 #include "llvm/Object/ObjectFile.h"
     24 #include "llvm/Support/DynamicLibrary.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 #include "llvm/Support/MemoryBuffer.h"
     27 #include "llvm/Support/SmallVectorMemoryBuffer.h"
     28 #include <mutex>
     29 
     30 using namespace llvm;
     31 
     32 namespace {
     33 
     34 static struct RegisterJIT {
     35   RegisterJIT() { MCJIT::Register(); }
     36 } JITRegistrator;
     37 
     38 }
     39 
     40 extern "C" void LLVMLinkInMCJIT() {
     41 }
     42 
     43 ExecutionEngine *
     44 MCJIT::createJIT(std::unique_ptr<Module> M, std::string *ErrorStr,
     45                  std::shared_ptr<MCJITMemoryManager> MemMgr,
     46                  std::shared_ptr<LegacyJITSymbolResolver> Resolver,
     47                  std::unique_ptr<TargetMachine> TM) {
     48   // Try to register the program as a source of symbols to resolve against.
     49   //
     50   // FIXME: Don't do this here.
     51   sys::DynamicLibrary::LoadLibraryPermanently(nullptr, nullptr);
     52 
     53   if (!MemMgr || !Resolver) {
     54     auto RTDyldMM = std::make_shared<SectionMemoryManager>();
     55     if (!MemMgr)
     56       MemMgr = RTDyldMM;
     57     if (!Resolver)
     58       Resolver = RTDyldMM;
     59   }
     60 
     61   return new MCJIT(std::move(M), std::move(TM), std::move(MemMgr),
     62                    std::move(Resolver));
     63 }
     64 
     65 MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> TM,
     66              std::shared_ptr<MCJITMemoryManager> MemMgr,
     67              std::shared_ptr<LegacyJITSymbolResolver> Resolver)
     68     : ExecutionEngine(TM->createDataLayout(), std::move(M)), TM(std::move(TM)),
     69       Ctx(nullptr), MemMgr(std::move(MemMgr)),
     70       Resolver(*this, std::move(Resolver)), Dyld(*this->MemMgr, this->Resolver),
     71       ObjCache(nullptr) {
     72   // FIXME: We are managing our modules, so we do not want the base class
     73   // ExecutionEngine to manage them as well. To avoid double destruction
     74   // of the first (and only) module added in ExecutionEngine constructor
     75   // we remove it from EE and will destruct it ourselves.
     76   //
     77   // It may make sense to move our module manager (based on SmallStPtr) back
     78   // into EE if the JIT and Interpreter can live with it.
     79   // If so, additional functions: addModule, removeModule, FindFunctionNamed,
     80   // runStaticConstructorsDestructors could be moved back to EE as well.
     81   //
     82   std::unique_ptr<Module> First = std::move(Modules[0]);
     83   Modules.clear();
     84 
     85   if (First->getDataLayout().isDefault())
     86     First->setDataLayout(getDataLayout());
     87 
     88   OwnedModules.addModule(std::move(First));
     89   RegisterJITEventListener(JITEventListener::createGDBRegistrationListener());
     90 }
     91 
     92 MCJIT::~MCJIT() {
     93   std::lock_guard<sys::Mutex> locked(lock);
     94 
     95   Dyld.deregisterEHFrames();
     96 
     97   for (auto &Obj : LoadedObjects)
     98     if (Obj)
     99       notifyFreeingObject(*Obj);
    100 
    101   Archives.clear();
    102 }
    103 
    104 void MCJIT::addModule(std::unique_ptr<Module> M) {
    105   std::lock_guard<sys::Mutex> locked(lock);
    106 
    107   if (M->getDataLayout().isDefault())
    108     M->setDataLayout(getDataLayout());
    109 
    110   OwnedModules.addModule(std::move(M));
    111 }
    112 
    113 bool MCJIT::removeModule(Module *M) {
    114   std::lock_guard<sys::Mutex> locked(lock);
    115   return OwnedModules.removeModule(M);
    116 }
    117 
    118 void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) {
    119   std::unique_ptr<RuntimeDyld::LoadedObjectInfo> L = Dyld.loadObject(*Obj);
    120   if (Dyld.hasError())
    121     report_fatal_error(Dyld.getErrorString());
    122 
    123   notifyObjectLoaded(*Obj, *L);
    124 
    125   LoadedObjects.push_back(std::move(Obj));
    126 }
    127 
    128 void MCJIT::addObjectFile(object::OwningBinary<object::ObjectFile> Obj) {
    129   std::unique_ptr<object::ObjectFile> ObjFile;
    130   std::unique_ptr<MemoryBuffer> MemBuf;
    131   std::tie(ObjFile, MemBuf) = Obj.takeBinary();
    132   addObjectFile(std::move(ObjFile));
    133   Buffers.push_back(std::move(MemBuf));
    134 }
    135 
    136 void MCJIT::addArchive(object::OwningBinary<object::Archive> A) {
    137   Archives.push_back(std::move(A));
    138 }
    139 
    140 void MCJIT::setObjectCache(ObjectCache* NewCache) {
    141   std::lock_guard<sys::Mutex> locked(lock);
    142   ObjCache = NewCache;
    143 }
    144 
    145 std::unique_ptr<MemoryBuffer> MCJIT::emitObject(Module *M) {
    146   assert(M && "Can not emit a null module");
    147 
    148   std::lock_guard<sys::Mutex> locked(lock);
    149 
    150   // Materialize all globals in the module if they have not been
    151   // materialized already.
    152   cantFail(M->materializeAll());
    153 
    154   // This must be a module which has already been added but not loaded to this
    155   // MCJIT instance, since these conditions are tested by our caller,
    156   // generateCodeForModule.
    157 
    158   legacy::PassManager PM;
    159 
    160   // The RuntimeDyld will take ownership of this shortly
    161   SmallVector<char, 4096> ObjBufferSV;
    162   raw_svector_ostream ObjStream(ObjBufferSV);
    163 
    164   // Turn the machine code intermediate representation into bytes in memory
    165   // that may be executed.
    166   if (TM->addPassesToEmitMC(PM, Ctx, ObjStream, !getVerifyModules()))
    167     report_fatal_error("Target does not support MC emission!");
    168 
    169   // Initialize passes.
    170   PM.run(*M);
    171   // Flush the output buffer to get the generated code into memory
    172 
    173   std::unique_ptr<MemoryBuffer> CompiledObjBuffer(
    174       new SmallVectorMemoryBuffer(std::move(ObjBufferSV)));
    175 
    176   // If we have an object cache, tell it about the new object.
    177   // Note that we're using the compiled image, not the loaded image (as below).
    178   if (ObjCache) {
    179     // MemoryBuffer is a thin wrapper around the actual memory, so it's OK
    180     // to create a temporary object here and delete it after the call.
    181     MemoryBufferRef MB = CompiledObjBuffer->getMemBufferRef();
    182     ObjCache->notifyObjectCompiled(M, MB);
    183   }
    184 
    185   return CompiledObjBuffer;
    186 }
    187 
    188 void MCJIT::generateCodeForModule(Module *M) {
    189   // Get a thread lock to make sure we aren't trying to load multiple times
    190   std::lock_guard<sys::Mutex> locked(lock);
    191 
    192   // This must be a module which has already been added to this MCJIT instance.
    193   assert(OwnedModules.ownsModule(M) &&
    194          "MCJIT::generateCodeForModule: Unknown module.");
    195 
    196   // Re-compilation is not supported
    197   if (OwnedModules.hasModuleBeenLoaded(M))
    198     return;
    199 
    200   std::unique_ptr<MemoryBuffer> ObjectToLoad;
    201   // Try to load the pre-compiled object from cache if possible
    202   if (ObjCache)
    203     ObjectToLoad = ObjCache->getObject(M);
    204 
    205   assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
    206 
    207   // If the cache did not contain a suitable object, compile the object
    208   if (!ObjectToLoad) {
    209     ObjectToLoad = emitObject(M);
    210     assert(ObjectToLoad && "Compilation did not produce an object.");
    211   }
    212 
    213   // Load the object into the dynamic linker.
    214   // MCJIT now owns the ObjectImage pointer (via its LoadedObjects list).
    215   Expected<std::unique_ptr<object::ObjectFile>> LoadedObject =
    216     object::ObjectFile::createObjectFile(ObjectToLoad->getMemBufferRef());
    217   if (!LoadedObject) {
    218     std::string Buf;
    219     raw_string_ostream OS(Buf);
    220     logAllUnhandledErrors(LoadedObject.takeError(), OS);
    221     OS.flush();
    222     report_fatal_error(Buf);
    223   }
    224   std::unique_ptr<RuntimeDyld::LoadedObjectInfo> L =
    225     Dyld.loadObject(*LoadedObject.get());
    226 
    227   if (Dyld.hasError())
    228     report_fatal_error(Dyld.getErrorString());
    229 
    230   notifyObjectLoaded(*LoadedObject.get(), *L);
    231 
    232   Buffers.push_back(std::move(ObjectToLoad));
    233   LoadedObjects.push_back(std::move(*LoadedObject));
    234 
    235   OwnedModules.markModuleAsLoaded(M);
    236 }
    237 
    238 void MCJIT::finalizeLoadedModules() {
    239   std::lock_guard<sys::Mutex> locked(lock);
    240 
    241   // Resolve any outstanding relocations.
    242   Dyld.resolveRelocations();
    243 
    244   // Check for Dyld error.
    245   if (Dyld.hasError())
    246     ErrMsg = Dyld.getErrorString().str();
    247 
    248   OwnedModules.markAllLoadedModulesAsFinalized();
    249 
    250   // Register EH frame data for any module we own which has been loaded
    251   Dyld.registerEHFrames();
    252 
    253   // Set page permissions.
    254   MemMgr->finalizeMemory();
    255 }
    256 
    257 // FIXME: Rename this.
    258 void MCJIT::finalizeObject() {
    259   std::lock_guard<sys::Mutex> locked(lock);
    260 
    261   // Generate code for module is going to move objects out of the 'added' list,
    262   // so we need to copy that out before using it:
    263   SmallVector<Module*, 16> ModsToAdd;
    264   for (auto M : OwnedModules.added())
    265     ModsToAdd.push_back(M);
    266 
    267   for (auto M : ModsToAdd)
    268     generateCodeForModule(M);
    269 
    270   finalizeLoadedModules();
    271 }
    272 
    273 void MCJIT::finalizeModule(Module *M) {
    274   std::lock_guard<sys::Mutex> locked(lock);
    275 
    276   // This must be a module which has already been added to this MCJIT instance.
    277   assert(OwnedModules.ownsModule(M) && "MCJIT::finalizeModule: Unknown module.");
    278 
    279   // If the module hasn't been compiled, just do that.
    280   if (!OwnedModules.hasModuleBeenLoaded(M))
    281     generateCodeForModule(M);
    282 
    283   finalizeLoadedModules();
    284 }
    285 
    286 JITSymbol MCJIT::findExistingSymbol(const std::string &Name) {
    287   if (void *Addr = getPointerToGlobalIfAvailable(Name))
    288     return JITSymbol(static_cast<uint64_t>(
    289                          reinterpret_cast<uintptr_t>(Addr)),
    290                      JITSymbolFlags::Exported);
    291 
    292   return Dyld.getSymbol(Name);
    293 }
    294 
    295 Module *MCJIT::findModuleForSymbol(const std::string &Name,
    296                                    bool CheckFunctionsOnly) {
    297   StringRef DemangledName = Name;
    298   if (DemangledName[0] == getDataLayout().getGlobalPrefix())
    299     DemangledName = DemangledName.substr(1);
    300 
    301   std::lock_guard<sys::Mutex> locked(lock);
    302 
    303   // If it hasn't already been generated, see if it's in one of our modules.
    304   for (ModulePtrSet::iterator I = OwnedModules.begin_added(),
    305                               E = OwnedModules.end_added();
    306        I != E; ++I) {
    307     Module *M = *I;
    308     Function *F = M->getFunction(DemangledName);
    309     if (F && !F->isDeclaration())
    310       return M;
    311     if (!CheckFunctionsOnly) {
    312       GlobalVariable *G = M->getGlobalVariable(DemangledName);
    313       if (G && !G->isDeclaration())
    314         return M;
    315       // FIXME: Do we need to worry about global aliases?
    316     }
    317   }
    318   // We didn't find the symbol in any of our modules.
    319   return nullptr;
    320 }
    321 
    322 uint64_t MCJIT::getSymbolAddress(const std::string &Name,
    323                                  bool CheckFunctionsOnly) {
    324   std::string MangledName;
    325   {
    326     raw_string_ostream MangledNameStream(MangledName);
    327     Mangler::getNameWithPrefix(MangledNameStream, Name, getDataLayout());
    328   }
    329   if (auto Sym = findSymbol(MangledName, CheckFunctionsOnly)) {
    330     if (auto AddrOrErr = Sym.getAddress())
    331       return *AddrOrErr;
    332     else
    333       report_fatal_error(AddrOrErr.takeError());
    334   } else if (auto Err = Sym.takeError())
    335     report_fatal_error(Sym.takeError());
    336   return 0;
    337 }
    338 
    339 JITSymbol MCJIT::findSymbol(const std::string &Name,
    340                             bool CheckFunctionsOnly) {
    341   std::lock_guard<sys::Mutex> locked(lock);
    342 
    343   // First, check to see if we already have this symbol.
    344   if (auto Sym = findExistingSymbol(Name))
    345     return Sym;
    346 
    347   for (object::OwningBinary<object::Archive> &OB : Archives) {
    348     object::Archive *A = OB.getBinary();
    349     // Look for our symbols in each Archive
    350     auto OptionalChildOrErr = A->findSym(Name);
    351     if (!OptionalChildOrErr)
    352       report_fatal_error(OptionalChildOrErr.takeError());
    353     auto &OptionalChild = *OptionalChildOrErr;
    354     if (OptionalChild) {
    355       // FIXME: Support nested archives?
    356       Expected<std::unique_ptr<object::Binary>> ChildBinOrErr =
    357           OptionalChild->getAsBinary();
    358       if (!ChildBinOrErr) {
    359         // TODO: Actually report errors helpfully.
    360         consumeError(ChildBinOrErr.takeError());
    361         continue;
    362       }
    363       std::unique_ptr<object::Binary> &ChildBin = ChildBinOrErr.get();
    364       if (ChildBin->isObject()) {
    365         std::unique_ptr<object::ObjectFile> OF(
    366             static_cast<object::ObjectFile *>(ChildBin.release()));
    367         // This causes the object file to be loaded.
    368         addObjectFile(std::move(OF));
    369         // The address should be here now.
    370         if (auto Sym = findExistingSymbol(Name))
    371           return Sym;
    372       }
    373     }
    374   }
    375 
    376   // If it hasn't already been generated, see if it's in one of our modules.
    377   Module *M = findModuleForSymbol(Name, CheckFunctionsOnly);
    378   if (M) {
    379     generateCodeForModule(M);
    380 
    381     // Check the RuntimeDyld table again, it should be there now.
    382     return findExistingSymbol(Name);
    383   }
    384 
    385   // If a LazyFunctionCreator is installed, use it to get/create the function.
    386   // FIXME: Should we instead have a LazySymbolCreator callback?
    387   if (LazyFunctionCreator) {
    388     auto Addr = static_cast<uint64_t>(
    389                   reinterpret_cast<uintptr_t>(LazyFunctionCreator(Name)));
    390     return JITSymbol(Addr, JITSymbolFlags::Exported);
    391   }
    392 
    393   return nullptr;
    394 }
    395 
    396 uint64_t MCJIT::getGlobalValueAddress(const std::string &Name) {
    397   std::lock_guard<sys::Mutex> locked(lock);
    398   uint64_t Result = getSymbolAddress(Name, false);
    399   if (Result != 0)
    400     finalizeLoadedModules();
    401   return Result;
    402 }
    403 
    404 uint64_t MCJIT::getFunctionAddress(const std::string &Name) {
    405   std::lock_guard<sys::Mutex> locked(lock);
    406   uint64_t Result = getSymbolAddress(Name, true);
    407   if (Result != 0)
    408     finalizeLoadedModules();
    409   return Result;
    410 }
    411 
    412 // Deprecated.  Use getFunctionAddress instead.
    413 void *MCJIT::getPointerToFunction(Function *F) {
    414   std::lock_guard<sys::Mutex> locked(lock);
    415 
    416   Mangler Mang;
    417   SmallString<128> Name;
    418   TM->getNameWithPrefix(Name, F, Mang);
    419 
    420   if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) {
    421     bool AbortOnFailure = !F->hasExternalWeakLinkage();
    422     void *Addr = getPointerToNamedFunction(Name, AbortOnFailure);
    423     updateGlobalMapping(F, Addr);
    424     return Addr;
    425   }
    426 
    427   Module *M = F->getParent();
    428   bool HasBeenAddedButNotLoaded = OwnedModules.hasModuleBeenAddedButNotLoaded(M);
    429 
    430   // Make sure the relevant module has been compiled and loaded.
    431   if (HasBeenAddedButNotLoaded)
    432     generateCodeForModule(M);
    433   else if (!OwnedModules.hasModuleBeenLoaded(M)) {
    434     // If this function doesn't belong to one of our modules, we're done.
    435     // FIXME: Asking for the pointer to a function that hasn't been registered,
    436     //        and isn't a declaration (which is handled above) should probably
    437     //        be an assertion.
    438     return nullptr;
    439   }
    440 
    441   // FIXME: Should the Dyld be retaining module information? Probably not.
    442   //
    443   // This is the accessor for the target address, so make sure to check the
    444   // load address of the symbol, not the local address.
    445   return (void*)Dyld.getSymbol(Name).getAddress();
    446 }
    447 
    448 void MCJIT::runStaticConstructorsDestructorsInModulePtrSet(
    449     bool isDtors, ModulePtrSet::iterator I, ModulePtrSet::iterator E) {
    450   for (; I != E; ++I) {
    451     ExecutionEngine::runStaticConstructorsDestructors(**I, isDtors);
    452   }
    453 }
    454 
    455 void MCJIT::runStaticConstructorsDestructors(bool isDtors) {
    456   // Execute global ctors/dtors for each module in the program.
    457   runStaticConstructorsDestructorsInModulePtrSet(
    458       isDtors, OwnedModules.begin_added(), OwnedModules.end_added());
    459   runStaticConstructorsDestructorsInModulePtrSet(
    460       isDtors, OwnedModules.begin_loaded(), OwnedModules.end_loaded());
    461   runStaticConstructorsDestructorsInModulePtrSet(
    462       isDtors, OwnedModules.begin_finalized(), OwnedModules.end_finalized());
    463 }
    464 
    465 Function *MCJIT::FindFunctionNamedInModulePtrSet(StringRef FnName,
    466                                                  ModulePtrSet::iterator I,
    467                                                  ModulePtrSet::iterator E) {
    468   for (; I != E; ++I) {
    469     Function *F = (*I)->getFunction(FnName);
    470     if (F && !F->isDeclaration())
    471       return F;
    472   }
    473   return nullptr;
    474 }
    475 
    476 GlobalVariable *MCJIT::FindGlobalVariableNamedInModulePtrSet(StringRef Name,
    477                                                              bool AllowInternal,
    478                                                              ModulePtrSet::iterator I,
    479                                                              ModulePtrSet::iterator E) {
    480   for (; I != E; ++I) {
    481     GlobalVariable *GV = (*I)->getGlobalVariable(Name, AllowInternal);
    482     if (GV && !GV->isDeclaration())
    483       return GV;
    484   }
    485   return nullptr;
    486 }
    487 
    488 
    489 Function *MCJIT::FindFunctionNamed(StringRef FnName) {
    490   Function *F = FindFunctionNamedInModulePtrSet(
    491       FnName, OwnedModules.begin_added(), OwnedModules.end_added());
    492   if (!F)
    493     F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_loaded(),
    494                                         OwnedModules.end_loaded());
    495   if (!F)
    496     F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_finalized(),
    497                                         OwnedModules.end_finalized());
    498   return F;
    499 }
    500 
    501 GlobalVariable *MCJIT::FindGlobalVariableNamed(StringRef Name, bool AllowInternal) {
    502   GlobalVariable *GV = FindGlobalVariableNamedInModulePtrSet(
    503       Name, AllowInternal, OwnedModules.begin_added(), OwnedModules.end_added());
    504   if (!GV)
    505     GV = FindGlobalVariableNamedInModulePtrSet(Name, AllowInternal, OwnedModules.begin_loaded(),
    506                                         OwnedModules.end_loaded());
    507   if (!GV)
    508     GV = FindGlobalVariableNamedInModulePtrSet(Name, AllowInternal, OwnedModules.begin_finalized(),
    509                                         OwnedModules.end_finalized());
    510   return GV;
    511 }
    512 
    513 GenericValue MCJIT::runFunction(Function *F, ArrayRef<GenericValue> ArgValues) {
    514   assert(F && "Function *F was null at entry to run()");
    515 
    516   void *FPtr = getPointerToFunction(F);
    517   finalizeModule(F->getParent());
    518   assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
    519   FunctionType *FTy = F->getFunctionType();
    520   Type *RetTy = FTy->getReturnType();
    521 
    522   assert((FTy->getNumParams() == ArgValues.size() ||
    523           (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) &&
    524          "Wrong number of arguments passed into function!");
    525   assert(FTy->getNumParams() == ArgValues.size() &&
    526          "This doesn't support passing arguments through varargs (yet)!");
    527 
    528   // Handle some common cases first.  These cases correspond to common `main'
    529   // prototypes.
    530   if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) {
    531     switch (ArgValues.size()) {
    532     case 3:
    533       if (FTy->getParamType(0)->isIntegerTy(32) &&
    534           FTy->getParamType(1)->isPointerTy() &&
    535           FTy->getParamType(2)->isPointerTy()) {
    536         int (*PF)(int, char **, const char **) =
    537           (int(*)(int, char **, const char **))(intptr_t)FPtr;
    538 
    539         // Call the function.
    540         GenericValue rv;
    541         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
    542                                  (char **)GVTOP(ArgValues[1]),
    543                                  (const char **)GVTOP(ArgValues[2])));
    544         return rv;
    545       }
    546       break;
    547     case 2:
    548       if (FTy->getParamType(0)->isIntegerTy(32) &&
    549           FTy->getParamType(1)->isPointerTy()) {
    550         int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr;
    551 
    552         // Call the function.
    553         GenericValue rv;
    554         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
    555                                  (char **)GVTOP(ArgValues[1])));
    556         return rv;
    557       }
    558       break;
    559     case 1:
    560       if (FTy->getNumParams() == 1 &&
    561           FTy->getParamType(0)->isIntegerTy(32)) {
    562         GenericValue rv;
    563         int (*PF)(int) = (int(*)(int))(intptr_t)FPtr;
    564         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue()));
    565         return rv;
    566       }
    567       break;
    568     }
    569   }
    570 
    571   // Handle cases where no arguments are passed first.
    572   if (ArgValues.empty()) {
    573     GenericValue rv;
    574     switch (RetTy->getTypeID()) {
    575     default: llvm_unreachable("Unknown return type for function call!");
    576     case Type::IntegerTyID: {
    577       unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth();
    578       if (BitWidth == 1)
    579         rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)());
    580       else if (BitWidth <= 8)
    581         rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)());
    582       else if (BitWidth <= 16)
    583         rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)());
    584       else if (BitWidth <= 32)
    585         rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)());
    586       else if (BitWidth <= 64)
    587         rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)());
    588       else
    589         llvm_unreachable("Integer types > 64 bits not supported");
    590       return rv;
    591     }
    592     case Type::VoidTyID:
    593       rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)());
    594       return rv;
    595     case Type::FloatTyID:
    596       rv.FloatVal = ((float(*)())(intptr_t)FPtr)();
    597       return rv;
    598     case Type::DoubleTyID:
    599       rv.DoubleVal = ((double(*)())(intptr_t)FPtr)();
    600       return rv;
    601     case Type::X86_FP80TyID:
    602     case Type::FP128TyID:
    603     case Type::PPC_FP128TyID:
    604       llvm_unreachable("long double not supported yet");
    605     case Type::PointerTyID:
    606       return PTOGV(((void*(*)())(intptr_t)FPtr)());
    607     }
    608   }
    609 
    610   report_fatal_error("MCJIT::runFunction does not support full-featured "
    611                      "argument passing. Please use "
    612                      "ExecutionEngine::getFunctionAddress and cast the result "
    613                      "to the desired function pointer type.");
    614 }
    615 
    616 void *MCJIT::getPointerToNamedFunction(StringRef Name, bool AbortOnFailure) {
    617   if (!isSymbolSearchingDisabled()) {
    618     if (auto Sym = Resolver.findSymbol(std::string(Name))) {
    619       if (auto AddrOrErr = Sym.getAddress())
    620         return reinterpret_cast<void*>(
    621                  static_cast<uintptr_t>(*AddrOrErr));
    622     } else if (auto Err = Sym.takeError())
    623       report_fatal_error(std::move(Err));
    624   }
    625 
    626   /// If a LazyFunctionCreator is installed, use it to get/create the function.
    627   if (LazyFunctionCreator)
    628     if (void *RP = LazyFunctionCreator(std::string(Name)))
    629       return RP;
    630 
    631   if (AbortOnFailure) {
    632     report_fatal_error("Program used external function '"+Name+
    633                        "' which could not be resolved!");
    634   }
    635   return nullptr;
    636 }
    637 
    638 void MCJIT::RegisterJITEventListener(JITEventListener *L) {
    639   if (!L)
    640     return;
    641   std::lock_guard<sys::Mutex> locked(lock);
    642   EventListeners.push_back(L);
    643 }
    644 
    645 void MCJIT::UnregisterJITEventListener(JITEventListener *L) {
    646   if (!L)
    647     return;
    648   std::lock_guard<sys::Mutex> locked(lock);
    649   auto I = find(reverse(EventListeners), L);
    650   if (I != EventListeners.rend()) {
    651     std::swap(*I, EventListeners.back());
    652     EventListeners.pop_back();
    653   }
    654 }
    655 
    656 void MCJIT::notifyObjectLoaded(const object::ObjectFile &Obj,
    657                                const RuntimeDyld::LoadedObjectInfo &L) {
    658   uint64_t Key =
    659       static_cast<uint64_t>(reinterpret_cast<uintptr_t>(Obj.getData().data()));
    660   std::lock_guard<sys::Mutex> locked(lock);
    661   MemMgr->notifyObjectLoaded(this, Obj);
    662   for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
    663     EventListeners[I]->notifyObjectLoaded(Key, Obj, L);
    664   }
    665 }
    666 
    667 void MCJIT::notifyFreeingObject(const object::ObjectFile &Obj) {
    668   uint64_t Key =
    669       static_cast<uint64_t>(reinterpret_cast<uintptr_t>(Obj.getData().data()));
    670   std::lock_guard<sys::Mutex> locked(lock);
    671   for (JITEventListener *L : EventListeners)
    672     L->notifyFreeingObject(Key);
    673 }
    674 
    675 JITSymbol
    676 LinkingSymbolResolver::findSymbol(const std::string &Name) {
    677   auto Result = ParentEngine.findSymbol(Name, false);
    678   if (Result)
    679     return Result;
    680   if (ParentEngine.isSymbolSearchingDisabled())
    681     return nullptr;
    682   return ClientResolver->findSymbol(Name);
    683 }
    684 
    685 void LinkingSymbolResolver::anchor() {}
    686