Add output redirection, rename namespace llvmcc to namespace llvmc.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50746 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvmc2/Action.cpp b/tools/llvmc2/Action.cpp
index 8d34910..fdbfb88 100644
--- a/tools/llvmc2/Action.cpp
+++ b/tools/llvmc2/Action.cpp
@@ -20,12 +20,13 @@
 #include <stdexcept>
 
 using namespace llvm;
+using namespace llvmc;
 
 extern cl::opt<bool> VerboseMode;
 
 namespace {
   int ExecuteProgram(const std::string& name,
-                     const std::vector<std::string>& args) {
+                     const StringVector& args) {
     sys::Path prog = sys::Program::FindProgramByName(name);
 
     if (prog.isEmpty())
@@ -33,14 +34,27 @@
     if (!prog.canExecute())
       throw std::runtime_error("Program '" + name + "' is not executable.");
 
-    // Invoke the program
-    std::vector<const char*> argv((args.size()+2));
-    argv[0] = name.c_str();
-    for (unsigned i = 1; i <= args.size(); ++i)
-      argv[i] = args[i-1].c_str();
-    argv[args.size()+1] = 0;  // null terminate list.
+    const sys::Path* redirects[3] = {0,0,0};
+    sys::Path stdout_redirect;
 
-    return sys::Program::ExecuteAndWait(prog, &argv[0]);
+    std::vector<const char*> argv;
+    argv.reserve((args.size()+2));
+    argv.push_back(name.c_str());
+
+    for (StringVector::const_iterator B = args.begin(), E = args.end();
+         B!=E; ++B) {
+      if (*B == ">") {
+        ++B;
+        stdout_redirect.set(*B);
+        redirects[1] = &stdout_redirect;
+      }
+      else {
+        argv.push_back((*B).c_str());
+      }
+    }
+    argv.push_back(0);  // null terminate list.
+
+    return sys::Program::ExecuteAndWait(prog, &argv[0], 0, &redirects[0]);
   }
 
   void print_string (const std::string& str) {
@@ -48,7 +62,7 @@
   }
 }
 
