@@ -367,3 +367,97 @@ TEST_F(MemoryDeathTest, TestReadMemoryRangesWithShortBuffer) {
367367 ASSERT_TRUE (result.empty ());
368368#endif
369369}
370+ TEST_F (MemoryTest, TestReadPointersFromMemory) {
371+ ArchSpec arch (" x86_64-apple-macosx-" );
372+ Platform::SetHostPlatform (PlatformRemoteMacOSX::CreateInstance (true , &arch));
373+ DebuggerSP debugger_sp = Debugger::CreateInstance ();
374+ ASSERT_TRUE (debugger_sp);
375+ TargetSP target_sp = CreateTarget (debugger_sp, arch);
376+ ASSERT_TRUE (target_sp);
377+ ListenerSP listener_sp (Listener::MakeListener (" dummy" ));
378+ ProcessSP process =
379+ std::make_shared<DummyReaderProcess>(target_sp, listener_sp);
380+ ASSERT_TRUE (process);
381+
382+ // Read pointers at arbitrary addresses.
383+ llvm::SmallVector<addr_t > ptr_locs = {0x0 , 0x100 , 0x2000 , 0x123400 };
384+ // Because of how DummyReaderProcess works, each byte of a memory read result
385+ // is its address modulo 256:
386+ constexpr addr_t expected_result = 0x0706050403020100 ;
387+
388+ llvm::SmallVector<std::optional<addr_t >> read_results =
389+ process->ReadPointersFromMemory (ptr_locs);
390+
391+ for (std::optional<addr_t > maybe_ptr : read_results) {
392+ ASSERT_TRUE (maybe_ptr.has_value ());
393+ EXPECT_EQ (*maybe_ptr, expected_result);
394+ }
395+ }
396+
397+ TEST_F (MemoryTest, TestReadUnsignedIntegersFromMemory) {
398+ ArchSpec arch (" x86_64-apple-macosx-" );
399+
400+ Platform::SetHostPlatform (PlatformRemoteMacOSX::CreateInstance (true , &arch));
401+ DebuggerSP debugger_sp = Debugger::CreateInstance ();
402+ ASSERT_TRUE (debugger_sp);
403+ TargetSP target_sp = CreateTarget (debugger_sp, arch);
404+ ASSERT_TRUE (target_sp);
405+ ListenerSP listener_sp (Listener::MakeListener (" dummy" ));
406+ ProcessSP process =
407+ std::make_shared<DummyReaderProcess>(target_sp, listener_sp);
408+ ASSERT_TRUE (process);
409+
410+ { // Test reads of size 1
411+ llvm::SmallVector<addr_t > locs = {0x0 , 0x101 , 0x2002 , 0x123403 };
412+ llvm::SmallVector<std::optional<addr_t >> read_results =
413+ process->ReadUnsignedIntegersFromMemory (locs, /* byte_size=*/ 1 );
414+
415+ for (auto [maybe_int, loc] : llvm::zip (read_results, locs)) {
416+ ASSERT_TRUE (maybe_int.has_value ());
417+ EXPECT_EQ (*maybe_int, static_cast <uint8_t >(loc));
418+ }
419+ }
420+
421+ { // Test reads of size 2
422+ llvm::SmallVector<addr_t > locs = {0x0 , 0x101 , 0x2002 , 0x123403 };
423+ llvm::SmallVector<std::optional<addr_t >> read_results =
424+ process->ReadUnsignedIntegersFromMemory (locs, /* byte_size=*/ 2 );
425+
426+ for (auto [maybe_int, loc] : llvm::zip (read_results, locs)) {
427+ ASSERT_TRUE (maybe_int.has_value ());
428+ uint64_t lsb = static_cast <uint8_t >(loc);
429+ uint64_t expected_result = ((lsb + 1 ) << 8 ) | lsb;
430+ EXPECT_EQ (*maybe_int, expected_result);
431+ }
432+ }
433+
434+ { // Test reads of size 4
435+ llvm::SmallVector<addr_t > locs = {0x0 , 0x101 , 0x2002 , 0x123403 };
436+ llvm::SmallVector<std::optional<addr_t >> read_results =
437+ process->ReadUnsignedIntegersFromMemory (locs, /* byte_size=*/ 4 );
438+
439+ for (auto [maybe_int, loc] : llvm::zip (read_results, locs)) {
440+ ASSERT_TRUE (maybe_int.has_value ());
441+ uint64_t lsb = static_cast <uint8_t >(loc);
442+ uint64_t expected_result =
443+ ((lsb + 3 ) << 24 ) | ((lsb + 2 ) << 16 ) | ((lsb + 1 ) << 8 ) | lsb;
444+ EXPECT_EQ (*maybe_int, expected_result);
445+ }
446+ }
447+
448+ { // Test reads of size 8
449+ llvm::SmallVector<addr_t > locs = {0x0 , 0x101 , 0x2002 , 0x123403 };
450+ llvm::SmallVector<std::optional<addr_t >> read_results =
451+ process->ReadUnsignedIntegersFromMemory (locs, /* byte_size=*/ 8 );
452+
453+ for (auto [maybe_int, loc] : llvm::zip (read_results, locs)) {
454+ ASSERT_TRUE (maybe_int.has_value ());
455+ uint64_t lsb = static_cast <uint8_t >(loc);
456+ uint64_t expected_result = ((lsb + 7 ) << 56 ) | ((lsb + 6 ) << 48 ) |
457+ ((lsb + 5 ) << 40 ) | ((lsb + 4 ) << 32 ) |
458+ ((lsb + 3 ) << 24 ) | ((lsb + 2 ) << 16 ) |
459+ ((lsb + 1 ) << 8 ) | lsb;
460+ EXPECT_EQ (*maybe_int, expected_result);
461+ }
462+ }
463+ }
0 commit comments