//===-- Address.h -----------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_CORE_ADDRESS_H #define LLDB_CORE_ADDRESS_H #include "lldb/Utility/Stream.h" #include "lldb/lldb-defines.h" #include "lldb/lldb-forward.h" #include "lldb/lldb-private-enumerations.h" #include "lldb/lldb-types.h" #include "llvm/ADT/StringRef.h" #include <cstddef> #include <cstdint> namespace lldb_private { class Block; class CompileUnit; class ExecutionContextScope; class Function; class SectionList; class Stream; class Symbol; class SymbolContext; class Target; struct LineEntry; /// \class Address Address.h "lldb/Core/Address.h" /// A section + offset based address class. /// /// The Address class allows addresses to be relative to a section that can /// move during runtime due to images (executables, shared libraries, bundles, /// frameworks) being loaded at different addresses than the addresses found /// in the object file that represents them on disk. There are currently two /// types of addresses for a section: /// \li file addresses /// \li load addresses /// /// File addresses represent the virtual addresses that are in the "on disk" /// object files. These virtual addresses are converted to be relative to /// unique sections scoped to the object file so that when/if the addresses /// slide when the images are loaded/unloaded in memory, we can easily track /// these changes without having to update every object (compile unit ranges, /// line tables, function address ranges, lexical block and inlined subroutine /// address ranges, global and static variables) each time an image is loaded /// or unloaded. /// /// Load addresses represent the virtual addresses where each section ends up /// getting loaded at runtime. Before executing a program, it is common for /// all of the load addresses to be unresolved. When a DynamicLoader plug-in /// receives notification that shared libraries have been loaded/unloaded, the /// load addresses of the main executable and any images (shared libraries) /// will be resolved/unresolved. When this happens, breakpoints that are in /// one of these sections can be set/cleared. class Address { … }; // NOTE: Be careful using this operator. It can correctly compare two // addresses from the same Module correctly. It can't compare two addresses // from different modules in any meaningful way, but it will compare the module // pointers. // // To sum things up: // - works great for addresses within the same module - it works for addresses // across multiple modules, but don't expect the // address results to make much sense // // This basically lets Address objects be used in ordered collection classes. bool operator<(const Address &lhs, const Address &rhs); bool operator>(const Address &lhs, const Address &rhs); bool operator==(const Address &lhs, const Address &rhs); bool operator!=(const Address &lhs, const Address &rhs); } // namespace lldb_private #endif // LLDB_CORE_ADDRESS_H