Index: lldb/trunk/include/lldb/Core/Module.h =================================================================== --- lldb/trunk/include/lldb/Core/Module.h +++ lldb/trunk/include/lldb/Core/Module.h @@ -460,7 +460,7 @@ /// specify a DeclContext and a language for the type being searched /// for. size_t FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, TypeMap &types); + LanguageSet languages, TypeMap &types); lldb::TypeSP FindFirstType(const SymbolContext &sc, ConstString type_name, bool exact_match); @@ -1076,7 +1076,7 @@ size_t FindTypes_Impl( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, size_t max_matches, + size_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types); Index: lldb/trunk/include/lldb/Symbol/SymbolFile.h =================================================================== --- lldb/trunk/include/lldb/Symbol/SymbolFile.h +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h @@ -190,15 +190,14 @@ SymbolContextList &sc_list); virtual uint32_t FindTypes(ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types); /// Find types specified by a CompilerContextPattern. /// \param languages Only return results in these languages. virtual size_t FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, - TypeMap &types); + LanguageSet languages, TypeMap &types); virtual void GetMangledNamesForFunction(const std::string &scope_qualified_name, Index: lldb/trunk/source/Core/Module.cpp =================================================================== --- lldb/trunk/source/Core/Module.cpp +++ lldb/trunk/source/Core/Module.cpp @@ -941,13 +941,13 @@ size_t Module::FindTypes_Impl( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, size_t max_matches, + size_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) { static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); if (SymbolFile *symbols = GetSymbolFile()) - return symbols->FindTypes(name, parent_decl_ctx, append, max_matches, + return symbols->FindTypes(name, parent_decl_ctx, max_matches, searched_symbol_files, types); return 0; } @@ -955,12 +955,10 @@ size_t Module::FindTypesInNamespace(ConstString type_name, const CompilerDeclContext *parent_decl_ctx, size_t max_matches, TypeList &type_list) { - const bool append = true; TypeMap types_map; llvm::DenseSet searched_symbol_files; - size_t num_types = - FindTypes_Impl(type_name, parent_decl_ctx, append, max_matches, - searched_symbol_files, types_map); + size_t num_types = FindTypes_Impl(type_name, parent_decl_ctx, max_matches, + searched_symbol_files, types_map); if (num_types > 0) { SymbolContext sc; sc.module_sp = shared_from_this(); @@ -988,7 +986,6 @@ const char *type_name_cstr = name.GetCString(); llvm::StringRef type_scope; llvm::StringRef type_basename; - const bool append = true; TypeClass type_class = eTypeClassAny; TypeMap typesmap; @@ -1001,7 +998,7 @@ exact_match = type_scope.consume_front("::"); ConstString type_basename_const_str(type_basename); - if (FindTypes_Impl(type_basename_const_str, nullptr, append, max_matches, + if (FindTypes_Impl(type_basename_const_str, nullptr, max_matches, searched_symbol_files, typesmap)) { typesmap.RemoveMismatchedTypes(type_scope, type_basename, type_class, exact_match); @@ -1013,13 +1010,13 @@ if (type_class != eTypeClassAny && !type_basename.empty()) { // The "type_name_cstr" will have been modified if we have a valid type // class prefix (like "struct", "class", "union", "typedef" etc). - FindTypes_Impl(ConstString(type_basename), nullptr, append, UINT_MAX, + FindTypes_Impl(ConstString(type_basename), nullptr, UINT_MAX, searched_symbol_files, typesmap); typesmap.RemoveMismatchedTypes(type_scope, type_basename, type_class, exact_match); num_matches = typesmap.GetSize(); } else { - num_matches = FindTypes_Impl(name, nullptr, append, UINT_MAX, + num_matches = FindTypes_Impl(name, nullptr, UINT_MAX, searched_symbol_files, typesmap); if (exact_match) { std::string name_str(name.AsCString("")); @@ -1038,11 +1035,11 @@ } size_t Module::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, TypeMap &types) { + LanguageSet languages, TypeMap &types) { static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); Timer scoped_timer(func_cat, LLVM_PRETTY_FUNCTION); if (SymbolFile *symbols = GetSymbolFile()) - return symbols->FindTypes(pattern, languages, append, types); + return symbols->FindTypes(pattern, languages, types); return 0; } Index: lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -112,13 +112,13 @@ bool append, SymbolContextList &sc_list) override; uint32_t FindTypes(ConstString name, - const CompilerDeclContext *parent_decl_ctx, bool append, + const CompilerDeclContext *parent_decl_ctx, uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, TypeMap &types) override; + LanguageSet languages, TypeMap &types) override; llvm::Expected GetTypeSystemForLanguage(lldb::LanguageType language) override { Index: lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp +++ lldb/trunk/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp @@ -310,19 +310,14 @@ uint32_t SymbolFileBreakpad::FindTypes( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, - llvm::DenseSet &searched_symbol_files, TypeMap &types) { - if (!append) - types.Clear(); - return types.GetSize(); + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, + TypeMap &types) { + return 0; } size_t SymbolFileBreakpad::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, - TypeMap &types) { - if (!append) - types.Clear(); - return types.GetSize(); + LanguageSet languages, TypeMap &types) { + return 0; } void SymbolFileBreakpad::AddSymbols(Symtab &symtab) { Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -151,7 +151,7 @@ // 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, + if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages, dwo_types)) { if (!IsClangModuleFwdDecl(die)) return TypeSP(); @@ -162,8 +162,8 @@ for (const auto &name_module : sym_file.getExternalTypeModules()) { if (!name_module.second) continue; - if (name_module.second->GetSymbolFile()->FindTypes( - decl_context, languages, true, dwo_types)) + if (name_module.second->GetSymbolFile()->FindTypes(decl_context, + languages, dwo_types)) break; } } Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -184,12 +184,12 @@ uint32_t FindTypes(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - lldb_private::LanguageSet languages, bool append, + lldb_private::LanguageSet languages, lldb_private::TypeMap &types) override; size_t GetTypes(lldb_private::SymbolContextScope *sc_scope, Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2384,15 +2384,11 @@ } uint32_t SymbolFileDWARF::FindTypes( - ConstString name, const CompilerDeclContext *parent_decl_ctx, bool append, + ConstString name, const CompilerDeclContext *parent_decl_ctx, uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) { std::lock_guard guard(GetModuleMutex()); - // If we aren't appending the results to this list, then clear the list - if (!append) - types.Clear(); - // Make sure we haven't already searched this SymbolFile before... if (searched_symbol_files.count(this)) return 0; @@ -2410,15 +2406,15 @@ GetObjectFile()->GetModule()->LogMessage( log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = " - "%p (\"%s\"), append=%u, max_matches=%u, type_list)", + "%p (\"%s\"), max_matches=%u, type_list)", name.GetCString(), static_cast(parent_decl_ctx), - parent_decl_ctx->GetName().AsCString(""), append, max_matches); + parent_decl_ctx->GetName().AsCString(""), max_matches); else GetObjectFile()->GetModule()->LogMessage( log, "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx = " - "NULL, append=%u, max_matches=%u, type_list)", - name.GetCString(), append, max_matches); + "NULL, max_matches=%u, type_list)", + name.GetCString(), max_matches); } if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx)) @@ -2427,46 +2423,25 @@ DIEArray die_offsets; m_index->GetTypes(name, die_offsets); const size_t num_die_matches = die_offsets.size(); + const uint32_t initial_types_size = types.GetSize(); - if (num_die_matches) { - const uint32_t initial_types_size = types.GetSize(); - for (size_t i = 0; i < num_die_matches; ++i) { - const DIERef &die_ref = die_offsets[i]; - DWARFDIE die = GetDIE(die_ref); - - if (die) { - if (!DIEInDeclContext(parent_decl_ctx, die)) - continue; // The containing decl contexts don't match + for (size_t i = 0; i < num_die_matches; ++i) { + const DIERef &die_ref = die_offsets[i]; + DWARFDIE die = GetDIE(die_ref); + if (die) { + if (!DIEInDeclContext(parent_decl_ctx, die)) + continue; // The containing decl contexts don't match - Type *matching_type = ResolveType(die, true, true); - if (matching_type) { - // We found a type pointer, now find the shared pointer form our type - // list - types.InsertUnique(matching_type->shared_from_this()); - if (types.GetSize() >= max_matches) - break; - } - } else { - m_index->ReportInvalidDIERef(die_ref, name.GetStringRef()); - } - } - const uint32_t num_matches = types.GetSize() - initial_types_size; - if (log && num_matches) { - if (parent_decl_ctx) { - GetObjectFile()->GetModule()->LogMessage( - log, - "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx " - "= %p (\"%s\"), append=%u, max_matches=%u, type_list) => %u", - name.GetCString(), static_cast(parent_decl_ctx), - parent_decl_ctx->GetName().AsCString(""), append, max_matches, - num_matches); - } else { - GetObjectFile()->GetModule()->LogMessage( - log, - "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx " - "= NULL, append=%u, max_matches=%u, type_list) => %u", - name.GetCString(), append, max_matches, num_matches); + Type *matching_type = ResolveType(die, true, true); + if (matching_type) { + // We found a type pointer, now find the shared pointer form our type + // list + types.InsertUnique(matching_type->shared_from_this()); + if (types.GetSize() >= max_matches) + break; } + } else { + m_index->ReportInvalidDIERef(die_ref, name.GetStringRef()); } } @@ -2476,31 +2451,38 @@ if (num_die_matches < max_matches) { UpdateExternalModuleListIfNeeded(); - for (const auto &pair : m_external_type_modules) { - ModuleSP external_module_sp = pair.second; - if (external_module_sp) { - SymbolFile *sym_file = external_module_sp->GetSymbolFile(); - if (sym_file) { - const uint32_t num_external_matches = - sym_file->FindTypes(name, parent_decl_ctx, append, max_matches, - searched_symbol_files, types); - if (num_external_matches) - return num_external_matches; - } - } + for (const auto &pair : m_external_type_modules) + if (ModuleSP external_module_sp = pair.second) + if (SymbolFile *sym_file = external_module_sp->GetSymbolFile()) + sym_file->FindTypes(name, parent_decl_ctx, max_matches, + searched_symbol_files, types); + } + + uint32_t num_matches = types.GetSize() - initial_types_size; + if (log && num_matches) { + if (parent_decl_ctx) { + GetObjectFile()->GetModule()->LogMessage( + log, + "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx " + "= %p (\"%s\"), max_matches=%u, type_list) => %u", + name.GetCString(), static_cast(parent_decl_ctx), + parent_decl_ctx->GetName().AsCString(""), max_matches, + num_matches); + } else { + GetObjectFile()->GetModule()->LogMessage( + log, + "SymbolFileDWARF::FindTypes (sc, name=\"%s\", parent_decl_ctx " + "= NULL, max_matches=%u, type_list) => %u", + name.GetCString(), max_matches, num_matches); } } - return num_die_matches; + return num_matches; } size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, - TypeMap &types) { + LanguageSet languages, TypeMap &types) { std::lock_guard guard(GetModuleMutex()); - if (!append) - types.Clear(); - if (pattern.empty()) return 0; Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -111,7 +111,7 @@ uint32_t FindTypes(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, lldb_private::TypeMap &types) override; lldb_private::CompilerDeclContext FindNamespace( Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1201,17 +1201,14 @@ uint32_t SymbolFileDWARFDebugMap::FindTypes( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) { std::lock_guard guard(GetModuleMutex()); - if (!append) - types.Clear(); - const uint32_t initial_types_size = types.GetSize(); ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { - oso_dwarf->FindTypes(name, parent_decl_ctx, append, max_matches, + oso_dwarf->FindTypes(name, parent_decl_ctx, max_matches, searched_symbol_files, types); return types.GetSize() >= max_matches; }); Index: lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -129,13 +129,13 @@ bool append, SymbolContextList &sc_list) override; uint32_t FindTypes(ConstString name, - const CompilerDeclContext *parent_decl_ctx, bool append, + const CompilerDeclContext *parent_decl_ctx, uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, TypeMap &types) override; + LanguageSet languages, TypeMap &types) override; llvm::Expected GetTypeSystemForLanguage(lldb::LanguageType language) override; Index: lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1252,11 +1252,9 @@ uint32_t SymbolFileNativePDB::FindTypes( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) { std::lock_guard guard(GetModuleMutex()); - if (!append) - types.Clear(); if (!name) return 0; @@ -1270,10 +1268,7 @@ } size_t SymbolFileNativePDB::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, - TypeMap &types) { - if (!append) - types.Clear(); + LanguageSet languages, TypeMap &types) { return 0; } Index: lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -128,12 +128,12 @@ uint32_t FindTypes(lldb_private::ConstString name, const lldb_private::CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef pattern, - lldb_private::LanguageSet languages, bool append, + lldb_private::LanguageSet languages, lldb_private::TypeMap &types) override; void FindTypesByRegex(const lldb_private::RegularExpression ®ex, Index: lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp =================================================================== --- lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ lldb/trunk/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1443,13 +1443,11 @@ uint32_t SymbolFilePDB::FindTypes( lldb_private::ConstString name, - const lldb_private::CompilerDeclContext *parent_decl_ctx, bool append, + const lldb_private::CompilerDeclContext *parent_decl_ctx, uint32_t max_matches, llvm::DenseSet &searched_symbol_files, lldb_private::TypeMap &types) { std::lock_guard guard(GetModuleMutex()); - if (!append) - types.Clear(); if (!name) return 0; if (!DeclContextMatchesThisSymbolFile(parent_decl_ctx)) @@ -1585,10 +1583,8 @@ } size_t SymbolFilePDB::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, + LanguageSet languages, lldb_private::TypeMap &types) { - if (!append) - types.Clear(); return 0; } Index: lldb/trunk/source/Symbol/SymbolFile.cpp =================================================================== --- lldb/trunk/source/Symbol/SymbolFile.cpp +++ lldb/trunk/source/Symbol/SymbolFile.cpp @@ -141,19 +141,14 @@ uint32_t SymbolFile::FindTypes( ConstString name, const CompilerDeclContext *parent_decl_ctx, - bool append, uint32_t max_matches, + uint32_t max_matches, llvm::DenseSet &searched_symbol_files, TypeMap &types) { - if (!append) - types.Clear(); return 0; } size_t SymbolFile::FindTypes(llvm::ArrayRef pattern, - LanguageSet languages, bool append, - TypeMap &types) { - if (!append) - types.Clear(); + LanguageSet languages, TypeMap &types) { return 0; } Index: lldb/trunk/tools/lldb-test/lldb-test.cpp =================================================================== --- lldb/trunk/tools/lldb-test/lldb-test.cpp +++ lldb/trunk/tools/lldb-test/lldb-test.cpp @@ -519,10 +519,10 @@ DenseSet SearchedFiles; TypeMap Map; if (!Name.empty()) - Symfile.FindTypes(ConstString(Name), ContextPtr, true, UINT32_MAX, - SearchedFiles, Map); + Symfile.FindTypes(ConstString(Name), ContextPtr, UINT32_MAX, SearchedFiles, + Map); else - Module.FindTypes(parseCompilerContext(), languages, true, Map); + Module.FindTypes(parseCompilerContext(), languages, Map); outs() << formatv("Found {0} types:\n", Map.GetSize()); StreamString Stream;