[Lldb-commits] [lldb] 993220a - [lldb] Remove CPlusPlusLanguage from Mangled
Alex Langford via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 29 14:14:32 PDT 2021
Author: Alex Langford
Date: 2021-07-29T13:58:35-07:00
New Revision: 993220a99ccef6657d6d5d04dc51c06255f285f2
URL: https://github.com/llvm/llvm-project/commit/993220a99ccef6657d6d5d04dc51c06255f285f2
DIFF: https://github.com/llvm/llvm-project/commit/993220a99ccef6657d6d5d04dc51c06255f285f2.diff
LOG: [lldb] Remove CPlusPlusLanguage from Mangled
The only remaining plugin dependency in Mangled is CPlusPlusLanguage which it
uses to extract information from C++ mangled names. The static function
GetDemangledNameWithoutArguments is written specifically for C++, so it
would make sense for this specific functionality to live in a
C++-related plugin. In order to keep this functionality in Mangled
without maintaining this dependency, I added
`Language::GetDemangledFunctionNameWithoutArguments`.
Differential Revision: https://reviews.llvm.org/D105215
Added:
Modified:
lldb/include/lldb/Target/Language.h
lldb/source/Core/Mangled.cpp
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
Removed:
################################################################################
diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h
index 11b9daa389454..2ad9677ea3f8c 100644
--- a/lldb/include/lldb/Target/Language.h
+++ b/lldb/include/lldb/Target/Language.h
@@ -243,6 +243,14 @@ class Language : public PluginInterface {
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
index fbaf9ff7151a3..b2ceb6312be06 100644
--- 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 @@ static inline bool cstring_is_mangled(llvm::StringRef s) {
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 @@ ConstString Mangled::GetName(Mangled::NamePreference preference) const {
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.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 895fd55f499c0..814bfe28ca31a 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -64,6 +64,35 @@ bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
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() {
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
index 9163be4807ec2..46d708bec192a 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -106,6 +106,9 @@ class CPlusPlusLanguage : public Language {
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
More information about the lldb-commits
mailing list