[Lldb-commits] [lldb] [lldb][DWARFASTParserClang] Resolve nested types when parsing structures (PR #66879)

Vlad Serebrennikov via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 26 10:03:01 PDT 2023


https://github.com/Endilll updated https://github.com/llvm/llvm-project/pull/66879

>From 72f83fb2944829c60bd6f12a079bfba95da4f6e7 Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov <serebrennikov.vladislav at gmail.com>
Date: Thu, 14 Sep 2023 09:46:53 +0300
Subject: [PATCH 1/3] Implementation (migrated from Phabricator)

---
 .../SymbolFile/DWARF/DWARFASTParserClang.cpp      | 15 +++++++++------
 .../SymbolFile/DWARF/DWARFASTParserClang.h        |  2 +-
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index 37fb16d4e0351c9..fc340da8eba0763 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -2150,14 +2150,14 @@ bool DWARFASTParserClang::CompleteRecordType(const DWARFDIE &die,
 
     std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> bases;
     // Parse members and base classes first
-    std::vector<DWARFDIE> member_function_dies;
+    std::vector<DWARFDIE> member_function_and_type_dies;
 
     DelayedPropertyList delayed_properties;
-    ParseChildMembers(die, clang_type, bases, member_function_dies,
+    ParseChildMembers(die, clang_type, bases, member_function_and_type_dies,
                       delayed_properties, default_accessibility, layout_info);
 
-    // Now parse any methods if there were any...
-    for (const DWARFDIE &die : member_function_dies)
+    // Now parse any methods or nested types if there were any...
+    for (const DWARFDIE &die : member_function_and_type_dies)
       dwarf->ResolveType(die);
 
     if (type_is_objc_object_or_interface) {
@@ -3153,7 +3153,7 @@ void DWARFASTParserClang::ParseSingleMember(
 bool DWARFASTParserClang::ParseChildMembers(
     const DWARFDIE &parent_die, CompilerType &class_clang_type,
     std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> &base_classes,
-    std::vector<DWARFDIE> &member_function_dies,
+    std::vector<DWARFDIE> &member_function_and_type_dies,
     DelayedPropertyList &delayed_properties,
     const AccessType default_accessibility,
     ClangASTImporter::LayoutInfo &layout_info) {
@@ -3189,8 +3189,11 @@ bool DWARFASTParserClang::ParseChildMembers(
       break;
 
     case DW_TAG_subprogram:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_structure_type:
+    case DW_TAG_union_type:
       // Let the type parsing code handle this one for us.
-      member_function_dies.push_back(die);
+      member_function_and_type_dies.push_back(die);
       break;
 
     case DW_TAG_inheritance:
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
index 88bfc490e890744..d4218959e61a8fa 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h
@@ -157,7 +157,7 @@ class DWARFASTParserClang : public DWARFASTParser {
   bool ParseChildMembers(
       const DWARFDIE &die, lldb_private::CompilerType &class_compiler_type,
       std::vector<std::unique_ptr<clang::CXXBaseSpecifier>> &base_classes,
-      std::vector<DWARFDIE> &member_function_dies,
+      std::vector<DWARFDIE> &member_function_and_type_dies,
       DelayedPropertyList &delayed_properties,
       const lldb::AccessType default_accessibility,
       lldb_private::ClangASTImporter::LayoutInfo &layout_info);

>From 4a4aa7ad35124414aafdb7db44c89e51f498aa83 Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov <serebrennikov.vladislav at gmail.com>
Date: Wed, 20 Sep 2023 12:32:44 +0300
Subject: [PATCH 2/3] Add an incomplete unit test

---
 .../DWARF/DWARFASTParserClangTests.cpp        | 93 +++++++++++++++++++
 1 file changed, 93 insertions(+)

diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
index 20a085741f73d00..d47f9b636ec15eb 100644
--- a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
@@ -462,3 +462,96 @@ TEST_F(DWARFASTParserClangTests, TestDefaultTemplateParamParsing) {
     }
   }
 }
+
+TEST_F(DWARFASTParserClangTests, EnsureNestedTypesOfTypeAreParsed) {
+  const char *yamldata = R"(
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_386
+DWARF:
+  debug_str:
+    - Info
+    - B
+    - C
+    - Mask
+    - Enum
+  debug_abbrev:
+    - Table:
+        - Code:            0x1
+          Tag:             DW_TAG_compile_unit
+          Children:        DW_CHILDREN_yes
+          Attributes:
+            - Attribute:       DW_AT_language
+              Form:            DW_FORM_data2
+        - Code:            0x2
+          Tag:             DW_TAG_structure_type
+          Children:        DW_CHILDREN_yes
+          Attributes:
+            - Attribute:       DW_AT_name
+              Form:            DW_FORM_strp
+        - Code:            0x3
+          Tag:             DW_TAG_union_type
+          Children:        DW_CHILDREN_no
+          Attributes:
+            - Attribute:       DW_AT_name
+              Form:            DW_FORM_strp
+        - Code:            0x4
+          Tag:             DW_TAG_structure_type
+          Children:        DW_CHILDREN_no
+          Attributes:
+            - Attribute:       DW_AT_name
+              Form:            DW_FORM_strp
+        - Code:            0x5
+          Tag:             DW_TAG_enumeration_type
+          Children:        DW_CHILDREN_yes
+          Attributes:
+            - Attribute:       DW_AT_name
+              Form:            DW_FORM_strp
+        - Code:            0x6
+          Tag:             DW_TAG_enumerator
+          Children:        DW_CHILDREN_no
+          Attributes:
+            - Attribute:       DW_AT_name
+              Form:            DW_FORM_strp  
+  debug_info:
+    - Version:         5
+      AddrSize:        8
+      UnitType:        DW_UT_compile
+      Entries:
+        - AbbrCode:        0x1
+          Values:
+            - Value:           0x21
+        - AbbrCode:        0x2
+          Values:
+            - Value:           0x0
+        - AbbrCode:        0x3
+          Values:
+            - Value:           0x5
+        - AbbrCode:        0x4
+          Values:
+            - Value:           0x7
+        - AbbrCode:        0x5
+          Values:
+            - Value:           0x9
+        - AbbrCode:        0x6
+          Values:
+            - Value:           0xE
+)";
+
+  YAMLModuleTester t(yamldata);
+
+  DWARFUnit *unit = t.GetDwarfUnit();
+  ASSERT_NE(unit, nullptr);
+  const DWARFDebugInfoEntry *cu_entry = unit->DIE().GetDIE();
+  ASSERT_EQ(cu_entry->Tag(), DW_TAG_compile_unit);
+  DWARFDIE cu_die(unit, cu_entry);
+
+  auto holder = std::make_unique<clang_utils::TypeSystemClangHolder>("ast");
+  auto &ast_ctx = *holder->GetAST();
+  DWARFASTParserClangStub ast_parser(ast_ctx);
+
+  EXPECT_TRUE(false);
+}

>From fdcf14efd2c5d84252c7b7be9049e68986458270 Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov <serebrennikov.vladislav at gmail.com>
Date: Tue, 26 Sep 2023 20:02:41 +0300
Subject: [PATCH 3/3] Redo incomplete unit test as API test

---
 lldb/test/API/lang/cpp/nested-type/Makefile   |  3 +
 .../lang/cpp/nested-type/TestNestedType.py    | 33 +++++++
 lldb/test/API/lang/cpp/nested-type/main.cpp   | 23 +++++
 .../DWARF/DWARFASTParserClangTests.cpp        | 93 -------------------
 4 files changed, 59 insertions(+), 93 deletions(-)
 create mode 100644 lldb/test/API/lang/cpp/nested-type/Makefile
 create mode 100644 lldb/test/API/lang/cpp/nested-type/TestNestedType.py
 create mode 100644 lldb/test/API/lang/cpp/nested-type/main.cpp

diff --git a/lldb/test/API/lang/cpp/nested-type/Makefile b/lldb/test/API/lang/cpp/nested-type/Makefile
new file mode 100644
index 000000000000000..99998b20bcb0502
--- /dev/null
+++ b/lldb/test/API/lang/cpp/nested-type/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/nested-type/TestNestedType.py b/lldb/test/API/lang/cpp/nested-type/TestNestedType.py
new file mode 100644
index 000000000000000..7aafda001a4eb3a
--- /dev/null
+++ b/lldb/test/API/lang/cpp/nested-type/TestNestedType.py
@@ -0,0 +1,33 @@
+"""
+Test that nested types are parsed
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+
+class CPPNestedTypeTestCase(TestBase):
+    def test_with_run_command(self):
+        """Test that nested types work in the expression evaluator"""
+        self.build()
+        lldbutil.run_to_source_breakpoint(
+            self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")
+        )
+
+        self.expect_expr(
+            "(int)PointerIntPairInfo::MaskAndShiftConstants::PointerBitMask",
+            result_type="int",
+            result_value="42",
+        )
+
+        self.expect_expr(
+            "sizeof(PointerIntPairInfo::B)",
+            result_type="unsigned long",
+            result_value="1",
+        )
+
+        self.expect_expr(
+            "sizeof(PointerIntPairInfo::C)",
+            result_type="unsigned long",
+            result_value="1",
+        )
diff --git a/lldb/test/API/lang/cpp/nested-type/main.cpp b/lldb/test/API/lang/cpp/nested-type/main.cpp
new file mode 100644
index 000000000000000..8ee06aac054544c
--- /dev/null
+++ b/lldb/test/API/lang/cpp/nested-type/main.cpp
@@ -0,0 +1,23 @@
+struct PointerIntPairInfo {
+  enum MaskAndShiftConstants : unsigned long {
+    PointerBitMask = 42,
+  };
+
+  union B {};
+  B b;
+
+  struct C {};
+  C c;
+
+  int a{};
+};
+
+static unsigned long foo() {
+  return PointerIntPairInfo::PointerBitMask;
+}
+
+int main()
+{
+    PointerIntPairInfo p;
+    return p.a + foo(); // breakpoint 1
+}
\ No newline at end of file
diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
index d47f9b636ec15eb..20a085741f73d00 100644
--- a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp
@@ -462,96 +462,3 @@ TEST_F(DWARFASTParserClangTests, TestDefaultTemplateParamParsing) {
     }
   }
 }
-
-TEST_F(DWARFASTParserClangTests, EnsureNestedTypesOfTypeAreParsed) {
-  const char *yamldata = R"(
---- !ELF
-FileHeader:
-  Class:   ELFCLASS64
-  Data:    ELFDATA2LSB
-  Type:    ET_EXEC
-  Machine: EM_386
-DWARF:
-  debug_str:
-    - Info
-    - B
-    - C
-    - Mask
-    - Enum
-  debug_abbrev:
-    - Table:
-        - Code:            0x1
-          Tag:             DW_TAG_compile_unit
-          Children:        DW_CHILDREN_yes
-          Attributes:
-            - Attribute:       DW_AT_language
-              Form:            DW_FORM_data2
-        - Code:            0x2
-          Tag:             DW_TAG_structure_type
-          Children:        DW_CHILDREN_yes
-          Attributes:
-            - Attribute:       DW_AT_name
-              Form:            DW_FORM_strp
-        - Code:            0x3
-          Tag:             DW_TAG_union_type
-          Children:        DW_CHILDREN_no
-          Attributes:
-            - Attribute:       DW_AT_name
-              Form:            DW_FORM_strp
-        - Code:            0x4
-          Tag:             DW_TAG_structure_type
-          Children:        DW_CHILDREN_no
-          Attributes:
-            - Attribute:       DW_AT_name
-              Form:            DW_FORM_strp
-        - Code:            0x5
-          Tag:             DW_TAG_enumeration_type
-          Children:        DW_CHILDREN_yes
-          Attributes:
-            - Attribute:       DW_AT_name
-              Form:            DW_FORM_strp
-        - Code:            0x6
-          Tag:             DW_TAG_enumerator
-          Children:        DW_CHILDREN_no
-          Attributes:
-            - Attribute:       DW_AT_name
-              Form:            DW_FORM_strp  
-  debug_info:
-    - Version:         5
-      AddrSize:        8
-      UnitType:        DW_UT_compile
-      Entries:
-        - AbbrCode:        0x1
-          Values:
-            - Value:           0x21
-        - AbbrCode:        0x2
-          Values:
-            - Value:           0x0
-        - AbbrCode:        0x3
-          Values:
-            - Value:           0x5
-        - AbbrCode:        0x4
-          Values:
-            - Value:           0x7
-        - AbbrCode:        0x5
-          Values:
-            - Value:           0x9
-        - AbbrCode:        0x6
-          Values:
-            - Value:           0xE
-)";
-
-  YAMLModuleTester t(yamldata);
-
-  DWARFUnit *unit = t.GetDwarfUnit();
-  ASSERT_NE(unit, nullptr);
-  const DWARFDebugInfoEntry *cu_entry = unit->DIE().GetDIE();
-  ASSERT_EQ(cu_entry->Tag(), DW_TAG_compile_unit);
-  DWARFDIE cu_die(unit, cu_entry);
-
-  auto holder = std::make_unique<clang_utils::TypeSystemClangHolder>("ast");
-  auto &ast_ctx = *holder->GetAST();
-  DWARFASTParserClangStub ast_parser(ast_ctx);
-
-  EXPECT_TRUE(false);
-}



More information about the lldb-commits mailing list