From c117c2c8ba4afd45a006043ec6dd858652b2ffcc Mon Sep 17 00:00:00 2001 From: Nick Desaulniers Date: Tue, 2 May 2023 11:10:43 -0700 Subject: [Demangle] make llvm::demangle take std::string_view rather than const std::string& As suggested by @erichkeane in https://reviews.llvm.org/D141451#inline-1429549 There's potential for a lot more cleanups around these APIs. This is just a start. Callers need to be more careful about sub-expressions producing strings that don't outlast the expression using ``llvm::demangle``. Add a release note. Reviewed By: MaskRay, #lld-macho Differential Revision: https://reviews.llvm.org/D149104 --- lld/COFF/Symbols.cpp | 4 ++-- lld/ELF/SymbolTable.cpp | 15 +++++++++------ lld/ELF/Symbols.cpp | 4 +--- lld/MachO/Symbols.cpp | 2 +- lld/wasm/Symbols.cpp | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-) (limited to 'lld') diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index c042386e0106..f4efcf2266cd 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -38,9 +38,9 @@ static std::string maybeDemangleSymbol(const COFFLinkerContext &ctx, 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 + demangled; return (prefix + prefixless).str(); } return std::string(symName); diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index f09d0d7f9095..c5ef6d3f0cbf 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -145,13 +145,16 @@ StringMap> &SymbolTable::getDemangledSyms() { if (canBeVersioned(*sym)) { StringRef name = sym->getName(); size_t pos = name.find('@'); + std::string substr; if (pos == std::string::npos) - demangled = demangle(name.str()); - else if (pos + 1 == name.size() || name[pos + 1] == '@') - demangled = demangle(name.substr(0, pos).str()); - else - demangled = - (demangle(name.substr(0, pos).str()) + name.substr(pos)).str(); + demangled = demangle(name); + else if (pos + 1 == name.size() || name[pos + 1] == '@') { + substr = name.substr(0, pos); + demangled = demangle(substr); + } else { + substr = name.substr(0, pos); + demangled = (demangle(substr) + name.substr(pos)).str(); + } (*demangledSyms)[demangled].push_back(sym); } } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 62a8a3c30664..840385aabea3 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -45,9 +45,7 @@ LLVM_ATTRIBUTE_UNUSED static inline void assertSymbols() { // Returns a symbol for an error message. static std::string maybeDemangleSymbol(StringRef symName) { - if (elf::config->demangle) - return demangle(symName.str()); - return symName.str(); + return elf::config->demangle ? demangle(symName.str()) : symName.str(); } std::string lld::toString(const elf::Symbol &sym) { diff --git a/lld/MachO/Symbols.cpp b/lld/MachO/Symbols.cpp index cb3b271a1912..660826edc4f8 100644 --- a/lld/MachO/Symbols.cpp +++ b/lld/MachO/Symbols.cpp @@ -32,7 +32,7 @@ static_assert(sizeof(SymbolUnion) == sizeof(Defined), 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 index 567ff49dfa44..2adf72b6965c 100644 --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -35,7 +35,7 @@ std::string maybeDemangleSymbol(StringRef name) { if (name == "__main_argc_argv") return "main"; if (wasm::config->demangle) - return demangle(name.str()); + return demangle(name); return name.str(); } -- cgit v1.2.1