Skip to content

Commit 3b73dcd

Browse files
committed
Performance: Add a set of visited SymbolFiles to the other FindFiles variant.
This is basically the same bug as in r260434. SymbolFileDWARF::FindTypes has exponential worst-case when digging through dependency DAG of .pcm files because each object file and .pcm file may depend on an already-visited .pcm file, which may again have dependencies. Fixed here by carrying a set of already visited SymbolFiles around. rdar://problem/56993424 Differential Revision: https://reviews.llvm.org/D70106
1 parent 54a9b4c commit 3b73dcd

File tree

14 files changed

+49
-24
lines changed

14 files changed

+49
-24
lines changed

lldb/include/lldb/Core/Module.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,11 @@ class Module : public std::enable_shared_from_this<Module>,
429429
/// This behaves like the other FindTypes method but allows to
430430
/// specify a DeclContext and a language for the type being searched
431431
/// for.
432+
///
433+
/// \param searched_symbol_files
434+
/// Prevents one file from being visited multiple times.
432435
void FindTypes(llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
436+
llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
433437
TypeMap &types);
434438

435439
lldb::TypeSP FindFirstType(const SymbolContext &sc,

lldb/include/lldb/Symbol/SymbolFile.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,14 @@ class SymbolFile : public PluginInterface {
193193
TypeMap &types);
194194

195195
/// Find types specified by a CompilerContextPattern.
196-
/// \param languages Only return results in these languages.
197-
virtual void FindTypes(llvm::ArrayRef<CompilerContext> pattern,
198-
LanguageSet languages, TypeMap &types);
196+
/// \param languages
197+
/// Only return results in these languages.
198+
/// \param searched_symbol_files
199+
/// Prevents one file from being visited multiple times.
200+
virtual void
201+
FindTypes(llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
202+
llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
203+
TypeMap &types);
199204

200205
virtual void
201206
GetMangledNamesForFunction(const std::string &scope_qualified_name,

lldb/source/Core/Module.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,12 +1006,14 @@ void Module::FindTypes(
10061006
}
10071007
}
10081008

1009-
void Module::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
1010-
LanguageSet languages, TypeMap &types) {
1009+
void Module::FindTypes(
1010+
llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
1011+
llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
1012+
TypeMap &types) {
10111013
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
10121014
Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION);
10131015
if (SymbolFile *symbols = GetSymbolFile())
1014-
symbols->FindTypes(pattern, languages, types);
1016+
symbols->FindTypes(pattern, languages, searched_symbol_files, types);
10151017
}
10161018

10171019
SymbolFile *Module::GetSymbolFile(bool can_create, Stream *feedback_strm) {

lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,9 @@ void SymbolFileBreakpad::FindTypes(
307307
uint32_t max_matches, llvm::DenseSet<SymbolFile *> &searched_symbol_files,
308308
TypeMap &types) {}
309309

310-
void SymbolFileBreakpad::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
311-
LanguageSet languages, TypeMap &types) {}
310+
void SymbolFileBreakpad::FindTypes(
311+
llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
312+
llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) {}
312313

313314
void SymbolFileBreakpad::AddSymbols(Symtab &symtab) {
314315
Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS);

lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class SymbolFileBreakpad : public SymbolFile {
112112
TypeMap &types) override;
113113

114114
void FindTypes(llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
115+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
115116
TypeMap &types) override;
116117

