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 @@ -300,6 +300,12 @@ return std::vector(); } + virtual ConstString + FindBestAlternateFunctionMangledName(const Mangled mangled, + const SymbolContext &sym_ctx) const { + return ConstString(); + } + protected: // Classes that inherit from Language can see and modify these diff --git a/lldb/source/Expression/CMakeLists.txt b/lldb/source/Expression/CMakeLists.txt --- a/lldb/source/Expression/CMakeLists.txt +++ b/lldb/source/Expression/CMakeLists.txt @@ -23,7 +23,6 @@ lldbSymbol lldbTarget lldbUtility - lldbPluginCPlusPlusLanguage lldbPluginObjectFileJIT LINK_COMPONENTS 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 @@ -26,6 +26,7 @@ #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Target/ExecutionContext.h" +#include "lldb/Target/Language.h" #include "lldb/Target/LanguageRuntime.h" #include "lldb/Target/Target.h" #include "lldb/Utility/DataBufferHeap.h" @@ -33,7 +34,6 @@ #include "lldb/Utility/LLDBAssert.h" #include "lldb/Utility/Log.h" -#include "lldb/../../source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" #include "lldb/../../source/Plugins/ObjectFile/JIT/ObjectFileJIT.h" using namespace lldb_private; @@ -652,52 +652,6 @@ return return_value; } -static ConstString FindBestAlternateMangledName(ConstString demangled, - const SymbolContext &sym_ctx) { - CPlusPlusLanguage::MethodName cpp_name(demangled); - std::string scope_qualified_name = cpp_name.GetScopeQualifiedName(); - - if (!scope_qualified_name.size()) - return ConstString(); - - if (!sym_ctx.module_sp) - return ConstString(); - - lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile(); - if (!sym_file) - return ConstString(); - - std::vector alternates; - sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates); - - std::vector param_and_qual_matches; - std::vector param_matches; - for (size_t i = 0; i < alternates.size(); i++) { - ConstString alternate_mangled_name = alternates[i]; - Mangled mangled(alternate_mangled_name); - ConstString demangled = mangled.GetDemangledName(); - - CPlusPlusLanguage::MethodName alternate_cpp_name(demangled); - if (!cpp_name.IsValid()) - continue; - - if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) { - if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers()) - param_and_qual_matches.push_back(alternate_mangled_name); - else - param_matches.push_back(alternate_mangled_name); - } - } - - if (param_and_qual_matches.size()) - return param_and_qual_matches[0]; // It is assumed that there will be only - // one! - else if (param_matches.size()) - return param_matches[0]; // Return one of them as a best match - else - return ConstString(); -} - void IRExecutionUnit::CollectCandidateCNames(std::vector &C_names, ConstString name) { if (m_strip_underscore && name.AsCString()[0] == '_') @@ -712,10 +666,9 @@ for (const ConstString &name : C_names) { Mangled mangled(name); if (cpp_lang->SymbolNameFitsToLanguage(mangled)) { - if (ConstString demangled = mangled.GetDemangledName()) { - if (ConstString best_alternate_mangled_name = - FindBestAlternateMangledName(demangled, sc)) - CPP_names.push_back(best_alternate_mangled_name); + if (ConstString best_alternate = + cpp_lang->FindBestAlternateFunctionMangledName(mangled, sc)) { + CPP_names.push_back(best_alternate); } } 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 @@ -130,6 +130,9 @@ std::vector GenerateAlternateFunctionManglings(const ConstString mangled) const override; + ConstString FindBestAlternateFunctionMangledName( + const Mangled mangled, const SymbolContext &sym_ctx) const override; + // PluginInterface protocol ConstString GetPluginName() override; }; 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 @@ -20,12 +20,14 @@ #include "llvm/Demangle/ItaniumDemangle.h" #include "lldb/Core/Mangled.h" +#include "lldb/Core/Module.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/DataFormatters/CXXFunctionPointer.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/VectorType.h" +#include "lldb/Symbol/SymbolFile.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/RegularExpression.h" @@ -478,6 +480,56 @@ return alternates; } +ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName( + const Mangled mangled, const SymbolContext &sym_ctx) const { + ConstString demangled = mangled.GetDemangledName(); + if (!demangled) + return ConstString(); + + CPlusPlusLanguage::MethodName cpp_name(demangled); + std::string scope_qualified_name = cpp_name.GetScopeQualifiedName(); + + if (!scope_qualified_name.size()) + return ConstString(); + + if (!sym_ctx.module_sp) + return ConstString(); + + lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile(); + if (!sym_file) + return ConstString(); + + std::vector alternates; + sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates); + + std::vector param_and_qual_matches; + std::vector param_matches; + for (size_t i = 0; i < alternates.size(); i++) { + ConstString alternate_mangled_name = alternates[i]; + Mangled mangled(alternate_mangled_name); + ConstString demangled = mangled.GetDemangledName(); + + CPlusPlusLanguage::MethodName alternate_cpp_name(demangled); + if (!cpp_name.IsValid()) + continue; + + if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) { + if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers()) + param_and_qual_matches.push_back(alternate_mangled_name); + else + param_matches.push_back(alternate_mangled_name); + } + } + + if (param_and_qual_matches.size()) + return param_and_qual_matches[0]; // It is assumed that there will be only + // one! + else if (param_matches.size()) + return param_matches[0]; // Return one of them as a best match + else + return ConstString(); +} + static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { if (!cpp_category_sp) return;