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