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) {
48 "AtomizeWatchpointRequest user request addr {0:x} size {1}",
50 std::vector<WatchpointResourceSP> resources;
51 for (
Region &ent : entries) {
53 log,
"AtomizeWatchpointRequest creating resource {0:x} size {1}",
56 std::make_shared<WatchpointResource>(ent.addr, ent.size, read, write);
57 resources.push_back(wp_res_sp);
80 uint32_t address_byte_size) {
85 "AtomizeWatchpointRequest user request addr {0:x} size {1} "
86 "min_byte_size {2}, max_byte_size {3}, address_byte_size {4}",
87 user_addr, user_size, min_byte_size, max_byte_size, address_byte_size);
93 size_t aligned_size = std::max(user_size, min_byte_size);
97 aligned_size = llvm::bit_ceil(aligned_size);
99 addr_t aligned_start = user_addr & ~(aligned_size - 1);
103 if (aligned_size <= max_byte_size &&
104 aligned_start + aligned_size >= user_addr + user_size)
105 return {{aligned_start, aligned_size}};
120 if (max_byte_size >= (aligned_size << 1)) {
122 aligned_start = user_addr & ~(aligned_size - 1);
123 if (aligned_size <= max_byte_size &&
124 aligned_start + aligned_size >= user_addr + user_size)
125 return {{aligned_start, aligned_size}};
135 aligned_size = std::min(aligned_size, max_byte_size);
136 aligned_start = user_addr & ~(aligned_size - 1);
138 std::vector<Region> result;
139 addr_t current_address = aligned_start;
140 const addr_t user_end_address = user_addr + user_size;
141 while (current_address + aligned_size < user_end_address) {
142 result.push_back({current_address, aligned_size});
143 current_address += aligned_size;
146 if (current_address < user_end_address)
147 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...