Skip to content

Commit b1cd918

Browse files
committed
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
1 parent ac7c6d5 commit b1cd918

File tree

1 file changed

+41
-3
lines changed

1 file changed

+41
-3
lines changed

lldb/source/Core/Mangled.cpp

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88

99
#include "lldb/Core/Mangled.h"
1010

11+
#if defined(_WIN32)
12+
#include "lldb/Host/windows/windows.h"
13+
14+
#include <dbghelp.h>
15+
#pragma comment(lib, "dbghelp.lib")
16+
#endif
17+
1118
#include "lldb/Core/RichManglingContext.h"
1219
#include "lldb/Utility/ConstString.h"
1320
#include "lldb/Utility/Log.h"
@@ -32,6 +39,25 @@
3239
#include <string.h>
3340
using namespace lldb_private;
3441

42+
#if defined(_MSC_VER)
43+
static DWORD safeUndecorateName(const char *Mangled, char *Demangled,
44+
DWORD DemangledLength) {
45+
static std::mutex M;
46+
std::lock_guard<std::mutex> Lock(M);
47+
return ::UnDecorateSymbolName(
48+
Mangled, Demangled, DemangledLength,
49+
UNDNAME_NO_ACCESS_SPECIFIERS | // Strip public, private, protected
50+
// keywords
51+
UNDNAME_NO_ALLOCATION_LANGUAGE | // Strip __thiscall, __stdcall,
52+
// etc keywords
53+
UNDNAME_NO_THROW_SIGNATURES | // Strip throw() specifications
54+
UNDNAME_NO_MEMBER_TYPE | // Strip virtual, static, etc
55+
// specifiers
56+
UNDNAME_NO_MS_KEYWORDS // Strip all MS extension keywords
57+
);
58+
}
59+
#endif
60+
3561
static inline Mangled::ManglingScheme cstring_mangling_scheme(const char *s) {
3662
if (s) {
3763
if (s[0] == '?')
@@ -192,16 +218,28 @@ void Mangled::SetValue(ConstString name) {
192218

193219
// Local helpers for different demangling implementations.
194220
static char *GetMSVCDemangledStr(const char *M) {
195-
char *demangled_cstr = llvm::microsoftDemangle(M, nullptr, nullptr, nullptr);
221+
#if defined(_MSC_VER)
222+
const size_t demangled_length = 2048;
223+
char *demangled_cstr = static_cast<char *>(::malloc(demangled_length));
224+
::ZeroMemory(demangled_cstr, demangled_length);
225+
DWORD result = safeUndecorateName(M, demangled_cstr, demangled_length);
196226

197227
if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) {
198228
if (demangled_cstr && demangled_cstr[0])
199229
LLDB_LOGF(log, "demangled msvc: %s -> \"%s\"", M, demangled_cstr);
200230
else
201-
LLDB_LOGF(log, "demangled msvc: %s -> error", M);
231+
LLDB_LOGF(log, "demangled msvc: %s -> error: 0x%lu", M, result);
202232
}
203233

204-
return demangled_cstr;
234+
if (result != 0) {
235+
return demangled_cstr;
236+
} else {
237+
::free(demangled_cstr);
238+
return nullptr;
239+
}
240+
#else
241+
return nullptr;
242+
#endif
205243
}
206244

207245
static char *GetItaniumDemangledStr(const char *M) {

0 commit comments

Comments
 (0)