[Lldb-commits] [lldb] [lldb] Make SBType know its dynamic-ness (PR #207743)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 8 01:15:56 PDT 2026
https://github.com/labath updated https://github.com/llvm/llvm-project/pull/207743
>From df80d3e2dd9aaa38f175030bb30b5387e01271ae Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Wed, 8 Jul 2026 10:12:52 +0200
Subject: [PATCH] [lldb] Return static SBType for static SBValues
The type should reflect our view of the value. To enable looking at the
nested types of dynamic types, I change TypeImpl::FindDirectNestedType
to prefer dynamic types (if it exists). To get the previous behavior,
explicitly ask for a static type from the value.
---
lldb/source/API/SBValue.cpp | 2 ++
lldb/source/Symbol/Type.cpp | 2 +-
lldb/test/API/python_api/type/TestTypeList.py | 23 +++++++++++++++++++
lldb/test/API/python_api/type/main.cpp | 11 +++++++++
4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/lldb/source/API/SBValue.cpp b/lldb/source/API/SBValue.cpp
index 9b84fb975c302..a4d8a790071de 100644
--- a/lldb/source/API/SBValue.cpp
+++ b/lldb/source/API/SBValue.cpp
@@ -229,6 +229,8 @@ SBType SBValue::GetType() {
ValueLocker locker;
lldb::ValueObjectSP value_sp(GetSP(locker));
TypeImplSP type_sp;
+ if (value_sp && GetPreferDynamicValue() == eNoDynamicValues)
+ value_sp = value_sp->GetStaticValue();
if (value_sp) {
type_sp = std::make_shared<TypeImpl>(value_sp->GetTypeImpl());
sb_type.SetSP(type_sp);
diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp
index 7681d7065a522..9b62018bbd3d8 100644
--- a/lldb/source/Symbol/Type.cpp
+++ b/lldb/source/Symbol/Type.cpp
@@ -1215,7 +1215,7 @@ bool TypeImpl::GetDescription(lldb_private::Stream &strm,
CompilerType TypeImpl::FindDirectNestedType(llvm::StringRef name) {
if (name.empty())
return CompilerType();
- return GetCompilerType(/*prefer_dynamic=*/false)
+ return GetCompilerType(/*prefer_dynamic=*/true)
.GetDirectNestedTypeWithName(name);
}
diff --git a/lldb/test/API/python_api/type/TestTypeList.py b/lldb/test/API/python_api/type/TestTypeList.py
index e4dc810169089..1097f75e4e49a 100644
--- a/lldb/test/API/python_api/type/TestTypeList.py
+++ b/lldb/test/API/python_api/type/TestTypeList.py
@@ -300,6 +300,29 @@ def test_nested_typedef(self):
self.assertTrue(the_typedef)
self.assertEqual(the_typedef.GetTypedefedType().GetName(), "int")
+ @expectedFailureWindows # Dynamic type resolution not implemented
+ def test_dynamic_values(self):
+ """Test FindDirectNestedType on dynamic values"""
+
+ self.build()
+ lldbutil.run_to_line_breakpoint(self, lldb.SBFileSpec(self.source), self.line)
+ polymorphic = (
+ self.frame()
+ .FindVariable("polymorphic")
+ .GetDynamicValue(lldb.eDynamicDontRunTarget)
+ )
+ self.DebugSBValue(polymorphic)
+ polymorphic_type = polymorphic.GetType().GetPointeeType()
+ self.DebugSBType(polymorphic_type)
+ nested = polymorphic_type.FindDirectNestedType("Nested")
+ self.DebugSBType(nested)
+ self.assertEqual(nested.GetName(), "PolymorphicDerived::Nested")
+
+ static = polymorphic.GetStaticValue()
+ self.DebugSBValue(static)
+ static_type = static.GetType().GetPointeeType()
+ self.assertFalse(static_type.FindDirectNestedType("Nested"))
+
def test_GetByteAlign(self):
"""Exercise SBType::GetByteAlign"""
self.build()
diff --git a/lldb/test/API/python_api/type/main.cpp b/lldb/test/API/python_api/type/main.cpp
index 449f77db0d75e..3d31790be05ee 100644
--- a/lldb/test/API/python_api/type/main.cpp
+++ b/lldb/test/API/python_api/type/main.cpp
@@ -63,6 +63,15 @@ struct WithNestedTypedef {
};
WithNestedTypedef::TheTypedef typedefed_value;
+struct PolymorphicBase {
+ virtual void foo() {}
+};
+
+struct PolymorphicDerived : PolymorphicBase {
+ struct Nested {};
+ Nested get() { return {}; }
+};
+
int main (int argc, char const *argv[])
{
Task *task_head = new Task(-1, NULL);
@@ -100,5 +109,7 @@ int main (int argc, char const *argv[])
PointerInfo<3>::Masks1 mask1 = PointerInfo<3>::Masks1::pointer_mask;
PointerInfo<3>::Masks2 mask2 = PointerInfo<3>::Masks2::pointer_mask;
+ PolymorphicBase *polymorphic = new PolymorphicDerived();
+
return 0; // Break at this line
}
More information about the lldb-commits
mailing list