Author: labath Date: Tue Sep 24 05:36:54 2019 New Revision: 372744 URL: http://llvm.org/viewvc/llvm-project?rev=372744&view=rev Log: Enhance SymbolFileDWARF::ParseDeclsForContext performance
This implements DWARFASTParserClang::EnsureAllDIEsInDeclContextHaveBeenParsed so as to provide a faster way to ensure all DIEs linked to a certain declaration context have been parsed. Currently, we rely on SymbolFileDWARF::ParseDeclsForContext calling DWARFASTParserClang::GetDIEForDeclContext, and only then DWARFASTParserClang::GetDeclForUIDFromDWARF. This change shortcuts that logic and removes redundant calls to DWARFASTParserClang:: GetClangDeclForDIE by deleting DIEs from the m_decl_ctx_to_die map once they have been parsed. Differential Revision: https://reviews.llvm.org/D67760 Patch by Guilherme Andrade <guiandr...@google.com>. Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h?rev=372744&r1=372743&r2=372744&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h Tue Sep 24 05:36:54 2019 @@ -48,8 +48,8 @@ public: virtual lldb_private::CompilerDeclContext GetDeclContextContainingUIDFromDWARF(const DWARFDIE &die) = 0; - virtual std::vector<DWARFDIE> - GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context) = 0; + virtual void EnsureAllDIEsInDeclContextHaveBeenParsed( + lldb_private::CompilerDeclContext decl_context) = 0; static llvm::Optional<lldb_private::SymbolFile::ArrayInfo> ParseChildArrayInfo(const DWARFDIE &parent_die, Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=372744&r1=372743&r2=372744&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Tue Sep 24 05:36:54 2019 @@ -2183,15 +2183,16 @@ bool DWARFASTParserClang::CompleteTypeFr return false; } -std::vector<DWARFDIE> DWARFASTParserClang::GetDIEForDeclContext( +void DWARFASTParserClang::EnsureAllDIEsInDeclContextHaveBeenParsed( lldb_private::CompilerDeclContext decl_context) { - std::vector<DWARFDIE> result; auto opaque_decl_ctx = (clang::DeclContext *)decl_context.GetOpaqueDeclContext(); for (auto it = m_decl_ctx_to_die.find(opaque_decl_ctx); - it != m_decl_ctx_to_die.end() && it->first == opaque_decl_ctx; it++) - result.push_back(it->second); - return result; + it != m_decl_ctx_to_die.end() && it->first == opaque_decl_ctx; + it = m_decl_ctx_to_die.erase(it)) + for (DWARFDIE decl = it->second.GetFirstChild(); decl; + decl = decl.GetSibling()) + GetClangDeclForDIE(decl); } CompilerDecl DWARFASTParserClang::GetDeclForUIDFromDWARF(const DWARFDIE &die) { Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h?rev=372744&r1=372743&r2=372744&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h Tue Sep 24 05:36:54 2019 @@ -51,8 +51,8 @@ public: lldb_private::CompilerDecl GetDeclForUIDFromDWARF(const DWARFDIE &die) override; - std::vector<DWARFDIE> - GetDIEForDeclContext(lldb_private::CompilerDeclContext decl_context) override; + void EnsureAllDIEsInDeclContextHaveBeenParsed( + lldb_private::CompilerDeclContext decl_context) override; lldb_private::CompilerDeclContext GetDeclContextForUIDFromDWARF(const DWARFDIE &die) override; Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=372744&r1=372743&r2=372744&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue Sep 24 05:36:54 2019 @@ -1217,16 +1217,9 @@ bool SymbolFileDWARF::ClassOrStructIsVir void SymbolFileDWARF::ParseDeclsForContext(CompilerDeclContext decl_ctx) { auto *type_system = decl_ctx.GetTypeSystem(); - if (!type_system) - return; - DWARFASTParser *ast_parser = type_system->GetDWARFParser(); - std::vector<DWARFDIE> decl_ctx_die_list = - ast_parser->GetDIEForDeclContext(decl_ctx); - - for (DWARFDIE decl_ctx_die : decl_ctx_die_list) - for (DWARFDIE decl = decl_ctx_die.GetFirstChild(); decl; - decl = decl.GetSibling()) - ast_parser->GetDeclForUIDFromDWARF(decl); + if (type_system != nullptr) + type_system->GetDWARFParser()->EnsureAllDIEsInDeclContextHaveBeenParsed( + decl_ctx); } user_id_t SymbolFileDWARF::GetUID(DIERef ref) { Modified: lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp?rev=372744&r1=372743&r2=372744&view=diff ============================================================================== --- lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp (original) +++ lldb/trunk/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp Tue Sep 24 05:36:54 2019 @@ -6,6 +6,7 @@ // //===----------------------------------------------------------------------===// +#include "gmock/gmock.h" #include "gtest/gtest.h" #include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h" @@ -19,29 +20,36 @@ class DWARFASTParserClangStub : public D public: using DWARFASTParserClang::DWARFASTParserClang; using DWARFASTParserClang::LinkDeclContextToDIE; + + std::vector<const clang::DeclContext *> GetDeclContextToDIEMapKeys() { + std::vector<const clang::DeclContext *> keys; + for (const auto &it : m_decl_ctx_to_die) + keys.push_back(it.first); + return keys; + } }; } // namespace // If your implementation needs to dereference the dummy pointers we are // defining here, causing this test to fail, feel free to delete it. TEST(DWARFASTParserClangTests, - TestGetDIEForDeclContextReturnsOnlyMatchingEntries) { + EnsureAllDIEsInDeclContextHaveBeenParsedParsesOnlyMatchingEntries) { ClangASTContext ast_ctx; DWARFASTParserClangStub ast_parser(ast_ctx); DWARFUnit *unit = nullptr; - DWARFDIE die1(unit, (DWARFDebugInfoEntry *)1LL); - DWARFDIE die2(unit, (DWARFDebugInfoEntry *)2LL); - DWARFDIE die3(unit, (DWARFDebugInfoEntry *)3LL); - DWARFDIE die4(unit, (DWARFDebugInfoEntry *)4LL); - ast_parser.LinkDeclContextToDIE((clang::DeclContext *)1LL, die1); - ast_parser.LinkDeclContextToDIE((clang::DeclContext *)2LL, die2); - ast_parser.LinkDeclContextToDIE((clang::DeclContext *)2LL, die3); - ast_parser.LinkDeclContextToDIE((clang::DeclContext *)3LL, die4); - - auto die_list = ast_parser.GetDIEForDeclContext( - CompilerDeclContext(nullptr, (clang::DeclContext *)2LL)); - ASSERT_EQ(2u, die_list.size()); - ASSERT_EQ(die2, die_list[0]); - ASSERT_EQ(die3, die_list[1]); + std::vector<DWARFDIE> dies = {DWARFDIE(unit, (DWARFDebugInfoEntry *)1LL), + DWARFDIE(unit, (DWARFDebugInfoEntry *)2LL), + DWARFDIE(unit, (DWARFDebugInfoEntry *)3LL), + DWARFDIE(unit, (DWARFDebugInfoEntry *)4LL)}; + std::vector<clang::DeclContext *> decl_ctxs = { + (clang::DeclContext *)1LL, (clang::DeclContext *)2LL, + (clang::DeclContext *)2LL, (clang::DeclContext *)3LL}; + for (int i = 0; i < 4; ++i) + ast_parser.LinkDeclContextToDIE(decl_ctxs[i], dies[i]); + ast_parser.EnsureAllDIEsInDeclContextHaveBeenParsed( + CompilerDeclContext(nullptr, decl_ctxs[1])); + + EXPECT_THAT(ast_parser.GetDeclContextToDIEMapKeys(), + testing::UnorderedElementsAre(decl_ctxs[0], decl_ctxs[3])); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits