| //===-- WatchpointAlgorithms.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_BREAKPOINT_WATCHPOINTALGORITHMS_H |
| #define LLDB_BREAKPOINT_WATCHPOINTALGORITHMS_H |
| |
| #include "lldb/Breakpoint/WatchpointResource.h" |
| #include "lldb/Utility/ArchSpec.h" |
| #include "lldb/lldb-private.h" |
| |
| #include <vector> |
| |
| namespace lldb_private { |
| |
| class WatchpointAlgorithms { |
| |
| public: |
| /// Convert a user's watchpoint request into an array of memory |
| /// regions, each region watched by one hardware watchpoint register. |
| /// |
| /// \param[in] addr |
| /// The start address specified by the user. |
| /// |
| /// \param[in] size |
| /// The number of bytes the user wants to watch. |
| /// |
| /// \param[in] read |
| /// True if we are watching for read accesses. |
| /// |
| /// \param[in] write |
| /// True if we are watching for write accesses. |
| /// \a read and \a write may both be true. |
| /// There is no "modify" style for WatchpointResources - |
| /// WatchpointResources are akin to the hardware watchpoint |
| /// registers which are either in terms of read or write. |
| /// "modify" distinction is done at the Watchpoint layer, where |
| /// we check the actual range of bytes the user requested. |
| /// |
| /// \param[in] supported_features |
| /// The bit flags in this parameter are set depending on which |
| /// WatchpointHardwareFeature enum values the current target supports. |
| /// The eWatchpointHardwareFeatureUnknown bit may be set if we |
| /// don't have specific information about what the remote stub |
| /// can support, and a reasonablec default will be used. |
| /// |
| /// \param[in] arch |
| /// The ArchSpec of the current Target. |
| /// |
| /// \return |
| /// A vector of WatchpointResourceSP's, one per hardware watchpoint |
| /// register needed. We may return more WatchpointResources than the |
| /// target can watch at once; if all resources cannot be set, the |
| /// watchpoint cannot be set. |
| static std::vector<lldb::WatchpointResourceSP> AtomizeWatchpointRequest( |
| lldb::addr_t addr, size_t size, bool read, bool write, |
| WatchpointHardwareFeature supported_features, ArchSpec &arch); |
| |
| protected: |
| struct Region { |
| lldb::addr_t addr; |
| size_t size; |
| }; |
| |
| /// Convert a user's watchpoint request into an array of Regions, |
| /// each of which can be watched by a single hardware watchpoint |
| /// that can watch power-of-2 size & aligned memory regions. |
| /// |
| /// This is the default algorithm if we have no further information; |
| /// most watchpoint implementations can be assumed to be able to watch up |
| /// to sizeof(void*) regions of memory, in power-of-2 sizes and alignments. |
| /// e.g. on a 64-bit target: 1, 2, 4, 8 or bytes with a single hardware |
| /// watchpoint register. |
| /// |
| /// \param[in] user_addr |
| /// The user's start address. |
| /// |
| /// \param[in] user_size |
| /// The user's specified byte length. |
| /// |
| /// \param[in] min_byte_size |
| /// The minimum byte size of the range of memory that can be watched |
| /// with one watchpoint register. |
| /// In most cases, this will be 1. AArch64 MASK watchpoints can |
| /// watch a minimum of 8 bytes (although Byte Address Select watchpoints |
| /// can watch 1 to pointer-size bytes in a pointer-size aligned granule). |
| /// |
| /// \param[in] max_byte_size |
| /// The maximum byte size supported for one watchpoint on this target. |
| /// |
| /// \param[in] address_byte_size |
| /// The address byte size on this target. |
| static std::vector<Region> PowerOf2Watchpoints(lldb::addr_t user_addr, |
| size_t user_size, |
| size_t min_byte_size, |
| size_t max_byte_size, |
| uint32_t address_byte_size); |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // LLDB_BREAKPOINT_WATCHPOINTALGORITHMS_H |