1*9880d681SAndroid Build Coastguard Worker //===-- MCJIT.h - Class definition for the MCJIT ----------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_EXECUTIONENGINE_MCJIT_MCJIT_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_EXECUTIONENGINE_MCJIT_MCJIT_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallPtrSet.h" 14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallVector.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/ExecutionEngine.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/ObjectCache.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/ObjectMemoryBuffer.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/RTDyldMemoryManager.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/RuntimeDyld.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h" 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker namespace llvm { 23*9880d681SAndroid Build Coastguard Worker class MCJIT; 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker // This is a helper class that the MCJIT execution engine uses for linking 26*9880d681SAndroid Build Coastguard Worker // functions across modules that it owns. It aggregates the memory manager 27*9880d681SAndroid Build Coastguard Worker // that is passed in to the MCJIT constructor and defers most functionality 28*9880d681SAndroid Build Coastguard Worker // to that object. 29*9880d681SAndroid Build Coastguard Worker class LinkingSymbolResolver : public RuntimeDyld::SymbolResolver { 30*9880d681SAndroid Build Coastguard Worker public: LinkingSymbolResolver(MCJIT & Parent,std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver)31*9880d681SAndroid Build Coastguard Worker LinkingSymbolResolver(MCJIT &Parent, 32*9880d681SAndroid Build Coastguard Worker std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver) 33*9880d681SAndroid Build Coastguard Worker : ParentEngine(Parent), ClientResolver(std::move(Resolver)) {} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolInfo findSymbol(const std::string &Name) override; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker // MCJIT doesn't support logical dylibs. 38*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolInfo findSymbolInLogicalDylib(const std::string & Name)39*9880d681SAndroid Build Coastguard Worker findSymbolInLogicalDylib(const std::string &Name) override { 40*9880d681SAndroid Build Coastguard Worker return nullptr; 41*9880d681SAndroid Build Coastguard Worker } 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker private: 44*9880d681SAndroid Build Coastguard Worker MCJIT &ParentEngine; 45*9880d681SAndroid Build Coastguard Worker std::shared_ptr<RuntimeDyld::SymbolResolver> ClientResolver; 46*9880d681SAndroid Build Coastguard Worker }; 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker // About Module states: added->loaded->finalized. 49*9880d681SAndroid Build Coastguard Worker // 50*9880d681SAndroid Build Coastguard Worker // The purpose of the "added" state is having modules in standby. (added=known 51*9880d681SAndroid Build Coastguard Worker // but not compiled). The idea is that you can add a module to provide function 52*9880d681SAndroid Build Coastguard Worker // definitions but if nothing in that module is referenced by a module in which 53*9880d681SAndroid Build Coastguard Worker // a function is executed (note the wording here because it's not exactly the 54*9880d681SAndroid Build Coastguard Worker // ideal case) then the module never gets compiled. This is sort of lazy 55*9880d681SAndroid Build Coastguard Worker // compilation. 56*9880d681SAndroid Build Coastguard Worker // 57*9880d681SAndroid Build Coastguard Worker // The purpose of the "loaded" state (loaded=compiled and required sections 58*9880d681SAndroid Build Coastguard Worker // copied into local memory but not yet ready for execution) is to have an 59*9880d681SAndroid Build Coastguard Worker // intermediate state wherein clients can remap the addresses of sections, using 60*9880d681SAndroid Build Coastguard Worker // MCJIT::mapSectionAddress, (in preparation for later copying to a new location 61*9880d681SAndroid Build Coastguard Worker // or an external process) before relocations and page permissions are applied. 62*9880d681SAndroid Build Coastguard Worker // 63*9880d681SAndroid Build Coastguard Worker // It might not be obvious at first glance, but the "remote-mcjit" case in the 64*9880d681SAndroid Build Coastguard Worker // lli tool does this. In that case, the intermediate action is taken by the 65*9880d681SAndroid Build Coastguard Worker // RemoteMemoryManager in response to the notifyObjectLoaded function being 66*9880d681SAndroid Build Coastguard Worker // called. 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker class MCJIT : public ExecutionEngine { 69*9880d681SAndroid Build Coastguard Worker MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> tm, 70*9880d681SAndroid Build Coastguard Worker std::shared_ptr<MCJITMemoryManager> MemMgr, 71*9880d681SAndroid Build Coastguard Worker std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver); 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker typedef llvm::SmallPtrSet<Module *, 4> ModulePtrSet; 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker class OwningModuleContainer { 76*9880d681SAndroid Build Coastguard Worker public: OwningModuleContainer()77*9880d681SAndroid Build Coastguard Worker OwningModuleContainer() { 78*9880d681SAndroid Build Coastguard Worker } ~OwningModuleContainer()79*9880d681SAndroid Build Coastguard Worker ~OwningModuleContainer() { 80*9880d681SAndroid Build Coastguard Worker freeModulePtrSet(AddedModules); 81*9880d681SAndroid Build Coastguard Worker freeModulePtrSet(LoadedModules); 82*9880d681SAndroid Build Coastguard Worker freeModulePtrSet(FinalizedModules); 83*9880d681SAndroid Build Coastguard Worker } 84*9880d681SAndroid Build Coastguard Worker begin_added()85*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator begin_added() { return AddedModules.begin(); } end_added()86*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator end_added() { return AddedModules.end(); } added()87*9880d681SAndroid Build Coastguard Worker iterator_range<ModulePtrSet::iterator> added() { 88*9880d681SAndroid Build Coastguard Worker return make_range(begin_added(), end_added()); 89*9880d681SAndroid Build Coastguard Worker } 90*9880d681SAndroid Build Coastguard Worker begin_loaded()91*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator begin_loaded() { return LoadedModules.begin(); } end_loaded()92*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator end_loaded() { return LoadedModules.end(); } 93*9880d681SAndroid Build Coastguard Worker begin_finalized()94*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator begin_finalized() { return FinalizedModules.begin(); } end_finalized()95*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator end_finalized() { return FinalizedModules.end(); } 96*9880d681SAndroid Build Coastguard Worker addModule(std::unique_ptr<Module> M)97*9880d681SAndroid Build Coastguard Worker void addModule(std::unique_ptr<Module> M) { 98*9880d681SAndroid Build Coastguard Worker AddedModules.insert(M.release()); 99*9880d681SAndroid Build Coastguard Worker } 100*9880d681SAndroid Build Coastguard Worker removeModule(Module * M)101*9880d681SAndroid Build Coastguard Worker bool removeModule(Module *M) { 102*9880d681SAndroid Build Coastguard Worker return AddedModules.erase(M) || LoadedModules.erase(M) || 103*9880d681SAndroid Build Coastguard Worker FinalizedModules.erase(M); 104*9880d681SAndroid Build Coastguard Worker } 105*9880d681SAndroid Build Coastguard Worker hasModuleBeenAddedButNotLoaded(Module * M)106*9880d681SAndroid Build Coastguard Worker bool hasModuleBeenAddedButNotLoaded(Module *M) { 107*9880d681SAndroid Build Coastguard Worker return AddedModules.count(M) != 0; 108*9880d681SAndroid Build Coastguard Worker } 109*9880d681SAndroid Build Coastguard Worker hasModuleBeenLoaded(Module * M)110*9880d681SAndroid Build Coastguard Worker bool hasModuleBeenLoaded(Module *M) { 111*9880d681SAndroid Build Coastguard Worker // If the module is in either the "loaded" or "finalized" sections it 112*9880d681SAndroid Build Coastguard Worker // has been loaded. 113*9880d681SAndroid Build Coastguard Worker return (LoadedModules.count(M) != 0 ) || (FinalizedModules.count(M) != 0); 114*9880d681SAndroid Build Coastguard Worker } 115*9880d681SAndroid Build Coastguard Worker hasModuleBeenFinalized(Module * M)116*9880d681SAndroid Build Coastguard Worker bool hasModuleBeenFinalized(Module *M) { 117*9880d681SAndroid Build Coastguard Worker return FinalizedModules.count(M) != 0; 118*9880d681SAndroid Build Coastguard Worker } 119*9880d681SAndroid Build Coastguard Worker ownsModule(Module * M)120*9880d681SAndroid Build Coastguard Worker bool ownsModule(Module* M) { 121*9880d681SAndroid Build Coastguard Worker return (AddedModules.count(M) != 0) || (LoadedModules.count(M) != 0) || 122*9880d681SAndroid Build Coastguard Worker (FinalizedModules.count(M) != 0); 123*9880d681SAndroid Build Coastguard Worker } 124*9880d681SAndroid Build Coastguard Worker markModuleAsLoaded(Module * M)125*9880d681SAndroid Build Coastguard Worker void markModuleAsLoaded(Module *M) { 126*9880d681SAndroid Build Coastguard Worker // This checks against logic errors in the MCJIT implementation. 127*9880d681SAndroid Build Coastguard Worker // This function should never be called with either a Module that MCJIT 128*9880d681SAndroid Build Coastguard Worker // does not own or a Module that has already been loaded and/or finalized. 129*9880d681SAndroid Build Coastguard Worker assert(AddedModules.count(M) && 130*9880d681SAndroid Build Coastguard Worker "markModuleAsLoaded: Module not found in AddedModules"); 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker // Remove the module from the "Added" set. 133*9880d681SAndroid Build Coastguard Worker AddedModules.erase(M); 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker // Add the Module to the "Loaded" set. 136*9880d681SAndroid Build Coastguard Worker LoadedModules.insert(M); 137*9880d681SAndroid Build Coastguard Worker } 138*9880d681SAndroid Build Coastguard Worker markModuleAsFinalized(Module * M)139*9880d681SAndroid Build Coastguard Worker void markModuleAsFinalized(Module *M) { 140*9880d681SAndroid Build Coastguard Worker // This checks against logic errors in the MCJIT implementation. 141*9880d681SAndroid Build Coastguard Worker // This function should never be called with either a Module that MCJIT 142*9880d681SAndroid Build Coastguard Worker // does not own, a Module that has not been loaded or a Module that has 143*9880d681SAndroid Build Coastguard Worker // already been finalized. 144*9880d681SAndroid Build Coastguard Worker assert(LoadedModules.count(M) && 145*9880d681SAndroid Build Coastguard Worker "markModuleAsFinalized: Module not found in LoadedModules"); 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker // Remove the module from the "Loaded" section of the list. 148*9880d681SAndroid Build Coastguard Worker LoadedModules.erase(M); 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker // Add the Module to the "Finalized" section of the list by inserting it 151*9880d681SAndroid Build Coastguard Worker // before the 'end' iterator. 152*9880d681SAndroid Build Coastguard Worker FinalizedModules.insert(M); 153*9880d681SAndroid Build Coastguard Worker } 154*9880d681SAndroid Build Coastguard Worker markAllLoadedModulesAsFinalized()155*9880d681SAndroid Build Coastguard Worker void markAllLoadedModulesAsFinalized() { 156*9880d681SAndroid Build Coastguard Worker for (ModulePtrSet::iterator I = LoadedModules.begin(), 157*9880d681SAndroid Build Coastguard Worker E = LoadedModules.end(); 158*9880d681SAndroid Build Coastguard Worker I != E; ++I) { 159*9880d681SAndroid Build Coastguard Worker Module *M = *I; 160*9880d681SAndroid Build Coastguard Worker FinalizedModules.insert(M); 161*9880d681SAndroid Build Coastguard Worker } 162*9880d681SAndroid Build Coastguard Worker LoadedModules.clear(); 163*9880d681SAndroid Build Coastguard Worker } 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker private: 166*9880d681SAndroid Build Coastguard Worker ModulePtrSet AddedModules; 167*9880d681SAndroid Build Coastguard Worker ModulePtrSet LoadedModules; 168*9880d681SAndroid Build Coastguard Worker ModulePtrSet FinalizedModules; 169*9880d681SAndroid Build Coastguard Worker freeModulePtrSet(ModulePtrSet & MPS)170*9880d681SAndroid Build Coastguard Worker void freeModulePtrSet(ModulePtrSet& MPS) { 171*9880d681SAndroid Build Coastguard Worker // Go through the module set and delete everything. 172*9880d681SAndroid Build Coastguard Worker for (ModulePtrSet::iterator I = MPS.begin(), E = MPS.end(); I != E; ++I) { 173*9880d681SAndroid Build Coastguard Worker Module *M = *I; 174*9880d681SAndroid Build Coastguard Worker delete M; 175*9880d681SAndroid Build Coastguard Worker } 176*9880d681SAndroid Build Coastguard Worker MPS.clear(); 177*9880d681SAndroid Build Coastguard Worker } 178*9880d681SAndroid Build Coastguard Worker }; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker std::unique_ptr<TargetMachine> TM; 181*9880d681SAndroid Build Coastguard Worker MCContext *Ctx; 182*9880d681SAndroid Build Coastguard Worker std::shared_ptr<MCJITMemoryManager> MemMgr; 183*9880d681SAndroid Build Coastguard Worker LinkingSymbolResolver Resolver; 184*9880d681SAndroid Build Coastguard Worker RuntimeDyld Dyld; 185*9880d681SAndroid Build Coastguard Worker std::vector<JITEventListener*> EventListeners; 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker OwningModuleContainer OwnedModules; 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker SmallVector<object::OwningBinary<object::Archive>, 2> Archives; 190*9880d681SAndroid Build Coastguard Worker SmallVector<std::unique_ptr<MemoryBuffer>, 2> Buffers; 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker SmallVector<std::unique_ptr<object::ObjectFile>, 2> LoadedObjects; 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Worker // An optional ObjectCache to be notified of compiled objects and used to 195*9880d681SAndroid Build Coastguard Worker // perform lookup of pre-compiled code to avoid re-compilation. 196*9880d681SAndroid Build Coastguard Worker ObjectCache *ObjCache; 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker Function *FindFunctionNamedInModulePtrSet(const char *FnName, 199*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator I, 200*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator E); 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker GlobalVariable *FindGlobalVariableNamedInModulePtrSet(const char *Name, 203*9880d681SAndroid Build Coastguard Worker bool AllowInternal, 204*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator I, 205*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator E); 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker void runStaticConstructorsDestructorsInModulePtrSet(bool isDtors, 208*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator I, 209*9880d681SAndroid Build Coastguard Worker ModulePtrSet::iterator E); 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard Worker public: 212*9880d681SAndroid Build Coastguard Worker ~MCJIT() override; 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker /// @name ExecutionEngine interface implementation 215*9880d681SAndroid Build Coastguard Worker /// @{ 216*9880d681SAndroid Build Coastguard Worker void addModule(std::unique_ptr<Module> M) override; 217*9880d681SAndroid Build Coastguard Worker void addObjectFile(std::unique_ptr<object::ObjectFile> O) override; 218*9880d681SAndroid Build Coastguard Worker void addObjectFile(object::OwningBinary<object::ObjectFile> O) override; 219*9880d681SAndroid Build Coastguard Worker void addArchive(object::OwningBinary<object::Archive> O) override; 220*9880d681SAndroid Build Coastguard Worker bool removeModule(Module *M) override; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker /// FindFunctionNamed - Search all of the active modules to find the function that 223*9880d681SAndroid Build Coastguard Worker /// defines FnName. This is very slow operation and shouldn't be used for 224*9880d681SAndroid Build Coastguard Worker /// general code. 225*9880d681SAndroid Build Coastguard Worker Function *FindFunctionNamed(const char *FnName) override; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker /// FindGlobalVariableNamed - Search all of the active modules to find the 228*9880d681SAndroid Build Coastguard Worker /// global variable that defines Name. This is very slow operation and 229*9880d681SAndroid Build Coastguard Worker /// shouldn't be used for general code. 230*9880d681SAndroid Build Coastguard Worker GlobalVariable *FindGlobalVariableNamed(const char *Name, 231*9880d681SAndroid Build Coastguard Worker bool AllowInternal = false) override; 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker /// Sets the object manager that MCJIT should use to avoid compilation. 234*9880d681SAndroid Build Coastguard Worker void setObjectCache(ObjectCache *manager) override; 235*9880d681SAndroid Build Coastguard Worker setProcessAllSections(bool ProcessAllSections)236*9880d681SAndroid Build Coastguard Worker void setProcessAllSections(bool ProcessAllSections) override { 237*9880d681SAndroid Build Coastguard Worker Dyld.setProcessAllSections(ProcessAllSections); 238*9880d681SAndroid Build Coastguard Worker } 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker void generateCodeForModule(Module *M) override; 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker /// finalizeObject - ensure the module is fully processed and is usable. 243*9880d681SAndroid Build Coastguard Worker /// 244*9880d681SAndroid Build Coastguard Worker /// It is the user-level function for completing the process of making the 245*9880d681SAndroid Build Coastguard Worker /// object usable for execution. It should be called after sections within an 246*9880d681SAndroid Build Coastguard Worker /// object have been relocated using mapSectionAddress. When this method is 247*9880d681SAndroid Build Coastguard Worker /// called the MCJIT execution engine will reapply relocations for a loaded 248*9880d681SAndroid Build Coastguard Worker /// object. 249*9880d681SAndroid Build Coastguard Worker /// Is it OK to finalize a set of modules, add modules and finalize again. 250*9880d681SAndroid Build Coastguard Worker // FIXME: Do we really need both of these? 251*9880d681SAndroid Build Coastguard Worker void finalizeObject() override; 252*9880d681SAndroid Build Coastguard Worker virtual void finalizeModule(Module *); 253*9880d681SAndroid Build Coastguard Worker void finalizeLoadedModules(); 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker /// runStaticConstructorsDestructors - This method is used to execute all of 256*9880d681SAndroid Build Coastguard Worker /// the static constructors or destructors for a program. 257*9880d681SAndroid Build Coastguard Worker /// 258*9880d681SAndroid Build Coastguard Worker /// \param isDtors - Run the destructors instead of constructors. 259*9880d681SAndroid Build Coastguard Worker void runStaticConstructorsDestructors(bool isDtors) override; 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker void *getPointerToFunction(Function *F) override; 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker GenericValue runFunction(Function *F, 264*9880d681SAndroid Build Coastguard Worker ArrayRef<GenericValue> ArgValues) override; 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker /// getPointerToNamedFunction - This method returns the address of the 267*9880d681SAndroid Build Coastguard Worker /// specified function by using the dlsym function call. As such it is only 268*9880d681SAndroid Build Coastguard Worker /// useful for resolving library symbols, not code generated symbols. 269*9880d681SAndroid Build Coastguard Worker /// 270*9880d681SAndroid Build Coastguard Worker /// If AbortOnFailure is false and no function with the given name is 271*9880d681SAndroid Build Coastguard Worker /// found, this function silently returns a null pointer. Otherwise, 272*9880d681SAndroid Build Coastguard Worker /// it prints a message to stderr and aborts. 273*9880d681SAndroid Build Coastguard Worker /// 274*9880d681SAndroid Build Coastguard Worker void *getPointerToNamedFunction(StringRef Name, 275*9880d681SAndroid Build Coastguard Worker bool AbortOnFailure = true) override; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker /// mapSectionAddress - map a section to its target address space value. 278*9880d681SAndroid Build Coastguard Worker /// Map the address of a JIT section as returned from the memory manager 279*9880d681SAndroid Build Coastguard Worker /// to the address in the target process as the running code will see it. 280*9880d681SAndroid Build Coastguard Worker /// This is the address which will be used for relocation resolution. mapSectionAddress(const void * LocalAddress,uint64_t TargetAddress)281*9880d681SAndroid Build Coastguard Worker void mapSectionAddress(const void *LocalAddress, 282*9880d681SAndroid Build Coastguard Worker uint64_t TargetAddress) override { 283*9880d681SAndroid Build Coastguard Worker Dyld.mapSectionAddress(LocalAddress, TargetAddress); 284*9880d681SAndroid Build Coastguard Worker } 285*9880d681SAndroid Build Coastguard Worker void RegisterJITEventListener(JITEventListener *L) override; 286*9880d681SAndroid Build Coastguard Worker void UnregisterJITEventListener(JITEventListener *L) override; 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker // If successful, these function will implicitly finalize all loaded objects. 289*9880d681SAndroid Build Coastguard Worker // To get a function address within MCJIT without causing a finalize, use 290*9880d681SAndroid Build Coastguard Worker // getSymbolAddress. 291*9880d681SAndroid Build Coastguard Worker uint64_t getGlobalValueAddress(const std::string &Name) override; 292*9880d681SAndroid Build Coastguard Worker uint64_t getFunctionAddress(const std::string &Name) override; 293*9880d681SAndroid Build Coastguard Worker getTargetMachine()294*9880d681SAndroid Build Coastguard Worker TargetMachine *getTargetMachine() override { return TM.get(); } 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker /// @} 297*9880d681SAndroid Build Coastguard Worker /// @name (Private) Registration Interfaces 298*9880d681SAndroid Build Coastguard Worker /// @{ 299*9880d681SAndroid Build Coastguard Worker Register()300*9880d681SAndroid Build Coastguard Worker static void Register() { 301*9880d681SAndroid Build Coastguard Worker MCJITCtor = createJIT; 302*9880d681SAndroid Build Coastguard Worker } 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Worker static ExecutionEngine* 305*9880d681SAndroid Build Coastguard Worker createJIT(std::unique_ptr<Module> M, 306*9880d681SAndroid Build Coastguard Worker std::string *ErrorStr, 307*9880d681SAndroid Build Coastguard Worker std::shared_ptr<MCJITMemoryManager> MemMgr, 308*9880d681SAndroid Build Coastguard Worker std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver, 309*9880d681SAndroid Build Coastguard Worker std::unique_ptr<TargetMachine> TM); 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker // @} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolInfo findSymbol(const std::string &Name, 314*9880d681SAndroid Build Coastguard Worker bool CheckFunctionsOnly); 315*9880d681SAndroid Build Coastguard Worker // DEPRECATED - Please use findSymbol instead. 316*9880d681SAndroid Build Coastguard Worker // This is not directly exposed via the ExecutionEngine API, but it is 317*9880d681SAndroid Build Coastguard Worker // used by the LinkingMemoryManager. 318*9880d681SAndroid Build Coastguard Worker uint64_t getSymbolAddress(const std::string &Name, 319*9880d681SAndroid Build Coastguard Worker bool CheckFunctionsOnly); 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker protected: 322*9880d681SAndroid Build Coastguard Worker /// emitObject -- Generate a JITed object in memory from the specified module 323*9880d681SAndroid Build Coastguard Worker /// Currently, MCJIT only supports a single module and the module passed to 324*9880d681SAndroid Build Coastguard Worker /// this function call is expected to be the contained module. The module 325*9880d681SAndroid Build Coastguard Worker /// is passed as a parameter here to prepare for multiple module support in 326*9880d681SAndroid Build Coastguard Worker /// the future. 327*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MemoryBuffer> emitObject(Module *M); 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker void NotifyObjectEmitted(const object::ObjectFile& Obj, 330*9880d681SAndroid Build Coastguard Worker const RuntimeDyld::LoadedObjectInfo &L); 331*9880d681SAndroid Build Coastguard Worker void NotifyFreeingObject(const object::ObjectFile& Obj); 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolInfo findExistingSymbol(const std::string &Name); 334*9880d681SAndroid Build Coastguard Worker Module *findModuleForSymbol(const std::string &Name, 335*9880d681SAndroid Build Coastguard Worker bool CheckFunctionsOnly); 336*9880d681SAndroid Build Coastguard Worker }; 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker } // end llvm namespace 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker #endif // LLVM_LIB_EXECUTIONENGINE_MCJIT_MCJIT_H 341