Add output redirection, rename namespace llvmcc to namespace llvmc.
llvm-svn: 50746
This commit is contained in:
		
							parent
							
								
									2eb0268fab
								
							
						
					
					
						commit
						d4918dd32c
					
				| 
						 | 
					@ -20,12 +20,13 @@
 | 
				
			||||||
#include <stdexcept>
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace llvm;
 | 
					using namespace llvm;
 | 
				
			||||||
 | 
					using namespace llvmc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern cl::opt<bool> VerboseMode;
 | 
					extern cl::opt<bool> VerboseMode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
  int ExecuteProgram(const std::string& name,
 | 
					  int ExecuteProgram(const std::string& name,
 | 
				
			||||||
                     const std::vector<std::string>& args) {
 | 
					                     const StringVector& args) {
 | 
				
			||||||
    sys::Path prog = sys::Program::FindProgramByName(name);
 | 
					    sys::Path prog = sys::Program::FindProgramByName(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (prog.isEmpty())
 | 
					    if (prog.isEmpty())
 | 
				
			||||||
| 
						 | 
					@ -33,14 +34,27 @@ namespace {
 | 
				
			||||||
    if (!prog.canExecute())
 | 
					    if (!prog.canExecute())
 | 
				
			||||||
      throw std::runtime_error("Program '" + name + "' is not executable.");
 | 
					      throw std::runtime_error("Program '" + name + "' is not executable.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Invoke the program
 | 
					    const sys::Path* redirects[3] = {0,0,0};
 | 
				
			||||||
    std::vector<const char*> argv((args.size()+2));
 | 
					    sys::Path stdout_redirect;
 | 
				
			||||||
    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.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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) {
 | 
					  void print_string (const std::string& str) {
 | 
				
			||||||
| 
						 | 
					@ -48,7 +62,7 @@ namespace {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int llvmcc::Action::Execute() const {
 | 
					int llvmc::Action::Execute() const {
 | 
				
			||||||
  if (VerboseMode) {
 | 
					  if (VerboseMode) {
 | 
				
			||||||
    std::cerr << Command_ << " ";
 | 
					    std::cerr << Command_ << " ";
 | 
				
			||||||
    std::for_each(Args_.begin(), Args_.end(), print_string);
 | 
					    std::for_each(Args_.begin(), Args_.end(), print_string);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,14 +17,16 @@
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvmcc {
 | 
					namespace llvmc {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  typedef std::vector<std::string> StringVector;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  class Action {
 | 
					  class Action {
 | 
				
			||||||
    std::string Command_;
 | 
					    std::string Command_;
 | 
				
			||||||
    std::vector<std::string> Args_;
 | 
					    std::vector<std::string> Args_;
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    Action (std::string const& C,
 | 
					    Action (const std::string& C,
 | 
				
			||||||
            std::vector<std::string> const& A)
 | 
					            const StringVector& A)
 | 
				
			||||||
      : Command_(C), Args_(A)
 | 
					      : Command_(C), Args_(A)
 | 
				
			||||||
    {}
 | 
					    {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@
 | 
				
			||||||
#include <stdexcept>
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace llvm;
 | 
					using namespace llvm;
 | 
				
			||||||
using namespace llvmcc;
 | 
					using namespace llvmc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The auto-generated file
 | 
					// The auto-generated file
 | 
				
			||||||
#include "AutoGenerated.inc"
 | 
					#include "AutoGenerated.inc"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvmcc {
 | 
					namespace llvmc {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  typedef llvm::StringMap<std::string> LanguageMap;
 | 
					  typedef llvm::StringMap<std::string> LanguageMap;
 | 
				
			||||||
  class CompilationGraph;
 | 
					  class CompilationGraph;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
#include <stdexcept>
 | 
					#include <stdexcept>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace llvm;
 | 
					using namespace llvm;
 | 
				
			||||||
using namespace llvmcc;
 | 
					using namespace llvmc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern cl::list<std::string> InputFilenames;
 | 
					extern cl::list<std::string> InputFilenames;
 | 
				
			||||||
extern cl::opt<std::string> OutputFilename;
 | 
					extern cl::opt<std::string> OutputFilename;
 | 
				
			||||||
| 
						 | 
					@ -215,6 +215,9 @@ const Node* CompilationGraph::FindToolChain(const sys::Path& In) const {
 | 
				
			||||||
  return &getNode(ChooseEdge(TV)->ToolName());
 | 
					  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) {
 | 
					int CompilationGraph::Build (const sys::Path& TempDir) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // For each input file:
 | 
					  // For each input file:
 | 
				
			||||||
| 
						 | 
					@ -234,12 +237,13 @@ int CompilationGraph::Build (const sys::Path& TempDir) {
 | 
				
			||||||
  // For all join nodes in topological order:
 | 
					  // For all join nodes in topological order:
 | 
				
			||||||
  for (std::vector<const Node*>::iterator B = JTV.begin(), E = JTV.end();
 | 
					  for (std::vector<const Node*>::iterator B = JTV.begin(), E = JTV.end();
 | 
				
			||||||
       B != E; ++B) {
 | 
					       B != E; ++B) {
 | 
				
			||||||
    // TOFIX: more testing, merge some parts with PassThroughGraph.
 | 
					
 | 
				
			||||||
    sys::Path Out;
 | 
					    sys::Path Out;
 | 
				
			||||||
    const Node* CurNode = *B;
 | 
					    const Node* CurNode = *B;
 | 
				
			||||||
    JoinTool* JT = &dynamic_cast<JoinTool&>(*CurNode->ToolPtr.getPtr());
 | 
					    JoinTool* JT = &dynamic_cast<JoinTool&>(*CurNode->ToolPtr.getPtr());
 | 
				
			||||||
    bool IsLast = false;
 | 
					    bool IsLast = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Has files pending?
 | 
				
			||||||
    if (JT->JoinListEmpty())
 | 
					    if (JT->JoinListEmpty())
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -277,7 +281,7 @@ int CompilationGraph::Build (const sys::Path& TempDir) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvm {
 | 
					namespace llvm {
 | 
				
			||||||
  template <>
 | 
					  template <>
 | 
				
			||||||
  struct DOTGraphTraits<llvmcc::CompilationGraph*>
 | 
					  struct DOTGraphTraits<llvmc::CompilationGraph*>
 | 
				
			||||||
    : public DefaultDOTGraphTraits
 | 
					    : public DefaultDOTGraphTraits
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvmcc {
 | 
					namespace llvmc {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // An edge in the graph.
 | 
					  // An edge in the graph.
 | 
				
			||||||
  class Edge : public llvm::RefCountedBaseVPTR<Edge> {
 | 
					  class Edge : public llvm::RefCountedBaseVPTR<Edge> {
 | 
				
			||||||
| 
						 | 
					@ -255,10 +255,10 @@ namespace llvmcc {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvm {
 | 
					namespace llvm {
 | 
				
			||||||
  template <>
 | 
					  template <>
 | 
				
			||||||
  struct GraphTraits<llvmcc::CompilationGraph*> {
 | 
					  struct GraphTraits<llvmc::CompilationGraph*> {
 | 
				
			||||||
    typedef llvmcc::CompilationGraph GraphType;
 | 
					    typedef llvmc::CompilationGraph GraphType;
 | 
				
			||||||
    typedef llvmcc::Node NodeType;
 | 
					    typedef llvmc::Node NodeType;
 | 
				
			||||||
    typedef llvmcc::NodeChildIterator ChildIteratorType;
 | 
					    typedef llvmc::NodeChildIterator ChildIteratorType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static NodeType* getEntryNode(GraphType* G) {
 | 
					    static NodeType* getEntryNode(GraphType* G) {
 | 
				
			||||||
      return &G->getNode("root");
 | 
					      return &G->getNode("root");
 | 
				
			||||||
| 
						 | 
					@ -271,7 +271,7 @@ namespace llvm {
 | 
				
			||||||
      return ChildIteratorType(N, N->OutEdges.end());
 | 
					      return ChildIteratorType(N, N->OutEdges.end());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    typedef llvmcc::NodesIterator nodes_iterator;
 | 
					    typedef llvmc::NodesIterator nodes_iterator;
 | 
				
			||||||
    static nodes_iterator nodes_begin(GraphType *G) {
 | 
					    static nodes_iterator nodes_begin(GraphType *G) {
 | 
				
			||||||
      return GraphBegin(G);
 | 
					      return GraphBegin(G);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "llvm/ADT/StringExtras.h"
 | 
					#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) {
 | 
					                                 std::vector<std::string>& to) {
 | 
				
			||||||
  llvm::SplitString(from, to, ",");
 | 
					  llvm::SplitString(from, to, ",");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace llvmcc {
 | 
					namespace llvmc {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  typedef std::vector<llvm::sys::Path> PathVector;
 | 
					  typedef std::vector<llvm::sys::Path> PathVector;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
//===--- llvmcc.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
 | 
					//===--- llvmc.cpp - The LLVM Compiler Driver ------------------*- C++ -*-===//
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//                     The LLVM Compiler Infrastructure
 | 
					//                     The LLVM Compiler Infrastructure
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace cl = llvm::cl;
 | 
					namespace cl = llvm::cl;
 | 
				
			||||||
namespace sys = llvm::sys;
 | 
					namespace sys = llvm::sys;
 | 
				
			||||||
using namespace llvmcc;
 | 
					using namespace llvmc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Built-in command-line options.
 | 
					// Built-in command-line options.
 | 
				
			||||||
// External linkage here is intentional.
 | 
					// External linkage here is intentional.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
//===- LLVMCConfigurationEmitter.cpp - Generate LLVMCC config -------------===//
 | 
					//===- LLVMCConfigurationEmitter.cpp - Generate LLVMC config --------------===//
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//                     The LLVM Compiler Infrastructure
 | 
					//                     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!");
 | 
					    throw std::string("Error in the language map definition!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Generate code
 | 
					  // 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) {
 | 
					  for (unsigned i = 0; i < LangsToSuffixesList->size(); ++i) {
 | 
				
			||||||
    Record* LangToSuffixes = LangsToSuffixesList->getElementAsRecord(i);
 | 
					    Record* LangToSuffixes = LangsToSuffixesList->getElementAsRecord(i);
 | 
				
			||||||
| 
						 | 
					@ -1040,7 +1040,7 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
 | 
				
			||||||
  ListInit* edges = CompilationGraph->getValueAsListInit("edges");
 | 
					  ListInit* edges = CompilationGraph->getValueAsListInit("edges");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Generate code
 | 
					  // Generate code
 | 
				
			||||||
  O << "void llvmcc::PopulateCompilationGraph(CompilationGraph& G) {\n"
 | 
					  O << "void llvmc::PopulateCompilationGraph(CompilationGraph& G) {\n"
 | 
				
			||||||
    << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n\n";
 | 
					    << Indent1 << "PopulateLanguageMap(G.ExtsToLangs);\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Insert vertices
 | 
					  // Insert vertices
 | 
				
			||||||
| 
						 | 
					@ -1085,7 +1085,7 @@ void EmitPopulateCompilationGraph (Record* CompilationGraph,
 | 
				
			||||||
// Back-end entry point
 | 
					// Back-end entry point
 | 
				
			||||||
void LLVMCCConfigurationEmitter::run (std::ostream &O) {
 | 
					void LLVMCCConfigurationEmitter::run (std::ostream &O) {
 | 
				
			||||||
  // Emit file header
 | 
					  // Emit file header
 | 
				
			||||||
  EmitSourceFileHeader("LLVMCC Configuration Library", O);
 | 
					  EmitSourceFileHeader("LLVMC Configuration Library", O);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get a list of all defined Tools
 | 
					  // Get a list of all defined Tools
 | 
				
			||||||
  RecordVector Tools = Records.getAllDerivedDefinitions("Tool");
 | 
					  RecordVector Tools = Records.getAllDerivedDefinitions("Tool");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue