From: Saleem Abdulrasool Date: Fri, 20 Jan 2017 04:25:26 +0000 (+0000) Subject: llvm-cxxfilt: support `-t` to demangle types X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=81cf2fa17ae698248ffe12408ee8939e4892b3c1;p=llvm 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292576 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-cxxfilt/types.test b/test/tools/llvm-cxxfilt/types.test new file mode 100644 index 00000000000..4f0b2ecaab1 --- /dev/null +++ b/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/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 1e2797ba333..525cea28ff3 100644 --- a/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/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 #include using namespace llvm; +static cl::opt + 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 +Decorated(cl::Positional, cl::desc(""), 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; }