From: Martin Storsjo Date: Sat, 28 Sep 2019 10:25:22 +0000 (+0000) Subject: Revert "[LLDB] Use the llvm microsoft demangler instead of the windows dbghelp api... X-Git-Tag: llvmorg-11-init~8071 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b1cd91815e03a914724117f9ffbe498abeb05da7;p=platform%2Fupstream%2Fllvm.git Revert "[LLDB] Use the llvm microsoft demangler instead of the windows dbghelp api. NFC." This reverts SVN r373144, as it changed the demangled output a little, see http://lab.llvm.org:8011/builders/lldb-x64-windows-ninja/builds/9306. llvm-svn: 373146 --- diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp index 82438b5..944c7b0 100644 --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -8,6 +8,13 @@ #include "lldb/Core/Mangled.h" +#if defined(_WIN32) +#include "lldb/Host/windows/windows.h" + +#include +#pragma comment(lib, "dbghelp.lib") +#endif + #include "lldb/Core/RichManglingContext.h" #include "lldb/Utility/ConstString.h" #include "lldb/Utility/Log.h" @@ -32,6 +39,25 @@ #include 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 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] == '?') @@ -192,16 +218,28 @@ void Mangled::SetValue(ConstString name) { // Local helpers for different demangling implementations. static char *GetMSVCDemangledStr(const char *M) { - char *demangled_cstr = llvm::microsoftDemangle(M, nullptr, nullptr, nullptr); +#if defined(_MSC_VER) + const size_t demangled_length = 2048; + char *demangled_cstr = static_cast(::malloc(demangled_length)); + ::ZeroMemory(demangled_cstr, demangled_length); + DWORD result = safeUndecorateName(M, demangled_cstr, demangled_length); if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) { if (demangled_cstr && demangled_cstr[0]) LLDB_LOGF(log, "demangled msvc: %s -> \"%s\"", M, demangled_cstr); else - LLDB_LOGF(log, "demangled msvc: %s -> error", M); + LLDB_LOGF(log, "demangled msvc: %s -> error: 0x%lu", M, result); } - return demangled_cstr; + if (result != 0) { + return demangled_cstr; + } else { + ::free(demangled_cstr); + return nullptr; + } +#else + return nullptr; +#endif } static char *GetItaniumDemangledStr(const char *M) {