xref: /aosp_15_r20/external/llvm/lib/ExecutionEngine/MCJIT/MCJIT.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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