-int llvmcc::Action::Execute() const {
+int llvmc::Action::Execute() const {
   if (VerboseMode) {
     std::cerr << Command_ << " ";
     std::for_each(Args_.begin(), Args_.end(), print_string);
diff --git a/tools/llvmc2/Action.h b/tools/llvmc2/Action.h
index 3f7b33b..7aaf470 100644
--- a/tools/llvmc2/Action.h
+++ b/tools/llvmc2/Action.h
@@ -17,14 +17,16 @@
 #include <string>
 #include <vector>
 
-namespace llvmcc {
+namespace llvmc {
+
+  typedef std::vector<std::string> StringVector;
 
   class Action {
     std::string Command_;
     std::vector<std::string> Args_;
   public:
-    Action (std::string const& C,
-            std::vector<std::string> const& A)
+    Action (const std::string& C,
+            const StringVector& A)
       : Command_(C), Args_(A)
     {}
 
diff --git a/tools/llvmc2/AutoGenerated.cpp b/tools/llvmc2/AutoGenerated.cpp
index 327e8e7..9b0255c 100644
--- a/tools/llvmc2/AutoGenerated.cpp
+++ b/tools/llvmc2/AutoGenerated.cpp
@@ -20,7 +20,7 @@
 #include <stdexcept>
 
 using namespace llvm;
-using namespace llvmcc;
+using namespace llvmc;
 
 // The auto-generated file
 #include "AutoGenerated.inc"
diff --git a/tools/llvmc2/AutoGenerated.h b/tools/llvmc2/AutoGenerated.h
index 686ae3f..49248d9 100644
--- a/tools/llvmc2/AutoGenerated.h
+++ b/tools/llvmc2/AutoGenerated.h
@@ -18,7 +18,7 @@
 
 #include <string>
 
-namespace llvmcc {
+namespace llvmc {
 
   typedef llvm::StringMap<std::string> LanguageMap;
   class CompilationGraph;
diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp
index a130ee5..817e0fb 100644
--- a/tools/llvmc2/CompilationGraph.cpp
+++ b/tools/llvmc2/CompilationGraph.cpp
@@ -24,7 +24,7 @@
 #include <stdexcept>
 
 using namespace llvm;
-using namespace llvmcc;
+using namespace llvmc;
 
 extern cl::list<std::string> InputFilenames;
 extern cl::opt<std::string> OutputFilename;
@@ -215,6 +215,9 @@
   return &getNode(ChooseEdge(TV)->ToolName());
 }
 
+// TOFIX: merge some parts with PassThroughGraph.
+// Build the targets. Command-line options are passed through
+// temporary variables.
 int CompilationGraph::Build (const sys::Path& TempDir) {
 
   // For each input file:
@@ -234,12 +237,13 @@
   // For all join nodes in topological order:
   for (std::vector<const Node*>::iterator B = JTV.begin(), E = JTV.end();
        B != E; ++B) {
-    // TOFIX: more testing, merge some parts with PassThroughGraph.
+
     sys::Path Out;
     const Node* CurNode = *B;
     JoinTool* JT = &dynamic_cast<JoinTool&>(*CurNode->ToolPtr.getPtr());
     bool IsLast = false;
 
+    // Has files pending?
     if (JT->JoinListEmpty())
       continue;
 
@@ -277,7 +281,7 @@
 
 namespace llvm {
   template <>
-  struct DOTGraphTraits<llvmcc::CompilationGraph*>
+  struct DOTGraphTraits<llvmc::CompilationGraph*>
     : public DefaultDOTGraphTraits
   {
 
diff --git a/tools/llvmc2/CompilationGraph.h b/tools/llvmc2/CompilationGraph.h
index dc388d0..7d949e6 100644
--- a/tools/llvmc2/CompilationGraph.h
+++ b/tools/llvmc2/CompilationGraph.h
@@ -26,7 +26,7 @@
 
 #include <string>
 
-namespace llvmcc {
+namespace llvmc {
 
   // An edge in the graph.
   class Edge : public llvm::RefCountedBaseVPTR<Edge> {
@@ -255,10 +255,10 @@
 
 namespace llvm {
   template <>
-  struct GraphTraits<llvmcc::CompilationGraph*> {
-    typedef llvmcc::CompilationGraph GraphType;
-    typedef llvmcc::Node NodeType;
-    typedef llvmcc::NodeChildIterator ChildIteratorType;
+  struct GraphTraits<llvmc::CompilationGraph*> {
+    typedef llvmc::CompilationGraph GraphType;
+    typedef llvmc::Node NodeType;
+    typedef llvmc::NodeChildIterator ChildIteratorType;
 
     static NodeType* getEntryNode(GraphType* G) {
       return &G->getNode("root");
@@ -271,7 +271,7 @@
       return ChildIteratorType(N, N->OutEdges.end());
     }
 
-    typedef llvmcc::NodesIterator nodes_iterator;
+    typedef llvmc::NodesIterator nodes_iterator;
     static nodes_iterator nodes_begin(GraphType *G) {
       return GraphBegin(G);
     }
diff --git a/tools/llvmc2/Tool.cpp b/tools/llvmc2/Tool.cpp
index d0e703a..eea0145 100644
--- a/tools/llvmc2/Tool.cpp
+++ b/tools/llvmc2/Tool.cpp
@@ -15,7 +15,7 @@
 
 #include "llvm/ADT/StringExtras.h"
 
-void llvmcc::Tool::UnpackValues (const std::string& from,
+void llvmc::Tool::UnpackValues (const std::string& from,
                                  std::vector<std::string>& to) {
   llvm::SplitString(from, to, ",");
 }
diff --git a/tools/llvmc2/Tool.h b/tools/llvmc2/Tool.h
index b4478f9..1cac7ee 100644
--- a/tools/llvmc2/Tool.h
+++ b/tools/llvmc2/Tool.h
@@ -22,7 +22,7 @@
 #include <string>
 #include <vector>
 
-namespace llvmcc {
+namespace llvmc {
 
   typedef std::vector<llvm::sys::Path> PathVector;
 
diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp
index 87c0e41..b4f0afe 100644
--- a/tools/llvmc2/llvmc.cpp
+++ b/tools/llvmc2/llvmc.cpp
@@ -1,4 +1,4 @@
-//===--- llvmcc.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
+//===--- llvmc.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -26,7 +26,7 @@
 
 namespace cl = llvm::cl;
 namespace sys = llvm::sys;
-using namespace llvmcc;
+using namespace llvmc;
 
 // Built-in command-line options.
 // External linkage here is intentional.
diff --git a/utils/TableGen/LLVMCCConfigurationEmitter.cpp b/utils/TableGen/LLVMCCConfigurationEmitter.cpp
index aa99b26..e79ff31 100644
--- a/utils/TableGen/LLVMCCConfigurationEmitter.cpp
+++ b/utils/TableGen/LLVMCCConfigurationEmitter.cpp
@@ -1,4 +1,4 @@
-//===- LLVMCConfigurationEmitter.cpp - Generate LLVMCC config -------------===//
+//===- LLVMCConfigurationEmitter.cpp - Generate LLVMC config --------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This tablegen backend is responsible for emitting LLVMCC configuration code.
+// This tablegen backend is responsible for emitting LLVMC configuration code.
 //
 //===----------------------------------------------------------------------===//
 
@@ -848,7 +848,7 @@
     throw std::string("Error in the language map definition!");
 
   // Generate code
-  O << "void llvmcc::PopulateLanguageMap(LanguageMap& language_map) {\n";
+  O << "void llvmc::PopulateLanguageMap(LanguageMap& language_map) {\n";
 
   for (unsigned i = 0; i < LangsToSuffixesList->size(); ++i) {
     Record* LangToSuffixes = LangsToSuffixesList->getElementAsRecord(i);
@@ -1040,7 +1040,7 @@
   ListInit* edges = CompilationGraph->getValueAsListInit("edges");
 
   // Generate code
-  O << "void llvmcc::PopulateCompilationGraph(CompilationGraph& G) {\n"
+  O << "void llvmc::PopulateCompilationGraph(CompilationGraph& G) {\n"
     << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n\n";
 
   // Insert vertices
@@ -1085,7 +1085,7 @@
 // Back-end entry point
 void LLVMCCConfigurationEmitter::run (std::ostream &O) {
   // Emit file header
-  EmitSourceFileHeader("LLVMCC Configuration Library", O);
+  EmitSourceFileHeader("LLVMC Configuration Library", O);
 
   // Get a list of all defined Tools
   RecordVector Tools = Records.getAllDerivedDefinitions("Tool");