diff options
Diffstat (limited to 'lldb/source/Core/Mangled.cpp')
-rw-r--r-- | lldb/source/Core/Mangled.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index b06656aa3fb..15baffd212a 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -32,18 +32,8 @@ #include <string.h> using namespace lldb_private; -static inline Mangled::ManglingScheme cstring_mangling_scheme(const char *s) { - if (s) { - if (s[0] == '?') - return Mangled::eManglingSchemeMSVC; - if (s[0] == '_' && s[1] == 'Z') - return Mangled::eManglingSchemeItanium; - } - return Mangled::eManglingSchemeNone; -} - -static inline bool cstring_is_mangled(const char *s) { - return cstring_mangling_scheme(s) != Mangled::eManglingSchemeNone; +static inline bool cstring_is_mangled(llvm::StringRef s) { + return Mangled::GetManglingScheme(s) != Mangled::eManglingSchemeNone; } static ConstString @@ -99,6 +89,23 @@ get_demangled_name_without_arguments(ConstString mangled, #pragma mark Mangled +Mangled::ManglingScheme Mangled::GetManglingScheme(llvm::StringRef const name) { + if (name.empty()) + return Mangled::eManglingSchemeNone; + + if (name.startswith("?")) + return Mangled::eManglingSchemeMSVC; + + if (name.startswith("_Z")) + return Mangled::eManglingSchemeItanium; + + // ___Z is a clang extension of block invocations + if (name.startswith("___Z")) + return Mangled::eManglingSchemeItanium; + + return Mangled::eManglingSchemeNone; +} + Mangled::Mangled(ConstString s) : m_mangled(), m_demangled() { if (s) SetValue(s); @@ -159,7 +166,7 @@ void Mangled::SetValue(ConstString s, bool mangled) { void Mangled::SetValue(ConstString name) { if (name) { - if (cstring_is_mangled(name.GetCString())) { + if (cstring_is_mangled(name.GetStringRef())) { m_demangled.Clear(); m_mangled = name; } else { @@ -232,7 +239,7 @@ bool Mangled::DemangleWithRichManglingInfo( assert(m_mangled); // Check whether or not we are interested in this name at all. - ManglingScheme scheme = cstring_mangling_scheme(m_mangled.GetCString()); + ManglingScheme scheme = GetManglingScheme(m_mangled.GetStringRef()); if (skip_mangled_name && skip_mangled_name(m_mangled.GetStringRef(), scheme)) return false; @@ -300,7 +307,7 @@ Mangled::GetDemangledName(lldb::LanguageType language) const { // Don't bother running anything that isn't mangled const char *mangled_name = m_mangled.GetCString(); - ManglingScheme mangling_scheme{cstring_mangling_scheme(mangled_name)}; + ManglingScheme mangling_scheme = GetManglingScheme(m_mangled.GetStringRef()); if (mangling_scheme != eManglingSchemeNone && !m_mangled.GetMangledCounterpart(m_demangled)) { // We didn't already mangle this name, demangle it and if all goes well @@ -405,6 +412,7 @@ size_t Mangled::MemorySize() const { // within those targets. lldb::LanguageType Mangled::GuessLanguage() const { ConstString mangled = GetMangledName(); + if (mangled) { const char *mangled_name = mangled.GetCString(); if (CPlusPlusLanguage::IsCPPMangledName(mangled_name)) |