[Lldb-commits] [lldb] r373146 - Revert "[LLDB] Use the llvm microsoft demangler instead of the windows dbghelp api. NFC."
Martin Storsjo via lldb-commits
lldb-commits at lists.llvm.org
Sat Sep 28 03:25:22 PDT 2019
Author: mstorsjo
Date: Sat Sep 28 03:25:22 2019
New Revision: 373146
URL: http://llvm.org/viewvc/llvm-project?rev=373146&view=rev
Log:
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.
Modified:
lldb/trunk/source/Core/Mangled.cpp
Modified: lldb/trunk/source/Core/Mangled.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Mangled.cpp?rev=373146&r1=373145&r2=373146&view=diff
==============================================================================
--- lldb/trunk/source/Core/Mangled.cpp (original)
+++ lldb/trunk/source/Core/Mangled.cpp Sat Sep 28 03:25:22 2019
@@ -8,6 +8,13 @@
#include "lldb/Core/Mangled.h"
+#if defined(_WIN32)
+#include "lldb/Host/windows/windows.h"
+
+#include <dbghelp.h>
+#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 <string.h>
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] == '?')
@@ -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<char *>(::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) {
More information about the lldb-commits
mailing list