1 //===-- JIT.h - Class definition for the JIT --------------------*- 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 // This file defines the top-level JIT data structure. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef JIT_H 15 #define JIT_H 16 17 #include "llvm/ExecutionEngine/ExecutionEngine.h" 18 #include "llvm/PassManager.h" 19 #include "llvm/Support/ValueHandle.h" 20 21 namespace llvm { 22 23 class Function; 24 struct JITEvent_EmittedFunctionDetails; 25 class MachineCodeEmitter; 26 class MachineCodeInfo; 27 class TargetJITInfo; 28 class TargetMachine; 29 30 class JITState { 31 private: 32 FunctionPassManager PM; // Passes to compile a function 33 Module *M; // Module used to create the PM 34 35 /// PendingFunctions - Functions which have not been code generated yet, but 36 /// were called from a function being code generated. 37 std::vector<AssertingVH<Function> > PendingFunctions; 38 39 public: JITState(Module * M)40 explicit JITState(Module *M) : PM(M), M(M) {} 41 getPM(const MutexGuard & L)42 FunctionPassManager &getPM(const MutexGuard &L) { 43 return PM; 44 } 45 getModule()46 Module *getModule() const { return M; } getPendingFunctions(const MutexGuard & L)47 std::vector<AssertingVH<Function> > &getPendingFunctions(const MutexGuard &L){ 48 return PendingFunctions; 49 } 50 }; 51 52 53 class JIT : public ExecutionEngine { 54 /// types 55 typedef ValueMap<const BasicBlock *, void *> 56 BasicBlockAddressMapTy; 57 /// data 58 TargetMachine &TM; // The current target we are compiling to 59 TargetJITInfo &TJI; // The JITInfo for the target we are compiling to 60 JITCodeEmitter *JCE; // JCE object 61 std::vector<JITEventListener*> EventListeners; 62 63 /// AllocateGVsWithCode - Some applications require that global variables and 64 /// code be allocated into the same region of memory, in which case this flag 65 /// should be set to true. Doing so breaks freeMachineCodeForFunction. 66 bool AllocateGVsWithCode; 67 68 /// True while the JIT is generating code. Used to assert against recursive 69 /// entry. 70 bool isAlreadyCodeGenerating; 71 72 JITState *jitstate; 73 74 /// BasicBlockAddressMap - A mapping between LLVM basic blocks and their 75 /// actualized version, only filled for basic blocks that have their address 76 /// taken. 77 BasicBlockAddressMapTy BasicBlockAddressMap; 78 79 80 JIT(Module *M, TargetMachine &tm, TargetJITInfo &tji, 81 JITMemoryManager *JMM, CodeGenOpt::Level OptLevel, 82 bool AllocateGVsWithCode); 83 public: 84 ~JIT(); 85 Register()86 static void Register() { 87 JITCtor = createJIT; 88 } 89 90 /// getJITInfo - Return the target JIT information structure. 91 /// getJITInfo()92 TargetJITInfo &getJITInfo() const { return TJI; } 93 94 /// create - Create an return a new JIT compiler if there is one available 95 /// for the current target. Otherwise, return null. 96 /// 97 static ExecutionEngine *create(Module *M, 98 std::string *Err, 99 JITMemoryManager *JMM, 100 CodeGenOpt::Level OptLevel = 101 CodeGenOpt::Default, 102 bool GVsWithCode = true, 103 Reloc::Model RM = Reloc::Default, 104 CodeModel::Model CMM = CodeModel::JITDefault) { 105 return ExecutionEngine::createJIT(M, Err, JMM, OptLevel, GVsWithCode, 106 RM, CMM); 107 } 108 109 virtual void addModule(Module *M); 110 111 /// removeModule - Remove a Module from the list of modules. Returns true if 112 /// M is found. 113 virtual bool removeModule(Module *M); 114 115 /// runFunction - Start execution with the specified function and arguments. 116 /// 117 virtual GenericValue runFunction(Function *F, 118 const std::vector<GenericValue> &ArgValues); 119 120 /// getPointerToNamedFunction - This method returns the address of the 121 /// specified function by using the dlsym function call. As such it is only 122 /// useful for resolving library symbols, not code generated symbols. 123 /// 124 /// If AbortOnFailure is false and no function with the given name is 125 /// found, this function silently returns a null pointer. Otherwise, 126 /// it prints a message to stderr and aborts. 127 /// 128 void *getPointerToNamedFunction(const std::string &Name, 129 bool AbortOnFailure = true); 130 131 // CompilationCallback - Invoked the first time that a call site is found, 132 // which causes lazy compilation of the target function. 133 // 134 static void CompilationCallback(); 135 136 /// getPointerToFunction - This returns the address of the specified function, 137 /// compiling it if necessary. 138 /// 139 void *getPointerToFunction(Function *F); 140 141 /// addPointerToBasicBlock - Adds address of the specific basic block. 142 void addPointerToBasicBlock(const BasicBlock *BB, void *Addr); 143 144 /// clearPointerToBasicBlock - Removes address of specific basic block. 145 void clearPointerToBasicBlock(const BasicBlock *BB); 146 147 /// getPointerToBasicBlock - This returns the address of the specified basic 148 /// block, assuming function is compiled. 149 void *getPointerToBasicBlock(BasicBlock *BB); 150 151 /// getOrEmitGlobalVariable - Return the address of the specified global 152 /// variable, possibly emitting it to memory if needed. This is used by the 153 /// Emitter. 154 void *getOrEmitGlobalVariable(const GlobalVariable *GV); 155 156 /// getPointerToFunctionOrStub - If the specified function has been 157 /// code-gen'd, return a pointer to the function. If not, compile it, or use 158 /// a stub to implement lazy compilation if available. 159 /// 160 void *getPointerToFunctionOrStub(Function *F); 161 162 /// recompileAndRelinkFunction - This method is used to force a function 163 /// which has already been compiled, to be compiled again, possibly 164 /// after it has been modified. Then the entry to the old copy is overwritten 165 /// with a branch to the new copy. If there was no old copy, this acts 166 /// just like JIT::getPointerToFunction(). 167 /// 168 void *recompileAndRelinkFunction(Function *F); 169 170 /// freeMachineCodeForFunction - deallocate memory used to code-generate this 171 /// Function. 172 /// 173 void freeMachineCodeForFunction(Function *F); 174 175 /// addPendingFunction - while jitting non-lazily, a called but non-codegen'd 176 /// function was encountered. Add it to a pending list to be processed after 177 /// the current function. 178 /// 179 void addPendingFunction(Function *F); 180 181 /// getCodeEmitter - Return the code emitter this JIT is emitting into. 182 /// getCodeEmitter()183 JITCodeEmitter *getCodeEmitter() const { return JCE; } 184 185 static ExecutionEngine *createJIT(Module *M, 186 std::string *ErrorStr, 187 JITMemoryManager *JMM, 188 CodeGenOpt::Level OptLevel, 189 bool GVsWithCode, 190 TargetMachine *TM); 191 192 // Run the JIT on F and return information about the generated code 193 void runJITOnFunction(Function *F, MachineCodeInfo *MCI = 0); 194 195 virtual void RegisterJITEventListener(JITEventListener *L); 196 virtual void UnregisterJITEventListener(JITEventListener *L); 197 /// These functions correspond to the methods on JITEventListener. They 198 /// iterate over the registered listeners and call the corresponding method on 199 /// each. 200 void NotifyFunctionEmitted( 201 const Function &F, void *Code, size_t Size, 202 const JITEvent_EmittedFunctionDetails &Details); 203 void NotifyFreeingMachineCode(void *OldPtr); 204 205 BasicBlockAddressMapTy & getBasicBlockAddressMap(const MutexGuard &)206 getBasicBlockAddressMap(const MutexGuard &) { 207 return BasicBlockAddressMap; 208 } 209 210 211 private: 212 static JITCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM, 213 TargetMachine &tm); 214 void runJITOnFunctionUnlocked(Function *F, const MutexGuard &locked); 215 void updateFunctionStub(Function *F); 216 void jitTheFunction(Function *F, const MutexGuard &locked); 217 218 protected: 219 220 /// getMemoryforGV - Allocate memory for a global variable. 221 virtual char* getMemoryForGV(const GlobalVariable* GV); 222 223 }; 224 225 } // End llvm namespace 226 227 #endif 228