summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/Mangled.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Core/Mangled.cpp')
-rw-r--r--lldb/source/Core/Mangled.cpp38
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))
OpenPOWER on IntegriCloud