Index: lldb/include/lldb/Symbol/ClangASTContext.h =================================================================== --- lldb/include/lldb/Symbol/ClangASTContext.h +++ lldb/include/lldb/Symbol/ClangASTContext.h @@ -58,6 +58,8 @@ void Finalize() override; + llvm::SmallBitVector GetSupportedLanguages() const override; + // PluginInterface functions ConstString GetPluginName() override; Index: lldb/include/lldb/Symbol/SymbolFile.h =================================================================== --- lldb/include/lldb/Symbol/SymbolFile.h +++ lldb/include/lldb/Symbol/SymbolFile.h @@ -20,6 +20,7 @@ #include "lldb/lldb-private.h" #include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/SmallBitVector.h" #include @@ -189,7 +190,11 @@ bool append, uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types); - virtual size_t FindTypes(llvm::ArrayRef pattern, bool append, + + /// Find types specified by a CompilerContextPattern. + /// \param languages Only return results in these languages. + virtual size_t FindTypes(llvm::ArrayRef pattern, + llvm::SmallBitVector languages, bool append, TypeMap &types); virtual void Index: lldb/include/lldb/Symbol/TypeSystem.h =================================================================== --- lldb/include/lldb/Symbol/TypeSystem.h +++ lldb/include/lldb/Symbol/TypeSystem.h @@ -15,6 +15,7 @@ #include #include "llvm/ADT/APSInt.h" +#include "llvm/ADT/SmallBitVector.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" @@ -30,7 +31,7 @@ namespace lldb_private { -// Interface for representing the Type Systems in different languages. +/// Interface for representing the Type Systems in different languages. class TypeSystem : public PluginInterface { public: // Intrusive type system that allows us to use llvm casting. @@ -86,6 +87,12 @@ // removing all the TypeSystems from the TypeSystemMap. virtual void Finalize() {} + /// Returns a bitvector of \p LanguageType entries this type system + /// supports. Each lldb::LanguageType is represented by the bit with + /// its number. The largest LanguageType is < 64, so this is very + /// space-efficient. + virtual llvm::SmallBitVector GetSupportedLanguages() const { return {}; } + virtual DWARFASTParser *GetDWARFParser() { return nullptr; } virtual PDBASTParser *GetPDBParser() { return nullptr; } Index: lldb/lit/SymbolFile/DWARF/compilercontext.ll =================================================================== --- lldb/lit/SymbolFile/DWARF/compilercontext.ll +++ lldb/lit/SymbolFile/DWARF/compilercontext.ll @@ -1,18 +1,21 @@ ; Test finding types by CompilerContext. ; RUN: llc %s -filetype=obj -o %t.o -; RUN: lldb-test symbols %t.o -find=type \ +; RUN: lldb-test symbols %t.o -find=type --language=C99 \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmoduleX" \ ; RUN: | FileCheck %s --check-prefix=NORESULTS -; RUN: lldb-test symbols %t.o -find=type \ +; RUN: lldb-test symbols %t.o -find=type --language=C++ \ +; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmodule" \ +; RUN: | FileCheck %s --check-prefix=NORESULTS +; RUN: lldb-test symbols %t.o -find=type --language=C99 \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type \ +; RUN: lldb-test symbols %t.o -find=type --language=C99 \ ; RUN: -compiler-context="Module:CModule,AnyModule:*,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type \ +; RUN: lldb-test symbols %t.o -find=type --language=C99 \ ; RUN: -compiler-context="AnyModule:*,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type \ +; RUN: lldb-test symbols %t.o -find=type --language=C99 \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,AnyType:FromSubmodule" \ ; RUN: | FileCheck %s ; Index: lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h =================================================================== --- lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -116,7 +116,8 @@ llvm::DenseSet &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef pattern, bool append, + size_t FindTypes(llvm::ArrayRef pattern, + llvm::SmallBitVector languages, bool append, TypeMap &types) override; llvm::Expected Index: lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp +++ lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp @@ -319,6 +319,7 @@ } size_t SymbolFileBreakpad::FindTypes(llvm::ArrayRef pattern, + llvm::SmallBitVector languages, bool append, TypeMap &types) { if (!append) types.Clear(); Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -148,7 +148,10 @@ 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. + llvm::SmallBitVector languages(eNumLanguageTypes); + languages.set(die.GetCU()->GetLanguageType()); + if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages, true, dwo_types)) { if (!IsClangModuleFwdDecl(die)) return TypeSP(); @@ -159,8 +162,8 @@ 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; } } Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -185,7 +185,8 @@ lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - bool append, lldb_private::TypeMap &types) override; + llvm::SmallBitVector languages, bool append, + lldb_private::TypeMap &types) override; size_t GetTypes(lldb_private::SymbolContextScope *sc_scope, lldb::TypeClass type_mask, Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2485,7 +2485,8 @@ } size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef pattern, - bool append, TypeMap &types) { + llvm::SmallBitVector languages, bool append, + TypeMap &types) { std::lock_guard guard(GetModuleMutex()); if (!append) types.Clear(); @@ -2508,6 +2509,9 @@ DWARFDIE die = GetDIE(die_ref); if (die) { + if (!languages[die.GetCU()->GetLanguageType()]) + continue; + llvm::SmallVector die_context; die.GetDeclContext(die_context); if (!contextMatches(die_context, pattern)) Index: lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h =================================================================== --- lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -134,7 +134,8 @@ llvm::DenseSet &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef pattern, bool append, + size_t FindTypes(llvm::ArrayRef pattern, + llvm::SmallBitVector languages, bool append, TypeMap &types) override; llvm::Expected Index: lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1270,6 +1270,7 @@ } size_t SymbolFileNativePDB::FindTypes(llvm::ArrayRef pattern, + llvm::SmallBitVector languages, bool append, TypeMap &types) { return 0; } Index: lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h =================================================================== --- lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -133,7 +133,8 @@ lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - bool append, lldb_private::TypeMap &types) override; + llvm::SmallBitVector languages, bool append, + lldb_private::TypeMap &types) override; void FindTypesByRegex(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::TypeMap &types); Index: lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1585,7 +1585,8 @@ } size_t SymbolFilePDB::FindTypes(llvm::ArrayRef pattern, - bool append, lldb_private::TypeMap &types) { + llvm::SmallBitVector languages, bool append, + lldb_private::TypeMap &types) { return 0; } Index: lldb/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/source/Symbol/ClangASTContext.cpp +++ lldb/source/Symbol/ClangASTContext.cpp @@ -798,6 +798,28 @@ m_pointer_byte_size = 0; } +llvm::SmallBitVector ClangASTContext::GetSupportedLanguages() const { + llvm::SmallBitVector languages(64-8, 0); + static_assert(eNumLanguageTypes < 64-8, + "Languages bit vector is no longer small on 64 bit systems"); + uint64_t mask = + 1 << eLanguageTypeC89 | + 1 << eLanguageTypeC | + 1 << eLanguageTypeC_plus_plus | + 1 << eLanguageTypeC99 | + 1 << eLanguageTypeObjC | + 1 << eLanguageTypeObjC_plus_plus | + 1 << eLanguageTypeUPC | + 1 << eLanguageTypeC_plus_plus_03 | + 1 << eLanguageTypeC_plus_plus_11 | + 1 << eLanguageTypeC11 | + 1 << eLanguageTypeC_plus_plus_14; + uint32_t mask32[2]; + memcpy(mask32, &mask, 8); + languages.setBitsInMask(mask32, 7); + return languages; +} + void ClangASTContext::setSema(Sema *s) { // Ensure that the new sema actually belongs to our ASTContext. assert(s == nullptr || &s->getASTContext() == m_ast_up.get()); Index: lldb/source/Symbol/SymbolFile.cpp =================================================================== --- lldb/source/Symbol/SymbolFile.cpp +++ lldb/source/Symbol/SymbolFile.cpp @@ -150,7 +150,8 @@ } size_t SymbolFile::FindTypes(llvm::ArrayRef pattern, - bool append, TypeMap &types) { + llvm::SmallBitVector languages, bool append, + TypeMap &types) { if (!append) types.Clear(); return 0; Index: lldb/tools/lldb-test/lldb-test.cpp =================================================================== --- lldb/tools/lldb-test/lldb-test.cpp +++ lldb/tools/lldb-test/lldb-test.cpp @@ -26,6 +26,7 @@ #include "lldb/Symbol/TypeList.h" #include "lldb/Symbol/TypeMap.h" #include "lldb/Symbol/VariableList.h" +#include "lldb/Target/Language.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Utility/CleanUp.h" @@ -144,6 +145,10 @@ cl::desc("Specify a compiler context as \"kind:name,...\"."), cl::value_desc("context"), cl::sub(SymbolsSubcommand)); +static cl::opt + Language("language", cl::desc("Specify a DWARF language like C99."), + cl::value_desc("language"), cl::sub(SymbolsSubcommand)); + static cl::list FunctionNameFlags( "function-flags", cl::desc("Function search flags:"), cl::values(clEnumValN(eFunctionNameTypeAuto, "auto", @@ -507,13 +512,17 @@ CompilerDeclContext *ContextPtr = ContextOr->IsValid() ? &*ContextOr : nullptr; + SmallBitVector languages(eNumLanguageTypes); + if (!Language.empty()) + languages.set(Language::GetLanguageTypeFromString(Language)); + DenseSet SearchedFiles; TypeMap Map; if (!Name.empty()) Symfile.FindTypes(ConstString(Name), ContextPtr, true, UINT32_MAX, SearchedFiles, Map); else - Symfile.FindTypes({parseCompilerContext()}, true, Map); + Symfile.FindTypes({parseCompilerContext()}, languages, true, Map); outs() << formatv("Found {0} types:\n", Map.GetSize()); StreamString Stream;