https://github.com/Michael137 updated 
https://github.com/llvm/llvm-project/pull/149112

>From c14caf77cd3fbb0d4d94a9e34122bc75eb07dfb8 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuc...@gmail.com>
Date: Wed, 16 Jul 2025 16:01:30 +0100
Subject: [PATCH 1/3] [lldb][SBType] GetBasicType to unwrap canonical type

`SBType::GetBasicType` fails on typedefs to primitive types. The docs for 
`GetBasicType` state:
```
Returns the BasicType value that is most appropriate to this type
```
But, e.g., for `uint64_t` this would currently return `eBasicTypeInvalid`.

`TypeSystemClang::GetBasicTypeEnumeration` (which is what
`SBType::GetBasicType` uses) doesn't see through typedefs.
Inside LLDB we almost always call `GetBasicTypeEnumeration`
on the canonical type. In the cases we don't I suspect those were just
subtle bugs. This patch gets the canonical type inside of
`GetBasicTypeEnumeration` instead.

rdar://155829208
---
 .../TypeSystem/Clang/TypeSystemClang.cpp      |  2 +-
 lldb/source/Symbol/CompilerType.cpp           | 10 +++---
 lldb/source/ValueObject/ValueObject.cpp       |  8 ++---
 .../API/python_api/sbtype_basic_type/Makefile |  3 ++
 .../sbtype_basic_type/TestSBTypeBasicType.py  | 32 +++++++++++++++++++
 .../API/python_api/sbtype_basic_type/main.cpp | 11 +++++++
 6 files changed, 55 insertions(+), 11 deletions(-)
 create mode 100644 lldb/test/API/python_api/sbtype_basic_type/Makefile
 create mode 100644 
lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
 create mode 100644 lldb/test/API/python_api/sbtype_basic_type/main.cpp

diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp 
b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 82e07bb8e0ffb..216d5a9f4745f 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -5467,7 +5467,7 @@ CompilerType 
TypeSystemClang::GetBuiltinTypeByName(ConstString name) {
 lldb::BasicType
 TypeSystemClang::GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) {
   if (type) {
-    clang::QualType qual_type(GetQualType(type));
+    clang::QualType qual_type(GetCanonicalQualType(type));
     const clang::Type::TypeClass type_class = qual_type->getTypeClass();
     if (type_class == clang::Type::Builtin) {
       switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind()) {
diff --git a/lldb/source/Symbol/CompilerType.cpp 
b/lldb/source/Symbol/CompilerType.cpp
index dd81fc2361f88..62c0ddf51c012 100644
--- a/lldb/source/Symbol/CompilerType.cpp
+++ b/lldb/source/Symbol/CompilerType.cpp
@@ -354,12 +354,11 @@ bool CompilerType::IsSigned() const {
 }
 
 bool CompilerType::IsNullPtrType() const {
-  return GetCanonicalType().GetBasicTypeEnumeration() ==
-         lldb::eBasicTypeNullPtr;
+  return GetBasicTypeEnumeration() == lldb::eBasicTypeNullPtr;
 }
 
 bool CompilerType::IsBoolean() const {
-  return GetCanonicalType().GetBasicTypeEnumeration() == lldb::eBasicTypeBool;
+  return GetBasicTypeEnumeration() == lldb::eBasicTypeBool;
 }
 
 bool CompilerType::IsEnumerationIntegerTypeSigned() const {
@@ -379,7 +378,7 @@ bool CompilerType::IsPromotableIntegerType() const {
   if (IsUnscopedEnumerationType())
     return true;
 
-  switch (GetCanonicalType().GetBasicTypeEnumeration()) {
+  switch (GetBasicTypeEnumeration()) {
   case lldb::eBasicTypeBool:
   case lldb::eBasicTypeChar:
   case lldb::eBasicTypeSignedChar:
@@ -455,8 +454,7 @@ bool CompilerType::IsContextuallyConvertibleToBool() const {
 }
 
 bool CompilerType::IsBasicType() const {
-  return GetCanonicalType().GetBasicTypeEnumeration() !=
-         lldb::eBasicTypeInvalid;
+  return GetBasicTypeEnumeration() != lldb::eBasicTypeInvalid;
 }
 
 std::string CompilerType::TypeDescription() {
diff --git a/lldb/source/ValueObject/ValueObject.cpp 
b/lldb/source/ValueObject/ValueObject.cpp
index a6fb3fad65251..84ad130299221 100644
--- a/lldb/source/ValueObject/ValueObject.cpp
+++ b/lldb/source/ValueObject/ValueObject.cpp
@@ -3228,8 +3228,8 @@ lldb::ValueObjectSP 
ValueObject::CastToBasicType(CompilerType type) {
         llvm::APSInt ext =
             int_value_or_err->extOrTrunc(type_byte_size * CHAR_BIT);
         Scalar scalar_int(ext);
-        llvm::APFloat f = scalar_int.CreateAPFloatFromAPSInt(
-            type.GetCanonicalType().GetBasicTypeEnumeration());
+        llvm::APFloat f =
+            scalar_int.CreateAPFloatFromAPSInt(type.GetBasicTypeEnumeration());
         return ValueObject::CreateValueObjectFromAPFloat(target, f, type,
                                                          "result");
       } else {
@@ -3245,7 +3245,7 @@ lldb::ValueObjectSP 
ValueObject::CastToBasicType(CompilerType type) {
         if (int_value_or_err) {
           Scalar scalar_int(*int_value_or_err);
           llvm::APFloat f = scalar_int.CreateAPFloatFromAPSInt(
-              type.GetCanonicalType().GetBasicTypeEnumeration());
+              type.GetBasicTypeEnumeration());
           return ValueObject::CreateValueObjectFromAPFloat(target, f, type,
                                                            "result");
         } else {
@@ -3261,7 +3261,7 @@ lldb::ValueObjectSP 
ValueObject::CastToBasicType(CompilerType type) {
         if (float_value_or_err) {
           Scalar scalar_float(*float_value_or_err);
           llvm::APFloat f = scalar_float.CreateAPFloatFromAPFloat(
-              type.GetCanonicalType().GetBasicTypeEnumeration());
+              type.GetBasicTypeEnumeration());
           return ValueObject::CreateValueObjectFromAPFloat(target, f, type,
                                                            "result");
         } else {
diff --git a/lldb/test/API/python_api/sbtype_basic_type/Makefile 
b/lldb/test/API/python_api/sbtype_basic_type/Makefile
new file mode 100644
index 0000000000000..99998b20bcb05
--- /dev/null
+++ b/lldb/test/API/python_api/sbtype_basic_type/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py 
b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
new file mode 100644
index 0000000000000..ba74341324039
--- /dev/null
+++ b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
@@ -0,0 +1,32 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+    def test(self):
+        """Test that SBType.GetBasicType unwraps typedefs."""
+        self.build()
+        lldbutil.run_to_source_breakpoint(
+            self, "return", lldb.SBFileSpec("main.cpp")
+        )
+
+        a = self.frame().FindVariable("a")
+        self.assertTrue(a)
+
+        int_basic_type = a.GetType().GetBasicType()
+        self.assertEqual(int_basic_type, 13)
+
+        b = self.frame().FindVariable("b")
+        self.assertTrue(b)
+
+        c = self.frame().FindVariable("c")
+        self.assertTrue(c)
+
+        d = self.frame().FindVariable("d")
+        self.assertTrue(d)
+
+        self.assertEqual(a.GetType().GetBasicType(), int_basic_type)
+        self.assertEqual(b.GetType().GetBasicType(), int_basic_type)
+        self.assertEqual(c.GetType().GetBasicType(), int_basic_type)
diff --git a/lldb/test/API/python_api/sbtype_basic_type/main.cpp 
b/lldb/test/API/python_api/sbtype_basic_type/main.cpp
new file mode 100644
index 0000000000000..7ded37186edaf
--- /dev/null
+++ b/lldb/test/API/python_api/sbtype_basic_type/main.cpp
@@ -0,0 +1,11 @@
+using T1 = int;
+using T2 = T1;
+using T3 = T2;
+
+int main() {
+  int a;
+  T1 b;
+  T2 c;
+  T3 d;
+  return 0;
+}

>From be0b111af98c1b628b4a8c416719302afe52355b Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuc...@gmail.com>
Date: Wed, 16 Jul 2025 16:08:18 +0100
Subject: [PATCH 2/3] fixup! adjust test assertion

---
 .../API/python_api/sbtype_basic_type/TestSBTypeBasicType.py     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py 
b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
index ba74341324039..3693d45c1a246 100644
--- a/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
+++ b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
@@ -27,6 +27,6 @@ def test(self):
         d = self.frame().FindVariable("d")
         self.assertTrue(d)
 
-        self.assertEqual(a.GetType().GetBasicType(), int_basic_type)
         self.assertEqual(b.GetType().GetBasicType(), int_basic_type)
         self.assertEqual(c.GetType().GetBasicType(), int_basic_type)
+        self.assertEqual(d.GetType().GetBasicType(), int_basic_type)

>From 746d843890a22eadaf5b320058df3c7afb53fd9d Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuc...@gmail.com>
Date: Wed, 16 Jul 2025 16:09:00 +0100
Subject: [PATCH 3/3] fixup! python format

---
 .../API/python_api/sbtype_basic_type/TestSBTypeBasicType.py   | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py 
b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
index 3693d45c1a246..535d8b900673e 100644
--- a/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
+++ b/lldb/test/API/python_api/sbtype_basic_type/TestSBTypeBasicType.py
@@ -8,9 +8,7 @@ class TestCase(TestBase):
     def test(self):
         """Test that SBType.GetBasicType unwraps typedefs."""
         self.build()
-        lldbutil.run_to_source_breakpoint(
-            self, "return", lldb.SBFileSpec("main.cpp")
-        )
+        lldbutil.run_to_source_breakpoint(self, "return", 
lldb.SBFileSpec("main.cpp"))
 
         a = self.frame().FindVariable("a")
         self.assertTrue(a)

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to