[Lldb-commits] [lldb] [lldb] Prefer shadowed variables with a location (PR #223493)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Sep 14 11:50:30 PDT 2026
https://github.com/Nerixyz created https://github.com/llvm/llvm-project/pull/223493
Intends to address #221696 on the lldb side.
[TODO: explain why this is done + add tests]
The fix feels very hacky and specific to the linked issue. Because it doesn't change the missing block ranges, the linked issue isn't fully resolved. But this is about as much as we can do on the lldb side.
>From f66a6e8690bb1bfac0764024ab352e1f63a92d8a Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Mon, 14 Sep 2026 20:44:07 +0200
Subject: [PATCH] [lldb] Prefer shadowed variables with a location
---
lldb/include/lldb/Symbol/VariableList.h | 8 ++++++++
lldb/source/Expression/UserExpression.cpp | 4 ++--
lldb/source/Symbol/VariableList.cpp | 21 +++++++++++++++++++++
lldb/source/Target/StackFrame.cpp | 6 +++---
lldb/source/ValueObject/DILEval.cpp | 2 +-
5 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/lldb/include/lldb/Symbol/VariableList.h b/lldb/include/lldb/Symbol/VariableList.h
index 12c25da0fe04f..1b9e8bbd51be4 100644
--- a/lldb/include/lldb/Symbol/VariableList.h
+++ b/lldb/include/lldb/Symbol/VariableList.h
@@ -47,6 +47,14 @@ class VariableList {
lldb::VariableSP FindVariable(ConstString name, lldb::ValueType value_type,
bool include_static_members = true) const;
+ /// Find a variable by name.
+ ///
+ /// If multiple variables have the same name, return the one who's location is
+ /// valid in the given frame. If no variable's location is valid, the first
+ /// one is returned.
+ lldb::VariableSP FindVariable(ConstString name, StackFrame &frame,
+ bool include_static_members = true) const;
+
uint32_t FindVariableIndex(const lldb::VariableSP &var_sp);
size_t AppendVariablesIfUnique(VariableList &var_list);
diff --git a/lldb/source/Expression/UserExpression.cpp b/lldb/source/Expression/UserExpression.cpp
index 537a9cc4c4e35..fc34aba1d5b9f 100644
--- a/lldb/source/Expression/UserExpression.cpp
+++ b/lldb/source/Expression/UserExpression.cpp
@@ -111,8 +111,8 @@ lldb::ValueObjectSP UserExpression::GetObjectPointerValueObject(
}
if (auto var_list_sp = frame_sp->GetInScopeVariableList(false))
- if (auto var_sp =
- var_list_sp->FindVariable(ConstString(object_name), false))
+ if (auto var_sp = var_list_sp->FindVariable(ConstString(object_name),
+ *frame_sp, false))
return frame_sp->GetValueObjectForFrameVariable(var_sp,
lldb::eNoDynamicValues);
diff --git a/lldb/source/Symbol/VariableList.cpp b/lldb/source/Symbol/VariableList.cpp
index b9f2494d4a5bd..42cd83b274bb2 100644
--- a/lldb/source/Symbol/VariableList.cpp
+++ b/lldb/source/Symbol/VariableList.cpp
@@ -88,6 +88,27 @@ VariableSP VariableList::FindVariable(ConstString name,
return {};
}
+VariableSP VariableList::FindVariable(ConstString name, StackFrame &frame,
+ bool include_static_members) const {
+ VariableSP first_match_sp;
+ for (const auto &var_sp : m_variables) {
+ if (!var_sp->NameMatches(name))
+ continue;
+
+ if (var_sp->IsStaticMember()) {
+ if (!include_static_members)
+ continue;
+ return var_sp;
+ }
+
+ if (var_sp->LocationIsValidForFrame(&frame))
+ return var_sp;
+ if (!first_match_sp)
+ first_match_sp = var_sp;
+ }
+ return first_match_sp;
+}
+
size_t VariableList::AppendVariablesIfUnique(VariableList &var_list) {
const size_t initial_size = var_list.GetSize();
iterator pos, end = m_variables.end();
diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp
index 46fb65cc506a5..3c089e0e77f52 100644
--- a/lldb/source/Target/StackFrame.cpp
+++ b/lldb/source/Target/StackFrame.cpp
@@ -624,7 +624,7 @@ ValueObjectSP StackFrame::LegacyGetValueForVariableExpressionPath(
ConstString name_const_string(var_expr.substr(0, separator_idx));
- var_sp = variable_list->FindVariable(name_const_string, false);
+ var_sp = variable_list->FindVariable(name_const_string, *this, false);
bool synthetically_added_instance_object = false;
@@ -638,7 +638,7 @@ ValueObjectSP StackFrame::LegacyGetValueForVariableExpressionPath(
GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock);
llvm::StringRef instance_name = m_sc.GetInstanceName();
if (!instance_name.empty()) {
- var_sp = variable_list->FindVariable(ConstString(instance_name));
+ var_sp = variable_list->FindVariable(ConstString(instance_name), *this);
if (var_sp) {
separator_idx = 0;
if (Type *var_type = var_sp->GetType())
@@ -1879,7 +1879,7 @@ lldb::ValueObjectSP StackFrame::FindVariable(ConstString name) {
can_create, get_parent_variables, stop_if_block_is_inlined_function,
[this](Variable *v) { return v->IsInScope(this); },
&variable_list)) {
- var_sp = variable_list.FindVariable(name);
+ var_sp = variable_list.FindVariable(name, *this);
}
if (var_sp)
diff --git a/lldb/source/ValueObject/DILEval.cpp b/lldb/source/ValueObject/DILEval.cpp
index 627d30cae9bec..66c9bd83cb7b5 100644
--- a/lldb/source/ValueObject/DILEval.cpp
+++ b/lldb/source/ValueObject/DILEval.cpp
@@ -390,7 +390,7 @@ lldb::ValueObjectSP LookupIdentifier(llvm::StringRef name_ref,
lldb::ValueObjectSP value_sp;
if (variable_list) {
lldb::VariableSP var_sp =
- variable_list->FindVariable(ConstString(name_ref));
+ variable_list->FindVariable(ConstString(name_ref), stack_frame);
if (var_sp)
value_sp =
stack_frame.GetValueObjectForFrameVariable(var_sp, use_dynamic);
More information about the lldb-commits
mailing list