Index: include/lldb/Target/Process.h =================================================================== --- include/lldb/Target/Process.h +++ include/lldb/Target/Process.h @@ -2447,7 +2447,7 @@ } virtual Error - GetMemoryRegions (std::vector&) + GetMemoryRegions (std::vector ®ions) { Error error; error.SetErrorString ("Process::GetMemoryRegions() not supported"); Index: source/Plugins/Process/elf-core/ProcessElfCore.h =================================================================== --- source/Plugins/Process/elf-core/ProcessElfCore.h +++ source/Plugins/Process/elf-core/ProcessElfCore.h @@ -105,6 +105,9 @@ lldb_private::Error GetMemoryRegionInfo(lldb::addr_t load_addr, lldb_private::MemoryRegionInfo ®ion_info) override; + lldb_private::Error + GetMemoryRegions (std::vector ®ions) override; + lldb::addr_t GetImageInfoAddress() override; lldb_private::ArchSpec Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp =================================================================== --- source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -359,6 +359,27 @@ return Error("invalid address"); } +Error +ProcessElfCore::GetMemoryRegions (std::vector ®ions) { + regions.clear(); + // The list of VMRangeToPermissions is sorted when it is created. + for( size_t i = 0; i < m_core_range_infos.GetSize(); ++i ) { + const VMRangeToPermissions::Entry *permission_entry = m_core_range_infos.GetEntryAtIndex(i); + lldb::MemoryRegionInfoSP region_info_sp( new MemoryRegionInfo() ); + region_info_sp->GetRange().SetRangeBase(permission_entry->GetRangeBase()); + region_info_sp->GetRange().SetRangeEnd(permission_entry->GetRangeEnd()); + const Flags permissions(permission_entry->data); + region_info_sp->SetReadable(permissions.Test(lldb::ePermissionsReadable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + region_info_sp->SetWritable(permissions.Test(lldb::ePermissionsWritable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + region_info_sp->SetExecutable(permissions.Test(lldb::ePermissionsExecutable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + regions.push_back( region_info_sp ); + } + return Error(); +} + size_t ProcessElfCore::DoReadMemory (lldb::addr_t addr, void *buf, size_t size, Error &error) { Index: source/Plugins/Process/mach-core/ProcessMachCore.h =================================================================== --- source/Plugins/Process/mach-core/ProcessMachCore.h +++ source/Plugins/Process/mach-core/ProcessMachCore.h @@ -107,6 +107,9 @@ lldb_private::Error GetMemoryRegionInfo(lldb::addr_t load_addr, lldb_private::MemoryRegionInfo ®ion_info) override; + lldb_private::Error + GetMemoryRegions (std::vector ®ions) override; + lldb::addr_t GetImageInfoAddress () override; Index: source/Plugins/Process/mach-core/ProcessMachCore.cpp =================================================================== --- source/Plugins/Process/mach-core/ProcessMachCore.cpp +++ source/Plugins/Process/mach-core/ProcessMachCore.cpp @@ -596,6 +596,27 @@ return Error("invalid address"); } +Error +ProcessMachCore::GetMemoryRegions (std::vector ®ions) { + regions.clear(); + // The list of VMRangeToPermissions is sorted when it is created. + for( size_t i = 0; i < m_core_range_infos.GetSize(); ++i ) { + const VMRangeToPermissions::Entry *permission_entry = m_core_range_infos.GetEntryAtIndex(i); + lldb::MemoryRegionInfoSP region_info_sp( new MemoryRegionInfo() ); + region_info_sp->GetRange().SetRangeBase(permission_entry->GetRangeBase()); + region_info_sp->GetRange().SetRangeEnd(permission_entry->GetRangeEnd()); + const Flags permissions(permission_entry->data); + region_info_sp->SetReadable(permissions.Test(lldb::ePermissionsReadable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + region_info_sp->SetWritable(permissions.Test(lldb::ePermissionsWritable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + region_info_sp->SetExecutable(permissions.Test(lldb::ePermissionsExecutable) ? MemoryRegionInfo::eYes + : MemoryRegionInfo::eNo); + regions.push_back( region_info_sp ); + } + return Error(); +} + void ProcessMachCore::Clear() {