[Symbolize] Demangle Rust symbols
authorTomasz Miąsko <tomasz.miasko@gmail.com>
Fri, 15 Oct 2021 18:43:55 +0000 (20:43 +0200)
committerTomasz Miąsko <tomasz.miasko@gmail.com>
Sat, 16 Oct 2021 11:32:17 +0000 (13:32 +0200)
Add support for demangling Rust v0 symbols to LLVM symbolizer by reusing
nonMicrosoftDemangle which supports both Itanium and Rust mangling.

Reviewed By: dblaikie, jhenderson

Part of https://reviews.llvm.org/D110664

llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
llvm/test/DebugInfo/symbolize-demangling.s

index fb4875f..6da0b69 100644 (file)
@@ -652,18 +652,9 @@ StringRef demanglePE32ExternCFunc(StringRef SymbolName) {
 std::string
 LLVMSymbolizer::DemangleName(const std::string &Name,
                              const SymbolizableModule *DbiModuleDescriptor) {
-  // We can spoil names of symbols with C linkage, so use an heuristic
-  // 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);
+  std::string Result;
+  if (nonMicrosoftDemangle(Name.c_str(), Result))
     return Result;
-  }
 
   if (!Name.empty() && Name.front() == '?') {
     // Only do MSVC C++ demangling on symbols starting with '?'.
@@ -674,7 +665,7 @@ LLVMSymbolizer::DemangleName(const std::string &Name,
                         MSDF_NoMemberType | MSDF_NoReturnType));
     if (status != 0)
       return Name;
-    std::string Result = DemangledName;
+    Result = DemangledName;
     free(DemangledName);
     return Result;
   }
index acd769a..ff29b99 100644 (file)
@@ -2,23 +2,29 @@
 
 # RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.o -g
 
-# RUN: llvm-symbolizer --obj=%t.o 0 1 2 | FileCheck %s
+# RUN: llvm-symbolizer --obj=%t.o 0 1 2 | FileCheck %s
 
 # CHECK:       f()
-# CHECK-NEXT:  symbolize-demangling.s:20
+# CHECK-NEXT:  symbolize-demangling.s:24
 # CHECK-EMPTY:
 # CHECK-NEXT:  {{^g$}}
-# CHECK-NEXT:  symbolize-demangling.s:22
+# CHECK-NEXT:  symbolize-demangling.s:26
 # CHECK-EMPTY:
 # CHECK-NEXT:  {{^baz$}}
-# CHECK-NEXT:  symbolize-demangling.s:24
+# CHECK-NEXT:  symbolize-demangling.s:28
+# CHECK-EMPTY:
+# CHECK-NEXT:  {{^x::y$}}
+# CHECK-NEXT:  symbolize-demangling.s:30
 
 .type _Z1fv,@function
 .type g,@function
 .type baz,@function
+.type _RNvC1x1y,@function
 _Z1fv:
   nop
 g:
   nop
 baz:
   nop
+_RNvC1x1y:
+  nop