diff options
| author | Adrian Prantl <aprantl@apple.com> | 2019-08-22 19:24:55 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2019-08-22 19:24:55 +0000 |
| commit | aa3a564efa6b5fff2129f81a4041069a0233168f (patch) | |
| tree | 230811320c2fff1889c8fcfa2d561dac57e6afc9 /lldb/source/Plugins/SymbolFile | |
| parent | 6c6dd6acf9e4a9d0599c99abbcbb696ed6b5ab19 (diff) | |
| download | llvm-aa3a564efa6b5fff2129f81a4041069a0233168f.tar.gz llvm-aa3a564efa6b5fff2129f81a4041069a0233168f.tar.bz2 llvm-aa3a564efa6b5fff2129f81a4041069a0233168f.zip | |
Extend FindTypes with CompilerContext to allow filtering by language.
This patch is also motivated by the Swift branch and is effectively NFC for the single-TypeSystem llvm.org branch.
In multi-language projects it is extremely common to have, e.g., a
Clang type and a similarly-named rendition of that same type in
another language. When searching for a type It is much cheaper to pass
a set of supported languages to the SymbolFile than having it
materialize every result and then rejecting the materialized types
that have the wrong language.
Differential Revision: https://reviews.llvm.org/D66546
<rdar://problem/54471165>
llvm-svn: 369690
Diffstat (limited to 'lldb/source/Plugins/SymbolFile')
9 files changed, 29 insertions, 13 deletions
diff --git a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp index d5f51458eb13..494e2d487c70 100644 --- a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp +++ b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp @@ -319,7 +319,8 @@ uint32_t SymbolFileBreakpad::FindTypes( } size_t SymbolFileBreakpad::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - bool append, TypeMap &types) { + LanguageSet languages, bool append, + TypeMap &types) { if (!append) types.Clear(); return types.GetSize(); diff --git a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h index def975efc94e..c066ae30ec8a 100644 --- a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -116,8 +116,8 @@ public: llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, bool append, - TypeMap &types) override; + size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, + LanguageSet languages, bool append, TypeMap &types) override; llvm::Expected<TypeSystem &> GetTypeSystemForLanguage(lldb::LanguageType language) override { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 5ef46ef3239f..8956a4f5c0f2 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -148,7 +148,10 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) { die.GetDeclContext(decl_context); TypeMap dwo_types; - if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, true, + // The type in the Clang module must have the same langage as the current CU. + LanguageSet languages; + languages.Insert(die.GetCU()->GetLanguageType()); + if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages, true, dwo_types)) { if (!IsClangModuleFwdDecl(die)) return TypeSP(); @@ -159,8 +162,8 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) { for (const auto &name_module : sym_file.getExternalTypeModules()) { if (!name_module.second) continue; - if (name_module.second->GetSymbolFile()->FindTypes(decl_context, true, - dwo_types)) + if (name_module.second->GetSymbolFile()->FindTypes( + decl_context, languages, true, dwo_types)) break; } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index ba63b41a5814..6b357c249ce7 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2485,7 +2485,8 @@ uint32_t SymbolFileDWARF::FindTypes( } size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - bool append, TypeMap &types) { + LanguageSet languages, bool append, + TypeMap &types) { std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); if (!append) types.Clear(); @@ -2508,6 +2509,9 @@ size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef<CompilerContext> pattern, DWARFDIE die = GetDIE(die_ref); if (die) { + if (!languages[die.GetCU()->GetLanguageType()]) + continue; + llvm::SmallVector<CompilerContext, 4> die_context; die.GetDeclContext(die_context); if (!contextMatches(die_context, pattern)) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 0d59013b0143..2a1eb8ab9abe 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -185,7 +185,8 @@ public: lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, - bool append, lldb_private::TypeMap &types) override; + lldb_private::LanguageSet languages, bool append, + lldb_private::TypeMap &types) override; size_t GetTypes(lldb_private::SymbolContextScope *sc_scope, lldb::TypeClass type_mask, diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index 32b13c950c02..05e48787cbeb 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1270,7 +1270,10 @@ uint32_t SymbolFileNativePDB::FindTypes( } size_t SymbolFileNativePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - bool append, TypeMap &types) { + LanguageSet languages, bool append, + TypeMap &types) { + if (!append) + types.Clear(); return 0; } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index f64fb4f42520..f2e840cdfc11 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -134,8 +134,8 @@ public: llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, bool append, - TypeMap &types) override; + size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, + LanguageSet languages, bool append, TypeMap &types) override; llvm::Expected<TypeSystem &> GetTypeSystemForLanguage(lldb::LanguageType language) override; diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index 51b84c4cae69..efd3b0cc9401 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1585,7 +1585,10 @@ void SymbolFilePDB::FindTypesByName( } size_t SymbolFilePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - bool append, lldb_private::TypeMap &types) { + LanguageSet languages, bool append, + lldb_private::TypeMap &types) { + if (!append) + types.Clear(); return 0; } diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index 15eed0f9f6cc..a360a18ae262 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -133,7 +133,8 @@ public: lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, - bool append, lldb_private::TypeMap &types) override; + lldb_private::LanguageSet languages, bool append, + lldb_private::TypeMap &types) override; void FindTypesByRegex(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::TypeMap &types); |
