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 @@ -243,6 +243,14 @@ FunctionNameRepresentation representation, Stream &s); + virtual ConstString + GetDemangledFunctionNameWithoutArguments(Mangled mangled) const { + if (ConstString demangled = mangled.GetDemangledName()) + return demangled; + + return mangled.GetMangledName(); + } + virtual void GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s); diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -9,6 +9,7 @@ #include "lldb/Core/Mangled.h" #include "lldb/Core/RichManglingContext.h" +#include "lldb/Target/Language.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Logging.h" @@ -16,8 +17,6 @@ #include "lldb/Utility/Stream.h" #include "lldb/lldb-enumerations.h" -#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" - #include "llvm/ADT/StringRef.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Support/Compiler.h" @@ -34,35 +33,6 @@ return Mangled::GetManglingScheme(s) != Mangled::eManglingSchemeNone; } -static ConstString GetDemangledNameWithoutArguments(ConstString mangled, - ConstString demangled) { - const char *mangled_name_cstr = mangled.GetCString(); - - if (demangled && mangled_name_cstr && mangled_name_cstr[0]) { - if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' && - (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure, - // typeinfo structure, and typeinfo - // mangled_name - mangled_name_cstr[2] != 'G' && // avoid guard variables - mangled_name_cstr[2] != 'Z')) // named local entities (if we eventually - // handle eSymbolTypeData, we will want - // this back) - { - CPlusPlusLanguage::MethodName cxx_method(demangled); - if (!cxx_method.GetBasename().empty()) { - std::string shortname; - if (!cxx_method.GetContext().empty()) - shortname = cxx_method.GetContext().str() + "::"; - shortname += cxx_method.GetBasename().str(); - return ConstString(shortname); - } - } - } - if (demangled) - return demangled; - return mangled; -} - #pragma mark Mangled Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) { @@ -344,14 +314,16 @@ if (preference == ePreferMangled && m_mangled) return m_mangled; + // Call the accessor to make sure we get a demangled name in case it hasn't + // been demangled yet... ConstString demangled = GetDemangledName(); if (preference == ePreferDemangledWithoutArguments) { - return GetDemangledNameWithoutArguments(m_mangled, demangled); + if (Language *lang = Language::FindPlugin(GuessLanguage())) { + return lang->GetDemangledFunctionNameWithoutArguments(*this); + } } if (preference == ePreferDemangled) { - // Call the accessor to make sure we get a demangled name in case it hasn't - // been demangled yet... if (demangled) return demangled; return m_mangled; 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 @@ -106,6 +106,9 @@ bool SymbolNameFitsToLanguage(Mangled mangled) const override; + ConstString + GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override; + static bool IsCPPMangledName(llvm::StringRef name); // Extract C++ context and identifier from a string using heuristic matching 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 @@ -64,6 +64,35 @@ return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name); } +ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( + Mangled mangled) const { + const char *mangled_name_cstr = mangled.GetMangledName().GetCString(); + ConstString demangled_name = mangled.GetDemangledName(); + if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) { + if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' && + (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure, + // typeinfo structure, and typeinfo + // mangled_name + mangled_name_cstr[2] != 'G' && // avoid guard variables + mangled_name_cstr[2] != 'Z')) // named local entities (if we + // eventually handle eSymbolTypeData, + // we will want this back) + { + CPlusPlusLanguage::MethodName cxx_method(demangled_name); + if (!cxx_method.GetBasename().empty()) { + std::string shortname; + if (!cxx_method.GetContext().empty()) + shortname = cxx_method.GetContext().str() + "::"; + shortname += cxx_method.GetBasename().str(); + return ConstString(shortname); + } + } + } + if (demangled_name) + return demangled_name; + return mangled.GetMangledName(); +} + // PluginInterface protocol lldb_private::ConstString CPlusPlusLanguage::GetPluginName() {