[lld] r288993 - Make demangle() return None instead of "" if a given string is not a mangled symbol.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 7 15:17:05 PST 2016
Author: ruiu
Date: Wed Dec 7 17:17:05 2016
New Revision: 288993
URL: http://llvm.org/viewvc/llvm-project?rev=288993&view=rev
Log:
Make demangle() return None instead of "" if a given string is not a mangled symbol.
Modified:
lld/trunk/ELF/Strings.cpp
lld/trunk/ELF/Strings.h
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/Symbols.cpp
Modified: lld/trunk/ELF/Strings.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Strings.cpp?rev=288993&r1=288992&r2=288993&view=diff
==============================================================================
--- lld/trunk/ELF/Strings.cpp (original)
+++ lld/trunk/ELF/Strings.cpp Wed Dec 7 17:17:05 2016
@@ -210,18 +210,18 @@ bool elf::isValidCIdentifier(StringRef S
}
// Returns the demangled C++ symbol name for Name.
-std::string elf::demangle(StringRef Name) {
+Optional<std::string> 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;
Modified: lld/trunk/ELF/Strings.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Strings.h?rev=288993&r1=288992&r2=288993&view=diff
==============================================================================
--- lld/trunk/ELF/Strings.h (original)
+++ lld/trunk/ELF/Strings.h Wed Dec 7 17:17:05 2016
@@ -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<std::string> demangle(StringRef Name);
inline StringRef toStringRef(ArrayRef<uint8_t> Arr) {
return {(const char *)Arr.data(), Arr.size()};
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=288993&r1=288992&r2=288993&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed Dec 7 17:17:05 2016
@@ -576,7 +576,10 @@ void SymbolTable<ELFT>::initDemangledSym
for (Symbol *Sym : SymVector) {
SymbolBody *B = Sym->body();
- (*DemangledSyms)[demangle(B->getName())].push_back(B);
+ if (Optional<std::string> S = demangle(B->getName()))
+ (*DemangledSyms)[*S].push_back(B);
+ else
+ (*DemangledSyms)[B->getName()].push_back(B);
}
}
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=288993&r1=288992&r2=288993&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Wed Dec 7 17:17:05 2016
@@ -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<std::string> S = demangle(B.getName()))
+ return *S;
return B.getName();
}
More information about the llvm-commits
mailing list