Add ability to annotate (color) nodes in a viewGraph.
authorJim Laskey <jlaskey@mac.com>
Mon, 2 Oct 2006 12:26:53 +0000 (12:26 +0000)
committerJim Laskey <jlaskey@mac.com>
Mon, 2 Oct 2006 12:26:53 +0000 (12:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30686 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
include/llvm/Support/DOTGraphTraits.h
include/llvm/Support/GraphWriter.h
lib/Analysis/DataStructure/Printer.cpp
lib/CodeGen/SelectionDAG/SelectionDAGPrinter.cpp

index 0475147b915a465f313f775ffdd80767c3bda089..c173eb122c358468af55a6098a0509e0dcd6252c 100644 (file)
@@ -69,10 +69,29 @@ public:
   TargetLowering &getTargetLoweringInfo() const { return TLI; }
   MachineDebugInfo *getMachineDebugInfo() const { return DI; }
 
-  /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
+  /// viewGraph - Pop up a GraphViz/gv window with the DAG rendered using 'dot'.
   ///
   void viewGraph();
+  
+#ifndef NDEBUG
+  std::map<const SDNode *, std::string> NodeGraphAttrs;
+#endif
 
+  /// clearGraphAttrs - Clear all previously defined node graph attributes.
+  /// Intended to be used from a debugging tool (eg. gdb).
+  void clearGraphAttrs();
+  
+  /// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
+  ///
+  void setGraphAttrs(const SDNode *N, const char *Attrs);
+  
+  /// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
+  /// Used from getNodeAttributes.
+  const std::string getGraphAttrs(const SDNode *N) const;
+  
+  /// setGraphColor - Convenience for setting node color attribute.
+  ///
+  void setGraphColor(const SDNode *N, const char *Color);
 
   typedef ilist<SDNode>::const_iterator allnodes_const_iterator;
   allnodes_const_iterator allnodes_begin() const { return AllNodes.begin(); }
index 9300ea7a8af0710b6a98acb1d4f449cb32174356..62eac0cea90a1794d997b2e4d9edc954253301a0 100644 (file)
@@ -60,7 +60,9 @@ struct DefaultDOTGraphTraits {
 
   /// If you want to specify custom node attributes, this is the place to do so
   ///
-  static std::string getNodeAttributes(const void *Node) { return ""; }
+  static std::string getNodeAttributes(const void *Node, const void *Graph) {
+    return "";
+  }
 
   /// If you want to override the dot attributes printed for a particular edge,
   /// override this method.
index 6bf43d29c7cd84fbd2b80b08126f05f32ce5ff26..b4e6d845e61f56876517e3bac5e605c5e15e0789 100644 (file)
@@ -109,7 +109,7 @@ public:
   }
 
   void writeNode(NodeType *Node) {
-    std::string NodeAttributes = DOTTraits::getNodeAttributes(Node);
+    std::string NodeAttributes = DOTTraits::getNodeAttributes(Node, G);
 
     O << "\tNode" << reinterpret_cast<const void*>(Node) << " [shape=record,";
     if (!NodeAttributes.empty()) O << NodeAttributes << ",";
index 7cb79247e4baef84a1cdc196f027243645efcb06..ce99961581121307835ad5458b913840318bd043 100644 (file)
@@ -112,7 +112,7 @@ struct DOTGraphTraits<const DSGraph*> : public DefaultDOTGraphTraits {
     return getCaption(Node, Graph);
   }
 
-  static std::string getNodeAttributes(const DSNode *N) {
+  static std::string getNodeAttributes(const DSNode *N, const DSGraph *Graph) {
     return "shape=Mrecord";
   }
 
index 1669c08a4026d1342e33d6634940c7688470d005..430c326ba5649d9d27d021695c8116281749ca84 100644 (file)
@@ -27,6 +27,9 @@
 using namespace llvm;
 
 namespace llvm {
+#ifndef NDEBUG
+  std::map<const SDNode *, std::string> DagNodeColor;
+#endif
   template<>
   struct DOTGraphTraits<SelectionDAG*> : public DefaultDOTGraphTraits {
     static std::string getGraphName(const SelectionDAG *G) {
@@ -44,7 +47,17 @@ namespace llvm {
 
     static std::string getNodeLabel(const SDNode *Node,
                                     const SelectionDAG *Graph);
-    static std::string getNodeAttributes(const SDNode *N) {
+    static std::string getNodeAttributes(const SDNode *N,
+                                         const SelectionDAG *Graph) {
+#ifndef NDEBUG
+      const std::string &Attrs = Graph->getGraphAttrs(N);
+      if (!Attrs.empty()) {
+        if (Attrs.find("shape=") == std::string::npos)
+          return std::string("shape=Mrecord,") + Attrs;
+        else
+          return Attrs;
+      }
+#endif
       return "shape=Mrecord";
     }
 
@@ -138,3 +151,58 @@ void SelectionDAG::viewGraph() {
             << "systems with Graphviz or gv!\n";
 #endif  // NDEBUG
 }
+
+
+/// clearGraphAttrs - Clear all previously defined node graph attributes.
+/// Intended to be used from a debugging tool (eg. gdb).
+void SelectionDAG::clearGraphAttrs() {
+#ifndef NDEBUG
+  NodeGraphAttrs.clear();
+#else
+  std::cerr << "SelectionDAG::clearGraphAttrs is only available in debug builds"
+            << " on systems with Graphviz or gv!\n";
+#endif
+}
+
+
+/// setGraphAttrs - Set graph attributes for a node. (eg. "color=red".)
+///
+void SelectionDAG::setGraphAttrs(const SDNode *N, const char *Attrs) {
+#ifndef NDEBUG
+  NodeGraphAttrs[N] = Attrs;
+#else
+  std::cerr << "SelectionDAG::setGraphAttrs is only available in debug builds"
+            << " on systems with Graphviz or gv!\n";
+#endif
+}
+
+
+/// getGraphAttrs - Get graph attributes for a node. (eg. "color=red".)
+/// Used from getNodeAttributes.
+const std::string SelectionDAG::getGraphAttrs(const SDNode *N) const {
+#ifndef NDEBUG
+  std::map<const SDNode *, std::string>::const_iterator I =
+    NodeGraphAttrs.find(N);
+    
+  if (I != NodeGraphAttrs.end())
+    return I->second;
+  else
+    return "";
+#else
+  std::cerr << "SelectionDAG::getGraphAttrs is only available in debug builds"
+            << " on systems with Graphviz or gv!\n";
+  return std::string("");
+#endif
+}
+
+/// setGraphColor - Convenience for setting node color attribute.
+///
+void SelectionDAG::setGraphColor(const SDNode *N, const char *Color) {
+#ifndef NDEBUG
+  NodeGraphAttrs[N] = std::string("color=") + Color;
+#else
+  std::cerr << "SelectionDAG::setGraphColor is only available in debug builds"
+            << " on systems with Graphviz or gv!\n";
+#endif
+}
+