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 /lld/ELF/Strings.cpp | |
| 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
Diffstat (limited to 'lld/ELF/Strings.cpp')
| -rw-r--r-- | lld/ELF/Strings.cpp | 28 | 
1 files changed, 28 insertions, 0 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 +} | 

