[llvm-nm] Demangle Rust symbols
authorTomasz Miąsko <tomasz.miasko@gmail.com>
Sat, 16 Oct 2021 12:10:31 +0000 (14:10 +0200)
committerTomasz Miąsko <tomasz.miasko@gmail.com>
Fri, 12 Nov 2021 11:46:59 +0000 (12:46 +0100)
Add support for demangling Rust v0 symbols to llvm-nm by reusing
nonMicrosoftDemangle which supports both Itanium and Rust mangling.

Reviewed By: dblaikie, jhenderson

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

llvm/test/tools/llvm-nm/X86/demangle.ll
llvm/tools/llvm-nm/llvm-nm.cpp

index b9f4b05241a25456974986c1607d2befa938ad77..cab2e09cc1d492a5c4f5f281de72ecc450856a00 100644 (file)
@@ -28,17 +28,27 @@ entry:
   ret float 0.000000e+00
 }
 
+define i32 @_RNvC1a3baz(i32) #0 {
+entry:
+  ret i32 1
+}
+
+; MANGLED:       0000000000000020 T _RNvC1a3baz
 ; MANGLED:       0000000000000010 T _Z3barf
 ; MANGLED:       0000000000000000 T _Z3fooi
 
+; MACHO-MANGLED: 0000000000000020 T __RNvC1a3baz
 ; MACHO-MANGLED: 0000000000000010 T __Z3barf
 ; MACHO-MANGLED: 0000000000000000 T __Z3fooi
 
+; COFF-MANGLED:          00000020 T _RNvC1a3baz
 ; COFF-MANGLED:          00000010 T _Z3barf
 ; COFF-MANGLED:          00000000 T _Z3fooi
 
+; DEMANGLED:     0000000000000020 T a::baz
 ; DEMANGLED:     0000000000000010 T bar(float)
 ; DEMANGLED:     0000000000000000 T foo(int)
 
+; COFF-DEMANGLED:        00000020 T a::baz
 ; COFF-DEMANGLED:        00000010 T bar(float)
 ; COFF-DEMANGLED:        00000000 T foo(int)
index 2754dac46986dedb2e3334d78f9c56b01edc2c37..0864985377cefaec454121b704e6958731015a84 100644 (file)
@@ -599,22 +599,16 @@ static void darwinPrintStab(MachOObjectFile *MachO, const NMSymbol &S) {
     outs() << format("   %02x", NType);
 }
 
-static Optional<std::string> demangle(StringRef Name, bool StripUnderscore) {
-  if (StripUnderscore && !Name.empty() && Name[0] == '_')
-    Name = Name.substr(1);
-
-  if (!Name.startswith("_Z"))
-    return None;
-
-  int Status;
-  char *Undecorated =
-      itaniumDemangle(Name.str().c_str(), nullptr, nullptr, &Status);
-  if (Status != 0)
-    return None;
-
-  std::string S(Undecorated);
-  free(Undecorated);
-  return S;
+static Optional<std::string> demangle(const std::string &Name,
+                                      bool StripUnderscore) {
+  const char *Mangled = Name.c_str();
+  if (StripUnderscore && Mangled[0] == '_')
+    Mangled = Mangled + 1;
+
+  std::string Demangled;
+  if (nonMicrosoftDemangle(Mangled, Demangled))
+    return Demangled;
+  return None;
 }
 
 static bool symbolIsDefined(const NMSymbol &Sym) {