117118
llvm::Expected<TypeSystem &>

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) {
150150
// The type in the Clang module must have the same language as the current CU.
151151
LanguageSet languages;
152152
languages.Insert(die.GetCU()->GetLanguageType());
153-
dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages, dwo_types);
153+
llvm::DenseSet<SymbolFile *> searched_symbol_files;
154+
dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages,
155+
searched_symbol_files, dwo_types);
154156
if (dwo_types.Empty()) {
155157
if (!IsClangModuleFwdDecl(die))
156158
return TypeSP();
@@ -161,8 +163,8 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) {
161163
for (const auto &name_module : sym_file.getExternalTypeModules()) {
162164
if (!name_module.second)
163165
continue;
164-
name_module.second->GetSymbolFile()->FindTypes(decl_context,
165-
languages, dwo_types);
166+
name_module.second->GetSymbolFile()->FindTypes(
167+
decl_context, languages, searched_symbol_files, dwo_types);
166168
if (dwo_types.GetSize())
167169
break;
168170
}

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2366,12 +2366,10 @@ void SymbolFileDWARF::FindTypes(
23662366
llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files,
23672367
TypeMap &types) {
23682368
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
2369-
// Make sure we haven't already searched this SymbolFile before...
2370-
if (searched_symbol_files.count(this))
2369+
// Make sure we haven't already searched this SymbolFile before.
2370+
if (!searched_symbol_files.insert(this).second)
23712371
return;
23722372

2373-
searched_symbol_files.insert(this);
2374-
23752373
DWARFDebugInfo *info = DebugInfo();
23762374
if (!info)
23772375
return;
@@ -2453,8 +2451,13 @@ void SymbolFileDWARF::FindTypes(
24532451
}
24542452
}
24552453

2456-
void SymbolFileDWARF::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
2457-
LanguageSet languages, TypeMap &types) {
2454+
void SymbolFileDWARF::FindTypes(
2455+
llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
2456+
llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) {
2457+
// Make sure we haven't already searched this SymbolFile before.
2458+
if (!searched_symbol_files.insert(this).second)
2459+
return;
2460+
24582461
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
24592462
if (pattern.empty())
24602463
return;

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class SymbolFileDWARF : public lldb_private::SymbolFile,
190190

191191
void FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern,
192192
lldb_private::LanguageSet languages,
193+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
193194
lldb_private::TypeMap &types) override;
194195

195196
void GetTypes(lldb_private::SymbolContextScope *sc_scope,

lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,8 +1259,9 @@ void SymbolFileNativePDB::FindTypes(
12591259
FindTypesByName(name.GetStringRef(), max_matches, types);
12601260
}
12611261

1262-
void SymbolFileNativePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
1263-
LanguageSet languages, TypeMap &types) {}
1262+
void SymbolFileNativePDB::FindTypes(
1263+
llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
1264+
llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) {}
12641265

12651266
void SymbolFileNativePDB::FindTypesByName(llvm::StringRef name,
12661267
uint32_t max_matches,

lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ class SymbolFileNativePDB : public SymbolFile {
131131
TypeMap &types) override;
132132

133133
void FindTypes(llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
134+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
134135
TypeMap &types) override;
135136

136137
llvm::Expected<TypeSystem &>

lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,9 +1562,10 @@ void SymbolFilePDB::FindTypesByName(
15621562
}
15631563
}
15641564

1565-
void SymbolFilePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
1566-
LanguageSet languages,
1567-
lldb_private::TypeMap &types) {}
1565+
void SymbolFilePDB::FindTypes(
1566+
llvm::ArrayRef<CompilerContext> pattern, LanguageSet languages,
1567+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
1568+
lldb_private::TypeMap &types) {}
15681569

15691570
void SymbolFilePDB::GetTypesForPDBSymbol(const llvm::pdb::PDBSymbol &pdb_symbol,
15701571
uint32_t type_mask,

lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class SymbolFilePDB : public lldb_private::SymbolFile {
134134

135135
void FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern,
136136
lldb_private::LanguageSet languages,
137+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
137138
lldb_private::TypeMap &types) override;
138139

139140
void FindTypesByRegex(const lldb_private::RegularExpression &regex,

lldb/source/Symbol/SymbolFile.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ void SymbolFile::FindTypes(
134134
TypeMap &types) {}
135135

136136
void SymbolFile::FindTypes(llvm::ArrayRef<CompilerContext> pattern,
137-
LanguageSet languages, TypeMap &types) {}
137+
LanguageSet languages,
138+
llvm::DenseSet<SymbolFile *> &searched_symbol_files,
139+
TypeMap &types) {}
138140

139141
void SymbolFile::AssertModuleLock() {
140142
// The code below is too expensive to leave enabled in release builds. It's

lldb/tools/lldb-test/lldb-test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ Error opts::symbols::findTypes(lldb_private::Module &Module) {
529529
Symfile.FindTypes(ConstString(Name), ContextPtr, UINT32_MAX, SearchedFiles,
530530
Map);
531531
else
532-
Module.FindTypes(parseCompilerContext(), languages, Map);
532+
Module.FindTypes(parseCompilerContext(), languages, SearchedFiles, Map);
533533

534534
outs() << formatv("Found {0} types:\n", Map.GetSize());
535535
StreamString Stream;

0 commit comments

Comments
 (0)