[PATCH] D57350: [llvm-cxxfilt] Split and demangle stdin input
Matt Davis via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 11 12:30:55 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL353743: [llvm-cxxfilt] Split and demangle stdin input (authored by mattd, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D57350?vs=185865&id=186311#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D57350/new/
https://reviews.llvm.org/D57350
Files:
llvm/trunk/test/tools/llvm-cxxfilt/simple.test
llvm/trunk/test/tools/llvm-cxxfilt/types.test
llvm/trunk/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
Index: llvm/trunk/test/tools/llvm-cxxfilt/simple.test
===================================================================
--- llvm/trunk/test/tools/llvm-cxxfilt/simple.test
+++ llvm/trunk/test/tools/llvm-cxxfilt/simple.test
@@ -1,4 +1,10 @@
RUN: llvm-cxxfilt _Z1fi abc | FileCheck %s
+RUN: echo "Mangled _Z1fi and _Z3foov in string." | llvm-cxxfilt \
+RUN: | FileCheck %s --check-prefix=CHECK-STRING
+RUN: llvm-cxxfilt "CLI remains mangled _Z1fi" \
+RUN: | FileCheck %s --check-prefix=CHECK-MANGLED
CHECK: f(int)
CHECK-NEXT: abc
+CHECK-STRING: Mangled f(int) and foo() in string.
+CHECK-MANGLED: CLI remains mangled _Z1fi
Index: llvm/trunk/test/tools/llvm-cxxfilt/types.test
===================================================================
--- llvm/trunk/test/tools/llvm-cxxfilt/types.test
+++ llvm/trunk/test/tools/llvm-cxxfilt/types.test
@@ -1,5 +1,6 @@
RUN: llvm-cxxfilt -t f i | FileCheck %s
+RUN: echo "f i" | llvm-cxxfilt -t | FileCheck %s --check-prefix="CHECK-STRING"
CHECK: float
CHECK-NEXT: int
-
+CHECK-STRING: float int
Index: llvm/trunk/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
===================================================================
--- llvm/trunk/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
+++ llvm/trunk/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
@@ -6,6 +6,7 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/StringExtras.h"
#include "llvm/Demangle/Demangle.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/InitLLVM.h"
@@ -51,7 +52,7 @@
static cl::list<std::string>
Decorated(cl::Positional, cl::desc("<mangled>"), cl::ZeroOrMore);
-static void demangle(llvm::raw_ostream &OS, const std::string &Mangled) {
+static std::string demangle(llvm::raw_ostream &OS, const std::string &Mangled) {
int Status;
const char *Decorated = Mangled.c_str();
@@ -72,10 +73,28 @@
Undecorated = itaniumDemangle(Decorated + 6, nullptr, nullptr, &Status);
}
- OS << (Undecorated ? Undecorated : Mangled) << '\n';
- OS.flush();
-
+ std::string Result(Undecorated ? Undecorated : Mangled);
free(Undecorated);
+ return Result;
+}
+
+// If 'Split' is true, then 'Mangled' is broken into individual words and each
+// word is demangled. Otherwise, the entire string is treated as a single
+// mangled item. The result is output to 'OS'.
+static void demangleLine(llvm::raw_ostream &OS, StringRef Mangled, bool Split) {
+ std::string Result;
+ if (Split) {
+ SmallVector<StringRef, 16> Words;
+ SplitString(Mangled, Words);
+ for (auto Word : Words)
+ Result += demangle(OS, Word) + ' ';
+ // Remove the trailing space character.
+ if (Result.back() == ' ')
+ Result.pop_back();
+ } else
+ Result = demangle(OS, Mangled);
+ OS << Result << '\n';
+ OS.flush();
}
int main(int argc, char **argv) {
@@ -85,10 +104,10 @@
if (Decorated.empty())
for (std::string Mangled; std::getline(std::cin, Mangled);)
- demangle(llvm::outs(), Mangled);
+ demangleLine(llvm::outs(), Mangled, true);
else
for (const auto &Symbol : Decorated)
- demangle(llvm::outs(), Symbol);
+ demangleLine(llvm::outs(), Symbol, false);
return EXIT_SUCCESS;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57350.186311.patch
Type: text/x-patch
Size: 3215 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190211/b37f277d/attachment.bin>
More information about the llvm-commits
mailing list