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 &region_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 &region_info) override;
 
+    lldb_private::Error
+    GetMemoryRegions (std::vector<lldb::MemoryRegionInfoSP> &regions) 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> &regions) {
+    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 &region_info) override;
 
+    lldb_private::Error
+    GetMemoryRegions (std::vector<lldb::MemoryRegionInfoSP> &regions) 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> &regions) {
+    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> &regions)
     {
         Error error;
         error.SetErrorString ("Process::GetMemoryRegions() not supported");
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to