[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