|
8 | 8 |
|
9 | 9 | #include "lldb/Core/Mangled.h"
|
10 | 10 |
|
| 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 | + |
11 | 18 | #include "lldb/Core/RichManglingContext.h"
|
12 | 19 | #include "lldb/Utility/ConstString.h"
|
13 | 20 | #include "lldb/Utility/Log.h"
|
|
32 | 39 | #include <string.h>
|
33 | 40 | using namespace lldb_private;
|
34 | 41 |
|
| 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 | + |
35 | 61 | static inline Mangled::ManglingScheme cstring_mangling_scheme(const char *s) {
|
36 | 62 | if (s) {
|
37 | 63 | if (s[0] == '?')
|
@@ -192,16 +218,28 @@ void Mangled::SetValue(ConstString name) {
|
192 | 218 |
|
193 | 219 | // Local helpers for different demangling implementations.
|
194 | 220 | 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); |
196 | 226 |
|
197 | 227 | if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) {
|
198 | 228 | if (demangled_cstr && demangled_cstr[0])
|
199 | 229 | LLDB_LOGF(log, "demangled msvc: %s -> \"%s\"", M, demangled_cstr);
|
200 | 230 | else
|
201 |
| - LLDB_LOGF(log, "demangled msvc: %s -> error", M); |
| 231 | + LLDB_LOGF(log, "demangled msvc: %s -> error: 0x%lu", M, result); |
202 | 232 | }
|
203 | 233 |
|
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 |
205 | 243 | }
|
206 | 244 |
|
207 | 245 | static char *GetItaniumDemangledStr(const char *M) {
|
|
0 commit comments