[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