[llvm-commits] [llvm] r50726 - in /llvm/trunk: tools/llvmc2/Common.td tools/llvmc2/CompilationGraph.cpp tools/llvmc2/CompilationGraph.h tools/llvmc2/Example.td tools/llvmc2/Makefile utils/TableGen/LLVMCCConfigurationEmitter.cpp

Mikhail Glushenkov foldr at codedgers.com
Tue May 6 09:36:50 PDT 2008


Author: foldr
Date: Tue May  6 11:36:50 2008
New Revision: 50726

URL: http://llvm.org/viewvc/llvm-project?rev=50726&view=rev
Log:
More work on edge properties. Use Edge classes instead of strings in CompilationGraph.

Modified:
    llvm/trunk/tools/llvmc2/Common.td
    llvm/trunk/tools/llvmc2/CompilationGraph.cpp
    llvm/trunk/tools/llvmc2/CompilationGraph.h
    llvm/trunk/tools/llvmc2/Example.td
    llvm/trunk/tools/llvmc2/Makefile
    llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp

Modified: llvm/trunk/tools/llvmc2/Common.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/Common.td?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/Common.td (original)
+++ llvm/trunk/tools/llvmc2/Common.td Tue May  6 11:36:50 2008
@@ -50,10 +50,6 @@
 def switch_on;
 def parameter_equals;
 def element_in_list;
-
-// Property combinators
-// TOFIX: implement
-def and;
 def or;
 
 // Map from suffixes to language names

Modified: llvm/trunk/tools/llvmc2/CompilationGraph.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/CompilationGraph.cpp?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/CompilationGraph.cpp (original)
+++ llvm/trunk/tools/llvmc2/CompilationGraph.cpp Tue May  6 11:36:50 2008
@@ -32,14 +32,14 @@
 Node& CompilationGraph::getNode(const std::string& ToolName) {
   nodes_map_type::iterator I = NodesMap.find(ToolName);
   if (I == NodesMap.end())
-    throw std::runtime_error("Node " + ToolName + " is not in graph");
+    throw std::runtime_error("Node " + ToolName + " is not in the graph");
   return I->second;
 }
 
 const Node& CompilationGraph::getNode(const std::string& ToolName) const {
   nodes_map_type::const_iterator I = NodesMap.find(ToolName);
   if (I == NodesMap.end())
-    throw std::runtime_error("Node " + ToolName + " is not in graph!");
+    throw std::runtime_error("Node " + ToolName + " is not in the graph!");
   return I->second;
 }
 
@@ -69,31 +69,23 @@
   }
 }
 
