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 @@ -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. 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" @@ -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. 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 @@ -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 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 @@ -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 diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h +++ b/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:]" diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h --- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h +++ b/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();