Add output redirection, rename namespace llvmcc to namespace llvmc.
authorMikhail Glushenkov <foldr@codedgers.com>
Tue, 6 May 2008 18:08:59 +0000 (18:08 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Tue, 6 May 2008 18:08:59 +0000 (18:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50746 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvmc2/Action.cpp
tools/llvmc2/Action.h
tools/llvmc2/AutoGenerated.cpp
tools/llvmc2/AutoGenerated.h
tools/llvmc2/CompilationGraph.cpp
tools/llvmc2/CompilationGraph.h
tools/llvmc2/Tool.cpp
tools/llvmc2/Tool.h
tools/llvmc2/llvmc.cpp
utils/TableGen/LLVMCCConfigurationEmitter.cpp

index 8d34910286a23c25e4ac1b3c2f692fdfa714d423..fdbfb886113c793f5a0c9ff68cbfefe4919beb59 100644 (file)
 #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 @@ namespace {
     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 @@ namespace {
   }
 }
 
-int llvmcc::Action::Execute() const {
+int llvmc::Action::Execute() const {
   if (VerboseMode) {
     std::cerr << Command_ << " ";
     std::for_each(Args_.begin(), Args_.end(), print_string);
index 3f7b33bbc712aef43a451568f24ff62217becba1..7aaf470cedc70e07cc1aacaaa19b3dfac432635c 100644 (file)
 #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)
     {}
 
index 327e8e758e319d63181fd2b85759b455fb76e236..9b0255cefc81b471cfd00b86b740fb85b7ec24aa 100644 (file)
@@ -20,7 +20,7 @@
 #include <stdexcept>
 
 using namespace llvm;
-using namespace llvmcc;
+using namespace llvmc;
 
 // The auto-generated file
 #include "AutoGenerated.inc"
index 686ae3feaff166f61410ea87ab7150560d7c9aeb..49248d9f1317c16d6578628b59bac11b4667eea9 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <string>
 
-namespace llvmcc {
+namespace llvmc {
 
   typedef llvm::StringMap<std::string> LanguageMap;
   class CompilationGraph;
index a130ee5457436733a793ef882c4a4ef6697e2923..817e0fb4c6b1ec5add4b616c622a70953ed9e002 100644 (file)
@@ -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 @@ const Node* CompilationGraph::FindToolChain(const sys::Path& In) const {
   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 @@ int CompilationGraph::Build (const sys::Path& TempDir) {
   // 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 @@ int CompilationGraph::Build (const sys::Path& TempDir) {
 
 namespace llvm {
   template <>
-  struct DOTGraphTraits<llvmcc::CompilationGraph*>
+  struct DOTGraphTraits<llvmc::CompilationGraph*>
     : public DefaultDOTGraphTraits
   {
 
index dc388d0fa74deb91de2a2c96b8d3cd9dad91cdb6..7d949e6d4f4e2367ccb2d93982ae7006789199f2 100644 (file)
@@ -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 llvmcc {
 
 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 @@ namespace llvm {
       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);
     }
index d0e703a9c1c9d9c52b83c4aaf64768674895b99c..eea0145d4aa6ca9bbfda15646ca01396635d312e 100644 (file)
@@ -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, ",");
 }
index b4478f9f2f8ef47ad20d00e25d46fbe7787c69ec..1cac7eed6978c62e6f9b35d9e96e4cee79bb682d 100644 (file)
@@ -22,7 +22,7 @@
 #include <string>
 #include <vector>
 
-namespace llvmcc {
+namespace llvmc {
 
   typedef std::vector<llvm::sys::Path> PathVector;
 
index 87c0e41cdcab1cf5b648b095c99e0039c3920cb0..b4f0afeb14e53b5d1333cdd40e588193b7fe2523 100644 (file)
@@ -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.
index aa99b26c2b1ce56129b430b374a0a9127b967ed0..e79ff31a431b877fb82b93f7f429511bca37b2c9 100644 (file)
@@ -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 @@ void EmitPopulateLanguageMap (const RecordKeeper& Records, std::ostream& O)
     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 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
   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 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
 // 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");