Add output redirection, rename namespace llvmcc to namespace llvmc.

llvm-svn: 50746
This commit is contained in:
Mikhail Glushenkov 2008-05-06 18:08:59 +00:00
parent 2eb0268fab
commit d4918dd32c
10 changed files with 52 additions and 32 deletions

View File

@ -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);

View File

@ -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)
{} {}

View File

@ -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"

View File

@ -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;

View File

@ -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
{ {

View File

@ -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);
} }

View File

@ -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, ",");
} }

View File

@ -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;

View File

@ -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.

View File

@ -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");