Skip to content

Commit 3e3c6f2

Browse files
Revert "[Demangle] make llvm::demangle take std::string_view rather than const std::string&"
This reverts commit c117c2c. 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.
1 parent 0fac44d commit 3e3c6f2

File tree

16 files changed

+60
-52
lines changed

16 files changed

+60
-52
lines changed

clang/lib/CodeGen/CodeGenAction.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,9 @@ BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) {
633633
return false;
634634

635635
Diags.Report(*Loc, diag::warn_fe_frame_larger_than)
636-
<< D.getStackSize() << D.getStackLimit()
637-
<< llvm::demangle(D.getFunction().getName());
636+
<< D.getStackSize()
637+
<< D.getStackLimit()
638+
<< llvm::demangle(D.getFunction().getName().str());
638639
return true;
639640
}
640641

@@ -648,7 +649,7 @@ bool BackendConsumer::ResourceLimitDiagHandler(
648649

649650
Diags.Report(*Loc, DiagID)
650651
<< D.getResourceName() << D.getResourceSize() << D.getResourceLimit()
651-
<< llvm::demangle(D.getFunction().getName());
652+
<< llvm::demangle(D.getFunction().getName().str());
652653
return true;
653654
}
654655

@@ -853,7 +854,7 @@ void BackendConsumer::DontCallDiagHandler(const DiagnosticInfoDontCall &D) {
853854
Diags.Report(LocCookie, D.getSeverity() == DiagnosticSeverity::DS_Error
854855
? diag::err_fe_backend_error_attr
855856
: diag::warn_fe_backend_warning_attr)
856-
<< llvm::demangle(D.getFunctionName()) << D.getNote();
857+
<< llvm::demangle(D.getFunctionName().str()) << D.getNote();
857858
}
858859

859860
void BackendConsumer::MisExpectDiagHandler(

lld/COFF/Symbols.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ static std::string maybeDemangleSymbol(const COFFLinkerContext &ctx,
3838
StringRef demangleInput = prefixless;
3939
if (ctx.config.machine == I386)
4040
demangleInput.consume_front("_");
41-
std::string demangled = demangle(demangleInput);
41+
std::string demangled = demangle(demangleInput.str());
4242
if (demangled != demangleInput)
43-
return prefix + demangled;
43+
return prefix + demangle(demangleInput.str());
4444
return (prefix + prefixless).str();
4545
}
4646
return std::string(symName);

lld/ELF/SymbolTable.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,13 @@ StringMap<SmallVector<Symbol *, 0>> &SymbolTable::getDemangledSyms() {
145145
if (canBeVersioned(*sym)) {
146146
StringRef name = sym->getName();
147147
size_t pos = name.find('@');
148-
std::string substr;
149148
if (pos == std::string::npos)
150-
demangled = demangle(name);
151-
else if (pos + 1 == name.size() || name[pos + 1] == '@') {
152-
substr = name.substr(0, pos);
153-
demangled = demangle(substr);
154-
} else {
155-
substr = name.substr(0, pos);
156-
demangled = (demangle(substr) + name.substr(pos)).str();
157-
}
149+
demangled = demangle(name.str());
150+
else if (pos + 1 == name.size() || name[pos + 1] == '@')
151+
demangled = demangle(name.substr(0, pos).str());
152+
else
153+
demangled =
154+
(demangle(name.substr(0, pos).str()) + name.substr(pos)).str();
158155
(*demangledSyms)[demangled].push_back(sym);
159156
}
160157
}

lld/ELF/Symbols.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ LLVM_ATTRIBUTE_UNUSED static inline void assertSymbols() {
4545

4646
// Returns a symbol for an error message.
4747
static std::string maybeDemangleSymbol(StringRef symName) {
48-
return elf::config->demangle ? demangle(symName.str()) : symName.str();
48+
if (elf::config->demangle)
49+
return demangle(symName.str());
50+
return symName.str();
4951
}
5052

5153
std::string lld::toString(const elf::Symbol &sym) {

lld/MachO/Symbols.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ static_assert(sizeof(SymbolUnion) == sizeof(Defined),
3232
static std::string maybeDemangleSymbol(StringRef symName) {
3333
if (config->demangle) {
3434
symName.consume_front("_");
35-
return demangle(symName);
35+
return demangle(symName.str());
3636
}
3737
return symName.str();
3838
}

lld/wasm/Symbols.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ std::string maybeDemangleSymbol(StringRef name) {
3535
if (name == "__main_argc_argv")
3636
return "main";
3737
if (wasm::config->demangle)
38-
return demangle(name);
38+
return demangle(name.str());
3939
return name.str();
4040
}
4141

llvm/docs/ReleaseNotes.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,11 +292,6 @@ Changes to Sanitizers
292292
Other Changes
293293
-------------
294294

295-
* ``llvm::demangle`` now takes a ``std::string_view`` rather than a
296-
``const std::string&``. Be careful passing temporaries into
297-
``llvm::demangle`` that don't outlive the expression using
298-
``llvm::demangle``.
299-
300295
External Open Source Projects Using LLVM 15
301296
===========================================
302297

llvm/include/llvm/Demangle/Demangle.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
#include <cstddef>
1313
#include <string>
14-
#include <string_view>
1514

1615
namespace llvm {
1716
/// This is a llvm local version of __cxa_demangle. Other than the name and
@@ -63,7 +62,7 @@ char *dlangDemangle(const char *MangledName);
6362
/// \param MangledName - reference to string to demangle.
6463
/// \returns - the demangled string, or a copy of the input string if no
6564
/// demangling occurred.
66-
std::string demangle(const std::string_view MangledName);
65+
std::string demangle(const std::string &MangledName);
6766

6867
bool nonMicrosoftDemangle(const char *MangledName, std::string &Result);
6968

llvm/lib/DebugInfo/LogicalView/Readers/LVCodeViewVisitor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1605,7 +1605,7 @@ Error LVSymbolVisitor::visitKnownRecord(CVSymbol &Record, ProcSym &Proc) {
16051605

16061606
// We don't have a way to see if the symbol is compiler generated. Use
16071607
// the linkage name, to detect `scalar deleting destructor' functions.
1608-
std::string DemangledSymbol = demangle(LinkageName);
1608+
std::string DemangledSymbol = demangle(std::string(LinkageName));
16091609
if (DemangledSymbol.find("scalar deleting dtor") != std::string::npos) {
16101610
Function->setIsArtificial();
16111611
} else {

llvm/lib/Demangle/Demangle.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,24 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "llvm/Demangle/Demangle.h"
14-
#include "llvm/Demangle/StringViewExtras.h"
1514
#include <cstdlib>
15+
#include <cstring>
1616

17-
using llvm::itanium_demangle::starts_with;
17+
static bool isItaniumEncoding(const char *S) {
18+
// Itanium encoding requires 1 or 3 leading underscores, followed by 'Z'.
19+
return std::strncmp(S, "_Z", 2) == 0 || std::strncmp(S, "___Z", 4) == 0;
20+
}
21+
22+
static bool isRustEncoding(const char *S) { return S[0] == '_' && S[1] == 'R'; }
23+
24+
static bool isDLangEncoding(const std::string &MangledName) {
25+
return MangledName.size() >= 2 && MangledName[0] == '_' &&
26+
MangledName[1] == 'D';
27+
}
1828

19-
std::string llvm::demangle(const std::string_view MangledName) {
29+
std::string llvm::demangle(const std::string &MangledName) {
2030
std::string Result;
21-
const char *S = MangledName.data();
31+
const char *S = MangledName.c_str();
2232

2333
if (nonMicrosoftDemangle(S, Result))
2434
return Result;
@@ -29,20 +39,12 @@ std::string llvm::demangle(const std::string_view MangledName) {
2939
if (char *Demangled = microsoftDemangle(S, nullptr, nullptr)) {
3040
Result = Demangled;
3141
std::free(Demangled);
32-
} else {
33-
Result = MangledName;
42+
return Result;
3443
}
35-
return Result;
36-
}
3744

38-
static bool isItaniumEncoding(std::string_view S) {
39-
return starts_with(S, "_Z") || starts_with(S, "___Z");
45+
return MangledName;
4046
}
4147

42-
static bool isRustEncoding(std::string_view S) { return starts_with(S, "_R"); }
43-
44-
static bool isDLangEncoding(std::string_view S) { return starts_with(S, "_D"); }
45-
4648
bool llvm::nonMicrosoftDemangle(const char *MangledName, std::string &Result) {
4749
char *Demangled = nullptr;
4850
if (isItaniumEncoding(MangledName))

llvm/lib/IR/DiagnosticInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,8 @@ void llvm::diagnoseDontCall(const CallInst &CI) {
441441
}
442442

443443
void DiagnosticInfoDontCall::print(DiagnosticPrinter &DP) const {
444-
DP << "call to " << demangle(getFunctionName()) << " marked \"dontcall-";
444+
DP << "call to " << demangle(getFunctionName().str())
445+
<< " marked \"dontcall-";
445446
if (getSeverity() == DiagnosticSeverity::DS_Error)
446447
DP << "error\"";
447448
else

llvm/tools/llvm-objdump/ELFDump.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,10 @@ static Error getRelocationValueString(const ELFObjectFile<ELFT> *Obj,
108108
Expected<StringRef> SymName = SI->getName();
109109
if (!SymName)
110110
return SymName.takeError();
111-
Fmt << (Demangle ? demangle(*SymName) : *SymName);
111+
if (Demangle)
112+
Fmt << demangle(std::string(*SymName));
113+
else
114+
Fmt << *SymName;
112115
}
113116
} else {
114117
Fmt << "*ABS*";

llvm/tools/llvm-objdump/XCOFFDump.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile &Obj,
3232
if (!SymNameOrErr)
3333
return SymNameOrErr.takeError();
3434

35-
std::string SymName =
36-
Demangle ? demangle(*SymNameOrErr) : SymNameOrErr->str();
35+
std::string SymName = (*SymNameOrErr).str();
36+
if (Demangle)
37+
SymName = demangle(SymName);
38+
3739
if (SymbolDescription)
3840
SymName = getXCOFFSymbolDescription(createSymbolInfo(Obj, *SymI), SymName);
3941

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,7 +1548,7 @@ static void disassembleObject(const Target *TheTarget, ObjectFile &Obj,
15481548
if (Demangle) {
15491549
// Fetch the demangled names and store them locally.
15501550
for (const SymbolInfoTy &Symbol : SymbolsHere)
1551-
DemangledSymNamesHere.push_back(demangle(Symbol.Name));
1551+
DemangledSymNamesHere.push_back(demangle(Symbol.Name.str()));
15521552
// Now we've finished modifying that vector, it's safe to make
15531553
// a vector of StringRefs pointing into it.
15541554
SymNamesHere.insert(SymNamesHere.begin(), DemangledSymNamesHere.begin(),
@@ -1909,8 +1909,9 @@ static void disassembleObject(const Target *TheTarget, ObjectFile &Obj,
19091909
if (TargetSym != nullptr) {
19101910
uint64_t TargetAddress = TargetSym->Addr;
19111911
uint64_t Disp = Target - TargetAddress;
1912-
std::string TargetName = Demangle ? demangle(TargetSym->Name)
1913-
: TargetSym->Name.str();
1912+
std::string TargetName = TargetSym->Name.str();
1913+
if (Demangle)
1914+
TargetName = demangle(TargetName);
19141915

19151916
*TargetOS << " <";
19161917
if (!Disp) {
@@ -2510,8 +2511,10 @@ void objdump::printSymbol(const ObjectFile &O, const SymbolRef &Symbol,
25102511

25112512
if (NameOrErr) {
25122513
outs() << " (csect:";
2513-
std::string SymName =
2514-
Demangle ? demangle(*NameOrErr) : NameOrErr->str();
2514+
std::string SymName(NameOrErr.get());
2515+
2516+
if (Demangle)
2517+
SymName = demangle(SymName);
25152518

25162519
if (SymbolDescription)
25172520
SymName = getXCOFFSymbolDescription(createSymbolInfo(O, *SymRef),
@@ -2565,7 +2568,10 @@ void objdump::printSymbol(const ObjectFile &O, const SymbolRef &Symbol,
25652568
outs() << " .hidden";
25662569
}
25672570

2568-
std::string SymName = Demangle ? demangle(Name) : Name.str();
2571+
std::string SymName(Name);
2572+
if (Demangle)
2573+
SymName = demangle(SymName);
2574+
25692575
if (O.isXCOFF() && SymbolDescription)
25702576
SymName = getXCOFFSymbolDescription(createSymbolInfo(O, Symbol), SymName);
25712577

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,7 @@ ELFDumper<ELFT>::getShndxTable(const Elf_Shdr *Symtab) const {
908908
}
909909

910910
static std::string maybeDemangle(StringRef Name) {
911-
return opts::Demangle ? demangle(Name) : Name.str();
911+
return opts::Demangle ? demangle(std::string(Name)) : Name.str();
912912
}
913913

914914
template <typename ELFT>

llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ static std::string getPrintableName(StringRef Name) {
107107
std::string OutputName = "'";
108108
OutputName += Name;
109109
OutputName += "'";
110-
std::string DemangledName(demangle(Name));
110+
std::string DemangledName(demangle(Name.str()));
111111
if (Name != DemangledName) {
112112
OutputName += " aka ";
113113
OutputName += DemangledName;

0 commit comments

Comments
 (0)