Michael137 updated this revision to Diff 452546. Michael137 added a comment.
- Return `std::vector` instead of using an output argument Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131333/new/ https://reviews.llvm.org/D131333 Files: lldb/include/lldb/Expression/IRExecutionUnit.h lldb/include/lldb/Target/Language.h lldb/source/Expression/IRExecutionUnit.cpp lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -135,8 +135,9 @@ std::vector<ConstString> GenerateAlternateFunctionManglings(const ConstString mangled) const override; - ConstString FindBestAlternateFunctionMangledName( - const Mangled mangled, const SymbolContext &sym_ctx) const override; + std::vector<ConstString> + CollectAlternateFunctionNames(const std::vector<ConstString> &mangled_names, + const SymbolContext &sc) const override; // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -510,8 +510,9 @@ 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(); @@ -1405,3 +1406,29 @@ // that we could check for. return file_path.contains("/usr/include/c++/"); } + +std::vector<ConstString> CPlusPlusLanguage::CollectAlternateFunctionNames( + const std::vector<ConstString> &mangled_names, + const SymbolContext &sc) const { + std::vector<ConstString> results; + 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<ConstString> 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); + } + + return results; +} Index: lldb/source/Expression/IRExecutionUnit.cpp =================================================================== --- lldb/source/Expression/IRExecutionUnit.cpp +++ lldb/source/Expression/IRExecutionUnit.cpp @@ -671,30 +671,13 @@ C_names.push_back(name); } -void IRExecutionUnit::CollectCandidateCPlusPlusNames( - std::vector<ConstString> &CPP_names, +std::vector<ConstString> IRExecutionUnit::CollectCandidateCPlusPlusNames( const std::vector<ConstString> &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<ConstString> 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); - } + return cpp_lang->CollectAlternateFunctionNames(C_names, sc); } + + return {}; } class LoadAddressResolver { @@ -869,7 +852,6 @@ lldb::addr_t IRExecutionUnit::FindSymbol(lldb_private::ConstString name, bool &missing_weak) { std::vector<ConstString> candidate_C_names; - std::vector<ConstString> candidate_CPlusPlus_names; CollectCandidateCNames(candidate_C_names, name); @@ -888,9 +870,9 @@ if (ret != LLDB_INVALID_ADDRESS) return ret; - CollectCandidateCPlusPlusNames(candidate_CPlusPlus_names, candidate_C_names, - m_sym_ctx); - ret = FindInSymbols(candidate_CPlusPlus_names, m_sym_ctx, missing_weak); + ret = FindInSymbols( + CollectCandidateCPlusPlusNames(candidate_C_names, m_sym_ctx), m_sym_ctx, + missing_weak); return ret; } Index: lldb/include/lldb/Target/Language.h =================================================================== --- lldb/include/lldb/Target/Language.h +++ lldb/include/lldb/Target/Language.h @@ -310,10 +310,20 @@ return std::vector<ConstString>(); } - virtual ConstString - FindBestAlternateFunctionMangledName(const Mangled mangled, - const SymbolContext &sym_ctx) const { - return ConstString(); + /// Generates a list of mangled function name alternatives + /// + /// \param[in] mangled_names List of mangled names to generate + /// alternatives for. + /// + /// \param[in] sc SymbolContext used to find approximately matching + /// mangled function names. + /// + /// \returns List of mangled function names that are similar to + /// the names in 'mangled_names'. + virtual std::vector<ConstString> + CollectAlternateFunctionNames(const std::vector<ConstString> &mangled_names, + const SymbolContext &sc) const { + return {}; } protected: Index: lldb/include/lldb/Expression/IRExecutionUnit.h =================================================================== --- lldb/include/lldb/Expression/IRExecutionUnit.h +++ lldb/include/lldb/Expression/IRExecutionUnit.h @@ -217,9 +217,20 @@ void CollectCandidateCNames(std::vector<ConstString> &C_names, ConstString name); - void CollectCandidateCPlusPlusNames(std::vector<ConstString> &CPP_names, - const std::vector<ConstString> &C_names, - const SymbolContext &sc); + /// Generates a list of mangled function names from a list of + /// of similar mangled function names. + /// + /// \param[in] C_names List of mangled names to generate + /// alternatives for. + /// + /// \param[in] sc SymbolContext used to find approximately matching + /// mangled function names. + /// + /// \returns List of mangled function names that are similar to + /// the names in 'C_names'. + std::vector<ConstString> + CollectCandidateCPlusPlusNames(const std::vector<ConstString> &C_names, + const SymbolContext &sc); lldb::addr_t FindInSymbols(const std::vector<ConstString> &names, const lldb_private::SymbolContext &sc,
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits