Make demangle() return None instead of "" if a given string is not a mangled symbol.
authorRui Ueyama <ruiu@google.com>
Wed, 7 Dec 2016 23:17:05 +0000 (23:17 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 7 Dec 2016 23:17:05 +0000 (23:17 +0000)
llvm-svn: 288993

lld/ELF/Strings.cpp
lld/ELF/Strings.h
lld/ELF/SymbolTable.cpp
lld/ELF/Symbols.cpp

index 28e50ff..7e5b5ab 100644 (file)
@@ -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;
index e3c13c9..1387c27 100644 (file)
@@ -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()};
index 6734e54..2b0bf42 100644 (file)
@@ -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);
   }
 }
 
index 99b84c7..9fa1ed4 100644 (file)
@@ -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();
 }