[Lldb-commits] [lldb] WIP: [lldb] Support Persistent Variables as DIL Identifiers (PR #215706)
Will Hawkins via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 11 18:49:12 PDT 2026
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 <hawkinsw at obs.cr>
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 <hawkinsw at obs.cr>
---
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.
More information about the lldb-commits
mailing list