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/IR/ValueHandle.h" 19 #include "llvm/PassManager.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()42 FunctionPassManager &getPM() { 43 return PM; 44 } 45 getModule()46 Module *getModule() const { return M; } getPendingFunctions()47 std::vector<AssertingVH<Function> > &getPendingFunctions() { 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 JITMemoryManager *JMM; 62 std::vector<JITEventListener*> EventListeners; 63 64 /// AllocateGVsWithCode - Some applications require that global variables and 65 /// code be allocated into the same region of memory, in which case this flag 66 /// should be set to true. Doing so breaks freeMachineCodeForFunction. 67 bool AllocateGVsWithCode; 68 69 /// True while the JIT is generating code. Used to assert against recursive 70 /// entry. 71 bool isAlreadyCodeGenerating; 72 73 JITState *jitstate; 74 75 /// BasicBlockAddressMap - A mapping between LLVM basic blocks and their 76 /// actualized version, only filled for basic blocks that have their address 77 /// taken. 78 BasicBlockAddressMapTy BasicBlockAddressMap; 79 80 81 JIT(Module *M, TargetMachine &tm, TargetJITInfo &tji, 82 JITMemoryManager *JMM, 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 void addModule(Module *M) override; 110 111 /// removeModule - Remove a Module from the list of modules. Returns true if 112 /// M is found. 113 bool removeModule(Module *M) override; 114 115 /// runFunction - Start execution with the specified function and arguments. 116 /// 117 GenericValue runFunction(Function *F, 118 const std::vector<GenericValue> &ArgValues) override; 119 120 /// getPointerToNamedFunction - This method returns the address of the 121 /// specified function by using the MemoryManager. 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) override; 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) override; 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) override; 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) override; 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) override; 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) override; 169 170 /// freeMachineCodeForFunction - deallocate memory used to code-generate this 171 /// Function. 172 /// 173 void freeMachineCodeForFunction(Function *F) override; 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 bool GVsWithCode, 189 TargetMachine *TM); 190 191 // Run the JIT on F and return information about the generated code 192 void runJITOnFunction(Function *F, MachineCodeInfo *MCI = nullptr) override; 193 194 void RegisterJITEventListener(JITEventListener *L) override; 195 void UnregisterJITEventListener(JITEventListener *L) override; 196 getTargetMachine()197 TargetMachine *getTargetMachine() override { return &TM; } 198 199 /// These functions correspond to the methods on JITEventListener. They 200 /// iterate over the registered listeners and call the corresponding method on 201 /// each. 202 void NotifyFunctionEmitted( 203 const Function &F, void *Code, size_t Size, 204 const JITEvent_EmittedFunctionDetails &Details); 205 void NotifyFreeingMachineCode(void *OldPtr); 206 207 BasicBlockAddressMapTy & getBasicBlockAddressMap()208 getBasicBlockAddressMap() { 209 return BasicBlockAddressMap; 210 } 211 212 213 private: 214 static JITCodeEmitter *createEmitter(JIT &J, JITMemoryManager *JMM, 215 TargetMachine &tm); 216 void runJITOnFunctionUnlocked(Function *F); 217 void updateFunctionStubUnlocked(Function *F); 218 void jitTheFunctionUnlocked(Function *F); 219 220 protected: 221 222 /// getMemoryforGV - Allocate memory for a global variable. 223 char* getMemoryForGV(const GlobalVariable* GV) override; 224 225 }; 226 227 } // End llvm namespace 228 229 #endif 230