diff options
| author | Rui Ueyama <ruiu@google.com> | 2016-07-07 23:04:15 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2016-07-07 23:04:15 +0000 |
| commit | f4d9338dfb60f7eb4c59b85409bcd3cc69b0becc (patch) | |
| tree | 3f1b163758c2d2df53aff6c2781bddd48c24f173 | |
| parent | 580d7a1b1ea827fc9b2f170855e0b830659aa456 (diff) | |
| download | bcm5719-llvm-f4d9338dfb60f7eb4c59b85409bcd3cc69b0becc.tar.gz bcm5719-llvm-f4d9338dfb60f7eb4c59b85409bcd3cc69b0becc.zip | |
Move demangle() from Symbols.cpp to Strings.cpp.
Symbols.cpp contains functions to handle ELF symbols.
demangle() function is essentially a function to work on a
string rather than on an ELF symbol. So Strings.cpp is a
better place to put that function.
This change also make demangle to demangle symbols unconditionally.
Previously, it demangled symbols only when Config->Demangle is true.
llvm-svn: 274804
| -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. |

