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