diff options
Diffstat (limited to 'llvm/lib/Demangle/Demangle.cpp')
| -rw-r--r-- | llvm/lib/Demangle/Demangle.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp index f2aa571d685f..83f3cdc88c01 100644 --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -24,7 +24,8 @@ std::string llvm::demangle(std::string_view MangledName) { return Result; if (starts_with(MangledName, '_') && - nonMicrosoftDemangle(MangledName.substr(1), Result)) + nonMicrosoftDemangle(MangledName.substr(1), Result, + /*CanHaveLeadingDot=*/false)) return Result; if (char *Demangled = microsoftDemangle(MangledName, nullptr, nullptr)) { @@ -46,8 +47,15 @@ static bool isRustEncoding(std::string_view S) { return starts_with(S, "_R"); } static bool isDLangEncoding(std::string_view S) { return starts_with(S, "_D"); } bool llvm::nonMicrosoftDemangle(std::string_view MangledName, - std::string &Result) { + std::string &Result, bool CanHaveLeadingDot) { char *Demangled = nullptr; + + // Do not consider the dot prefix as part of the demangled symbol name. + if (CanHaveLeadingDot && MangledName.size() > 0 && MangledName[0] == '.') { + MangledName.remove_prefix(1); + Result = "."; + } + if (isItaniumEncoding(MangledName)) Demangled = itaniumDemangle(MangledName); else if (isRustEncoding(MangledName)) @@ -58,7 +66,7 @@ bool llvm::nonMicrosoftDemangle(std::string_view MangledName, if (!Demangled) return false; - Result = Demangled; + Result += Demangled; std::free(Demangled); return true; } |
