1 //===-- Address.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 liblldb_Address_h_ 11 #define liblldb_Address_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <atomic> 16 // Other libraries and framework includes 17 // Project includes 18 #include "lldb/lldb-private.h" 19 #include "lldb/Symbol/SymbolContextScope.h" 20 21 namespace lldb_private { 22 23 //---------------------------------------------------------------------- 24 /// @class Address Address.h "lldb/Core/Address.h" 25 /// @brief A section + offset based address class. 26 /// 27 /// The Address class allows addresses to be relative to a section 28 /// that can move during runtime due to images (executables, shared 29 /// libraries, bundles, frameworks) being loaded at different 30 /// addresses than the addresses found in the object file that 31 /// represents them on disk. There are currently two types of addresses 32 /// for a section: 33 /// @li file addresses 34 /// @li load addresses 35 /// 36 /// File addresses represent the virtual addresses that are in the "on 37 /// disk" object files. These virtual addresses are converted to be 38 /// relative to unique sections scoped to the object file so that 39 /// when/if the addresses slide when the images are loaded/unloaded 40 /// in memory, we can easily track these changes without having to 41 /// update every object (compile unit ranges, line tables, function 42 /// address ranges, lexical block and inlined subroutine address 43 /// ranges, global and static variables) each time an image is loaded or 44 /// unloaded. 45 /// 46 /// Load addresses represent the virtual addresses where each section 47 /// ends up getting loaded at runtime. Before executing a program, it 48 /// is common for all of the load addresses to be unresolved. When a 49 /// DynamicLoader plug-in receives notification that shared libraries 50 /// have been loaded/unloaded, the load addresses of the main executable 51 /// and any images (shared libraries) will be resolved/unresolved. When 52 /// this happens, breakpoints that are in one of these sections can be 53 /// set/cleared. 54 //---------------------------------------------------------------------- 55 class Address 56 { 57 public: 58 //------------------------------------------------------------------ 59 /// Dump styles allow the Address::Dump(Stream *,DumpStyle) const 60 /// function to display Address contents in a variety of ways. 61 //------------------------------------------------------------------ 62 typedef enum { 63 DumpStyleInvalid, ///< Invalid dump style 64 DumpStyleSectionNameOffset, ///< Display as the section name + offset. 65 ///< \code 66 /// // address for printf in libSystem.B.dylib as a section name + offset 67 /// libSystem.B.dylib.__TEXT.__text + 0x0005cfdf 68 /// \endcode 69 DumpStyleSectionPointerOffset, ///< Display as the section pointer + offset (debug output). 70 ///< \code 71 /// // address for printf in libSystem.B.dylib as a section pointer + offset 72 /// (lldb::Section *)0x35cc50 + 0x000000000005cfdf \endcode 73 DumpStyleFileAddress, ///< Display as the file address (if any). 74 ///< \code 75 /// // address for printf in libSystem.B.dylib as a file address 76 /// 0x000000000005dcff \endcode 77 DumpStyleModuleWithFileAddress, ///< Display as the file address with the module name prepended (if any). 78 ///< \code 79 /// // address for printf in libSystem.B.dylib as a file address 80 /// libSystem.B.dylib[0x000000000005dcff] \endcode 81 DumpStyleLoadAddress, ///< Display as the load address (if resolved). 82 ///< \code 83 /// // address for printf in libSystem.B.dylib as a load address 84 /// 0x00007fff8306bcff \endcode 85 DumpStyleResolvedDescription, ///< Display the details about what an address resolves to. This can 86 ///< be anything from a symbol context summary (module, function/symbol, 87 ///< and file and line), to information about what the pointer points to 88 ///< if the address is in a section (section of pointers, c strings, etc). 89 DumpStyleResolvedDescriptionNoModule, 90 DumpStyleDetailedSymbolContext, ///< Detailed symbol context information for an address for all symbol 91 ///< context members. 92 DumpStyleResolvedPointerDescription ///< Dereference a pointer at the current address and then lookup the 93 ///< dereferenced address using DumpStyleResolvedDescription 94 } DumpStyle; 95 96 //------------------------------------------------------------------ 97 /// Default constructor. 98 /// 99 /// Initialize with a invalid section (NULL) and an invalid 100 /// offset (LLDB_INVALID_ADDRESS). 101 //------------------------------------------------------------------ Address()102 Address () : 103 m_section_wp (), 104 m_offset (LLDB_INVALID_ADDRESS) 105 { 106 } 107 108 109 //------------------------------------------------------------------ 110 /// Copy constructor 111 /// 112 /// Makes a copy of the another Address object \a rhs. 113 /// 114 /// @param[in] rhs 115 /// A const Address object reference to copy. 116 //------------------------------------------------------------------ Address(const Address & rhs)117 Address (const Address& rhs) : 118 m_section_wp (rhs.m_section_wp), 119 m_offset(rhs.m_offset.load()) 120 { 121 } 122 123 //------------------------------------------------------------------ 124 /// Construct with a section pointer and offset. 125 /// 126 /// Initialize the address with the supplied \a section and \a 127 /// offset. 128 /// 129 /// @param[in] section 130 /// A section pointer to a valid lldb::Section, or NULL if the 131 /// address doesn't have a section or will get resolved later. 132 /// 133 /// @param[in] offset 134 /// The offset in bytes into \a section. 135 //------------------------------------------------------------------ Address(const lldb::SectionSP & section_sp,lldb::addr_t offset)136 Address (const lldb::SectionSP §ion_sp, lldb::addr_t offset) : 137 m_section_wp (), // Don't init with section_sp in case section_sp is invalid (the weak_ptr will throw) 138 m_offset (offset) 139 { 140 if (section_sp) 141 m_section_wp = section_sp; 142 } 143 144 //------------------------------------------------------------------ 145 /// Construct with a virtual address and section list. 146 /// 147 /// Initialize and resolve the address with the supplied virtual 148 /// address \a file_addr. 149 /// 150 /// @param[in] file_addr 151 /// A virtual file address. 152 /// 153 /// @param[in] section_list 154 /// A list of sections, one of which may contain the \a file_addr. 155 //------------------------------------------------------------------ 156 Address (lldb::addr_t file_addr, const SectionList * section_list); 157 158 Address (lldb::addr_t abs_addr); 159 160 //------------------------------------------------------------------ 161 /// Assignment operator. 162 /// 163 /// Copies the address value from another Address object \a rhs 164 /// into \a this object. 165 /// 166 /// @param[in] rhs 167 /// A const Address object reference to copy. 168 /// 169 /// @return 170 /// A const Address object reference to \a this. 171 //------------------------------------------------------------------ 172 #ifndef SWIG 173 const Address& 174 operator= (const Address& rhs); 175 #endif 176 //------------------------------------------------------------------ 177 /// Clear the object's state. 178 /// 179 /// Sets the section to an invalid value (NULL) and an invalid 180 /// offset (LLDB_INVALID_ADDRESS). 181 //------------------------------------------------------------------ 182 void Clear()183 Clear () 184 { 185 m_section_wp.reset(); 186 m_offset = LLDB_INVALID_ADDRESS; 187 } 188 189 //------------------------------------------------------------------ 190 /// Compare two Address objects. 191 /// 192 /// @param[in] lhs 193 /// The Left Hand Side const Address object reference. 194 /// 195 /// @param[in] rhs 196 /// The Right Hand Side const Address object reference. 197 /// 198 /// @return 199 /// @li -1 if lhs < rhs 200 /// @li 0 if lhs == rhs 201 /// @li 1 if lhs > rhs 202 //------------------------------------------------------------------ 203 static int 204 CompareFileAddress (const Address& lhs, const Address& rhs); 205 206 static int 207 CompareLoadAddress (const Address& lhs, const Address& rhs, Target *target); 208 209 static int 210 CompareModulePointerAndOffset (const Address& lhs, const Address& rhs); 211 212 // For use with std::map, std::multi_map 213 class ModulePointerAndOffsetLessThanFunctionObject 214 { 215 public: ModulePointerAndOffsetLessThanFunctionObject()216 ModulePointerAndOffsetLessThanFunctionObject () {} 217 218 bool operator()219 operator() (const Address& a, const Address& b) const 220 { 221 return Address::CompareModulePointerAndOffset(a, b) < 0; 222 } 223 }; 224 225 //------------------------------------------------------------------ 226 /// Dump a description of this object to a Stream. 227 /// 228 /// Dump a description of the contents of this object to the 229 /// supplied stream \a s. There are many ways to display a section 230 /// offset based address, and \a style lets the user choose. 231 /// 232 /// @param[in] s 233 /// The stream to which to dump the object descripton. 234 /// 235 /// @param[in] style 236 /// The display style for the address. 237 /// 238 /// @param[in] fallback_style 239 /// The display style for the address. 240 /// 241 /// @return 242 /// Returns \b true if the address was able to be displayed. 243 /// File and load addresses may be unresolved and it may not be 244 /// possible to display a valid value, \b false will be returned 245 /// in such cases. 246 /// 247 /// @see Address::DumpStyle 248 //------------------------------------------------------------------ 249 bool 250 Dump (Stream *s, 251 ExecutionContextScope *exe_scope, 252 DumpStyle style, 253 DumpStyle fallback_style = DumpStyleInvalid, 254 uint32_t addr_byte_size = UINT32_MAX) const; 255 256 lldb::AddressClass 257 GetAddressClass () const; 258 259 //------------------------------------------------------------------ 260 /// Get the file address. 261 /// 262 /// If an address comes from a file on disk that has section 263 /// relative addresses, then it has a virtual address that is 264 /// relative to unique section in the object file. 265 /// 266 /// @return 267 /// The valid file virtual address, or LLDB_INVALID_ADDRESS if 268 /// the address doesn't have a file virtual address (image is 269 /// from memory only with no representation on disk). 270 //------------------------------------------------------------------ 271 lldb::addr_t 272 GetFileAddress () const; 273 274 //------------------------------------------------------------------ 275 /// Get the load address. 276 /// 277 /// If an address comes from a file on disk that has section 278 /// relative addresses, then it has a virtual address that is 279 /// relative to unique section in the object file. Sections get 280 /// resolved at runtime by DynamicLoader plug-ins as images 281 /// (executables and shared libraries) get loaded/unloaded. If a 282 /// section is loaded, then the load address can be resolved. 283 /// 284 /// @return 285 /// The valid load virtual address, or LLDB_INVALID_ADDRESS if 286 /// the address is currently not loaded. 287 //------------------------------------------------------------------ 288 lldb::addr_t 289 GetLoadAddress (Target *target) const; 290 291 //------------------------------------------------------------------ 292 /// Get the load address as a callable code load address. 293 /// 294 /// This function will first resolve its address to a load address. 295 /// Then, if the address turns out to be in code address, return the 296 /// load address that would be required to call or return to. The 297 /// address might have extra bits set (bit zero will be set to Thumb 298 /// functions for an ARM target) that are required when changing the 299 /// program counter to setting a return address. 300 /// 301 /// @return 302 /// The valid load virtual address, or LLDB_INVALID_ADDRESS if 303 /// the address is currently not loaded. 304 //------------------------------------------------------------------ 305 lldb::addr_t 306 GetCallableLoadAddress (Target *target, bool is_indirect = false) const; 307 308 //------------------------------------------------------------------ 309 /// Get the load address as an opcode load address. 310 /// 311 /// This function will first resolve its address to a load address. 312 /// Then, if the address turns out to be in code address, return the 313 /// load address for a an opcode. This address object might have 314 /// extra bits set (bit zero will be set to Thumb functions for an 315 /// ARM target) that are required for changing the program counter 316 /// and this function will remove any bits that are intended for 317 /// these special purposes. The result of this function can be used 318 /// to safely write a software breakpoint trap to memory. 319 /// 320 /// @return 321 /// The valid load virtual address with extra callable bits 322 /// removed, or LLDB_INVALID_ADDRESS if the address is currently 323 /// not loaded. 324 //------------------------------------------------------------------ 325 lldb::addr_t 326 GetOpcodeLoadAddress (Target *target) const; 327 328 //------------------------------------------------------------------ 329 /// Get the section relative offset value. 330 /// 331 /// @return 332 /// The current offset, or LLDB_INVALID_ADDRESS if this address 333 /// doesn't contain a valid offset. 334 //------------------------------------------------------------------ 335 lldb::addr_t GetOffset()336 GetOffset () const { return m_offset; } 337 338 //------------------------------------------------------------------ 339 /// Check if an address is section offset. 340 /// 341 /// When converting a virtual file or load address into a section 342 /// offset based address, we often need to know if, given a section 343 /// list, if the address was able to be converted to section offset. 344 /// This function returns true if the current value contained in 345 /// this object is section offset based. 346 /// 347 /// @return 348 /// Returns \b true if the address has a valid section and 349 /// offset, \b false otherwise. 350 //------------------------------------------------------------------ 351 bool IsSectionOffset()352 IsSectionOffset() const 353 { 354 return IsValid() && (GetSection().get() != NULL); 355 } 356 357 //------------------------------------------------------------------ 358 /// Check if the object state is valid. 359 /// 360 /// A valid Address object contains either a section pointer and 361 /// and offset (for section offset based addresses), or just a valid 362 /// offset (for absolute addresses that have no section). 363 /// 364 /// @return 365 /// Returns \b true if the the offset is valid, \b false 366 /// otherwise. 367 //------------------------------------------------------------------ 368 bool IsValid()369 IsValid() const 370 { 371 return m_offset != LLDB_INVALID_ADDRESS; 372 } 373 374 375 //------------------------------------------------------------------ 376 /// Get the memory cost of this object. 377 /// 378 /// @return 379 /// The number of bytes that this object occupies in memory. 380 //------------------------------------------------------------------ 381 size_t 382 MemorySize () const; 383 384 //------------------------------------------------------------------ 385 /// Resolve a file virtual address using a section list. 386 /// 387 /// Given a list of sections, attempt to resolve \a addr as a 388 /// an offset into one of the file sections. 389 /// 390 /// @return 391 /// Returns \b true if \a addr was able to be resolved, \b false 392 /// otherwise. 393 //------------------------------------------------------------------ 394 bool 395 ResolveAddressUsingFileSections (lldb::addr_t addr, const SectionList *sections); 396 397 //------------------------------------------------------------------ 398 /// Set the address to represent \a load_addr. 399 /// 400 /// The address will attempt to find a loaded section within 401 /// \a target that contains \a load_addr. If successful, this 402 /// address object will have a valid section and offset. Else this 403 /// address object will have no section (NULL) and the offset will 404 /// be \a load_addr. 405 /// 406 /// @param[in] load_addr 407 /// A load address from a current process. 408 /// 409 /// @param[in] target 410 /// The target to use when trying resolve the address into 411 /// a section + offset. The Target's SectionLoadList object 412 /// is used to resolve the address. 413 /// 414 /// @return 415 /// Returns \b true if the load address was resolved to be 416 /// section/offset, \b false otherwise. It is often ok for an 417 /// address no not resolve to a section in a module, this often 418 /// happens for JIT'ed code, or any load addresses on the stack 419 /// or heap. 420 //------------------------------------------------------------------ 421 bool 422 SetLoadAddress (lldb::addr_t load_addr, Target *target); 423 424 bool 425 SetOpcodeLoadAddress (lldb::addr_t load_addr, Target *target); 426 427 bool 428 SetCallableLoadAddress (lldb::addr_t load_addr, Target *target); 429 430 //------------------------------------------------------------------ 431 /// Get accessor for the module for this address. 432 /// 433 /// @return 434 /// Returns the Module pointer that this address is an offset 435 /// in, or NULL if this address doesn't belong in a module, or 436 /// isn't resolved yet. 437 //------------------------------------------------------------------ 438 lldb::ModuleSP 439 GetModule () const; 440 441 //------------------------------------------------------------------ 442 /// Get const accessor for the section. 443 /// 444 /// @return 445 /// Returns the const lldb::Section pointer that this address is an 446 /// offset in, or NULL if this address is absolute. 447 //------------------------------------------------------------------ 448 lldb::SectionSP GetSection()449 GetSection () const { return m_section_wp.lock(); } 450 451 //------------------------------------------------------------------ 452 /// Set accessor for the offset. 453 /// 454 /// @param[in] offset 455 /// A new offset value for this object. 456 /// 457 /// @return 458 /// Returns \b true if the offset changed, \b false otherwise. 459 //------------------------------------------------------------------ 460 bool SetOffset(lldb::addr_t offset)461 SetOffset (lldb::addr_t offset) 462 { 463 bool changed = m_offset != offset; 464 m_offset = offset; 465 return changed; 466 } 467 468 void SetRawAddress(lldb::addr_t addr)469 SetRawAddress (lldb::addr_t addr) 470 { 471 m_section_wp.reset(); 472 m_offset = addr; 473 } 474 475 bool Slide(int64_t offset)476 Slide (int64_t offset) 477 { 478 if (m_offset != LLDB_INVALID_ADDRESS) 479 { 480 m_offset += offset; 481 return true; 482 } 483 return false; 484 } 485 486 //------------------------------------------------------------------ 487 /// Set accessor for the section. 488 /// 489 /// @param[in] section 490 /// A new lldb::Section pointer to use as the section base. Can 491 /// be NULL for absolute addresses that are not relative to 492 /// any section. 493 //------------------------------------------------------------------ 494 void SetSection(const lldb::SectionSP & section_sp)495 SetSection (const lldb::SectionSP §ion_sp) 496 { 497 m_section_wp = section_sp; 498 } 499 500 void ClearSection()501 ClearSection () 502 { 503 m_section_wp.reset(); 504 } 505 //------------------------------------------------------------------ 506 /// Reconstruct a symbol context from an address. 507 /// 508 /// This class doesn't inherit from SymbolContextScope because many 509 /// address objects have short lifespans. Address objects that are 510 /// section offset can reconstruct their symbol context by looking 511 /// up the address in the module found in the section. 512 /// 513 /// @see SymbolContextScope::CalculateSymbolContext(SymbolContext*) 514 //------------------------------------------------------------------ 515 uint32_t 516 CalculateSymbolContext (SymbolContext *sc, 517 uint32_t resolve_scope = lldb::eSymbolContextEverything) const; 518 519 lldb::ModuleSP 520 CalculateSymbolContextModule () const; 521 522 CompileUnit * 523 CalculateSymbolContextCompileUnit () const; 524 525 Function * 526 CalculateSymbolContextFunction () const; 527 528 Block * 529 CalculateSymbolContextBlock () const; 530 531 Symbol * 532 CalculateSymbolContextSymbol () const; 533 534 bool 535 CalculateSymbolContextLineEntry (LineEntry &line_entry) const; 536 537 protected: 538 //------------------------------------------------------------------ 539 // Member variables. 540 //------------------------------------------------------------------ 541 lldb::SectionWP m_section_wp; ///< The section for the address, can be NULL. 542 std::atomic<lldb::addr_t> m_offset; ///< Offset into section if \a m_section_wp is valid... 543 }; 544 545 546 //---------------------------------------------------------------------- 547 // NOTE: Be careful using this operator. It can correctly compare two 548 // addresses from the same Module correctly. It can't compare two 549 // addresses from different modules in any meaningful way, but it will 550 // compare the module pointers. 551 // 552 // To sum things up: 553 // - works great for addresses within the same module 554 // - it works for addresses across multiple modules, but don't expect the 555 // address results to make much sense 556 // 557 // This basically lets Address objects be used in ordered collection 558 // classes. 559 //---------------------------------------------------------------------- 560 bool operator< (const Address& lhs, const Address& rhs); 561 bool operator> (const Address& lhs, const Address& rhs); 562 563 564 565 bool operator== (const Address& lhs, const Address& rhs); 566 bool operator!= (const Address& lhs, const Address& rhs); 567 568 } // namespace lldb_private 569 570 #endif // liblldb_Address_h_ 571