//===-- WatchpointAlgorithms.cpp ------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "lldb/Breakpoint/WatchpointAlgorithms.h" #include "lldb/Breakpoint/WatchpointResource.h" #include "lldb/Target/Process.h" #include "lldb/Utility/ArchSpec.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include <algorithm> #include <utility> #include <vector> usingnamespacelldb; usingnamespacelldb_private; std::vector<WatchpointResourceSP> WatchpointAlgorithms::AtomizeWatchpointRequest( addr_t addr, size_t size, bool read, bool write, WatchpointHardwareFeature supported_features, ArchSpec &arch) { … } // This should be `std::bit_ceil(aligned_size)` but // that requires C++20. // Calculates the smallest integral power of two that is not smaller than x. static uint64_t bit_ceil(uint64_t input) { … } /// Convert a user's watchpoint request (\a user_addr and \a user_size) /// into hardware watchpoints, for a target that can watch a power-of-2 /// region of memory (1, 2, 4, 8, etc), aligned to that same power-of-2 /// memory address. /// /// If a user asks to watch 4 bytes at address 0x1002 (0x1002-0x1005 /// inclusive) we can implement this with two 2-byte watchpoints /// (0x1002 and 0x1004) or with an 8-byte watchpoint at 0x1000. /// A 4-byte watchpoint at 0x1002 would not be properly 4 byte aligned. /// /// If a user asks to watch 16 bytes at 0x1000, and this target supports /// 8-byte watchpoints, we can implement this with two 8-byte watchpoints /// at 0x1000 and 0x1008. std::vector<WatchpointAlgorithms::Region> WatchpointAlgorithms::PowerOf2Watchpoints(addr_t user_addr, size_t user_size, size_t min_byte_size, size_t max_byte_size, uint32_t address_byte_size) { … }