================
@@ -270,6 +272,57 @@ size_t MemoryCache::Read(addr_t addr, void *dst, size_t
dst_len,
return dst_len;
}
+llvm::SmallVector<llvm::MutableArrayRef<uint8_t>>
+MemoryCache::ReadRanges(llvm::ArrayRef<Range<lldb::addr_t, size_t>> ranges,
+ llvm::MutableArrayRef<uint8_t> buffer) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+
+ llvm::SmallVector<llvm::MutableArrayRef<uint8_t>> results;
+ results.reserve(ranges.size());
+ llvm::SmallVector<Range<lldb::addr_t, size_t>> missed_ranges;
+
+ // Iterate once serving requests from L1.
+ for (auto range : ranges) {
+ const lldb::addr_t addr = range.GetRangeBase();
+ const size_t len = range.GetByteSize();
+
+ if (m_invalid_ranges.FindEntryThatContains(addr)) {
+ results.push_back(buffer.take_front(0));
+ continue;
+ }
+
+ if (const uint8_t *l1_data = FindL1CacheEntry(addr, len)) {
+ results.push_back(buffer.take_front(len));
+ buffer = buffer.drop_front(len);
+ memcpy(results.back().data(), l1_data, len);
+ continue;
+ }
+
+ // Use a nullptr to denote this needs fetching.
+ results.emplace_back(nullptr, nullptr);
+ missed_ranges.push_back(range);
+ }
+
+ if (missed_ranges.empty())
+ return results;
+
+ auto fetched_buffers = m_process.DoReadMemoryRanges(missed_ranges, buffer);
+
+ for (auto [missed_range, fetched] : llvm::zip(missed_ranges,
fetched_buffers))
+ AddL1CacheData(missed_range.GetRangeBase(), fetched);
+
+ auto *results_it = results.begin();
+ auto *end = results.end();
+ for (auto fetched : fetched_buffers) {
+ results_it = std::find_if(
----------------
felipepiovezan wrote:
Please have a look at the top commit for the precise diff!
https://github.com/llvm/llvm-project/pull/201166
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits