diff options
author | Adrian Prantl <aprantl@apple.com> | 2019-11-14 08:57:32 -0800 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2019-11-14 08:58:31 -0800 |
commit | 0e45e60c6f316d095d878aea3c098202b39b5bee (patch) | |
tree | de9f990fecc4d64c7430fd356f91092c52b8b95a /lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | |
parent | c9de002a2cf02b1a00abe5caaa05fd722583218a (diff) | |
download | bcm5719-llvm-0e45e60c6f316d095d878aea3c098202b39b5bee.tar.gz bcm5719-llvm-0e45e60c6f316d095d878aea3c098202b39b5bee.zip |
Use ForEachExternalModule in ParseTypeFromClangModule (NFC)
I wanted to further simplify ParseTypeFromClangModule by replacing the
hand-rolled loop with ForEachExternalModule, and then realized that
ForEachExternalModule also had the problem of visiting the same leaf
node an exponential number of times in the worst-case. This adds a set
of searched_symbol_files set to the function as well as the ability to
early-exit from it.
Differential Revision: https://reviews.llvm.org/D70215
Diffstat (limited to 'lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp index a50d4e460ba..31876204f32 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -652,12 +652,15 @@ bool SymbolFileDWARFDebugMap::ParseDebugMacros(CompileUnit &comp_unit) { return false; } -void SymbolFileDWARFDebugMap::ForEachExternalModule( - CompileUnit &comp_unit, llvm::function_ref<void(ModuleSP)> f) { +bool SymbolFileDWARFDebugMap::ForEachExternalModule( + CompileUnit &comp_unit, + llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files, + llvm::function_ref<bool(Module &)> f) { std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); SymbolFileDWARF *oso_dwarf = GetSymbolFile(comp_unit); if (oso_dwarf) - oso_dwarf->ForEachExternalModule(comp_unit, f); + return oso_dwarf->ForEachExternalModule(comp_unit, visited_symbol_files, f); + return false; } bool SymbolFileDWARFDebugMap::ParseSupportFiles(CompileUnit &comp_unit, @@ -1183,6 +1186,16 @@ void SymbolFileDWARFDebugMap::FindTypes( }); } +void SymbolFileDWARFDebugMap::FindTypes( + llvm::ArrayRef<CompilerContext> context, LanguageSet languages, + llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, + TypeMap &types) { + ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { + oso_dwarf->FindTypes(context, languages, searched_symbol_files, types); + return false; + }); +} + // // uint32_t // SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const |