llvm-cxxfilt: support reading from stdin
authorSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 13 Nov 2016 20:43:38 +0000 (20:43 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 13 Nov 2016 20:43:38 +0000 (20:43 +0000)
`c++filt` when given no arguments runs as a REPL, decoding each line as a
decorated name.  Unify the test structure to be more uniform, with the tests for
llvm-cxxfilt living under test/tools/llvm-cxxfilt.

llvm-svn: 286777

llvm/test/Demangle/lit.local.cfg [deleted file]
llvm/test/tools/llvm-cxxfilt/noargs.test [new file with mode: 0644]
llvm/test/tools/llvm-cxxfilt/simple.test [moved from llvm/test/Demangle/simple.test with 100% similarity]
llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp

diff --git a/llvm/test/Demangle/lit.local.cfg b/llvm/test/Demangle/lit.local.cfg
deleted file mode 100644 (file)
index df9b335..0000000
+++ /dev/null
@@ -1 +0,0 @@
-config.suffixes = ['.test']
diff --git a/llvm/test/tools/llvm-cxxfilt/noargs.test b/llvm/test/tools/llvm-cxxfilt/noargs.test
new file mode 100644 (file)
index 0000000..71262d2
--- /dev/null
@@ -0,0 +1,10 @@
+RUN: sed -n 's/^STDIN: //p' %s | llvm-cxxfilt | FileCheck %s
+
+STDIN: _Znw
+STDIN: _Znwj
+STDIN: _Znwm
+
+CHECK: operator new
+CHECK: operator new(unsigned int)
+CHECK: operator new(unsigned long)
+
index 07b0e4e..80a54bb 100644 (file)
@@ -9,18 +9,25 @@
 
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Support/raw_ostream.h"
-
-#include <stdlib.h>
+#include <cstdlib>
+#include <iostream>
 
 using namespace llvm;
 
+static void demangle(llvm::raw_ostream &OS, const char *Mangled) {
+  int Status;
+  char *Demangled = itaniumDemangle(Mangled, nullptr, nullptr, &Status);
+  OS << (Demangled ? Demangled : Mangled) << '\n';
+  free(Demangled);
+}
+
 int main(int argc, char **argv) {
-  for (int I = 1; I < argc; ++I) {
-    const char *Mangled = argv[I];
-    int Status;
-    char *Demangled = itaniumDemangle(Mangled, nullptr, nullptr, &Status);
-    llvm::outs() << (Demangled ? Demangled : Mangled) << '\n';
-    free(Demangled);
-  }
-  return 0;
+  if (argc == 1)
+    for (std::string Mangled; std::getline(std::cin, Mangled);)
+      demangle(llvm::outs(), Mangled.c_str());
+  else
+    for (int I = 1; I < argc; ++I)
+      demangle(llvm::outs(), argv[I]);
+
+  return EXIT_SUCCESS;
 }