xiaobai created this revision.
xiaobai added a reviewer: LLDB.
Herald added a project: LLDB.
Instead of asking each of the language plugins directly if a symbol is a
possible manghled name for that language, we can generalize this
pattern. By adding a method `IsMangledName` and iterating over each
loaded language plugin, we can avoid referencing any language plugin
directly.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D74187
Files:
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
lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
Index: lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
===================================================================
--- lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
+++ lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h
@@ -31,6 +31,11 @@
const Highlighter *GetHighlighter() const override { return &m_highlighter; }
+ bool IsMangledName(llvm::StringRef name) const override {
+ // Let the CPlusPlusLanguage plugin answer this
+ return false;
+ }
+
// Static Functions
static void Initialize();
Index: lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
===================================================================
--- lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
+++ lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
@@ -93,6 +93,10 @@
return lldb::eLanguageTypeObjC;
}
+ bool IsMangledName(llvm::StringRef name) const override {
+ return false;
+ }
+
// Get all possible names for a method. Examples:
// If method_name is "+[NSString(my_additions) myStringWithCString:]"
// variant_names[0] => "+[NSString myStringWithCString:]"
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
===================================================================
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -101,6 +101,8 @@
static lldb_private::ConstString GetPluginNameStatic();
+ bool IsMangledName(llvm::StringRef name) const override;
+
static bool IsCPPMangledName(llvm::StringRef name);
// Extract C++ context and identifier from a string using heuristic matching
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
===================================================================
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -239,6 +239,10 @@
return res;
}
+bool CPlusPlusLanguage::IsMangledName(llvm::StringRef name) const {
+ return IsCPPMangledName(name);
+}
+
bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {
// FIXME!! we should really run through all the known C++ Language plugins
// and ask each one if this is a C++ mangled name
Index: lldb/source/Core/Mangled.cpp
===================================================================
--- lldb/source/Core/Mangled.cpp
+++ 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"
@@ -410,11 +411,15 @@
ConstString mangled = GetMangledName();
if (mangled) {
- const char *mangled_name = mangled.GetCString();
- if (CPlusPlusLanguage::IsCPPMangledName(mangled_name))
- return lldb::eLanguageTypeC_plus_plus;
- else if (ObjCLanguage::IsPossibleObjCMethodName(mangled_name))
- return lldb::eLanguageTypeObjC;
+ lldb::LanguageType lang_type = lldb::eLanguageTypeUnknown;
+ Language::ForEach([&lang_type, &mangled](Language *lang) {
+ if (lang->IsMangledName(mangled.GetCString())) {
+ lang_type = lang->GetLanguageType();
+ return false; // Break out of ForEach early
+ }
+ return true;
+ });
+ return lang_type;
} else {
// ObjC names aren't really mangled, so they won't necessarily be in the
// mangled name slot.
Index: lldb/include/lldb/Target/Language.h
===================================================================
--- lldb/include/lldb/Target/Language.h
+++ lldb/include/lldb/Target/Language.h
@@ -188,6 +188,8 @@
virtual const char *GetLanguageSpecificTypeLookupHelp();
+ virtual bool IsMangledName(llvm::StringRef name) const = 0;
+
// If a language can have more than one possible name for a method, this
// function can be used to enumerate them. This is useful when doing name
// lookups.
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits