diff options
| -rw-r--r-- | lld/ELF/Strings.cpp | 28 | ||||
| -rw-r--r-- | lld/ELF/Strings.h | 5 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 8 | ||||
| -rw-r--r-- | lld/ELF/Symbols.cpp | 31 | ||||
| -rw-r--r-- | lld/ELF/Symbols.h | 5 |
5 files changed, 38 insertions, 39 deletions
diff --git a/lld/ELF/Strings.cpp b/lld/ELF/Strings.cpp index 21d7f428e85..0c21e8819d6 100644 --- a/lld/ELF/Strings.cpp +++ b/lld/ELF/Strings.cpp @@ -11,8 +11,13 @@ #include "Error.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" +#include "llvm/Config/config.h" #include <algorithm> +#ifdef HAVE_CXXABI_H +#include <cxxabi.h> +#endif + using namespace llvm; using namespace lld; using namespace lld::elf; @@ -68,3 +73,26 @@ bool elf::isValidCIdentifier(StringRef S) { return !S.empty() && isAlpha(S[0]) && std::all_of(S.begin() + 1, S.end(), isAlnum); } + +// Returns the demangled C++ symbol name for Name. +std::string elf::demangle(StringRef Name) { +#if !defined(HAVE_CXXABI_H) + return Name; +#else + // __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; + + 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 +} diff --git a/lld/ELF/Strings.h b/lld/ELF/Strings.h index 002e8c2b843..4948e9dbd56 100644 --- a/lld/ELF/Strings.h +++ b/lld/ELF/Strings.h @@ -18,6 +18,11 @@ namespace elf { bool globMatch(StringRef S, StringRef T); std::vector<uint8_t> parseHex(StringRef S); bool isValidCIdentifier(StringRef S); + +// 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); } } diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 2feb1a9b12f..a0ebb0257c5 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -242,9 +242,11 @@ SymbolTable<ELFT>::insert(StringRef Name, uint8_t Type, uint8_t Visibility, template <typename ELFT> std::string SymbolTable<ELFT>::conflictMsg(SymbolBody *Existing, InputFile *NewFile) { - StringRef Sym = Existing->getName(); - return demangle(Sym) + " in " + getFilename(Existing->getSourceFile<ELFT>()) + - " and " + getFilename(NewFile); + std::string Sym = Existing->getName(); + if (Config->Demangle) + Sym = demangle(Sym); + return Sym + " in " + getFilename(Existing->getSourceFile<ELFT>()) + " and " + + getFilename(NewFile); } template <class ELFT> Symbol *SymbolTable<ELFT>::addUndefined(StringRef Name) { diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 78786980db6..3e96b917719 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -15,11 +15,6 @@ #include "Target.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; @@ -249,32 +244,6 @@ std::unique_ptr<InputFile> LazyObject::getFile() { return createObjectFile(MBRef); } -// Returns the demangled C++ symbol name for Name. -std::string elf::demangle(StringRef Name) { -#if !defined(HAVE_CXXABI_H) - return Name; -#else - if (!Config->Demangle) - return 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; - - 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 -} - bool Symbol::includeInDynsym() const { if (Visibility != STV_DEFAULT && Visibility != STV_PROTECTED) return false; diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 3a9baa7fb0f..e429f03e96e 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -36,11 +36,6 @@ template <class ELFT> class OutputSection; template <class ELFT> class OutputSectionBase; template <class ELFT> class SharedFile; -// Returns a demangled C++ symbol name. If Name is not a mangled -// name or the system does not provide __cxa_demangle function, -// it returns the unmodified string. -std::string demangle(StringRef Name); - struct Symbol; // The base class for real symbol classes. |

