1 //===-- IRExecutionUnit.h ---------------------------------------*- 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 lldb_IRExecutionUnit_h_ 11 #define lldb_IRExecutionUnit_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <atomic> 16 #include <string> 17 #include <vector> 18 #include <map> 19 20 // Other libraries and framework includes 21 #include "llvm/IR/Module.h" 22 23 // Project includes 24 #include "lldb/lldb-forward.h" 25 #include "lldb/lldb-private.h" 26 #include "lldb/Core/ClangForward.h" 27 #include "lldb/Core/DataBufferHeap.h" 28 #include "llvm/ExecutionEngine/JITMemoryManager.h" 29 #include "lldb/Expression/ClangExpression.h" 30 #include "lldb/Expression/ClangExpressionParser.h" 31 #include "lldb/Expression/IRMemoryMap.h" 32 #include "lldb/Host/Mutex.h" 33 34 namespace llvm { 35 36 class Module; 37 class ExecutionEngine; 38 39 } 40 41 namespace lldb_private { 42 43 class Error; 44 45 //---------------------------------------------------------------------- 46 /// @class IRExecutionUnit IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h" 47 /// @brief Contains the IR and, optionally, JIT-compiled code for a module. 48 /// 49 /// This class encapsulates the compiled version of an expression, in IR 50 /// form (for interpretation purposes) and in raw machine code form (for 51 /// execution in the target). 52 /// 53 /// This object wraps an IR module that comes from the expression parser, 54 /// and knows how to use the JIT to make it into executable code. It can 55 /// then be used as input to the IR interpreter, or the address of the 56 /// executable code can be passed to a thread plan to run in the target. 57 /// 58 /// This class creates a subclass of LLVM's JITMemoryManager, because that is 59 /// how the JIT emits code. Because LLDB needs to move JIT-compiled code 60 /// into the target process, the IRExecutionUnit knows how to copy the 61 /// emitted code into the target process. 62 //---------------------------------------------------------------------- 63 class IRExecutionUnit : public IRMemoryMap 64 { 65 public: 66 //------------------------------------------------------------------ 67 /// Constructor 68 //------------------------------------------------------------------ 69 IRExecutionUnit (std::unique_ptr<llvm::LLVMContext> &context_ap, 70 std::unique_ptr<llvm::Module> &module_ap, 71 ConstString &name, 72 const lldb::TargetSP &target_sp, 73 std::vector<std::string> &cpu_features); 74 75 //------------------------------------------------------------------ 76 /// Destructor 77 //------------------------------------------------------------------ 78 ~IRExecutionUnit(); 79 GetModule()80 llvm::Module *GetModule() 81 { 82 return m_module; 83 } 84 GetFunction()85 llvm::Function *GetFunction() 86 { 87 if (m_module) 88 return m_module->getFunction (m_name.AsCString()); 89 else 90 return NULL; 91 } 92 93 void GetRunnableInfo(Error &error, 94 lldb::addr_t &func_addr, 95 lldb::addr_t &func_end); 96 97 //------------------------------------------------------------------ 98 /// Accessors for IRForTarget and other clients that may want binary 99 /// data placed on their behalf. The binary data is owned by the 100 /// IRExecutionUnit unless the client explicitly chooses to free it. 101 //------------------------------------------------------------------ 102 103 lldb::addr_t WriteNow(const uint8_t *bytes, 104 size_t size, 105 Error &error); 106 107 void FreeNow(lldb::addr_t allocation); 108 109 private: 110 //------------------------------------------------------------------ 111 /// Look up the object in m_address_map that contains a given address, 112 /// find where it was copied to, and return the remote address at the 113 /// same offset into the copied entity 114 /// 115 /// @param[in] local_address 116 /// The address in the debugger. 117 /// 118 /// @return 119 /// The address in the target process. 120 //------------------------------------------------------------------ 121 lldb::addr_t 122 GetRemoteAddressForLocal (lldb::addr_t local_address); 123 124 //------------------------------------------------------------------ 125 /// Look up the object in m_address_map that contains a given address, 126 /// find where it was copied to, and return its address range in the 127 /// target process 128 /// 129 /// @param[in] local_address 130 /// The address in the debugger. 131 /// 132 /// @return 133 /// The range of the containing object in the target process. 134 //------------------------------------------------------------------ 135 typedef std::pair <lldb::addr_t, uintptr_t> AddrRange; 136 AddrRange 137 GetRemoteRangeForLocal (lldb::addr_t local_address); 138 139 //------------------------------------------------------------------ 140 /// Commit all allocations to the process and record where they were stored. 141 /// 142 /// @param[in] process 143 /// The process to allocate memory in. 144 /// 145 /// @return 146 /// True <=> all allocations were performed successfully. 147 /// This method will attempt to free allocated memory if the 148 /// operation fails. 149 //------------------------------------------------------------------ 150 bool 151 CommitAllocations (lldb::ProcessSP &process_sp); 152 153 //------------------------------------------------------------------ 154 /// Report all committed allocations to the execution engine. 155 /// 156 /// @param[in] engine 157 /// The execution engine to notify. 158 //------------------------------------------------------------------ 159 void 160 ReportAllocations (llvm::ExecutionEngine &engine); 161 162 //------------------------------------------------------------------ 163 /// Write the contents of all allocations to the process. 164 /// 165 /// @param[in] local_address 166 /// The process containing the allocations. 167 /// 168 /// @return 169 /// True <=> all allocations were performed successfully. 170 //------------------------------------------------------------------ 171 bool 172 WriteData (lldb::ProcessSP &process_sp); 173 174 Error 175 DisassembleFunction (Stream &stream, 176 lldb::ProcessSP &process_sp); 177 178 class MemoryManager : public llvm::JITMemoryManager 179 { 180 public: 181 MemoryManager (IRExecutionUnit &parent); 182 183 //------------------------------------------------------------------ 184 /// Passthrough interface stub 185 //------------------------------------------------------------------ 186 virtual void setMemoryWritable (); 187 188 //------------------------------------------------------------------ 189 /// Passthrough interface stub 190 //------------------------------------------------------------------ 191 virtual void setMemoryExecutable (); 192 193 //------------------------------------------------------------------ 194 /// Passthrough interface stub 195 //------------------------------------------------------------------ setPoisonMemory(bool poison)196 virtual void setPoisonMemory (bool poison) 197 { 198 m_default_mm_ap->setPoisonMemory (poison); 199 } 200 201 //------------------------------------------------------------------ 202 /// Passthrough interface stub 203 //------------------------------------------------------------------ AllocateGOT()204 virtual void AllocateGOT() 205 { 206 m_default_mm_ap->AllocateGOT(); 207 } 208 209 //------------------------------------------------------------------ 210 /// Passthrough interface stub 211 //------------------------------------------------------------------ getGOTBase()212 virtual uint8_t *getGOTBase() const 213 { 214 return m_default_mm_ap->getGOTBase(); 215 } 216 217 //------------------------------------------------------------------ 218 /// Passthrough interface stub 219 //------------------------------------------------------------------ 220 virtual uint8_t *startFunctionBody(const llvm::Function *F, 221 uintptr_t &ActualSize); 222 223 //------------------------------------------------------------------ 224 /// Allocate room for a dyld stub for a lazy-referenced function, 225 /// and add it to the m_stubs map 226 /// 227 /// @param[in] F 228 /// The function being referenced. 229 /// 230 /// @param[in] StubSize 231 /// The size of the stub. 232 /// 233 /// @param[in] Alignment 234 /// The required alignment of the stub. 235 /// 236 /// @return 237 /// Allocated space for the stub. 238 //------------------------------------------------------------------ 239 virtual uint8_t *allocateStub(const llvm::GlobalValue* F, 240 unsigned StubSize, 241 unsigned Alignment); 242 243 //------------------------------------------------------------------ 244 /// Complete the body of a function, and add it to the m_functions map 245 /// 246 /// @param[in] F 247 /// The function being completed. 248 /// 249 /// @param[in] FunctionStart 250 /// The first instruction of the function. 251 /// 252 /// @param[in] FunctionEnd 253 /// The last byte of the last instruction of the function. 254 //------------------------------------------------------------------ 255 virtual void endFunctionBody(const llvm::Function *F, 256 uint8_t *FunctionStart, 257 uint8_t *FunctionEnd); 258 //------------------------------------------------------------------ 259 /// Allocate space for an unspecified purpose, and add it to the 260 /// m_spaceBlocks map 261 /// 262 /// @param[in] Size 263 /// The size of the area. 264 /// 265 /// @param[in] Alignment 266 /// The required alignment of the area. 267 /// 268 /// @return 269 /// Allocated space. 270 //------------------------------------------------------------------ 271 virtual uint8_t *allocateSpace(intptr_t Size, unsigned Alignment); 272 273 //------------------------------------------------------------------ 274 /// Allocate space for executable code, and add it to the 275 /// m_spaceBlocks map 276 /// 277 /// @param[in] Size 278 /// The size of the area. 279 /// 280 /// @param[in] Alignment 281 /// The required alignment of the area. 282 /// 283 /// @param[in] SectionID 284 /// A unique identifier for the section. 285 /// 286 /// @return 287 /// Allocated space. 288 //------------------------------------------------------------------ 289 virtual uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, 290 unsigned SectionID); 291 292 //------------------------------------------------------------------ 293 /// Allocate space for data, and add it to the m_spaceBlocks map 294 /// 295 /// @param[in] Size 296 /// The size of the area. 297 /// 298 /// @param[in] Alignment 299 /// The required alignment of the area. 300 /// 301 /// @param[in] SectionID 302 /// A unique identifier for the section. 303 /// 304 /// @param[in] IsReadOnly 305 /// Flag indicating the section is read-only. 306 /// 307 /// @return 308 /// Allocated space. 309 //------------------------------------------------------------------ 310 virtual uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, 311 unsigned SectionID, bool IsReadOnly); 312 313 //------------------------------------------------------------------ 314 /// Allocate space for a global variable, and add it to the 315 /// m_spaceBlocks map 316 /// 317 /// @param[in] Size 318 /// The size of the variable. 319 /// 320 /// @param[in] Alignment 321 /// The required alignment of the variable. 322 /// 323 /// @return 324 /// Allocated space for the global. 325 //------------------------------------------------------------------ 326 virtual uint8_t *allocateGlobal(uintptr_t Size, 327 unsigned Alignment); 328 329 //------------------------------------------------------------------ 330 /// Called when object loading is complete and section page 331 /// permissions can be applied. Currently unimplemented for LLDB. 332 /// 333 /// @param[out] ErrMsg 334 /// The error that prevented the page protection from succeeding. 335 /// 336 /// @return 337 /// True in case of failure, false in case of success. 338 //------------------------------------------------------------------ finalizeMemory(std::string * ErrMsg)339 virtual bool finalizeMemory(std::string *ErrMsg) { 340 // TODO: Ensure that the instruction cache is flushed because 341 // relocations are updated by dy-load. See: 342 // sys::Memory::InvalidateInstructionCache 343 // llvm::SectionMemoryManager 344 return false; 345 } 346 347 //------------------------------------------------------------------ 348 /// Passthrough interface stub 349 //------------------------------------------------------------------ 350 virtual void deallocateFunctionBody(void *Body); 351 352 //------------------------------------------------------------------ 353 /// Passthrough interface stub 354 //------------------------------------------------------------------ GetDefaultCodeSlabSize()355 virtual size_t GetDefaultCodeSlabSize() { 356 return m_default_mm_ap->GetDefaultCodeSlabSize(); 357 } 358 359 //------------------------------------------------------------------ 360 /// Passthrough interface stub 361 //------------------------------------------------------------------ GetDefaultDataSlabSize()362 virtual size_t GetDefaultDataSlabSize() { 363 return m_default_mm_ap->GetDefaultDataSlabSize(); 364 } 365 GetDefaultStubSlabSize()366 virtual size_t GetDefaultStubSlabSize() { 367 return m_default_mm_ap->GetDefaultStubSlabSize(); 368 } 369 370 //------------------------------------------------------------------ 371 /// Passthrough interface stub 372 //------------------------------------------------------------------ GetNumCodeSlabs()373 virtual unsigned GetNumCodeSlabs() { 374 return m_default_mm_ap->GetNumCodeSlabs(); 375 } 376 377 //------------------------------------------------------------------ 378 /// Passthrough interface stub 379 //------------------------------------------------------------------ GetNumDataSlabs()380 virtual unsigned GetNumDataSlabs() { 381 return m_default_mm_ap->GetNumDataSlabs(); 382 } 383 384 //------------------------------------------------------------------ 385 /// Passthrough interface stub 386 //------------------------------------------------------------------ GetNumStubSlabs()387 virtual unsigned GetNumStubSlabs() { 388 return m_default_mm_ap->GetNumStubSlabs(); 389 } 390 391 //------------------------------------------------------------------ 392 /// Passthrough interface stub 393 //------------------------------------------------------------------ 394 virtual void *getPointerToNamedFunction(const std::string &Name, 395 bool AbortOnFailure = true) { 396 return m_default_mm_ap->getPointerToNamedFunction(Name, AbortOnFailure); 397 } 398 private: 399 std::unique_ptr<JITMemoryManager> m_default_mm_ap; ///< The memory allocator to use in actually creating space. All calls are passed through to it. 400 IRExecutionUnit &m_parent; ///< The execution unit this is a proxy for. 401 }; 402 403 //---------------------------------------------------------------------- 404 /// @class JittedFunction IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h" 405 /// @brief Encapsulates a single function that has been generated by the JIT. 406 /// 407 /// Functions that have been generated by the JIT are first resident in the 408 /// local process, and then placed in the target process. JittedFunction 409 /// represents a function possibly resident in both. 410 //---------------------------------------------------------------------- 411 struct JittedFunction { 412 std::string m_name; ///< The function's name 413 lldb::addr_t m_local_addr; ///< The address of the function in LLDB's memory 414 lldb::addr_t m_remote_addr; ///< The address of the function in the target's memory 415 416 //------------------------------------------------------------------ 417 /// Constructor 418 /// 419 /// Initializes class variabes. 420 /// 421 /// @param[in] name 422 /// The name of the function. 423 /// 424 /// @param[in] local_addr 425 /// The address of the function in LLDB, or LLDB_INVALID_ADDRESS if 426 /// it is not present in LLDB's memory. 427 /// 428 /// @param[in] remote_addr 429 /// The address of the function in the target, or LLDB_INVALID_ADDRESS 430 /// if it is not present in the target's memory. 431 //------------------------------------------------------------------ 432 JittedFunction (const char *name, 433 lldb::addr_t local_addr = LLDB_INVALID_ADDRESS, 434 lldb::addr_t remote_addr = LLDB_INVALID_ADDRESS) : m_nameJittedFunction435 m_name (name), 436 m_local_addr (local_addr), 437 m_remote_addr (remote_addr) 438 { 439 } 440 }; 441 442 static const unsigned eSectionIDInvalid = (unsigned)-1; 443 444 //---------------------------------------------------------------------- 445 /// @class AllocationRecord IRExecutionUnit.h "lldb/Expression/IRExecutionUnit.h" 446 /// @brief Enacpsulates a single allocation request made by the JIT. 447 /// 448 /// Allocations made by the JIT are first queued up and then applied in 449 /// bulk to the underlying process. 450 //---------------------------------------------------------------------- 451 struct AllocationRecord { 452 lldb::addr_t m_process_address; 453 uintptr_t m_host_address; 454 uint32_t m_permissions; 455 size_t m_size; 456 unsigned m_alignment; 457 unsigned m_section_id; 458 459 AllocationRecord (uintptr_t host_address, 460 uint32_t permissions, 461 size_t size, 462 unsigned alignment, 463 unsigned section_id = eSectionIDInvalid) : m_process_addressAllocationRecord464 m_process_address(LLDB_INVALID_ADDRESS), 465 m_host_address(host_address), 466 m_permissions(permissions), 467 m_size(size), 468 m_alignment(alignment), 469 m_section_id(section_id) 470 { 471 } 472 473 void dump (Log *log); 474 }; 475 476 typedef std::vector<AllocationRecord> RecordVector; 477 RecordVector m_records; 478 479 std::unique_ptr<llvm::LLVMContext> m_context_ap; 480 std::unique_ptr<llvm::ExecutionEngine> m_execution_engine_ap; 481 std::unique_ptr<llvm::Module> m_module_ap; ///< Holder for the module until it's been handed off 482 llvm::Module *m_module; ///< Owned by the execution engine 483 std::vector<std::string> m_cpu_features; 484 llvm::SmallVector<JittedFunction, 1> m_jitted_functions; ///< A vector of all functions that have been JITted into machine code 485 const ConstString m_name; 486 487 std::atomic<bool> m_did_jit; 488 489 lldb::addr_t m_function_load_addr; 490 lldb::addr_t m_function_end_load_addr; 491 }; 492 493 } // namespace lldb_private 494 495 #endif // lldb_IRExecutionUnit_h_ 496