Selaa lähdekoodia

[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373698 91177308-0d34-0410-b5e6-96231b3b80d8
Martin Storsjo 5 vuotta sitten
vanhempi
commit
7b071ccb51

+ 4 - 37
lib/DebugInfo/Symbolize/Symbolize.cpp

@@ -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") {
-    int status = 0;
-    char *DemangledName = itaniumDemangle(Name.c_str(), nullptr, nullptr, &status);
-    if (status != 0)
-      return Name;
-    std::string Result = DemangledName;
-    free(DemangledName);
-    return Result;
-  }
+  // MSVC C++ mangled symbols start with '?', while itanium mangled ones
+  // start with _Z.
+  if (Name.substr(0, 2) == "_Z" || (!Name.empty() && Name.front() == '?'))
+    return demangle(Name);
 
 
-#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;

+ 0 - 3
test/tools/llvm-symbolizer/coff-dwarf.test

@@ -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)

+ 0 - 5
test/tools/llvm-symbolizer/coff-exports.test

@@ -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.