From 48ce523a26b7a5a3dc4cff616c93ed951244746b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tomasz=20Mi=C4=85sko?= Date: Fri, 15 Oct 2021 20:43:55 +0200 Subject: [PATCH] [Symbolize] Demangle Rust symbols 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 | 15 +++------------ llvm/test/DebugInfo/symbolize-demangling.s | 14 ++++++++++---- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index fb4875f..6da0b69 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -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; } diff --git a/llvm/test/DebugInfo/symbolize-demangling.s b/llvm/test/DebugInfo/symbolize-demangling.s index acd769a2..ff29b99 100644 --- a/llvm/test/DebugInfo/symbolize-demangling.s +++ b/llvm/test/DebugInfo/symbolize-demangling.s @@ -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 3 | 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 -- 2.7.4