diff options
Diffstat (limited to 'llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp')
| -rw-r--r-- | llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 9ac8bcf0ff01..6de512fc18dc 100644 --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -7,8 +7,10 @@ //===----------------------------------------------------------------------===// #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Triple.h" #include "llvm/Demangle/Demangle.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Host.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/raw_ostream.h" #include <cstdlib> @@ -41,6 +43,13 @@ static cl::opt<bool> StripUnderscore("strip-underscore", static cl::alias StripUnderscoreShort("_", cl::desc("alias for --strip-underscore"), cl::aliasopt(StripUnderscore)); +static cl::opt<bool> + NoStripUnderscore("no-strip-underscore", + cl::desc("do not strip the leading underscore"), + cl::init(false)); +static cl::alias + NoStripUnderscoreShort("n", cl::desc("alias for --no-strip-underscore"), + cl::aliasopt(NoStripUnderscore)); static cl::opt<bool> Types("types", @@ -55,11 +64,22 @@ Decorated(cl::Positional, cl::desc("<mangled>"), cl::ZeroOrMore); static cl::extrahelp HelpResponse("\nPass @FILE as argument to read options from FILE.\n"); -static std::string demangle(llvm::raw_ostream &OS, const std::string &Mangled) { +static bool shouldStripUnderscore() { + if (StripUnderscore) + return true; + if (NoStripUnderscore) + return false; + // If none of them are set, use the default value for platform. + // macho has symbols prefix with "_" so strip by default. + return Triple(sys::getProcessTriple()).isOSBinFormatMachO(); +} + +static std::string demangle(const std::string &Mangled) { int Status; + std::string Prefix; const char *DecoratedStr = Mangled.c_str(); - if (StripUnderscore) + if (shouldStripUnderscore()) if (DecoratedStr[0] == '_') ++DecoratedStr; size_t DecoratedLength = strlen(DecoratedStr); @@ -73,11 +93,11 @@ static std::string demangle(llvm::raw_ostream &OS, const std::string &Mangled) { if (!Undecorated && (DecoratedLength > 6 && strncmp(DecoratedStr, "__imp_", 6) == 0)) { - OS << "import thunk for "; + Prefix = "import thunk for "; Undecorated = itaniumDemangle(DecoratedStr + 6, nullptr, nullptr, &Status); } - std::string Result(Undecorated ? Undecorated : Mangled); + std::string Result(Undecorated ? Prefix + Undecorated : Mangled); free(Undecorated); return Result; } @@ -125,9 +145,9 @@ static void demangleLine(llvm::raw_ostream &OS, StringRef Mangled, bool Split) { SmallVector<std::pair<StringRef, StringRef>, 16> Words; SplitStringDelims(Mangled, Words, IsLegalItaniumChar); for (const auto &Word : Words) - Result += demangle(OS, Word.first) + Word.second.str(); + Result += ::demangle(Word.first) + Word.second.str(); } else - Result = demangle(OS, Mangled); + Result = ::demangle(Mangled); OS << Result << '\n'; OS.flush(); } |
