0d15b9afe6cdfa0fd2ebc25e754c82b8c711f82f
[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/SmallVector.h"
15 #include "llvm/ExecutionEngine/ExecutionEngine.h"
16 #include "llvm/ExecutionEngine/ObjectCache.h"
17 #include "llvm/ExecutionEngine/ObjectImage.h"
18 #include "llvm/ExecutionEngine/RuntimeDyld.h"
19 #include "llvm/PassManager.h"
20
21 namespace llvm {
22
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 notifyObjectLoaded(ExecutionEngine *EE,
50                                   const ObjectImage *Obj) {
51     ClientMM->notifyObjectLoaded(EE, Obj);
52   }
53
54   virtual void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {
55     ClientMM->registerEHFrames(Addr, LoadAddr, Size);
56   }
57
58   virtual void deregisterEHFrames(uint8_t *Addr,
59                                   uint64_t LoadAddr,
60                                   size_t Size) {
61     ClientMM->deregisterEHFrames(Addr, LoadAddr, Size);
62   }
63
64   virtual bool finalizeMemory(std::string *ErrMsg = 0) {
65     return ClientMM->finalizeMemory(ErrMsg);
66   }
67
68 private:
69   MCJIT *ParentEngine;
70   OwningPtr<RTDyldMemoryManager> ClientMM;
71 };
72
73 // About Module states:
74 //
75 // The purpose of the "added" state is having modules in standby. (added=known
76 // but not compiled). The idea is that you can add a module to provide function
77 // definitions but if nothing in that module is referenced by a module in which
78 // a function is executed (note the wording here because it\92s not exactly the
79 // ideal case) then the module never gets compiled. This is sort of lazy
80 // compilation.
81 //
82 // The purpose of the "loaded" state (loaded=compiled and required sections
83 // copied into local memory but not yet ready for execution) is to have an
84 // intermediate state wherein clients can remap the addresses of sections, using
85 // MCJIT::mapSectionAddress, (in preparation for later copying to a new location
86 // or an external process) before relocations and page permissions are applied.
87 //
88 // It might not be obvious at first glance, but the "remote-mcjit" case in the
89 // lli tool does this.  In that case, the intermediate action is taken by the
90 // RemoteMemoryManager in response to the notifyObjectLoaded function being
91 // called.
92
93 class MCJIT : public ExecutionEngine {
94   MCJIT(Module *M, TargetMachine *tm, RTDyldMemoryManager *MemMgr,
95         bool AllocateGVsWithCode);
96
97   enum ModuleState {
98     ModuleAdded,
99     ModuleEmitted,
100     ModuleLoading,
101     ModuleLoaded,
102     ModuleFinalizing,
103     ModuleFinalized
104   };
105
106   class MCJITModuleState {
107   public:
108     MCJITModuleState() : State(ModuleAdded) {}
109
110     MCJITModuleState & operator=(ModuleState s) { State = s; return *this; }
111     bool hasBeenEmitted() { return State != ModuleAdded; }
112     bool hasBeenLoaded() { return State != ModuleAdded &&
113                                   State != ModuleEmitted; }
114     bool hasBeenFinalized() { return State == ModuleFinalized; }
115
116   private:
117     ModuleState State;
118   };
119
120   TargetMachine *TM;
121   MCContext *Ctx;
122   LinkingMemoryManager MemMgr;
123   RuntimeDyld Dyld;
124   SmallVector<JITEventListener*, 2> EventListeners;
125
126   typedef DenseMap<Module *, MCJITModuleState> ModuleStateMap;
127   ModuleStateMap  ModuleStates;
128
129   typedef DenseMap<Module *, ObjectImage *> LoadedObjectMap;
130   LoadedObjectMap  LoadedObjects;
131
132   // An optional ObjectCache to be notified of compiled objects and used to
133   // perform lookup of pre-compiled code to avoid re-compilation.
134   ObjectCache *ObjCache;
135
136 public:
137   ~MCJIT();
138
139   /// @name ExecutionEngine interface implementation
140   /// @{
141   virtual void addModule(Module *M);
142
143   /// Sets the object manager that MCJIT should use to avoid compilation.
144   virtual void setObjectCache(ObjectCache *manager);
145
146   virtual void generateCodeForModule(Module *M);
147
148   /// finalizeObject - ensure the module is fully processed and is usable.
149   ///
150   /// It is the user-level function for completing the process of making the
151   /// object usable for execution. It should be called after sections within an
152   /// object have been relocated using mapSectionAddress.  When this method is
153   /// called the MCJIT execution engine will reapply relocations for a loaded
154   /// object.
155   /// Is it OK to finalize a set of modules, add modules and finalize again.
156   // FIXME: Do we really need both of these?
157   virtual void finalizeObject();
158   virtual void finalizeModule(Module *);
159   void finalizeLoadedModules();
160
161   virtual void *getPointerToBasicBlock(BasicBlock *BB);
162
163   virtual void *getPointerToFunction(Function *F);
164
165   virtual void *recompileAndRelinkFunction(Function *F);
166
167   virtual void freeMachineCodeForFunction(Function *F);
168
169   virtual GenericValue runFunction(Function *F,
170                                    const std::vector<GenericValue> &ArgValues);
171
172   /// getPointerToNamedFunction - This method returns the address of the
173   /// specified function by using the dlsym function call.  As such it is only
174   /// useful for resolving library symbols, not code generated symbols.
175   ///
176   /// If AbortOnFailure is false and no function with the given name is
177   /// found, this function silently returns a null pointer. Otherwise,
178   /// it prints a message to stderr and aborts.
179   ///
180   virtual void *getPointerToNamedFunction(const std::string &Name,
181                                           bool AbortOnFailure = true);
182
183   /// mapSectionAddress - map a section to its target address space value.
184   /// Map the address of a JIT section as returned from the memory manager
185   /// to the address in the target process as the running code will see it.
186   /// This is the address which will be used for relocation resolution.
187   virtual void mapSectionAddress(const void *LocalAddress,
188                                  uint64_t TargetAddress) {
189     Dyld.mapSectionAddress(LocalAddress, TargetAddress);
190   }
191   virtual void RegisterJITEventListener(JITEventListener *L);
192   virtual void UnregisterJITEventListener(JITEventListener *L);
193
194   // If successful, these function will implicitly finalize all loaded objects.
195   // To get a function address within MCJIT without causing a finalize, use
196   // getSymbolAddress.
197   virtual uint64_t getGlobalValueAddress(const std::string &Name);
198   virtual uint64_t getFunctionAddress(const std::string &Name);
199
200   /// @}
201   /// @name (Private) Registration Interfaces
202   /// @{
203
204   static void Register() {
205     MCJITCtor = createJIT;
206   }
207
208   static ExecutionEngine *createJIT(Module *M,
209                                     std::string *ErrorStr,
210                                     RTDyldMemoryManager *MemMgr,
211                                     bool GVsWithCode,
212                                     TargetMachine *TM);
213
214   // @}
215
216   // This is not directly exposed via the ExecutionEngine API, but it is
217   // used by the LinkingMemoryManager.
218   uint64_t getSymbolAddress(const std::string &Name,
219                           bool CheckFunctionsOnly);
220
221 protected:
222   /// emitObject -- Generate a JITed object in memory from the specified module
223   /// Currently, MCJIT only supports a single module and the module passed to
224   /// this function call is expected to be the contained module.  The module
225   /// is passed as a parameter here to prepare for multiple module support in 
226   /// the future.
227   ObjectBufferStream* emitObject(Module *M);
228
229   void NotifyObjectEmitted(const ObjectImage& Obj);
230   void NotifyFreeingObject(const ObjectImage& Obj);
231
232   uint64_t getExistingSymbolAddress(const std::string &Name);
233   Module *findModuleForSymbol(const std::string &Name,
234                               bool CheckFunctionsOnly);
235 };
236
237 } // End llvm namespace
238
239 #endif