diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -310,11 +310,20 @@ return std::vector(); } - virtual ConstString - FindBestAlternateFunctionMangledName(const Mangled mangled, - const SymbolContext &sym_ctx) const { - return ConstString(); - } + /// Generates a list of mangled function name alternatives + /// + /// \param[out] results Will contain alternative mangled + /// function names. + /// + /// \param[in] mangled_names List of mangled names to generate + /// alternatives for. + /// + /// \param[in] sc SymbolContext used to find approximately matching + /// mangled function names. + virtual void + CollectAlternateFunctionNames(std::vector &results, + const std::vector &mangled_names, + const SymbolContext &sc) const {} protected: // Classes that inherit from Language can see and modify these diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp --- a/lldb/source/Expression/IRExecutionUnit.cpp +++ b/lldb/source/Expression/IRExecutionUnit.cpp @@ -675,25 +675,7 @@ std::vector &CPP_names, const std::vector &C_names, const SymbolContext &sc) { if (auto *cpp_lang = Language::FindPlugin(lldb::eLanguageTypeC_plus_plus)) { - for (const ConstString &name : C_names) { - Mangled mangled(name); - if (cpp_lang->SymbolNameFitsToLanguage(mangled)) { - if (ConstString best_alternate = - cpp_lang->FindBestAlternateFunctionMangledName(mangled, sc)) { - CPP_names.push_back(best_alternate); - } - } - - std::vector alternates = - cpp_lang->GenerateAlternateFunctionManglings(name); - CPP_names.insert(CPP_names.end(), alternates.begin(), alternates.end()); - - // As a last-ditch fallback, try the base name for C++ names. It's - // terrible, but the DWARF doesn't always encode "extern C" correctly. - ConstString basename = - cpp_lang->GetDemangledFunctionNameWithoutArguments(mangled); - CPP_names.push_back(basename); - } + cpp_lang->CollectAlternateFunctionNames(CPP_names, C_names, sc); } } diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -135,8 +135,10 @@ std::vector GenerateAlternateFunctionManglings(const ConstString mangled) const override; - ConstString FindBestAlternateFunctionMangledName( - const Mangled mangled, const SymbolContext &sym_ctx) const override; + void + CollectAlternateFunctionNames(std::vector &results, + const std::vector &mangled_names, + const SymbolContext &sc) const override; // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -510,8 +510,8 @@ return alternates; } -ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName( - const Mangled mangled, const SymbolContext &sym_ctx) const { +static ConstString FindBestAlternateFunctionMangledName( + const Mangled mangled, const SymbolContext &sym_ctx) { ConstString demangled = mangled.GetDemangledName(); if (!demangled) return ConstString(); @@ -560,6 +560,7 @@ return ConstString(); } + static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { if (!cpp_category_sp) return; @@ -1405,3 +1406,28 @@ // that we could check for. return file_path.contains("/usr/include/c++/"); } + +void CPlusPlusLanguage::CollectAlternateFunctionNames( + std::vector &results, + const std::vector &mangled_names, + const SymbolContext &sc) const { + for (const ConstString &name : mangled_names) { + Mangled mangled(name); + if (SymbolNameFitsToLanguage(mangled)) { + if (ConstString best_alternate = + FindBestAlternateFunctionMangledName(mangled, sc)) { + results.push_back(best_alternate); + } + } + + std::vector alternates = + GenerateAlternateFunctionManglings(name); + results.insert(results.end(), alternates.begin(), alternates.end()); + + // As a last-ditch fallback, try the base name for C++ names. It's + // terrible, but the DWARF doesn't always encode "extern C" correctly. + ConstString basename = + GetDemangledFunctionNameWithoutArguments(mangled); + results.push_back(basename); + } +}