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
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to