[Lldb-commits] [PATCH] D116419: [lldb] Display MachO seg, sec of memory region

Dave Lee via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Dec 30 10:10:47 PST 2021


kastiglione created this revision.
kastiglione added reviewers: JDevlieghere, aprantl.
kastiglione requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

`memory region` displays the top-level section name, which for MachO is the segment name. The segment name alone is not much use, it's very course grained. This changes `memory region` to display the segment and section names for MachO images. For example: `__DATA,__const`.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D116419

Files:
  lldb/source/Commands/CommandObjectMemory.cpp
  lldb/test/API/functionalities/memory-region/TestMemoryRegion.py


Index: lldb/test/API/functionalities/memory-region/TestMemoryRegion.py
===================================================================
--- lldb/test/API/functionalities/memory-region/TestMemoryRegion.py
+++ lldb/test/API/functionalities/memory-region/TestMemoryRegion.py
@@ -62,3 +62,21 @@
         interp.HandleCommand("memory region", result)
         self.assertFalse(result.Succeeded())
         self.assertRegexpMatches(result.GetError(), "Usage: memory region ADDR")
+
+    @skipUnlessDarwin
+    def test_macho(self):
+        self.build()
+
+        # Set breakpoint in main and run
+        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
+        lldbutil.run_break_set_by_symbol(
+            self, "main", sym_exact=True, num_expected_locations=1
+        )
+
+        self.runCmd("run", RUN_SUCCEEDED)
+
+        interp = self.dbg.GetCommandInterpreter()
+        result = lldb.SBCommandReturnObject()
+
+        interp.HandleCommand("memory region $pc", result)
+        self.assertRegexpMatches(result.GetOutput(), r"\b__TEXT,__text\b")
Index: lldb/source/Commands/CommandObjectMemory.cpp
===================================================================
--- lldb/source/Commands/CommandObjectMemory.cpp
+++ lldb/source/Commands/CommandObjectMemory.cpp
@@ -34,6 +34,7 @@
 #include "lldb/Utility/DataBufferHeap.h"
 #include "lldb/Utility/DataBufferLLVM.h"
 #include "lldb/Utility/StreamString.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/MathExtras.h"
 #include <cinttypes>
 #include <memory>
@@ -1673,13 +1674,26 @@
       lldb_private::Address addr;
       ConstString name = range_info.GetName();
       ConstString section_name;
-      if (process_sp->GetTarget().ResolveLoadAddress(load_addr, addr)) {
+      auto &target = process_sp->GetTarget();
+      if (target.ResolveLoadAddress(load_addr, addr)) {
         SectionSP section_sp(addr.GetSection());
         if (section_sp) {
-          // Got the top most section, not the deepest section
-          while (section_sp->GetParent())
-            section_sp = section_sp->GetParent();
-          section_name = section_sp->GetName();
+          if (target.GetArchitecture().GetTriple().isOSBinFormatMachO()) {
+            // Display the conventional Mach-O format: __SEG,__SECT
+            if (auto segment_sp = section_sp->GetParent()) {
+              auto segment_name = segment_sp->GetName();
+              auto section_name_ = section_sp->GetName();
+              section_name = ConstString(
+                  llvm::formatv("{0},{1}", segment_name, section_name_).str());
+            }
+          }
+
+          if (section_name.IsEmpty()) {
+            // Got the top most section, not the deepest section
+            while (section_sp->GetParent())
+              section_sp = section_sp->GetParent();
+            section_name = section_sp->GetName();
+          }
         }
       }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D116419.396692.patch
Type: text/x-patch
Size: 2938 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20211230/98c12dbb/attachment-0001.bin>


More information about the lldb-commits mailing list