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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 = []

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to