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);