[Lldb-commits] [lldb] [lldb] Look up register set children by their own name too (PR #223857)

Charles Zablit via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 16 02:23:42 PDT 2026


https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/223857

>From 86660a4cafa1f679821e3afeadf492640d39d0ad Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 15 Sep 2026 22:35:30 +0100
Subject: [PATCH 1/2] [lldb] Fall back to a set-local name match when looking
 up register set children

---
 lldb/source/ValueObject/ValueObjectRegister.cpp | 17 +++++++++++++----
 lldb/test/API/python_api/value/TestValueAPI.py  |  8 ++++++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/lldb/source/ValueObject/ValueObjectRegister.cpp b/lldb/source/ValueObject/ValueObjectRegister.cpp
index 1a7a4560714bc..e6d633ac84b9e 100644
--- a/lldb/source/ValueObject/ValueObjectRegister.cpp
+++ b/lldb/source/ValueObject/ValueObjectRegister.cpp
@@ -138,18 +138,27 @@ ValueObjectRegisterSet::LookupChildWithName(llvm::StringRef name) {
 
   // See if the register exists at all in any set.
   const RegisterInfo *reg_info = m_reg_ctx_sp->GetRegisterInfoByName(name);
-  if (!reg_info)
-    return {};
 
-  // See if this register is in this register set.
+  // See if this register is in this register set, falling back to the name as
+  // written. The generic name may alias a register in another set while this
+  // set has a register of that exact name.
+  std::optional<std::pair<size_t, const RegisterInfo *>> name_match;
+  std::optional<std::pair<size_t, const RegisterInfo *>> alt_name_match;
   for (size_t i = 0; i < m_reg_set->num_registers; ++i) {
     const RegisterInfo *contained_reg_info =
         m_reg_ctx_sp->GetRegisterInfoAtIndex(m_reg_set->registers[i]);
+    if (!contained_reg_info)
+      continue;
     if (IsSameRegister(contained_reg_info, reg_info))
       return std::make_pair(i, reg_info);
+    if (!name_match && name.equals_insensitive(contained_reg_info->name))
+      name_match = std::make_pair(i, contained_reg_info);
+    else if (!alt_name_match &&
+             name.equals_insensitive(contained_reg_info->alt_name))
+      alt_name_match = std::make_pair(i, contained_reg_info);
   }
 
-  return {};
+  return name_match ? name_match : alt_name_match;
 }
 
 lldb::ValueObjectSP
diff --git a/lldb/test/API/python_api/value/TestValueAPI.py b/lldb/test/API/python_api/value/TestValueAPI.py
index cdc8c46723803..f7fce24a149df 100644
--- a/lldb/test/API/python_api/value/TestValueAPI.py
+++ b/lldb/test/API/python_api/value/TestValueAPI.py
@@ -346,8 +346,12 @@ def test_register(self):
                     sp_with_name_index = reg_set.GetIndexOfChildWithName(reg_name)
                     self.assertTrue(sp_with_name_index < num_registers)
                     rsp_with_name_index = reg_set.GetIndexOfChildWithName("rsp")
-                    self.assertTrue(rsp_with_name_index < num_registers)
-                    self.assertEqual(sp_with_name_index, rsp_with_name_index)
+                    if rsp_with_name_index < num_registers:
+                        self.assertEqual(sp_with_name_index, rsp_with_name_index)
+                    else:
+                        # "rsp" is not in this set, so we get the architectural
+                        # "sp" instead.
+                        self.assertEqual(sp_with_name_index, child_idx)
 
                     continue
 

>From 9a70ed9a8909204ecfc6c767c5af9a42996745be Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Wed, 16 Sep 2026 10:22:57 +0100
Subject: [PATCH 2/2] Track a single match in LookupChildWithName

---
 lldb/source/ValueObject/ValueObjectRegister.cpp | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/lldb/source/ValueObject/ValueObjectRegister.cpp b/lldb/source/ValueObject/ValueObjectRegister.cpp
index e6d633ac84b9e..23f4f3deb5c87 100644
--- a/lldb/source/ValueObject/ValueObjectRegister.cpp
+++ b/lldb/source/ValueObject/ValueObjectRegister.cpp
@@ -141,9 +141,9 @@ ValueObjectRegisterSet::LookupChildWithName(llvm::StringRef name) {
 
   // See if this register is in this register set, falling back to the name as
   // written. The generic name may alias a register in another set while this
-  // set has a register of that exact name.
-  std::optional<std::pair<size_t, const RegisterInfo *>> name_match;
-  std::optional<std::pair<size_t, const RegisterInfo *>> alt_name_match;
+  // set has a register of that exact name. A match on the name itself always
+  // wins over one on the alt name.
+  std::optional<std::pair<size_t, const RegisterInfo *>> match;
   for (size_t i = 0; i < m_reg_set->num_registers; ++i) {
     const RegisterInfo *contained_reg_info =
         m_reg_ctx_sp->GetRegisterInfoAtIndex(m_reg_set->registers[i]);
@@ -151,14 +151,13 @@ ValueObjectRegisterSet::LookupChildWithName(llvm::StringRef name) {
       continue;
     if (IsSameRegister(contained_reg_info, reg_info))
       return std::make_pair(i, reg_info);
-    if (!name_match && name.equals_insensitive(contained_reg_info->name))
-      name_match = std::make_pair(i, contained_reg_info);
-    else if (!alt_name_match &&
-             name.equals_insensitive(contained_reg_info->alt_name))
-      alt_name_match = std::make_pair(i, contained_reg_info);
+    if (name.equals_insensitive(contained_reg_info->name))
+      match = std::make_pair(i, contained_reg_info);
+    else if (!match && name.equals_insensitive(contained_reg_info->alt_name))
+      match = std::make_pair(i, contained_reg_info);
   }
 
-  return name_match ? name_match : alt_name_match;
+  return match;
 }
 
 lldb::ValueObjectSP



More information about the lldb-commits mailing list