@@ -231,8 +231,16 @@ TEST_F(MemoryTest, TesetMemoryCacheRead) {
231231// / the least significant byte of X.
232232class DummyReaderProcess : public Process {
233233public:
234+ // If true, `DoReadMemory` will not return all requested bytes.
235+ // It's not possible to control exactly how many bytes will be read, because
236+ // Process::ReadMemoryFromInferior tries to fulfill the entire request by
237+ // reading smaller chunks until it gets nothing back.
238+ bool read_less_than_requested = false ;
239+
234240 size_t DoReadMemory (lldb::addr_t vm_addr, void *buf, size_t size,
235241 Status &error) override {
242+ if (read_less_than_requested && size > 0 )
243+ size--;
236244 uint8_t *buffer = static_cast <uint8_t *>(buf);
237245 for (size_t addr = vm_addr; addr < vm_addr + size; addr++)
238246 buffer[addr - vm_addr] = static_cast <uint8_t >(addr); // LSB of addr.
@@ -264,21 +272,39 @@ TEST_F(MemoryTest, TestReadMemoryRanges) {
264272 std::make_shared<DummyReaderProcess>(target_sp, listener_sp);
265273 ASSERT_TRUE (process_sp);
266274
267- llvm::SmallVector<uint8_t , 0 > buffer (1024 , 0 );
268275
269- // Read 8 ranges of 128 bytes with arbitrary base addresses.
270- llvm::SmallVector<Range<addr_t , size_t >> ranges = {
271- {0x12345 , 128 }, {0x11112222 , 128 }, {0x77777777 , 128 },
272- {0xffaabbccdd , 128 }, {0x0 , 128 }, {0x4242424242 , 128 },
273- {0x17171717 , 128 }, {0x99999 , 128 }};
276+ {
277+ llvm::SmallVector<uint8_t , 0 > buffer (1024 , 0 );
278+ // Read 8 ranges of 128 bytes with arbitrary base addresses.
279+ llvm::SmallVector<Range<addr_t , size_t >> ranges = {
280+ {0x12345 , 128 }, {0x11112222 , 128 }, {0x77777777 , 128 },
281+ {0xffaabbccdd , 128 }, {0x0 , 128 }, {0x4242424242 , 128 },
282+ {0x17171717 , 128 }, {0x99999 , 128 }};
274283
275- llvm::SmallVector<llvm::MutableArrayRef<uint8_t >> read_results =
276- process_sp->ReadMemoryRanges (ranges, buffer);
284+ llvm::SmallVector<llvm::MutableArrayRef<uint8_t >> read_results =
285+ process_sp->ReadMemoryRanges (ranges, buffer);
277286
278- for (auto [range, memory] : llvm::zip (ranges, read_results)) {
279- ASSERT_EQ (memory.size (), 128u );
280- addr_t range_base = range.GetRangeBase ();
281- for (auto [idx, byte] : llvm::enumerate (memory))
282- ASSERT_EQ (byte, static_cast <uint8_t >(range_base + idx));
287+ for (auto [range, memory] : llvm::zip (ranges, read_results)) {
288+ ASSERT_EQ (memory.size (), 128u );
289+ addr_t range_base = range.GetRangeBase ();
290+ for (auto [idx, byte] : llvm::enumerate (memory))
291+ ASSERT_EQ (byte, static_cast <uint8_t >(range_base + idx));
292+ }
293+ }
294+
295+ auto &dummy_process = static_cast <DummyReaderProcess&>(*process_sp);
296+ dummy_process.read_less_than_requested = true ;
297+ {
298+ llvm::SmallVector<uint8_t , 0 > buffer (1024 , 0 );
299+ llvm::SmallVector<Range<addr_t , size_t >> ranges = {
300+ {0x12345 , 128 }, {0x11112222 , 128 }, {0x77777777 , 128 }};
301+ llvm::SmallVector<llvm::MutableArrayRef<uint8_t >> read_results =
302+ dummy_process.ReadMemoryRanges (ranges, buffer);
303+ for (auto [range, memory] : llvm::zip (ranges, read_results)) {
304+ ASSERT_LT (memory.size (), 128u );
305+ addr_t range_base = range.GetRangeBase ();
306+ for (auto [idx, byte] : llvm::enumerate (memory))
307+ ASSERT_EQ (byte, static_cast <uint8_t >(range_base + idx));
308+ }
283309 }
284310}
0 commit comments