25 addr_t addr,
size_t size,
bool read,
bool write,
26 WatchpointHardwareFeature supported_features,
ArchSpec &arch) {
28 std::vector<Region> entries;
30 if (supported_features & eWatchpointHardwareArmMASK) {
47 LLDB_LOGV(log,
"AtomizeWatchpointRequest user request addr {0:x} size {1}",
49 std::vector<WatchpointResourceSP> resources;
50 for (
Region &ent : entries) {
51 LLDB_LOGV(log,
"AtomizeWatchpointRequest creating resource {0:x} size {1}",
54 std::make_shared<WatchpointResource>(ent.addr, ent.size, read, write);
55 resources.push_back(wp_res_sp);
78 uint32_t address_byte_size) {
82 "AtomizeWatchpointRequest user request addr {0:x} size {1} "
83 "min_byte_size {2}, max_byte_size {3}, address_byte_size {4}",
84 user_addr, user_size, min_byte_size, max_byte_size,
91 size_t aligned_size = std::max(user_size, min_byte_size);
95 aligned_size = llvm::bit_ceil(aligned_size);
97 addr_t aligned_start = user_addr & ~(aligned_size - 1);
101 if (aligned_size <= max_byte_size &&
102 aligned_start + aligned_size >= user_addr + user_size)
103 return {{aligned_start, aligned_size}};
118 if (max_byte_size >= (aligned_size << 1)) {
120 aligned_start = user_addr & ~(aligned_size - 1);
121 if (aligned_size <= max_byte_size &&
122 aligned_start + aligned_size >= user_addr + user_size)
123 return {{aligned_start, aligned_size}};
133 aligned_size = std::min(aligned_size, max_byte_size);
134 aligned_start = user_addr & ~(aligned_size - 1);
136 std::vector<Region> result;
137 addr_t current_address = aligned_start;
138 const addr_t user_end_address = user_addr + user_size;
139 while (current_address + aligned_size < user_end_address) {
140 result.push_back({current_address, aligned_size});
141 current_address += aligned_size;
144 if (current_address < user_end_address)
145 result.push_back({current_address, aligned_size});
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)
Convert a user's watchpoint request into an array of Regions, each of which can be watched by a singl...
static std::vector< lldb::WatchpointResourceSP > AtomizeWatchpointRequest(lldb::addr_t addr, size_t size, bool read, bool write, WatchpointHardwareFeature supported_features, ArchSpec &arch)
Convert a user's watchpoint request into an array of memory regions, each region watched by one hardw...