1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00

[Symbolize] Use the local MSVC C++ demangler instead of relying on dbghelp. NFC.

This allows making a couple llvm-symbolizer tests run in all
environments.

Differential Revision: https://reviews.llvm.org/D68133

llvm-svn: 373698
This commit is contained in:
Martin Storsjo 2019-10-04 07:05:42 +00:00
parent 43d31fdc8e
commit e6de034fbb
3 changed files with 4 additions and 45 deletions

View File

@ -35,19 +35,6 @@
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#if defined(_MSC_VER)
#include <Windows.h>
// This must be included after windows.h.
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
// Windows.h conflicts with our COFF header definitions.
#ifdef IMAGE_FILE_MACHINE_I386
#undef IMAGE_FILE_MACHINE_I386
#endif
#endif
namespace llvm { namespace llvm {
namespace symbolize { namespace symbolize {
@ -524,31 +511,11 @@ LLVMSymbolizer::DemangleName(const std::string &Name,
const SymbolizableModule *DbiModuleDescriptor) { const SymbolizableModule *DbiModuleDescriptor) {
// We can spoil names of symbols with C linkage, so use an heuristic // We can spoil names of symbols with C linkage, so use an heuristic
// approach to check if the name should be demangled. // approach to check if the name should be demangled.
if (Name.substr(0, 2) == "_Z") { // MSVC C++ mangled symbols start with '?', while itanium mangled ones
int status = 0; // start with _Z.
char *DemangledName = itaniumDemangle(Name.c_str(), nullptr, nullptr, &status); if (Name.substr(0, 2) == "_Z" || (!Name.empty() && Name.front() == '?'))
if (status != 0) return demangle(Name);
return Name;
std::string Result = DemangledName;
free(DemangledName);
return Result;
}
#if defined(_MSC_VER)
if (!Name.empty() && Name.front() == '?') {
// Only do MSVC C++ demangling on symbols starting with '?'.
char DemangledName[1024] = {0};
DWORD result = ::UnDecorateSymbolName(
Name.c_str(), DemangledName, 1023,
UNDNAME_NO_ACCESS_SPECIFIERS | // Strip public, private, protected
UNDNAME_NO_ALLOCATION_LANGUAGE | // Strip __thiscall, __stdcall, etc
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
UNDNAME_NO_FUNCTION_RETURNS); // Strip function return types
return (result == 0) ? Name : std::string(DemangledName);
}
#endif
if (DbiModuleDescriptor && DbiModuleDescriptor->isWin32Module()) if (DbiModuleDescriptor && DbiModuleDescriptor->isWin32Module())
return std::string(demanglePE32ExternCFunc(Name)); return std::string(demanglePE32ExternCFunc(Name));
return Name; return Name;

View File

@ -5,9 +5,6 @@ RUN: | FileCheck %s
RUN: llvm-symbolizer 0x5009 0x5038 -i --relative-address -obj="%p/Inputs/coff-dwarf.exe" \ RUN: llvm-symbolizer 0x5009 0x5038 -i --relative-address -obj="%p/Inputs/coff-dwarf.exe" \
RUN: | FileCheck %s RUN: | FileCheck %s
This test relies on UnDecorateSymbolName, which is Windows-only.
REQUIRES: target-windows, system-windows
CHECK: foo(void) CHECK: foo(void)
CHECK: coff-dwarf.cpp:7 CHECK: coff-dwarf.cpp:7
CHECK: bar(void) CHECK: bar(void)

View File

@ -5,11 +5,6 @@ RUN: | FileCheck %s
RUN: llvm-symbolizer 0x500A 0x5038 0x504B -i --relative-address -obj="%p/Inputs/coff-exports.exe" \ RUN: llvm-symbolizer 0x500A 0x5038 0x504B -i --relative-address -obj="%p/Inputs/coff-exports.exe" \
RUN: | FileCheck %s RUN: | FileCheck %s
This test relies on UnDecorateSymbolName, which is Win32-only.
REQUIRES: system-windows
REQUIRES: target-windows
FIXME: This test depends on host, not target.
We get the expected stack trace, except 'foo' appears for the 'bar' frame We get the expected stack trace, except 'foo' appears for the 'bar' frame
because 'bar' isn't in the export table. because 'bar' isn't in the export table.