hhellyer created this revision.
hhellyer added a reviewer: clayborg.
hhellyer added a subscriber: lldb-commits.
This patch fills in the implementation of GetMemoryRegions() on the Linux and
Mac OS core file implementations of lldb_private::Process
(ProcessElfCore::GetMemoryRegions and ProcessMachCore::GetMemoryRegions.) The
GetMemoryRegions API was added under: http://reviews.llvm.org/D20565
The patch re-uses the m_core_range_infos list that was recently added to
implement GetMemoryRegionInfo in both ProcessElfCore and ProcessMachCore to
ensure the returned regions match the regions returned by
Process::GetMemoryRegionInfo(addr_t load_addr, MemoryRegionInfo ®ion_info).
http://reviews.llvm.org/D21751
Files:
include/lldb/Target/Process.h
source/Plugins/Process/elf-core/ProcessElfCore.cpp
source/Plugins/Process/elf-core/ProcessElfCore.h
source/Plugins/Process/mach-core/ProcessMachCore.cpp
source/Plugins/Process/mach-core/ProcessMachCore.h
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<lldb::MemoryRegionInfoSP> ®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<lldb::MemoryRegionInfoSP> ®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()
{
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<lldb::MemoryRegionInfoSP> ®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<lldb::MemoryRegionInfoSP> ®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: include/lldb/Target/Process.h
===================================================================
--- include/lldb/Target/Process.h
+++ include/lldb/Target/Process.h
@@ -2447,7 +2447,7 @@
}
virtual Error
- GetMemoryRegions (std::vector<lldb::MemoryRegionInfoSP>&)
+ GetMemoryRegions (std::vector<lldb::MemoryRegionInfoSP> ®ions)
{
Error error;
error.SetErrorString ("Process::GetMemoryRegions() not supported");
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits