From a63fd043fdb331a09c5195db5dd34260d01ac473 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool <compnerd@compnerd.org> Date: Fri, 20 Jan 2017 04:25:26 +0000 Subject: [PATCH] llvm-cxxfilt: support `-t` to demangle types By default c++filt demangles functions, though you can optionally pass `-t` to have it decode types as well, behaving nearly identical to `__cxa_demangle`. Add support for this mode. llvm-svn: 292576 --- llvm/test/tools/llvm-cxxfilt/types.test | 5 +++++ llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 23 ++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 llvm/test/tools/llvm-cxxfilt/types.test diff --git a/llvm/test/tools/llvm-cxxfilt/types.test b/llvm/test/tools/llvm-cxxfilt/types.test new file mode 100644 index 000000000000..4f0b2ecaab16 --- /dev/null +++ b/llvm/test/tools/llvm-cxxfilt/types.test @@ -0,0 +1,5 @@ +RUN: llvm-cxxfilt -t f i | FileCheck %s + +CHECK: float +CHECK-NEXT: int + diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 1e2797ba3334..525cea28ff3d 100644 --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -8,29 +8,42 @@ //===----------------------------------------------------------------------===// #include "llvm/Demangle/Demangle.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" #include <cstdlib> #include <iostream> using namespace llvm; +static cl::opt<bool> + Types("types", + cl::desc("attempt to demangle types as well as function names"), + cl::init(false)); +static cl::alias TypesShort("t", cl::desc("alias for --types"), + cl::aliasopt(Types)); + +static cl::list<std::string> +Decorated(cl::Positional, cl::desc("<mangled>"), cl::ZeroOrMore); + static void demangle(llvm::raw_ostream &OS, const std::string &Mangled) { int Status; char *Demangled = nullptr; - if ((Mangled.size() >= 2 && Mangled.compare(0, 2, "_Z")) || - (Mangled.size() >= 4 && Mangled.compare(0, 4, "___Z"))) + if (Types || ((Mangled.size() >= 2 && Mangled.compare(0, 2, "_Z")) || + (Mangled.size() >= 4 && Mangled.compare(0, 4, "___Z")))) Demangled = itaniumDemangle(Mangled.c_str(), nullptr, nullptr, &Status); OS << (Demangled ? Demangled : Mangled) << '\n'; free(Demangled); } int main(int argc, char **argv) { - if (argc == 1) + cl::ParseCommandLineOptions(argc, argv, "llvm symbol table dumper\n"); + + if (Decorated.empty()) for (std::string Mangled; std::getline(std::cin, Mangled);) demangle(llvm::outs(), Mangled); else - for (int I = 1; I < argc; ++I) - demangle(llvm::outs(), argv[I]); + for (const auto &Symbol : Decorated) + demangle(llvm::outs(), Symbol); return EXIT_SUCCESS; }