Demangle symbols when including them in error messages.

llvm-svn: 257647
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index 3c864cb..f7ef342 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -13,6 +13,11 @@
 #include "InputFiles.h"
 
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/Config/config.h"
+
+#ifdef HAVE_CXXABI_H
+#include <cxxabi.h>
+#endif
 
 using namespace llvm;
 using namespace llvm::object;
@@ -133,6 +138,23 @@
   doInitSymbols<ELF64BE>();
 }
 
+// Returns the demangled C++ symbol name for Name.
+std::string elf2::demangle(StringRef Name) {
+#if !defined(HAVE_CXXABI_H)
+  return Name;
+#else
+  if (!Config->Demangle)
+    return Name;
+  char *Buf =
+      abi::__cxa_demangle(Name.str().c_str(), nullptr, nullptr, nullptr);
+  if (!Buf)
+    return Name;
+  std::string S(Buf);
+  free(Buf);
+  return S;
+#endif
+}
+
 template int SymbolBody::compare<ELF32LE>(SymbolBody *Other);
 template int SymbolBody::compare<ELF32BE>(SymbolBody *Other);
 template int SymbolBody::compare<ELF64LE>(SymbolBody *Other);