diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -634,7 +634,7 @@ Diags.Report(*Loc, diag::warn_fe_frame_larger_than) << D.getStackSize() << D.getStackLimit() - << llvm::demangle(D.getFunction().getName().str()); + << llvm::demangle(D.getFunction().getName()); return true; } @@ -648,7 +648,7 @@ Diags.Report(*Loc, DiagID) << D.getResourceName() << D.getResourceSize() << D.getResourceLimit() - << llvm::demangle(D.getFunction().getName().str()); + << llvm::demangle(D.getFunction().getName()); return true; } @@ -853,7 +853,7 @@ Diags.Report(LocCookie, D.getSeverity() == DiagnosticSeverity::DS_Error ? diag::err_fe_backend_error_attr : diag::warn_fe_backend_warning_attr) - << llvm::demangle(D.getFunctionName().str()) << D.getNote(); + << llvm::demangle(D.getFunctionName()) << D.getNote(); } void BackendConsumer::MisExpectDiagHandler( diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -38,9 +38,9 @@ StringRef demangleInput = prefixless; if (ctx.config.machine == I386) demangleInput.consume_front("_"); - std::string demangled = demangle(demangleInput.str()); + std::string demangled = demangle(demangleInput); if (demangled != demangleInput) - return prefix + demangle(demangleInput.str()); + return prefix + demangle(demangleInput); return (prefix + prefixless).str(); } return std::string(symName); diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -146,12 +146,12 @@ StringRef name = sym->getName(); size_t pos = name.find('@'); if (pos == std::string::npos) - demangled = demangle(name.str()); + demangled = demangle(name); else if (pos + 1 == name.size() || name[pos + 1] == '@') - demangled = demangle(name.substr(0, pos).str()); + demangled = demangle(name.substr(0, pos)); else demangled = - (demangle(name.substr(0, pos).str()) + name.substr(pos)).str(); + (demangle(name.substr(0, pos)) + name.substr(pos)).str(); (*demangledSyms)[demangled].push_back(sym); } } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -46,7 +46,7 @@ // Returns a symbol for an error message. static std::string maybeDemangleSymbol(StringRef symName) { if (elf::config->demangle) - return demangle(symName.str()); + return demangle(symName); return symName.str(); } diff --git a/lld/MachO/Symbols.cpp b/lld/MachO/Symbols.cpp --- a/lld/MachO/Symbols.cpp +++ b/lld/MachO/Symbols.cpp @@ -32,7 +32,7 @@ static std::string maybeDemangleSymbol(StringRef symName) { if (config->demangle) { symName.consume_front("_"); - return demangle(symName.str()); + return demangle(symName); } return symName.str(); } diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -35,7 +35,7 @@ if (name == "__main_argc_argv") return "main"; if (wasm::config->demangle) - return demangle(name.str()); + return demangle(name); return name.str(); } 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 @@ -9,6 +9,8 @@ #ifndef LLVM_DEMANGLE_DEMANGLE_H #define LLVM_DEMANGLE_DEMANGLE_H +#include "llvm/ADT/StringRef.h" + #include #include @@ -68,7 +70,7 @@ /// \param MangledName - reference to string to demangle. /// \returns - the demangled string, or a copy of the input string if no /// demangling occurred. -std::string demangle(const std::string &MangledName); +std::string demangle(const StringRef MangledName); bool nonMicrosoftDemangle(const char *MangledName, std::string &Result); diff --git a/llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp b/llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp --- a/llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp +++ b/llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp @@ -1605,7 +1605,7 @@ // We don't have a way to see if the symbol is compiler generated. Use // the linkage name, to detect `scalar deleting destructor' functions. - std::string DemangledSymbol = demangle(std::string(LinkageName)); + std::string DemangledSymbol = demangle(LinkageName); if (DemangledSymbol.find("scalar deleting dtor") != std::string::npos) { Function->setIsArtificial(); } else { diff --git a/llvm/lib/DebugInfo/Symbolize/MarkupFilter.cpp b/llvm/lib/DebugInfo/Symbolize/MarkupFilter.cpp --- a/llvm/lib/DebugInfo/Symbolize/MarkupFilter.cpp +++ b/llvm/lib/DebugInfo/Symbolize/MarkupFilter.cpp @@ -229,7 +229,7 @@ return true; highlight(); - OS << llvm::demangle(Node.Fields.front().str()); + OS << llvm::demangle(Node.Fields.front()); restoreColor(); return true; } 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 @@ -26,9 +26,10 @@ MangledName[1] == 'D'; } -std::string llvm::demangle(const std::string &MangledName) { +std::string llvm::demangle(const StringRef MangledName) { std::string Result; - const char *S = MangledName.c_str(); + std::string Copy = MangledName.str(); + const char *S = Copy.data(); if (nonMicrosoftDemangle(S, Result)) return Result; @@ -43,7 +44,7 @@ return Result; } - return MangledName; + return Copy; } bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) { diff --git a/llvm/lib/IR/DiagnosticInfo.cpp b/llvm/lib/IR/DiagnosticInfo.cpp --- a/llvm/lib/IR/DiagnosticInfo.cpp +++ b/llvm/lib/IR/DiagnosticInfo.cpp @@ -441,7 +441,7 @@ } void DiagnosticInfoDontCall::print(DiagnosticPrinter &DP) const { - DP << "call to " << demangle(getFunctionName().str()) + DP << "call to " << demangle(getFunctionName()) << " marked \"dontcall-"; if (getSeverity() == DiagnosticSeverity::DS_Error) DP << "error\""; 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 @@ -646,10 +646,10 @@ static std::optional demangleXCOFF(StringRef Name) { if (Name.empty() || Name[0] != '.') - return demangle(Name); + return ::demangle(Name); Name = Name.drop_front(); - std::optional DemangledName = demangle(Name); + std::optional DemangledName = ::demangle(Name); if (DemangledName) return "." + *DemangledName; return std::nullopt; @@ -658,7 +658,7 @@ static std::optional demangleMachO(StringRef Name) { if (!Name.empty() && Name[0] == '_') Name = Name.drop_front(); - return demangle(Name); + return ::demangle(Name); } static bool symbolIsDefined(const NMSymbol &Sym) { diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -109,7 +109,7 @@ if (!SymName) return SymName.takeError(); if (Demangle) - Fmt << demangle(std::string(*SymName)); + Fmt << demangle(*SymName); else Fmt << *SymName; } diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -908,7 +908,7 @@ } static std::string maybeDemangle(StringRef Name) { - return opts::Demangle ? demangle(std::string(Name)) : Name.str(); + return opts::Demangle ? demangle(Name) : Name.str(); } template diff --git a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp --- a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp +++ b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp @@ -107,7 +107,7 @@ std::string OutputName = "'"; OutputName += Name; OutputName += "'"; - std::string DemangledName(demangle(Name.str())); + std::string DemangledName(demangle(Name)); if (Name != DemangledName) { OutputName += " aka "; OutputName += DemangledName;