Author: Zequan Wu Date: 2022-03-15T14:06:54-07:00 New Revision: 583223cd5ec42f369702a146eaac1bf20bdfbd46
URL: https://github.com/llvm/llvm-project/commit/583223cd5ec42f369702a146eaac1bf20bdfbd46 DIFF: https://github.com/llvm/llvm-project/commit/583223cd5ec42f369702a146eaac1bf20bdfbd46.diff LOG: [LLDB][NativePDB] Don't complete static members' types when completing a record type. `UdtRecordCompleter` shouldn't complete static members' types. static members' types are going to be completed when the types are called in `SymbolFile::CompleteType`. Reviewed By: labath Differential Revision: https://reviews.llvm.org/D121030 Added: lldb/test/Shell/SymbolFile/NativePDB/Inputs/lookup-by-types.lldbinit lldb/test/Shell/SymbolFile/NativePDB/lookup-by-types.cpp Modified: lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp index c2c89bdf4ce83..c6f9ef66a4819 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -1231,8 +1231,10 @@ clang::QualType PdbAstBuilder::CreateEnumType(PdbTypeSymId id, clang::QualType PdbAstBuilder::CreateArrayType(const ArrayRecord &ar) { clang::QualType element_type = GetOrCreateType(ar.ElementType); - uint64_t element_count = - ar.Size / GetSizeOfType({ar.ElementType}, m_index.tpi()); + uint64_t element_size = GetSizeOfType({ar.ElementType}, m_index.tpi()); + if (element_size == 0) + return {}; + uint64_t element_count = ar.Size / element_size; CompilerType array_ct = m_clang.CreateArrayType(ToCompilerType(element_type), element_count, false); diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp index 582c6d2827231..856ba1cb296d8 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp @@ -138,8 +138,6 @@ Error UdtRecordCompleter::visitKnownMember( clang::QualType member_type = m_ast_builder.GetOrCreateType(PdbTypeSymId(static_data_member.Type)); - m_ast_builder.CompleteType(member_type); - CompilerType member_ct = m_ast_builder.ToCompilerType(member_type); lldb::AccessType access = @@ -149,7 +147,7 @@ Error UdtRecordCompleter::visitKnownMember( // Static constant members may be a const[expr] declaration. // Query the symbol's value as the variable initializer if valid. - if (member_ct.IsConst()) { + if (member_ct.IsConst() && member_ct.IsCompleteType()) { std::string qual_name = decl->getQualifiedNameAsString(); auto results = diff --git a/lldb/test/Shell/SymbolFile/NativePDB/Inputs/lookup-by-types.lldbinit b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/lookup-by-types.lldbinit new file mode 100644 index 0000000000000..afe3f2c8b943e --- /dev/null +++ b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/lookup-by-types.lldbinit @@ -0,0 +1,4 @@ +image lookup -type A +image lookup -type B + +quit \ No newline at end of file diff --git a/lldb/test/Shell/SymbolFile/NativePDB/lookup-by-types.cpp b/lldb/test/Shell/SymbolFile/NativePDB/lookup-by-types.cpp new file mode 100644 index 0000000000000..f3aea8115f385 --- /dev/null +++ b/lldb/test/Shell/SymbolFile/NativePDB/lookup-by-types.cpp @@ -0,0 +1,46 @@ +// clang-format off + +// RUN: %build -o %t.exe -- %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ +// RUN: %p/Inputs/lookup-by-types.lldbinit 2>&1 | FileCheck %s + +class B; +class A { +public: + static const A constA; + static A a; + static B b; + int val = 1; +}; +class B { +public: + static A a; + int val = 2; +}; +A varA; +B varB; +const A A::constA = varA; +A A::a = varA; +B A::b = varB; +A B::a = varA; + +int main(int argc, char **argv) { + return varA.val + varB.val; +} + +// CHECK: image lookup -type A +// CHECK-NEXT: 1 match found in {{.*}}.exe +// CHECK-NEXT: compiler_type = "class A { +// CHECK-NEXT: static const A constA; +// CHECK-NEXT: static A a; +// CHECK-NEXT: static B b; +// CHECK-NEXT: public: +// CHECK-NEXT: int val; +// CHECK-NEXT: }" +// CHECK: image lookup -type B +// CHECK-NEXT: 1 match found in {{.*}}.exe +// CHECK-NEXT: compiler_type = "class B { +// CHECK-NEXT: static A a; +// CHECK-NEXT: public: +// CHECK-NEXT: int val; +// CHECK-NEXT: }" _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits