diff options
-rw-r--r-- | lldb/source/Core/Mangled.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index d0951fae448..376c16387b7 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -41,6 +41,24 @@ using namespace lldb_private; +#if defined(_MSC_VER) +static DWORD safeUndecorateName(const char* Mangled, char *Demangled, DWORD DemangledLength) { + static std::mutex M; + std::lock_guard<std::mutex> Lock(M); + return ::UnDecorateSymbolName( + Mangled, Demangled, DemangledLength, + UNDNAME_NO_ACCESS_SPECIFIERS | // Strip public, private, protected + // keywords + UNDNAME_NO_ALLOCATION_LANGUAGE | // Strip __thiscall, __stdcall, + // etc keywords + UNDNAME_NO_THROW_SIGNATURES | // Strip throw() specifications + UNDNAME_NO_MEMBER_TYPE | // Strip virtual, static, etc + // specifiers + UNDNAME_NO_MS_KEYWORDS // Strip all MS extension keywords + ); +} +#endif + static inline Mangled::ManglingScheme cstring_mangling_scheme(const char *s) { if (s) { if (s[0] == '?') @@ -253,17 +271,7 @@ Mangled::GetDemangledName(lldb::LanguageType language) const { const size_t demangled_length = 2048; demangled_name = static_cast<char *>(::malloc(demangled_length)); ::ZeroMemory(demangled_name, demangled_length); - DWORD result = ::UnDecorateSymbolName( - mangled_name, demangled_name, demangled_length, - UNDNAME_NO_ACCESS_SPECIFIERS | // Strip public, private, protected - // keywords - UNDNAME_NO_ALLOCATION_LANGUAGE | // Strip __thiscall, __stdcall, - // etc keywords - UNDNAME_NO_THROW_SIGNATURES | // Strip throw() specifications - UNDNAME_NO_MEMBER_TYPE | // Strip virtual, static, etc - // specifiers - UNDNAME_NO_MS_KEYWORDS // Strip all MS extension keywords - ); + DWORD result = safeUndecorateName(mangled_name, demangled_name, demangled_length); if (log) { if (demangled_name && demangled_name[0]) log->Printf("demangled msvc: %s -> \"%s\"", mangled_name, |