Adding multiple object support to MCJIT EH frame handling
[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 bool finalizeMemory(std::string *ErrMsg = 0) {
59     return ClientMM->finalizeMemory(ErrMsg);
60   }
61
62 private:
63   MCJIT *ParentEngine;
64   OwningPtr<RTDyldMemoryManager> ClientMM;
65 };
66
67 // FIXME: This makes all kinds of horrible assumptions for the time being,
68 // like only having one module, not needing to worry about multi-threading,
69 // blah blah. Purely in get-it-up-and-limping mode for now.
70
71 class MCJIT : public ExecutionEngine {
72   MCJIT(Module *M, TargetMachine *tm, RTDyldMemoryManager *MemMgr,
73         bool AllocateGVsWithCode);
74
75   enum ModuleState {
76     ModuleAdded,
77     ModuleEmitted,
78     ModuleLoading,
79     ModuleLoaded,
80     ModuleFinalizing,
81     ModuleFinalized
82   };
83
84   class MCJITModuleState {
85   public:
86     MCJITModuleState() : State(ModuleAdded) {}
87
88     MCJITModuleState & operator=(ModuleState s) { State = s; return *this; }
89     bool hasBeenEmitted() { return State != ModuleAdded; }
90     bool hasBeenLoaded() { return State != ModuleAdded &&
91                                   State != ModuleEmitted; }
92     bool hasBeenFinalized() { return State == ModuleFinalized; }
93
94   private:
95     ModuleState State;
96   };
97
98   TargetMachine *TM;
99   MCContext *Ctx;
100   LinkingMemoryManager MemMgr;
101   RuntimeDyld Dyld;
102   SmallVector<JITEventListener*, 2> EventListeners;
103
104   typedef DenseMap<Module *, MCJITModuleState> ModuleStateMap;
105   ModuleStateMap  ModuleStates;
106
107   typedef DenseMap<Module *, ObjectImage *> LoadedObjectMap;
108   LoadedObjectMap  LoadedObjects;
109
110   // An optional ObjectCache to be notified of compiled objects and used to
111   // perform lookup of pre-compiled code to avoid re-compilation.
112   ObjectCache *ObjCache;
113
114 public:
115   ~MCJIT();
116
117   /// @name ExecutionEngine interface implementation
118   /// @{
119   virtual void addModule(Module *M);
120
121   /// Sets the object manager that MCJIT should use to avoid compilation.
122   virtual void setObjectCache(ObjectCache *manager);
123
124   virtual void generateCodeForModule(Module *M);
125
126   /// finalizeObject - ensure the module is fully processed and is usable.
127   ///
128   /// It is the user-level function for completing the process of making the
129   /// object usable for execution. It should be called after sections within an
130   /// object have been relocated using mapSectionAddress.  When this method is
131   /// called the MCJIT execution engine will reapply relocations for a loaded
132   /// object.
133   /// FIXME: Do we really need both of these?
134   virtual void finalizeObject();
135   virtual void finalizeModule(Module *);
136   void finalizeLoadedModules();
137
138   virtual void *getPointerToBasicBlock(BasicBlock *BB);
139
140   virtual void *getPointerToFunction(Function *F);
141
142   virtual void *recompileAndRelinkFunction(Function *F);
143
144   virtual void freeMachineCodeForFunction(Function *F);
145
146   virtual GenericValue runFunction(Function *F,
147                                    const std::vector<GenericValue> &ArgValues);
148
149   /// getPointerToNamedFunction - This method returns the address of the
150   /// specified function by using the dlsym function call.  As such it is only
151   /// useful for resolving library symbols, not code generated symbols.
152   ///
153   /// If AbortOnFailure is false and no function with the given name is
154   /// found, this function silently returns a null pointer. Otherwise,
155   /// it prints a message to stderr and aborts.
156   ///
157   virtual void *getPointerToNamedFunction(const std::string &Name,
158                                           bool AbortOnFailure = true);
159
160   /// mapSectionAddress - map a section to its target address space value.
161   /// Map the address of a JIT section as returned from the memory manager
162   /// to the address in the target process as the running code will see it.
163   /// This is the address which will be used for relocation resolution.
164   virtual void mapSectionAddress(const void *LocalAddress,
165                                  uint64_t TargetAddress) {
166     Dyld.mapSectionAddress(LocalAddress, TargetAddress);
167   }
168   virtual void RegisterJITEventListener(JITEventListener *L);
169   virtual void UnregisterJITEventListener(JITEventListener *L);
170
171   // If successful, these function will implicitly finalize all loaded objects.
172   // To get a function address within MCJIT without causing a finalize, use
173   // getSymbolAddress.
174   virtual uint64_t getGlobalValueAddress(const std::string &Name);
175   virtual uint64_t getFunctionAddress(const std::string &Name);
176
177   /// @}
178   /// @name (Private) Registration Interfaces
179   /// @{
180
181   static void Register() {
182     MCJITCtor = createJIT;
183   }
184
185   static ExecutionEngine *createJIT(Module *M,
186                                     std::string *ErrorStr,
187                                     RTDyldMemoryManager *MemMgr,
188                                     bool GVsWithCode,
189                                     TargetMachine *TM);
190
191   // @}
192
193   // This is not directly exposed via the ExecutionEngine API, but it is
194   // used by the LinkingMemoryManager.
195   uint64_t getSymbolAddress(const std::string &Name,
196                           bool CheckFunctionsOnly);
197
198 protected:
199   /// emitObject -- Generate a JITed object in memory from the specified module
200   /// Currently, MCJIT only supports a single module and the module passed to
201   /// this function call is expected to be the contained module.  The module
202   /// is passed as a parameter here to prepare for multiple module support in 
203   /// the future.
204   ObjectBufferStream* emitObject(Module *M);
205
206   void NotifyObjectEmitted(const ObjectImage& Obj);
207   void NotifyFreeingObject(const ObjectImage& Obj);
208
209   uint64_t getExistingSymbolAddress(const std::string &Name);
210   Module *findModuleForSymbol(const std::string &Name,
211                               bool CheckFunctionsOnly);
212 };
213
214 } // End llvm namespace
215
216 #endif