Add an ability to choose between different edges based on edge properties.
authorMikhail Glushenkov <foldr@codedgers.com>
Tue, 6 May 2008 17:23:50 +0000 (17:23 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Tue, 6 May 2008 17:23:50 +0000 (17:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50732 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvmc2/CompilationGraph.cpp
tools/llvmc2/CompilationGraph.h
tools/llvmc2/Example.td
tools/llvmc2/Tools.td

index 94e323b7f6d001bee916da736c9afa271f5d3e52..f6cbe0875435d550468fdf30589ed3fb40f3826f 100644 (file)
@@ -25,6 +25,31 @@ using namespace llvmcc;
 extern cl::list<std::string> InputFilenames;
 extern cl::opt<std::string> 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<typename GraphType>
   static std::string getNodeLabel(const Node* N, const GraphType&) {
     if (N->ToolPtr)
-      return N->ToolPtr->Name();
+      return N->Name();
     else
       return "root";
   }
index d953aeea9003cf891eabd865676dab16a92afd45..18c1e6b3b5fb33cce93852548ee629f161370bd1 100644 (file)
@@ -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<Edge>(E)); }
index 4fa4978b067907adb06b810ff95f86e94894a004..82d9da1515deed98289896d446c2ff97a909dba8 100644 (file)
@@ -26,11 +26,10 @@ def CompilationGraph : CompilationGraph<[
     Edge<llvm_gcc_cpp, llc>,
     Edge<llvm_as, llc>,
 
-    OptionalEdge<llvm_gcc_c, opt, [(switch_on "S")]>,
-    OptionalEdge<llvm_gcc_cpp, opt, [(switch_on "S")]>,
-    OptionalEdge<llvm_as, opt, [(switch_on "S")]>,
-    OptionalEdge<opt, llc, [(and (switch_on "S"), (parameter_equals "O", "V")),
-                            (element_in_list  "P", "E")]>,
+    OptionalEdge<llvm_gcc_c, opt, [(switch_on "opt")]>,
+    OptionalEdge<llvm_gcc_cpp, opt, [(switch_on "opt")]>,
+    OptionalEdge<llvm_as, opt, [(switch_on "opt")]>,
+    Edge<opt, llc>,
 
     Edge<llc, llvm_gcc_assembler>,
     Edge<llvm_gcc_assembler, llvm_gcc_linker>
index f4c73cb735b265a3965d56b2b48329f4d135e3f6..76ec856171224b512a39017b894b972acec278fb 100644 (file)
@@ -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")
 ]>;