-void CompilationGraph::insertEdge(const std::string& A,
-                                  const std::string& B) {
-  // TOTHINK: check this at compile-time?
-  if (B == "root")
-    throw std::runtime_error("Edges back to the root are not allowed!"
-                             "Compilation graph should be acyclic!");
-
+void CompilationGraph::insertEdge(const std::string& A, Edge* E) {
   if (A == "root") {
-    const Node& N = getNode(B);
+    const Node& N = getNode(E->ToolName());
     const std::string& InputLanguage = N.ToolPtr->InputLanguage();
-    ToolsMap[InputLanguage].push_back(B);
+    ToolsMap[InputLanguage].push_back(E->ToolName());
 
     // Needed to support iteration via GraphTraits.
-    NodesMap["root"].AddEdge(new DefaultEdge(B));
+    NodesMap["root"].AddEdge(E);
   }
   else {
     Node& N = getNode(A);
-    // Check that there is a node at B.
-    getNode(B);
-    N.AddEdge(new DefaultEdge(B));
+    N.AddEdge(E);
   }
 }
 
-// TOFIX: extend, add an ability to choose between different
-// toolchains, support more interesting graph topologies.
+// TOFIX: support edge properties.
+// TOFIX: support more interesting graph topologies.
 int CompilationGraph::Build (const sys::Path& tempDir) const {
   PathVector JoinList;
   const Tool* JoinTool = 0;
@@ -124,7 +116,11 @@
 
       // Is this the last tool?
       if (!N->HasChildren() || CurTool->IsLast()) {
-        Out.appendComponent(In.getBasename());
+        // Check if the first tool is also the last
+        if(Out.empty())
+          Out.set(In.getBasename());
+        else
+          Out.appendComponent(In.getBasename());
         Out.appendSuffix(CurTool->OutputSuffix());
         Last = true;
       }
@@ -191,5 +187,5 @@
 }
 
 void CompilationGraph::viewGraph() {
-  llvm::ViewGraph(this, "CompilationGraph");
+  llvm::ViewGraph(this, "compilation-graph");
 }

Modified: llvm/trunk/tools/llvmc2/CompilationGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/CompilationGraph.h?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/CompilationGraph.h (original)
+++ llvm/trunk/tools/llvmc2/CompilationGraph.h Tue May  6 11:36:50 2008
@@ -28,6 +28,7 @@
 
 namespace llvmcc {
 
+  // An edge in the graph.
   class Edge : public llvm::RefCountedBaseVPTR<Edge> {
   public:
     Edge(const std::string& T) : ToolName_(T) {}
@@ -40,13 +41,15 @@
     std::string ToolName_;
   };
 
-  class DefaultEdge : public Edge {
+  // Edges with no properties are instances of this class.
+  class SimpleEdge : public Edge {
   public:
-    DefaultEdge(const std::string& T) : Edge(T) {}
+    SimpleEdge(const std::string& T) : Edge(T) {}
     bool isEnabled() const { return true;}
     bool isDefault() const { return true;}
   };
 
+  // A node in the graph.
   struct Node {
     typedef llvm::SmallVector<llvm::IntrusiveRefCntPtr<Edge>, 3> container_type;
     typedef container_type::iterator iterator;
@@ -56,14 +59,14 @@
     Node(CompilationGraph* G) : OwningGraph(G) {}
     Node(CompilationGraph* G, Tool* T) : OwningGraph(G), ToolPtr(T) {}
 
-    bool HasChildren() const { return OutEdges.empty(); }
+    bool HasChildren() const { return !OutEdges.empty(); }
 
     iterator EdgesBegin() { return OutEdges.begin(); }
     const_iterator EdgesBegin() const { return OutEdges.begin(); }
     iterator EdgesEnd() { return OutEdges.end(); }
     const_iterator EdgesEnd() const { return OutEdges.end(); }
 
-    // E is a new-allocated pointer.
+    // Takes ownership of the object.
     void AddEdge(Edge* E)
     { OutEdges.push_back(llvm::IntrusiveRefCntPtr<Edge>(E)); }
 
@@ -93,16 +96,16 @@
 
     CompilationGraph();
 
-    // insertVertex - insert a new node into the graph.
+    // insertVertex - insert a new node into the graph. Takes
+    // ownership of the object.
     void insertNode(Tool* T);
 
-    // insertEdge - Insert a new edge into the graph. This function
-    // assumes that both A and B have been already inserted.
-    void insertEdge(const std::string& A, const std::string& B);
-
-    // Build - Build the target(s) from the set of the input
-    // files. Command-line options are passed implicitly as global
-    // variables.
+    // insertEdge - Insert a new edge into the graph. Takes ownership
+    // of the object.
+    void insertEdge(const std::string& A, Edge* E);
+
+    // Build - Build target(s) from the input file set. Command-line
+    // options are passed implicitly as global variables.
     int Build(llvm::sys::Path const& tempDir) const;
 
     // Return a reference to the node correponding to the given tool

Modified: llvm/trunk/tools/llvmc2/Example.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/Example.td?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/Example.td (original)
+++ llvm/trunk/tools/llvmc2/Example.td Tue May  6 11:36:50 2008
@@ -21,9 +21,16 @@
     Edge<root, llvm_gcc_assembler>,
     Edge<root, llvm_gcc_cpp>,
     Edge<root, llvm_as>,
+
     Edge<llvm_gcc_c, llc>,
     Edge<llvm_gcc_cpp, llc>,
     Edge<llvm_as, llc>,
+
+    OptionalEdge<llvm_gcc_c, opt, [(switch_on "opt")]>,
+    OptionalEdge<llvm_gcc_cpp, opt, [(switch_on "opt")]>,
+    OptionalEdge<llvm_as, opt, [(switch_on "opt")]>,
+    OptionalEdge<opt, llc, [(switch_on "opt")]>,
+
     Edge<llc, llvm_gcc_assembler>,
     Edge<llvm_gcc_assembler, llvm_gcc_linker>
     ]>;

Modified: llvm/trunk/tools/llvmc2/Makefile
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvmc2/Makefile?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/tools/llvmc2/Makefile (original)
+++ llvm/trunk/tools/llvmc2/Makefile Tue May  6 11:36:50 2008
@@ -14,12 +14,7 @@
 
 include $(LEVEL)/Makefile.common
 
-TOOLS_TARGET=default
-ifeq ($(TOOLS_TARGET), default)
-	TOOLS_SOURCE=Example.td
-else
-	TOOLS_SOURCE=ExampleWithOpt.td
-endif
+TOOLS_SOURCE=Example.td
 
 # TOFIX: integrate this part into Makefile.rules?
 # The degree of horrorshowness in that file is too much for me atm.

Modified: llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp?rev=50726&r1=50725&r2=50726&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/LLVMCCConfigurationEmitter.cpp Tue May  6 11:36:50 2008
@@ -866,6 +866,8 @@
 }
 
 // Check that all output and input language names match.
+// TOFIX: check for cycles.
+// TOFIX: check for multiple default edges.
 void TypecheckGraph (Record* CompilationGraph,
                      const ToolPropertiesList& TPList) {
   StringMap<std::string> ToolToInLang;
@@ -889,22 +891,36 @@
     if(A->getName() != "root" && IA->second != IB->second)
       throw "Edge " + A->getName() + "->" + B->getName()
         + ": output->input language mismatch";
+    if(B->getName() == "root")
+      throw std::string("Edges back to the root are not allowed!");
   }
 }
 
-// Emit Edge* classes used for.
+// Emit Edge* classes that represent edges in the graph.
+// TOFIX: add edge properties.
 void EmitEdgeClasses (Record* CompilationGraph,
                       const GlobalOptionDescriptions& OptDescs,
                       std::ostream& O) {
   ListInit* edges = CompilationGraph->getValueAsListInit("edges");
 
   for (unsigned i = 0; i < edges->size(); ++i) {
-    //Record* Edge = edges->getElementAsRecord(i);
-    //Record* A = Edge->getValueAsDef("a");
-    //Record* B = Edge->getValueAsDef("b");
-    //ListInit* Props = Edge->getValueAsListInit("props");
+    Record* Edge = edges->getElementAsRecord(i);
+    Record* B = Edge->getValueAsDef("b");
+    ListInit* Props = Edge->getValueAsListInit("props");
+
+    if (Props->empty())
+      continue;
+
+    O << "class Edge" << i << ": public Edge {\n"
+      << "public:\n"
+      << Indent1 << "Edge" << i << "() : Edge(\"" << B->getName()
+      << "\") {}\n";
+
+    O << Indent1 << "bool isEnabled() const { return true; }\n";
 
-    O << "class Edge" << i << " {};\n\n";
+    O << Indent1 << "bool isDefault() const { return false; }\n";
+
+    O << "};\n\n";
   }
 }
 
@@ -937,8 +953,16 @@
     Record* Edge = edges->getElementAsRecord(i);
     Record* A = Edge->getValueAsDef("a");
     Record* B = Edge->getValueAsDef("b");
-    O << Indent1 << "G.insertEdge(\"" << A->getName() << "\", \""
-      << B->getName() << "\");\n";
+    ListInit* Props = Edge->getValueAsListInit("props");
+
+    O << Indent1 << "G.insertEdge(\"" << A->getName() << "\", ";
+
+    if (Props->empty())
+      O << "new SimpleEdge(\"" << B->getName() << "\")";
+    else
+      O << "new Edge" << i << "()";
+
+    O << ");\n";
   }
 
   O << "}\n\n";





More information about the llvm-commits mailing list