diff --git a/llvm/include/llvm/Demangle/Demangle.h b/llvm/include/llvm/Demangle/Demangle.h --- a/llvm/include/llvm/Demangle/Demangle.h +++ b/llvm/include/llvm/Demangle/Demangle.h @@ -29,7 +29,7 @@ demangle_success = 0, }; -char *itaniumDemangle(const char *mangled_name, char *buf, size_t *n, +char *itaniumDemangle(std::string_view mangled_name, char *buf, size_t *n, int *status); enum MSDemangleFlags { @@ -65,7 +65,7 @@ /// demangling occurred. std::string demangle(const std::string_view MangledName); -bool nonMicrosoftDemangle(const char *MangledName, std::string &Result); +bool nonMicrosoftDemangle(std::string_view MangledName, std::string &Result); /// "Partial" demangler. This supports demangling a string into an AST /// (typically an intermediate stage in itaniumDemangle) and querying certain diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -679,7 +679,7 @@ LLVMSymbolizer::DemangleName(const std::string &Name, const SymbolizableModule *DbiModuleDescriptor) { std::string Result; - if (nonMicrosoftDemangle(Name.c_str(), Result)) + if (nonMicrosoftDemangle(Name, Result)) return Result; if (!Name.empty() && Name.front() == '?') { @@ -700,7 +700,7 @@ std::string DemangledCName(demanglePE32ExternCFunc(Name)); // On i386 Windows, the C name mangling for different calling conventions // may also be applied on top of the Itanium or Rust name mangling. - if (nonMicrosoftDemangle(DemangledCName.c_str(), Result)) + if (nonMicrosoftDemangle(DemangledCName, Result)) return Result; return DemangledCName; } diff --git a/llvm/lib/Demangle/Demangle.cpp b/llvm/lib/Demangle/Demangle.cpp --- a/llvm/lib/Demangle/Demangle.cpp +++ b/llvm/lib/Demangle/Demangle.cpp @@ -20,10 +20,10 @@ std::string Result; const char *S = MangledName.data(); - if (nonMicrosoftDemangle(S, Result)) + if (nonMicrosoftDemangle(MangledName, Result)) return Result; - if (S[0] == '_' && nonMicrosoftDemangle(S + 1, Result)) + if (S[0] == '_' && nonMicrosoftDemangle(MangledName.substr(1), Result)) return Result; if (char *Demangled = microsoftDemangle(S, nullptr, nullptr)) { @@ -43,14 +43,15 @@ static bool isDLangEncoding(std::string_view S) { return starts_with(S, "_D"); } -bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) { +bool llvm::nonMicrosoftDemangle(std::string_view MangledName, + std::string &Result) { char *Demangled = nullptr; if (isItaniumEncoding(MangledName)) Demangled = itaniumDemangle(MangledName, nullptr, nullptr, nullptr); else if (isRustEncoding(MangledName)) - Demangled = rustDemangle(MangledName); + Demangled = rustDemangle(MangledName.data()); else if (isDLangEncoding(MangledName)) - Demangled = dlangDemangle(MangledName); + Demangled = dlangDemangle(MangledName.data()); if (!Demangled) return false; diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp --- a/llvm/lib/Demangle/ItaniumDemangle.cpp +++ b/llvm/lib/Demangle/ItaniumDemangle.cpp @@ -365,16 +365,17 @@ using Demangler = itanium_demangle::ManglingParser; -char *llvm::itaniumDemangle(const char *MangledName, char *Buf, - size_t *N, int *Status) { - if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) { +char *llvm::itaniumDemangle(std::string_view MangledName, char *Buf, size_t *N, + int *Status) { + if (MangledName.empty() || (Buf != nullptr && N == nullptr)) { if (Status) *Status = demangle_invalid_args; return nullptr; } int InternalStatus = demangle_success; - Demangler Parser(MangledName, MangledName + std::strlen(MangledName)); + Demangler Parser(MangledName.data(), + MangledName.data() + MangledName.length()); Node *AST = Parser.parse(); if (AST == nullptr) diff --git a/llvm/lib/ProfileData/GCOV.cpp b/llvm/lib/ProfileData/GCOV.cpp --- a/llvm/lib/ProfileData/GCOV.cpp +++ b/llvm/lib/ProfileData/GCOV.cpp @@ -339,7 +339,7 @@ if (Name.startswith("_Z")) { int status = 0; // Name is guaranteed to be NUL-terminated. - char *res = itaniumDemangle(Name.data(), nullptr, nullptr, &status); + char *res = itaniumDemangle(Name, nullptr, nullptr, &status); if (status == 0) { demangled = res; free(res); diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -71,10 +71,10 @@ } static std::string demangle(const std::string &Mangled) { - const char *DecoratedStr = Mangled.c_str(); + std::string_view DecoratedStr = Mangled; if (StripUnderscore) if (DecoratedStr[0] == '_') - ++DecoratedStr; + DecoratedStr.remove_prefix(1); std::string Result; if (nonMicrosoftDemangle(DecoratedStr, Result)) @@ -86,9 +86,10 @@ if (Types) Undecorated = itaniumDemangle(DecoratedStr, nullptr, nullptr, nullptr); - if (!Undecorated && strncmp(DecoratedStr, "__imp_", 6) == 0) { + if (!Undecorated && DecoratedStr.substr(6) == "__imp_") { Prefix = "import thunk for "; - Undecorated = itaniumDemangle(DecoratedStr + 6, nullptr, nullptr, nullptr); + Undecorated = + itaniumDemangle(DecoratedStr.substr(6), nullptr, nullptr, nullptr); } Result = Undecorated ? Prefix + Undecorated : Mangled; diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -639,7 +639,7 @@ static std::optional demangle(StringRef Name) { std::string Demangled; - if (nonMicrosoftDemangle(Name.str().c_str(), Demangled)) + if (nonMicrosoftDemangle(Name, Demangled)) return Demangled; return std::nullopt; } diff --git a/llvm/tools/llvm-opt-report/OptReport.cpp b/llvm/tools/llvm-opt-report/OptReport.cpp --- a/llvm/tools/llvm-opt-report/OptReport.cpp +++ b/llvm/tools/llvm-opt-report/OptReport.cpp @@ -340,7 +340,7 @@ if (!NoDemangle) { int Status = 0; char *Demangled = - itaniumDemangle(FuncName.c_str(), nullptr, nullptr, &Status); + itaniumDemangle(FuncName, nullptr, nullptr, &Status); if (Demangled && Status == 0) { OS << Demangled; Printed = true;