summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2019-09-28 10:25:22 +0000
committerMartin Storsjo <martin@martin.st>2019-09-28 10:25:22 +0000
commitb1cd91815e03a914724117f9ffbe498abeb05da7 (patch)
treeddb95130b6f21d19b61b8e444169b9bb7b43d820
parentac7c6d554d50bf5848314524e5ed66e12a7de138 (diff)
downloadbcm5719-llvm-b1cd91815e03a914724117f9ffbe498abeb05da7.tar.gz
bcm5719-llvm-b1cd91815e03a914724117f9ffbe498abeb05da7.zip
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
-rw-r--r--lldb/source/Core/Mangled.cpp44
1 files changed, 41 insertions, 3 deletions
diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp
index 82438b561f1..944c7b0bcfe 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 <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) {
OpenPOWER on IntegriCloud