Home | History | Annotate | Download | only in MCJIT
      1 //===-- MCJIT.cpp - MC-based Just-in-Time Compiler ------------------------===//
      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 #include "MCJIT.h"
     11 #include "llvm/ExecutionEngine/GenericValue.h"
     12 #include "llvm/ExecutionEngine/JITEventListener.h"
     13 #include "llvm/ExecutionEngine/JITMemoryManager.h"
     14 #include "llvm/ExecutionEngine/MCJIT.h"
     15 #include "llvm/ExecutionEngine/ObjectBuffer.h"
     16 #include "llvm/ExecutionEngine/ObjectImage.h"
     17 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
     18 #include "llvm/IR/DataLayout.h"
     19 #include "llvm/IR/DerivedTypes.h"
     20 #include "llvm/IR/Function.h"
     21 #include "llvm/MC/MCAsmInfo.h"
     22 #include "llvm/Support/DynamicLibrary.h"
     23 #include "llvm/Support/ErrorHandling.h"
     24 #include "llvm/Support/MemoryBuffer.h"
     25 #include "llvm/Support/MutexGuard.h"
     26 
     27 using namespace llvm;
     28 
     29 namespace {
     30 
     31 static struct RegisterJIT {
     32   RegisterJIT() { MCJIT::Register(); }
     33 } JITRegistrator;
     34 
     35 }
     36 
     37 extern "C" void LLVMLinkInMCJIT() {
     38 }
     39 
     40 ExecutionEngine *MCJIT::createJIT(Module *M,
     41                                   std::string *ErrorStr,
     42                                   RTDyldMemoryManager *MemMgr,
     43                                   bool GVsWithCode,
     44                                   TargetMachine *TM) {
     45   // Try to register the program as a source of symbols to resolve against.
     46   //
     47   // FIXME: Don't do this here.
     48   sys::DynamicLibrary::LoadLibraryPermanently(0, NULL);
     49 
     50   return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(),
     51                    GVsWithCode);
     52 }
     53 
     54 MCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
     55              bool AllocateGVsWithCode)
     56   : ExecutionEngine(m), TM(tm), Ctx(0), MemMgr(MM), Dyld(MM),
     57     IsLoaded(false), M(m), ObjCache(0) {
     58 
     59   setDataLayout(TM->getDataLayout());
     60 }
     61 
     62 MCJIT::~MCJIT() {
     63   if (LoadedObject)
     64     NotifyFreeingObject(*LoadedObject.get());
     65   delete MemMgr;
     66   delete TM;
     67 }
     68 
     69 void MCJIT::setObjectCache(ObjectCache* NewCache) {
     70   ObjCache = NewCache;
     71 }
     72 
     73 ObjectBufferStream* MCJIT::emitObject(Module *m) {
     74   /// Currently, MCJIT only supports a single module and the module passed to
     75   /// this function call is expected to be the contained module.  The module
     76   /// is passed as a parameter here to prepare for multiple module support in
     77   /// the future.
     78   assert(M == m);
     79 
     80   // Get a thread lock to make sure we aren't trying to compile multiple times
     81   MutexGuard locked(lock);
     82 
     83   // FIXME: Track compilation state on a per-module basis when multiple modules
     84   //        are supported.
     85   // Re-compilation is not supported
     86   assert(!IsLoaded);
     87 
     88   PassManager PM;
     89 
     90   PM.add(new DataLayout(*TM->getDataLayout()));
     91 
     92   // The RuntimeDyld will take ownership of this shortly
     93   OwningPtr<ObjectBufferStream> CompiledObject(new ObjectBufferStream());
     94 
     95   // Turn the machine code intermediate representation into bytes in memory
     96   // that may be executed.
     97   if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), false)) {
     98     report_fatal_error("Target does not support MC emission!");
     99   }
    100 
    101   // Initialize passes.
    102   PM.run(*m);
    103   // Flush the output buffer to get the generated code into memory
    104   CompiledObject->flush();
    105 
    106   // If we have an object cache, tell it about the new object.
    107   // Note that we're using the compiled image, not the loaded image (as below).
    108   if (ObjCache) {
    109     // MemoryBuffer is a thin wrapper around the actual memory, so it's OK
    110     // to create a temporary object here and delete it after the call.
    111     OwningPtr<MemoryBuffer> MB(CompiledObject->getMemBuffer());
    112     ObjCache->notifyObjectCompiled(m, MB.get());
    113   }
    114 
    115   return CompiledObject.take();
    116 }
    117 
    118 void MCJIT::loadObject(Module *M) {
    119 
    120   // Get a thread lock to make sure we aren't trying to load multiple times
    121   MutexGuard locked(lock);
    122 
    123   // FIXME: Track compilation state on a per-module basis when multiple modules
    124   //        are supported.
    125   // Re-compilation is not supported
    126   if (IsLoaded)
    127     return;
    128 
    129   OwningPtr<ObjectBuffer> ObjectToLoad;
    130   // Try to load the pre-compiled object from cache if possible
    131   if (0 != ObjCache) {
    132     OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M));
    133     if (0 != PreCompiledObject.get())
    134       ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take()));
    135   }
    136 
    137   // If the cache did not contain a suitable object, compile the object
    138   if (!ObjectToLoad) {
    139     ObjectToLoad.reset(emitObject(M));
    140     assert(ObjectToLoad.get() && "Compilation did not produce an object.");
    141   }
    142 
    143   // Load the object into the dynamic linker.
    144   // handing off ownership of the buffer
    145   LoadedObject.reset(Dyld.loadObject(ObjectToLoad.take()));
    146   if (!LoadedObject)
    147     report_fatal_error(Dyld.getErrorString());
    148 
    149   // Resolve any relocations.
    150   Dyld.resolveRelocations();
    151 
    152   // FIXME: Make this optional, maybe even move it to a JIT event listener
    153   LoadedObject->registerWithDebugger();
    154 
    155   NotifyObjectEmitted(*LoadedObject);
    156 
    157   // FIXME: Add support for per-module compilation state
    158   IsLoaded = true;
    159 }
    160 
    161 // FIXME: Add a parameter to identify which object is being finalized when
    162 // MCJIT supports multiple modules.
    163 // FIXME: Provide a way to separate code emission, relocations and page
    164 // protection in the interface.
    165 void MCJIT::finalizeObject() {
    166   // If the module hasn't been compiled, just do that.
    167   if (!IsLoaded) {
    168     // If the call to Dyld.resolveRelocations() is removed from loadObject()
    169     // we'll need to do that here.
    170     loadObject(M);
    171   } else {
    172     // Resolve any relocations.
    173     Dyld.resolveRelocations();
    174   }
    175 
    176   StringRef EHData = Dyld.getEHFrameSection();
    177   if (!EHData.empty())
    178     MemMgr->registerEHFrames(EHData);
    179 
    180   // Set page permissions.
    181   MemMgr->finalizeMemory();
    182 }
    183 
    184 void *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
    185   report_fatal_error("not yet implemented");
    186 }
    187 
    188 void *MCJIT::getPointerToFunction(Function *F) {
    189   // FIXME: This should really return a uint64_t since it's a pointer in the
    190   // target address space, not our local address space. That's part of the
    191   // ExecutionEngine interface, though. Fix that when the old JIT finally
    192   // dies.
    193 
    194   // FIXME: Add support for per-module compilation state
    195   if (!IsLoaded)
    196     loadObject(M);
    197 
    198   if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) {
    199     bool AbortOnFailure = !F->hasExternalWeakLinkage();
    200     void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure);
    201     addGlobalMapping(F, Addr);
    202     return Addr;
    203   }
    204 
    205   // FIXME: Should the Dyld be retaining module information? Probably not.
    206   // FIXME: Should we be using the mangler for this? Probably.
    207   //
    208   // This is the accessor for the target address, so make sure to check the
    209   // load address of the symbol, not the local address.
    210   StringRef BaseName = F->getName();
    211   if (BaseName[0] == '\1')
    212     return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1));
    213   return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
    214                                        + BaseName).str());
    215 }
    216 
    217 void *MCJIT::recompileAndRelinkFunction(Function *F) {
    218   report_fatal_error("not yet implemented");
    219 }
    220 
    221 void MCJIT::freeMachineCodeForFunction(Function *F) {
    222   report_fatal_error("not yet implemented");
    223 }
    224 
    225 GenericValue MCJIT::runFunction(Function *F,
    226                                 const std::vector<GenericValue> &ArgValues) {
    227   assert(F && "Function *F was null at entry to run()");
    228 
    229   void *FPtr = getPointerToFunction(F);
    230   assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
    231   FunctionType *FTy = F->getFunctionType();
    232   Type *RetTy = FTy->getReturnType();
    233 
    234   assert((FTy->getNumParams() == ArgValues.size() ||
    235           (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) &&
    236          "Wrong number of arguments passed into function!");
    237   assert(FTy->getNumParams() == ArgValues.size() &&
    238          "This doesn't support passing arguments through varargs (yet)!");
    239 
    240   // Handle some common cases first.  These cases correspond to common `main'
    241   // prototypes.
    242   if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) {
    243     switch (ArgValues.size()) {
    244     case 3:
    245       if (FTy->getParamType(0)->isIntegerTy(32) &&
    246           FTy->getParamType(1)->isPointerTy() &&
    247           FTy->getParamType(2)->isPointerTy()) {
    248         int (*PF)(int, char **, const char **) =
    249           (int(*)(int, char **, const char **))(intptr_t)FPtr;
    250 
    251         // Call the function.
    252         GenericValue rv;
    253         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
    254                                  (char **)GVTOP(ArgValues[1]),
    255                                  (const char **)GVTOP(ArgValues[2])));
    256         return rv;
    257       }
    258       break;
    259     case 2:
    260       if (FTy->getParamType(0)->isIntegerTy(32) &&
    261           FTy->getParamType(1)->isPointerTy()) {
    262         int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr;
    263 
    264         // Call the function.
    265         GenericValue rv;
    266         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(),
    267                                  (char **)GVTOP(ArgValues[1])));
    268         return rv;
    269       }
    270       break;
    271     case 1:
    272       if (FTy->getNumParams() == 1 &&
    273           FTy->getParamType(0)->isIntegerTy(32)) {
    274         GenericValue rv;
    275         int (*PF)(int) = (int(*)(int))(intptr_t)FPtr;
    276         rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue()));
    277         return rv;
    278       }
    279       break;
    280     }
    281   }
    282 
    283   // Handle cases where no arguments are passed first.
    284   if (ArgValues.empty()) {
    285     GenericValue rv;
    286     switch (RetTy->getTypeID()) {
    287     default: llvm_unreachable("Unknown return type for function call!");
    288     case Type::IntegerTyID: {
    289       unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth();
    290       if (BitWidth == 1)
    291         rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)());
    292       else if (BitWidth <= 8)
    293         rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)());
    294       else if (BitWidth <= 16)
    295         rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)());
    296       else if (BitWidth <= 32)
    297         rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)());
    298       else if (BitWidth <= 64)
    299         rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)());
    300       else
    301         llvm_unreachable("Integer types > 64 bits not supported");
    302       return rv;
    303     }
    304     case Type::VoidTyID:
    305       rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)());
    306       return rv;
    307     case Type::FloatTyID:
    308       rv.FloatVal = ((float(*)())(intptr_t)FPtr)();
    309       return rv;
    310     case Type::DoubleTyID:
    311       rv.DoubleVal = ((double(*)())(intptr_t)FPtr)();
    312       return rv;
    313     case Type::X86_FP80TyID:
    314     case Type::FP128TyID:
    315     case Type::PPC_FP128TyID:
    316       llvm_unreachable("long double not supported yet");
    317     case Type::PointerTyID:
    318       return PTOGV(((void*(*)())(intptr_t)FPtr)());
    319     }
    320   }
    321 
    322   llvm_unreachable("Full-featured argument passing not supported yet!");
    323 }
    324 
    325 void *MCJIT::getPointerToNamedFunction(const std::string &Name,
    326                                        bool AbortOnFailure) {
    327   // FIXME: Add support for per-module compilation state
    328   if (!IsLoaded)
    329     loadObject(M);
    330 
    331   if (!isSymbolSearchingDisabled() && MemMgr) {
    332     void *ptr = MemMgr->getPointerToNamedFunction(Name, false);
    333     if (ptr)
    334       return ptr;
    335   }
    336 
    337   /// If a LazyFunctionCreator is installed, use it to get/create the function.
    338   if (LazyFunctionCreator)
    339     if (void *RP = LazyFunctionCreator(Name))
    340       return RP;
    341 
    342   if (AbortOnFailure) {
    343     report_fatal_error("Program used external function '"+Name+
    344                        "' which could not be resolved!");
    345   }
    346   return 0;
    347 }
    348 
    349 void MCJIT::RegisterJITEventListener(JITEventListener *L) {
    350   if (L == NULL)
    351     return;
    352   MutexGuard locked(lock);
    353   EventListeners.push_back(L);
    354 }
    355 void MCJIT::UnregisterJITEventListener(JITEventListener *L) {
    356   if (L == NULL)
    357     return;
    358   MutexGuard locked(lock);
    359   SmallVector<JITEventListener*, 2>::reverse_iterator I=
    360       std::find(EventListeners.rbegin(), EventListeners.rend(), L);
    361   if (I != EventListeners.rend()) {
    362     std::swap(*I, EventListeners.back());
    363     EventListeners.pop_back();
    364   }
    365 }
    366 void MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) {
    367   MutexGuard locked(lock);
    368   for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
    369     EventListeners[I]->NotifyObjectEmitted(Obj);
    370   }
    371 }
    372 void MCJIT::NotifyFreeingObject(const ObjectImage& Obj) {
    373   MutexGuard locked(lock);
    374   for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) {
    375     EventListeners[I]->NotifyFreeingObject(Obj);
    376   }
    377 }
    378