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 '?'.
MSDF_NoMemberType | MSDF_NoReturnType));
if (status != 0)
return Name;
- std::string Result = DemangledName;
+ Result = DemangledName;
free(DemangledName);
return Result;
}
# 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