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