[llvm-branch-commits] [lldb] [lldb] Fix DIL losing StackFrame context after casting to pointer (PR #222386)

Ilia Kuklin via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sat Sep 12 06:19:41 PDT 2026


https://github.com/kuilpd updated https://github.com/llvm/llvm-project/pull/222386

>From 7c3884e057b7a768784e421832473bb0d9dae86b Mon Sep 17 00:00:00 2001
From: Ilia Kuklin <ikuklin at accesssoftek.com>
Date: Tue, 8 Sep 2026 21:31:16 +0500
Subject: [PATCH] [lldb] Fix DIL losing StackFrame context after casting to
 pointer

---
 lldb/source/ValueObject/DILEval.cpp           |  8 +++---
 .../TestCreateValueFromExpression.py          | 25 ++++++++++++-------
 2 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/lldb/source/ValueObject/DILEval.cpp b/lldb/source/ValueObject/DILEval.cpp
index 627d30cae9bec..10dcdaf08fc65 100644
--- a/lldb/source/ValueObject/DILEval.cpp
+++ b/lldb/source/ValueObject/DILEval.cpp
@@ -2057,11 +2057,9 @@ llvm::Expected<lldb::ValueObjectSP> Interpreter::Visit(const CastNode &node) {
                         ? operand->GetLoadAddress()
                         : (op_type.IsSigned() ? operand->GetValueAsSigned(0)
                                               : operand->GetValueAsUnsigned(0));
-    llvm::StringRef name = "result";
-    ExecutionContext exe_ctx(m_target.get(), false);
-    result = ValueObject::CreateValueObjectFromAddress(name, addr, exe_ctx,
-                                                       target_type,
-                                                       /* do_deref */ false);
+    result = ValueObject::CreateValueObjectFromAddress(
+        "result", addr, m_stack_frame, target_type,
+        /* do_deref */ false);
     break;
   }
   case CastKind::eNone: {
diff --git a/lldb/test/API/commands/frame/var-dil/expr/CreateValueFromExpression/TestCreateValueFromExpression.py b/lldb/test/API/commands/frame/var-dil/expr/CreateValueFromExpression/TestCreateValueFromExpression.py
index f105adc87ac14..f328c203869ae 100644
--- a/lldb/test/API/commands/frame/var-dil/expr/CreateValueFromExpression/TestCreateValueFromExpression.py
+++ b/lldb/test/API/commands/frame/var-dil/expr/CreateValueFromExpression/TestCreateValueFromExpression.py
@@ -33,17 +33,21 @@ def test_formatter(self):
         self.assertEqual(v1.GetValue(), "1")
         v2 = i.CreateValueFromExpression("v2", "static_cast<double>(i) + 2.5")
         self.assertEqual(v2.GetValue(), "2.5")
+        v3 = i.CreateValueFromExpression("v3", "(int *) 0")
+        self.assertEqual(v3.GetTypeName(), "int *")
+        v4 = v3.CreateValueFromExpression("v4", "i + 4")
+        self.assertEqual(v4.GetValue(), "4")
         expr_options = lldb.SBExpressionOptions()
-        v3 = i.CreateValueFromExpression("v3", "i + 3", expr_options)
-        self.assertEqual(v3.GetValue(), "3")
+        v5 = i.CreateValueFromExpression("v5", "i + 5", expr_options)
+        self.assertEqual(v5.GetValue(), "5")
         self.runCmd(
             "settings set target.experimental.use-DIL-for-creating-values false"
         )
-        v4 = i.CreateValueFromExpression("v4", "i + 4")
-        self.assertEqual(v4.GetValue(), "4")
+        v6 = i.CreateValueFromExpression("v6", "i + 6")
+        self.assertEqual(v6.GetValue(), "6")
         expr_options.SetTryDILFirst(True)
-        v5 = i.CreateValueFromExpression("v5", "i + 5", expr_options)
-        self.assertEqual(v5.GetValue(), "5")
+        v7 = i.CreateValueFromExpression("v7", "i + 7", expr_options)
+        self.assertEqual(v7.GetValue(), "7")
 
         with open(log_file, "r") as f:
             log = f.read()
@@ -53,9 +57,12 @@ def test_formatter(self):
         # Check that if DIL cannot evaluate the expression, it falls back to
         # full expression evaluation
         self.assertGreater(log.find("v2 = 2.5 (evaluated by: UserExpression)"), 0)
+        # Check that values can be created from values created by DIL
+        self.assertGreater(log.find("0000 (evaluated by: DIL)"), 0)
+        self.assertGreater(log.find("v4 = 4 (evaluated by: DIL)"), 0)
         # Check that trying DIL can be disabled through expression options parameter
-        self.assertGreater(log.find("v3 = 3 (evaluated by: UserExpression)"), 0)
+        self.assertGreater(log.find("v5 = 5 (evaluated by: UserExpression)"), 0)
         # Check that using DIL was disabled after disabling the lldb setting
-        self.assertGreater(log.find("v4 = 4 (evaluated by: UserExpression)"), 0)
+        self.assertGreater(log.find("v6 = 6 (evaluated by: UserExpression)"), 0)
         # Check that trying DIL can be enabled through expression options parameter
-        self.assertGreater(log.find("v5 = 5 (evaluated by: DIL)"), 0)
+        self.assertGreater(log.find("v7 = 7 (evaluated by: DIL)"), 0)



More information about the llvm-branch-commits mailing list