https://github.com/hawkinsw created https://github.com/llvm/llvm-project/pull/215706
When a persistent variable is used in a DIL expression, look it up as if it were any other identifier. >From 0c9cc2ee7ba5a383b7cc8e4bce2fafc33d504806 Mon Sep 17 00:00:00 2001 From: Will Hawkins <[email protected]> Date: Tue, 11 Aug 2026 21:46:30 -0400 Subject: [PATCH] WIP: [lldb] Support Persistent Variables as DIL Identifiers When a persistent variable is used in a DIL expression, look it up as if it were any other identifier. Signed-off-by: Will Hawkins <[email protected]> --- lldb/include/lldb/ValueObject/DILEval.h | 7 +++++ lldb/source/ValueObject/DILEval.cpp | 37 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/lldb/include/lldb/ValueObject/DILEval.h b/lldb/include/lldb/ValueObject/DILEval.h index 489dc801b20db..3a873063adda1 100644 --- a/lldb/include/lldb/ValueObject/DILEval.h +++ b/lldb/include/lldb/ValueObject/DILEval.h @@ -18,6 +18,13 @@ namespace lldb_private::dil { +/// Given the name of a persistent identifier (i.e., one that starts with a $), +/// find the ValueObject for that name (if it exists). +lldb::ValueObjectSP LookupPersistentIdentifier(llvm::StringRef name_ref, + StackFrame &stack_frame, + lldb::TargetSP target_sp, + lldb::LanguageType language); + /// Given the name of an identifier (variable name, member name, type name, /// etc.), find the ValueObject for that name (if it exists), excluding global /// variables, and create and return an IdentifierInfo object containing all diff --git a/lldb/source/ValueObject/DILEval.cpp b/lldb/source/ValueObject/DILEval.cpp index 0ef4e244410a4..da7c7eaac16ac 100644 --- a/lldb/source/ValueObject/DILEval.cpp +++ b/lldb/source/ValueObject/DILEval.cpp @@ -8,16 +8,20 @@ #include "lldb/ValueObject/DILEval.h" #include "lldb/Core/Module.h" +#include "lldb/Expression/ExpressionVariable.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/TypeSystem.h" #include "lldb/Symbol/VariableList.h" #include "lldb/Target/RegisterContext.h" +#include "lldb/Target/Target.h" #include "lldb/Utility/LLDBLog.h" #include "lldb/ValueObject/DILAST.h" #include "lldb/ValueObject/DILParser.h" #include "lldb/ValueObject/ValueObject.h" #include "lldb/ValueObject/ValueObjectRegister.h" #include "lldb/ValueObject/ValueObjectVariable.h" +#include "lldb/lldb-enumerations.h" +#include "lldb/lldb-private-types.h" #include "llvm/Support/ErrorExtras.h" #include "llvm/Support/FormatAdapters.h" #include <memory> @@ -44,6 +48,17 @@ static lldb::ValueObjectSP ArrayToPointerConversion(ValueObject &valobj, /* do_deref */ false); } +static llvm::Expected<lldb::LanguageType> +GetSourceLanguageFromCU(StackFrame &ctx) { + SymbolContext symbol_context = + ctx.GetSymbolContext(lldb::eSymbolContextCompUnit); + if (!symbol_context.comp_unit) + return llvm::createStringErrorV("no compile unit for frame: {}", + ctx.GetFunctionName()); + + return symbol_context.comp_unit->GetLanguage(); +} + static llvm::Expected<lldb::TypeSystemSP> GetTypeSystemFromCU(StackFrame &ctx) { SymbolContext symbol_context = ctx.GetSymbolContext(lldb::eSymbolContextCompUnit); @@ -323,6 +338,20 @@ lldb::ValueObjectSP LookupGlobalIdentifier(llvm::StringRef name_ref, return nullptr; } +lldb::ValueObjectSP LookupPersistentIdentifier(llvm::StringRef name_ref, + StackFrame &stack_frame, + lldb::TargetSP target_sp, + lldb::LanguageType language) { + if (name_ref.starts_with("$")) { + if (auto *state = + target_sp->GetPersistentExpressionStateForLanguage(language)) + if (auto var_sp = state->GetVariable(name_ref)) + if (auto valobj_sp = var_sp->GetValueObject()) + return valobj_sp; + } + return nullptr; +} + lldb::ValueObjectSP LookupIdentifier(llvm::StringRef name_ref, StackFrame &stack_frame, lldb::DynamicValueType use_dynamic) { @@ -459,6 +488,14 @@ Interpreter::Visit(const IdentifierNode &node) { if (!identifier) identifier = LookupEnumValue(node.GetName(), m_stack_frame); + if (!identifier && node.GetName()[0] == '$') { + auto language = GetSourceLanguageFromCU(m_stack_frame); + if (!language) + return language.takeError(); + identifier = LookupPersistentIdentifier(node.GetName(), m_stack_frame, + m_target, language.get()); + } + if (!identifier && node.GetName() == "nullptr") { // If we got a "nullptr" identifier, and there is no defined variable with // this name, resolve it as a null pointer. _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
