diff options
author | Nick Desaulniers <ndesaulniers@google.com> | 2023-05-02 15:54:09 -0700 |
---|---|---|
committer | Nick Desaulniers <ndesaulniers@google.com> | 2023-05-02 15:54:09 -0700 |
commit | 3e3c6f24ff85ea52ed67d4c26f1d3d0eacd1ad1b (patch) | |
tree | db1435ec6bb8dd51613636968c9a966b46218952 /lld | |
parent | 0fac44d80715ba04a7567346d1832d3b4f019f34 (diff) | |
download | llvm-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.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 15 | ||||
-rw-r--r-- | lld/ELF/Symbols.cpp | 4 | ||||
-rw-r--r-- | lld/MachO/Symbols.cpp | 2 | ||||
-rw-r--r-- | lld/wasm/Symbols.cpp | 2 |
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(); } |