Define a helper function to demangle symbols.
authorRui Ueyama <ruiu@google.com>
Wed, 26 Oct 2016 18:28:06 +0000 (18:28 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 26 Oct 2016 18:28:06 +0000 (18:28 +0000)
llvm-svn: 285219

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

index 550ff69..0369804 100644 (file)
@@ -553,8 +553,7 @@ static std::string getLocation(SymbolBody &Sym, InputSectionBase<ELFT> &S,
   DefinedRegular<ELFT> *Encl = getSymbolAt(&S, Offset);
   if (Encl && Encl->Type == STT_FUNC) {
     StringRef Func = getSymbolName(*File, *Encl);
-    return SrcFile + " (function " +
-           (Config->Demangle ? demangle(Func) : Func.str()) + ")";
+    return SrcFile + " (function " + maybeDemangle(Func) + ")";
   }
 
   return (SrcFile + " (" + S.Name + "+0x" + Twine::utohexstr(Offset) + ")")
@@ -571,9 +570,8 @@ static void reportUndefined(SymbolBody &Sym, InputSectionBase<ELFT> &S,
       Config->UnresolvedSymbols != UnresolvedPolicy::NoUndef)
     return;
 
-  std::string Msg =
-      getLocation(Sym, S, Offset) + ": undefined symbol '" +
-      (Config->Demangle ? demangle(Sym.getName()) : Sym.getName().str()) + "'";
+  std::string Msg = getLocation(Sym, S, Offset) + ": undefined symbol '" +
+                    maybeDemangle(Sym.getName()) + "'";
 
   if (Config->UnresolvedSymbols == UnresolvedPolicy::Warn)
     warn(Msg);
index 5a5a93a..ffabd00 100644 (file)
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "Strings.h"
+#include "Config.h"
 #include "Error.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/StringRef.h"
@@ -124,3 +125,9 @@ std::string elf::demangle(StringRef Name) {
   free(Buf);
   return S;
 }
+
+std::string elf::maybeDemangle(StringRef Name) {
+  if (Config->Demangle)
+    return demangle(Name);
+  return Name;
+}
index a109a60..5b61325 100644 (file)
@@ -30,6 +30,9 @@ StringRef unquote(StringRef S);
 // it returns an unmodified string.
 std::string demangle(StringRef Name);
 
+// Demangle if Config->Demangle is true.
+std::string maybeDemangle(StringRef Name);
+
 inline StringRef toStringRef(ArrayRef<uint8_t> Arr) {
   return {(const char *)Arr.data(), Arr.size()};
 }
index 6bcf8a9..60a212b 100644 (file)
@@ -256,11 +256,8 @@ SymbolTable<ELFT>::insert(StringRef &Name, uint8_t Type, uint8_t Visibility,
 template <typename ELFT>
 std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Existing,
                                            InputFile *NewFile) {
-  std::string Sym = Existing->getName();
-  if (Config->Demangle)
-    Sym = demangle(Sym);
-  return Sym + " in " + getFilename(Existing->File) + " and " +
-         getFilename(NewFile);
+  return maybeDemangle(Existing->getName()) + " in " +
+         getFilename(Existing->File) + " and " + getFilename(NewFile);
 }
 
 template <class ELFT> Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name) {