[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