summaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorNick Desaulniers <ndesaulniers@google.com>2023-05-02 15:54:09 -0700
committerNick Desaulniers <ndesaulniers@google.com>2023-05-02 15:54:09 -0700
commit3e3c6f24ff85ea52ed67d4c26f1d3d0eacd1ad1b (patch)
treedb1435ec6bb8dd51613636968c9a966b46218952 /lld
parent0fac44d80715ba04a7567346d1832d3b4f019f34 (diff)
downloadllvm-3e3c6f24ff85ea52ed67d4c26f1d3d0eacd1ad1b.tar.gz
Revert "[Demangle] make llvm::demangle take std::string_view rather than const std::string&"
This reverts commit c117c2c8ba4afd45a006043ec6dd858652b2ffcc. itaniumDemangle calls std::strlen with the results of std::string_view::data() which may not be NUL-terminated. This causes lld/test/wasm/why-extract.s to fail when "expensive checks" are enabled via -DLLVM_ENABLE_EXPENSIVE_CHECKS=ON. See D149675 for further discussion. Back this out until the individual demanglers are converted to use std::string_view.
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, 13 insertions, 14 deletions
diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp
index f4efcf2266cd..c042386e0106 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);
+ std::string demangled = demangle(demangleInput.str());
if (demangled != demangleInput)
- return prefix + demangled;
+ return prefix + demangle(demangleInput.str());
return (prefix + prefixless).str();
}
return std::string(symName);
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index c5ef6d3f0cbf..f09d0d7f9095 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -145,16 +145,13 @@ 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);
- 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();
- }
+ 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();
(*demangledSyms)[demangled].push_back(sym);
}
}
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 840385aabea3..62a8a3c30664 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -45,7 +45,9 @@ LLVM_ATTRIBUTE_UNUSED static inline void assertSymbols() {
// Returns a symbol for an error message.
static std::string maybeDemangleSymbol(StringRef symName) {
- return elf::config->demangle ? demangle(symName.str()) : symName.str();
+ if (elf::config->demangle)
+ return demangle(symName.str());
+ return symName.str();
}
std::string lld::toString(const elf::Symbol &sym) {
diff --git a/lld/MachO/Symbols.cpp b/lld/MachO/Symbols.cpp
index 660826edc4f8..cb3b271a1912 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);
+ return demangle(symName.str());
}
return symName.str();
}
diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp
index 2adf72b6965c..567ff49dfa44 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);
+ return demangle(name.str());
return name.str();
}