[Lldb-commits] [lldb] [lldb][test] Fix 64-bit register assumption in wrapped frame test (PR #217659)
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Fri Aug 21 03:49:18 PDT 2026
https://github.com/DavidSpickett updated https://github.com/llvm/llvm-project/pull/217659
>From dc031833811341d387277a9f275e9489ab15fbc5 Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Thu, 20 Aug 2026 15:09:55 +0000
Subject: [PATCH 1/3] [lldb][test] Fix 64-bit register assumption in wrapped
frame test
Added in #216840 / b0e9c530b5f0206de4a4f59f6728dbd5f10a5ca2.
This is failing on our downstream Arm 32-bit Linux bot:
```
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
* frame #0: 0x013d0630 a.out`compute(a=<unavailable>, b=<unavailable>) at main.c:3:10 [synthetic]
frame #1: 0x013d065c a.out`main at main.c:6:25
frame #2: 0xea2b739a libc.so.6`
frame #3: 0xea2b743e libc.so.6`__libc_start_main + 94
frame #4: 0x013d0538 a.out`_start + 40
Expecting sub string: "compute(a=3, b=4)" (was not found)
```
I have not had time to reproduce it locally, but I did notice
that the test packs a struct of registers using `Q` (8 bytes)
regardless of register size.
https://docs.python.org/3/library/struct.html#format-characters
Which probably works because most targets have 64-bit GPRs and
any non-64-bit registers don't take part in debug info lookups.
I think we can fix 32-bit by accounting for the actual register
sizes. I tried this on AArch64 Linux and it worked fine.
---
.../frame_provider.py | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
index 94be1b23d2552..8628a61ceb265 100644
--- a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
+++ b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
@@ -45,7 +45,10 @@ def get_register_context(self):
for reg_set in self._frame.registers:
if "general purpose" in reg_set.name.lower():
for reg in reg_set:
- regs[reg.name] = int(reg.value, 16) if reg.value else 0
+ regs[reg.name] = (
+ int(reg.value, 16) if reg.value else 0,
+ reg.GetByteSize(),
+ )
break
if not regs:
return None
@@ -60,7 +63,16 @@ def read(entry):
return regs[entry["name"]]
return regs.get(entry.get("alt-name", ""), 0)
- return struct.pack(f"{len(info)}Q", *(read(r) for r in info))
+ struct_format = ""
+ struct_data = []
+ sizes = {1: "B", 2: "H", 4: "I", 8: "Q"}
+
+ for reg in info:
+ value, size = read(reg)
+ struct_format += sizes[size]
+ struct_data.append(value)
+
+ return struct.pack(struct_format, *struct_data)
class WrapVariablesProvider(ScriptedFrameProvider):
>From c0aeb89ebfcb8447ef84079997401ea89a977c3c Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Fri, 21 Aug 2026 10:20:39 +0000
Subject: [PATCH 2/3] try to debug windows failure
---
.../wrapped_frame_register_context/frame_provider.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
index 8628a61ceb265..ce2e3b6dd10a2 100644
--- a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
+++ b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
@@ -45,6 +45,7 @@ def get_register_context(self):
for reg_set in self._frame.registers:
if "general purpose" in reg_set.name.lower():
for reg in reg_set:
+ print(f"Getting info for {reg.name}, byte size {reg.GetByteSize()}")
regs[reg.name] = (
int(reg.value, 16) if reg.value else 0,
reg.GetByteSize(),
@@ -54,6 +55,7 @@ def get_register_context(self):
return None
info = self.get_register_info()["registers"]
+ from pprint import pprint; pprint(info)
def read(entry):
# A register set reports a register under the name LLDB displays,
@@ -72,6 +74,9 @@ def read(entry):
struct_format += sizes[size]
struct_data.append(value)
+ print("struct_format:", struct_format)
+ print("struct_data:", struct_data)
+ print("len(struct_data):", len(struct_data))
return struct.pack(struct_format, *struct_data)
>From a6a44dd09b044e6fc69960927e8931a94737be4a Mon Sep 17 00:00:00 2001
From: David Spickett <david.spickett at arm.com>
Date: Fri, 21 Aug 2026 10:48:59 +0000
Subject: [PATCH 3/3] possible fix
---
.../wrapped_frame_register_context/frame_provider.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
index ce2e3b6dd10a2..9f53cb7107927 100644
--- a/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
+++ b/lldb/test/API/functionalities/scripted_frame_provider/wrapped_frame_register_context/frame_provider.py
@@ -63,7 +63,11 @@ def read(entry):
# uses. The register info carries that alias in "alt-name".
if entry["name"] in regs:
return regs[entry["name"]]
- return regs.get(entry.get("alt-name", ""), 0)
+
+ try:
+ return regs[entry[["alt-name"]]]
+ except KeyError:
+ return 0, entry["bitsize"] // 8
struct_format = ""
struct_data = []
More information about the lldb-commits
mailing list