diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp index 94e323b7f6d..f6cbe087543 100644 --- a/tools/llvmc2/CompilationGraph.cpp +++ b/tools/llvmc2/CompilationGraph.cpp @@ -25,6 +25,31 @@ using namespace llvmcc; extern cl::list InputFilenames; extern cl::opt OutputFilename; +// Choose one of the edges based on command-line options. +const Edge* Node::ChooseEdge() const { + const Edge* DefaultEdge = 0; + for (const_iterator B = EdgesBegin(), E = EdgesEnd(); + B != E; ++B) { + const Edge* E = (*B).getPtr(); + if (E->isDefault()) + if (!DefaultEdge) + DefaultEdge = E; + else + throw std::runtime_error("Node " + Name() + + ": multiple default edges found!" + "Most probably a specification error."); + if (E->isEnabled()) + return E; + } + + if (DefaultEdge) + return DefaultEdge; + else + throw std::runtime_error("Node " + Name() + + ": no suitable edge found! " + "Most probably a specification error."); +} + CompilationGraph::CompilationGraph() { NodesMap["root"] = Node(this); } @@ -84,8 +109,8 @@ void CompilationGraph::insertEdge(const std::string& A, Edge* E) { } } -// TOFIX: support edge properties. -// TOFIX: support more interesting graph topologies. +// TOFIX: support more interesting graph topologies. We will need to +// do topological sorting to process multiple Join nodes correctly. int CompilationGraph::Build (const sys::Path& tempDir) const { PathVector JoinList; const Tool* JoinTool = 0; @@ -102,7 +127,7 @@ int CompilationGraph::Build (const sys::Path& tempDir) const { throw std::runtime_error("Tool names vector is empty!"); const Node* N = &getNode(*TV.begin()); - // Pass it through the chain until we bump into a Join node or a + // Pass file through the chain until we bump into a Join node or a // node that says that it is the last. bool Last = false; while(!Last) { @@ -135,7 +160,7 @@ int CompilationGraph::Build (const sys::Path& tempDir) const { if (CurTool->GenerateAction(In, Out).Execute() != 0) throw std::runtime_error("Tool returned error code!"); - N = &getNode((*N->EdgesBegin())->ToolName()); + N = &getNode(N->ChooseEdge()->ToolName()); In = Out; Out.clear(); } } @@ -166,7 +191,7 @@ namespace llvm { template static std::string getNodeLabel(const Node* N, const GraphType&) { if (N->ToolPtr) - return N->ToolPtr->Name(); + return N->Name(); else return "root"; } diff --git a/tools/llvmc2/CompilationGraph.h b/tools/llvmc2/CompilationGraph.h index d953aeea900..18c1e6b3b5f 100644 --- a/tools/llvmc2/CompilationGraph.h +++ b/tools/llvmc2/CompilationGraph.h @@ -45,7 +45,7 @@ namespace llvmcc { class SimpleEdge : public Edge { public: SimpleEdge(const std::string& T) : Edge(T) {} - bool isEnabled() const { return true;} + bool isEnabled() const { return false;} bool isDefault() const { return true;} }; @@ -60,12 +60,16 @@ namespace llvmcc { Node(CompilationGraph* G, Tool* T) : OwningGraph(G), ToolPtr(T) {} bool HasChildren() const { return !OutEdges.empty(); } + const std::string Name() const { return ToolPtr->Name(); } iterator EdgesBegin() { return OutEdges.begin(); } const_iterator EdgesBegin() const { return OutEdges.begin(); } iterator EdgesEnd() { return OutEdges.end(); } const_iterator EdgesEnd() const { return OutEdges.end(); } + // Choose one of the edges based on command-line options. + const Edge* ChooseEdge() const; + // Takes ownership of the object. void AddEdge(Edge* E) { OutEdges.push_back(llvm::IntrusiveRefCntPtr(E)); } diff --git a/tools/llvmc2/Example.td b/tools/llvmc2/Example.td index 4fa4978b067..82d9da1515d 100644 --- a/tools/llvmc2/Example.td +++ b/tools/llvmc2/Example.td @@ -26,11 +26,10 @@ def CompilationGraph : CompilationGraph<[ Edge, Edge, - OptionalEdge, - OptionalEdge, - OptionalEdge, - OptionalEdge, + OptionalEdge, + OptionalEdge, + OptionalEdge, + Edge, Edge, Edge diff --git a/tools/llvmc2/Tools.td b/tools/llvmc2/Tools.td index f4c73cb735b..76ec8561712 100644 --- a/tools/llvmc2/Tools.td +++ b/tools/llvmc2/Tools.td @@ -38,9 +38,9 @@ def llvm_gcc_cpp : Tool< def opt : Tool< [(in_language "llvm-bitcode"), (out_language "llvm-bitcode"), - (switch_option "S", (help "Test switch")), - (parameter_option "O", (help "Test Parameter")), - (prefix_list_option "P", (help "Test Parameter List")), + (switch_option "opt", (help "Enable opt")), + //(parameter_option "O", (help "Test Parameter")), + //(prefix_list_option "P", (help "Test Parameter List")), (output_suffix "bc"), (cmd_line "opt $INFILE -o $OUTFILE") ]>;