summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Strings.cpp6
-rw-r--r--lld/ELF/Strings.h5
-rw-r--r--lld/ELF/SymbolTable.cpp5
-rw-r--r--lld/ELF/Symbols.cpp3
4 files changed, 11 insertions, 8 deletions
diff --git a/lld/ELF/Strings.cpp b/lld/ELF/Strings.cpp
index 28e50ffca0e..7e5b5ab75f8 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<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;
diff --git a/lld/ELF/Strings.h b/lld/ELF/Strings.h
index e3c13c993cd..1387c27ab5e 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<std::string> demangle(StringRef Name);
inline StringRef toStringRef(ArrayRef<uint8_t> Arr) {
return {(const char *)Arr.data(), Arr.size()};
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 6734e54a135..2b0bf42eda1 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -576,7 +576,10 @@ void SymbolTable<ELFT>::initDemangledSyms() {
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);
}
}
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 99b84c75779..9fa1ed4f31f 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<std::string> S = demangle(B.getName()))
+ return *S;
return B.getName();
}
OpenPOWER on IntegriCloud