https://github.com/labath created https://github.com/llvm/llvm-project/pull/126902
The llvm versions of these functions do that, so we must to so as well. Practically this meant that were were unable to correctly un-simplify the names of some types when using type units, which resulted in type lookup errors. >From 2c8e19be624a2ce6687f92840a2e494075024754 Mon Sep 17 00:00:00 2001 From: Pavel Labath <pa...@labath.sk> Date: Wed, 12 Feb 2025 13:34:03 +0100 Subject: [PATCH] [lldb/DWARF] Resolve type unit references in llvm DWARFDIE compatibility wrappers The llvm versions of these functions do that, so we must to so as well. Practically this meant that were were unable to correctly un-simplify the names of some types when using type units, which resulted in type lookup errors. --- .../Plugins/SymbolFile/DWARF/DWARFDIE.cpp | 4 ++-- .../DWARF/x86/simplified-template-names.cpp | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index 1e2564cb22f25..0db230d0a8b56 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -622,12 +622,12 @@ std::optional<uint64_t> DWARFDIE::getLanguage() const { } DWARFDIE DWARFDIE::resolveReferencedType(dw_attr_t attr) const { - return GetReferencedDIE(attr); + return GetReferencedDIE(attr).resolveTypeUnitReference(); } DWARFDIE DWARFDIE::resolveReferencedType(DWARFFormValue v) const { if (IsValid()) - return v.Reference(); + return v.Reference().resolveTypeUnitReference(); return {}; } diff --git a/lldb/test/Shell/SymbolFile/DWARF/x86/simplified-template-names.cpp b/lldb/test/Shell/SymbolFile/DWARF/x86/simplified-template-names.cpp index 328d6d2e16d59..ad5dfb6a6dded 100644 --- a/lldb/test/Shell/SymbolFile/DWARF/x86/simplified-template-names.cpp +++ b/lldb/test/Shell/SymbolFile/DWARF/x86/simplified-template-names.cpp @@ -11,12 +11,23 @@ // Test that we following DW_AT_signature correctly. If not, lldb might confuse the types of v1 and v2. // RUN: %clangxx --target=x86_64-pc-linux -g -gsimple-template-names -fdebug-types-section %s -c -o %t2.o // RUN: ld.lld %t2.o -o %t2 -// RUN: %lldb %t2 -o "target variable v1 v2" -o exit | FileCheck %s --check-prefix=TYPE +// RUN: %lldb %t2 -o "target variable v1 v2" \ +// RUN: -o "type lookup t2<outer_struct1>" -o "type lookup t2<outer_struct2>" \ +// RUN: -o exit | FileCheck %s --check-prefix=TYPE // LOG: unique name: t3<t2<int> >::t4 -// TYPE: (t2<outer_struct1::t1<int> >) v1 = {} -// TYPE-NEXT: (t2<outer_struct2::t1<int> >) v2 = {} +// TYPE-LABEL: target variable v1 v2 +// TYPE: (t2<outer_struct1::t1<int> >) v1 = {} +// TYPE: (t2<outer_struct2::t1<int> >) v2 = {} + +// TYPE-LABEL: type lookup t2<outer_struct1> +// TYPE: template<> struct t2<outer_struct1> { +// TYPE-NEXT: } + +// TYPE-LABEL: type lookup t2<outer_struct2> +// TYPE: template<> struct t2<outer_struct2> { +// TYPE-NEXT: } struct outer_struct1 { template <typename> struct t1 {}; @@ -30,6 +41,9 @@ template <typename> struct t2 {}; t2<outer_struct1::t1<int>> v1; t2<outer_struct2::t1<int>> v2; +t2<outer_struct1> v1_1; +t2<outer_struct2> v1_2; + template <typename> struct t3 { struct t4 {}; }; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits