[Lldb-commits] [lldb] [lldb] Support zero-padding in formatter sections (PR #119934)

Adrian Prantl via lldb-commits lldb-commits at lists.llvm.org
Fri Dec 13 15:01:48 PST 2024


https://github.com/adrian-prantl created https://github.com/llvm/llvm-project/pull/119934

None

>From 373a93b56b415003bff8ca0ae9de85c820c87036 Mon Sep 17 00:00:00 2001
From: Adrian Prantl <aprantl at apple.com>
Date: Fri, 13 Dec 2024 15:00:19 -0800
Subject: [PATCH] [lldb] Support zero-padding in formatter sections

---
 .../DataFormatters/FormatterSection.cpp       |  7 ++++
 .../TestEmbeddedTypeSummary.py                |  1 +
 .../data-formatter/embedded-summary/main.c    | 37 +++++++++++++++----
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/lldb/source/DataFormatters/FormatterSection.cpp b/lldb/source/DataFormatters/FormatterSection.cpp
index f70f41fdeb736f..1de633f4998e05 100644
--- a/lldb/source/DataFormatters/FormatterSection.cpp
+++ b/lldb/source/DataFormatters/FormatterSection.cpp
@@ -50,6 +50,13 @@ static void ForEachFormatterInModule(
   uint8_t addr_size = section.getAddressSize();
   llvm::DataExtractor::Cursor cursor(0);
   while (cursor && cursor.tell() < section_size) {
+    while (cursor && cursor.tell() < section_size) {
+      // Skip over 0 padding.
+      if (section.getU8(cursor) == 0)
+        continue;
+      cursor.seek(cursor.tell() - 1);
+      break;
+    }
     uint64_t version = section.getULEB128(cursor);
     uint64_t record_size = section.getULEB128(cursor);
     if (version == 1) {
diff --git a/lldb/test/API/functionalities/data-formatter/embedded-summary/TestEmbeddedTypeSummary.py b/lldb/test/API/functionalities/data-formatter/embedded-summary/TestEmbeddedTypeSummary.py
index b8ce7d9f76eb9e..21b21ea760e761 100644
--- a/lldb/test/API/functionalities/data-formatter/embedded-summary/TestEmbeddedTypeSummary.py
+++ b/lldb/test/API/functionalities/data-formatter/embedded-summary/TestEmbeddedTypeSummary.py
@@ -10,3 +10,4 @@ def test(self):
         self.build()
         lldbutil.run_to_source_breakpoint(self, "break here", lldb.SBFileSpec("main.c"))
         self.expect("v player", substrs=['"Dirk" (41)'])
+        self.expect("v layer", substrs=['"crust" (3)'])
diff --git a/lldb/test/API/functionalities/data-formatter/embedded-summary/main.c b/lldb/test/API/functionalities/data-formatter/embedded-summary/main.c
index 9ddd64246f726c..3273c1e38a2ae1 100644
--- a/lldb/test/API/functionalities/data-formatter/embedded-summary/main.c
+++ b/lldb/test/API/functionalities/data-formatter/embedded-summary/main.c
@@ -1,22 +1,43 @@
-#include <stdio.h>
+void puts(const char *);
+
+#define LLDBSUMMARY __attribute__((section("__TEXT,__lldbsummaries"), used))
 
 struct Player {
   char *name;
   int number;
 };
 
-__attribute__((used, section("__DATA_CONST,__lldbsummaries"))) unsigned char
-    _Player_type_summary[] = "\x01"     // version
-                             "\x25"     // record size
-                             "\x07"     // type name size
-                             "Player\0" // type name
-                             "\x1c"     // summary string size
-                             "${var.name} (${var.number})"; // summary string
+LLDBSUMMARY unsigned char _Player_type_summary[] =
+    "\x01"                         // version
+    "\x25"                         // record size
+    "\x07"                         // type name size
+    "Player\0"                     // type name
+    "\x1c"                         // summary string size
+    "${var.name} (${var.number})"; // summary string
+
+struct Layer {
+  char *name;
+  int number;
+};
+
+LLDBSUMMARY unsigned char _padding[] = "\x00\x00";
+
+// Near copy of the record for `Player`, using a regex type name (`^Layer`).
+LLDBSUMMARY unsigned char _Layer_type_summary[] =
+    "\x01"                         // version
+    "\x25"                         // record size
+    "\x07"                         // type name size
+    "^Layer\0"                     // type name
+    "\x1c"                         // summary string size
+    "${var.name} (${var.number})"; // summary string
 
 int main() {
   struct Player player;
   player.name = "Dirk";
   player.number = 41;
+  struct Layer layer;
+  layer.name = "crust";
+  layer.number = 3;
   puts("break here");
   return 0;
 }



More information about the lldb-commits mailing list