summaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorNick Desaulniers <ndesaulniers@google.com>2023-05-02 11:10:43 -0700
committerNick Desaulniers <ndesaulniers@google.com>2023-05-02 11:20:15 -0700
commitc117c2c8ba4afd45a006043ec6dd858652b2ffcc (patch)
treeeaf2bca8cf17d405cadb6ad2d34bf7c20b9912db /lld
parent1f74964b403c615c121c0adbd06661adaae14667 (diff)
downloadllvm-c117c2c8ba4afd45a006043ec6dd858652b2ffcc.tar.gz
[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
Diffstat (limited to 'lld')
-rw-r--r--lld/COFF/Symbols.cpp4
-rw-r--r--lld/ELF/SymbolTable.cpp15
-rw-r--r--lld/ELF/Symbols.cpp4
-rw-r--r--lld/MachO/Symbols.cpp2
-rw-r--r--lld/wasm/Symbols.cpp2
5 files changed, 14 insertions, 13 deletions
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<SmallVector<Symbol *, 0>> &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();
}