Skip to content

[lldb] Support zero-padding in formatter sections #119934

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 14, 2024

Conversation

adrian-prantl
Copy link
Collaborator

No description provided.

@llvmbot
Copy link
Member

llvmbot commented Dec 13, 2024

@llvm/pr-subscribers-lldb

Author: Adrian Prantl (adrian-prantl)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/119934.diff

3 Files Affected:

  • (modified) lldb/source/DataFormatters/FormatterSection.cpp (+7)
  • (modified) lldb/test/API/functionalities/data-formatter/embedded-summary/TestEmbeddedTypeSummary.py (+1)
  • (modified) lldb/test/API/functionalities/data-formatter/embedded-summary/main.c (+29-8)
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;
 }

@adrian-prantl adrian-prantl merged commit f22cff7 into llvm:main Dec 14, 2024
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants