From 4c5b8cea0208c5c9b847f6234f0a108127dd326a Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Wed, 7 Dec 2016 23:17:05 +0000 Subject: [PATCH] Make demangle() return None instead of "" if a given string is not a mangled symbol. llvm-svn: 288993 --- lld/ELF/Strings.cpp | 6 +++--- lld/ELF/Strings.h | 5 ++--- lld/ELF/SymbolTable.cpp | 5 ++++- lld/ELF/Symbols.cpp | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lld/ELF/Strings.cpp b/lld/ELF/Strings.cpp index 28e50ff..7e5b5ab 100644 --- a/lld/ELF/Strings.cpp +++ b/lld/ELF/Strings.cpp @@ -210,18 +210,18 @@ bool elf::isValidCIdentifier(StringRef S) { } // Returns the demangled C++ symbol name for Name. -std::string elf::demangle(StringRef Name) { +Optional elf::demangle(StringRef Name) { // __cxa_demangle can be used to demangle strings other than symbol // names which do not necessarily start with "_Z". Name can be // either a C or C++ symbol. Don't call __cxa_demangle if the name // does not look like a C++ symbol name to avoid getting unexpected // result for a C symbol that happens to match a mangled type name. if (!Name.startswith("_Z")) - return Name; + return None; char *Buf = itaniumDemangle(Name.str().c_str(), nullptr, nullptr, nullptr); if (!Buf) - return Name; + return None; std::string S(Buf); free(Buf); return S; diff --git a/lld/ELF/Strings.h b/lld/ELF/Strings.h index e3c13c9..1387c27 100644 --- a/lld/ELF/Strings.h +++ b/lld/ELF/Strings.h @@ -93,9 +93,8 @@ private: }; // Returns a demangled C++ symbol name. If Name is not a mangled -// name or the system does not provide __cxa_demangle function, -// it returns an unmodified string. -std::string demangle(StringRef Name); +// name, it returns Optional::None. +llvm::Optional demangle(StringRef Name); inline StringRef toStringRef(ArrayRef Arr) { return {(const char *)Arr.data(), Arr.size()}; diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 6734e54..2b0bf42 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -576,7 +576,10 @@ void SymbolTable::initDemangledSyms() { for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); - (*DemangledSyms)[demangle(B->getName())].push_back(B); + if (Optional S = demangle(B->getName())) + (*DemangledSyms)[*S].push_back(B); + else + (*DemangledSyms)[B->getName()].push_back(B); } } diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 99b84c7..9fa1ed4 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -306,7 +306,8 @@ void elf::printTraceSymbol(Symbol *Sym) { // Returns a symbol for an error message. std::string elf::toString(const SymbolBody &B) { if (Config->Demangle) - return demangle(B.getName()); + if (Optional S = demangle(B.getName())) + return *S; return B.getName(); } -- 2.7.4