- Generic graph printing infrastructure changes:
     * Only print outgoing edges from a cell if the destination isn't null.
       This is important for DSGraphs, which have sources with no edges.
     * Allow Node attributes to override shape of the node


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4192 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/Support/GraphWriter.h b/include/Support/GraphWriter.h
index fadff10..cae7345 100644
--- a/include/Support/GraphWriter.h
+++ b/include/Support/GraphWriter.h
@@ -69,9 +69,9 @@
 
     std::string NodeAttributes = DOTTraits::getNodeAttributes(Node);
 
-    O << "\tNode" << (void*)Node << " [";
+    O << "\tNode" << (void*)Node << " [shape=record,";
     if (!NodeAttributes.empty()) O << NodeAttributes << ",";
-    O << "shape=record,label=\"{"
+    O << "label=\"{"
       << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G));
     
     // Print out the fields of the current node...
@@ -94,23 +94,24 @@
     // Output all of the edges now
     EI = GTraits::child_begin(Node);
     for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) {
-      NodeType *TargetNode = *EI;
-      O << "\tNode" << (void*)Node << ":g" << i << " -> Node"
-        << (void*)TargetNode;
-      if (DOTTraits::edgeTargetsEdgeSource(Node, EI)) {
-        typename GTraits::ChildIteratorType TargetIt =
-          DOTTraits::getEdgeTarget(Node, EI);
-        // Figure out which edge this targets...
-        unsigned Offset = std::distance(GTraits::child_begin(TargetNode),
-                                        TargetIt);
-        if (Offset > 64) Offset = 64;  // Targetting the trancated part?
-        O << ":g" << Offset;        
+      if (NodeType *TargetNode = *EI) {
+        O << "\tNode" << (void*)Node << ":g" << i << " -> Node"
+          << (void*)TargetNode;
+        if (DOTTraits::edgeTargetsEdgeSource(Node, EI)) {
+          typename GTraits::ChildIteratorType TargetIt =
+            DOTTraits::getEdgeTarget(Node, EI);
+          // Figure out which edge this targets...
+          unsigned Offset = std::distance(GTraits::child_begin(TargetNode),
+                                          TargetIt);
+          if (Offset > 64) Offset = 64;  // Targetting the trancated part?
+          O << ":g" << Offset;        
+        }
+        
+        std::string EdgeAttributes = DOTTraits::getEdgeAttributes(Node, EI);
+        if (!EdgeAttributes.empty())
+          O << "[" << EdgeAttributes << "]";
+        O << ";\n";
       }
-
-      std::string EdgeAttributes = DOTTraits::getEdgeAttributes(Node, EI);
-      if (!EdgeAttributes.empty())
-        O << "[" << EdgeAttributes << "]";
-      O << ";\n";
     }
   }
 
diff --git a/include/llvm/Support/GraphWriter.h b/include/llvm/Support/GraphWriter.h
index fadff10..cae7345 100644
--- a/include/llvm/Support/GraphWriter.h
+++ b/include/llvm/Support/GraphWriter.h
@@ -69,9 +69,9 @@
 
     std::string NodeAttributes = DOTTraits::getNodeAttributes(Node);
 
-    O << "\tNode" << (void*)Node << " [";
+    O << "\tNode" << (void*)Node << " [shape=record,";
     if (!NodeAttributes.empty()) O << NodeAttributes << ",";
-    O << "shape=record,label=\"{"
+    O << "label=\"{"
       << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G));
     
     // Print out the fields of the current node...
@@ -94,23 +94,24 @@
     // Output all of the edges now
     EI = GTraits::child_begin(Node);
     for (unsigned i = 0; EI != EE && i != 64; ++EI, ++i) {
-      NodeType *TargetNode = *EI;
-      O << "\tNode" << (void*)Node << ":g" << i << " -> Node"
-        << (void*)TargetNode;
-      if (DOTTraits::edgeTargetsEdgeSource(Node, EI)) {
-        typename GTraits::ChildIteratorType TargetIt =
-          DOTTraits::getEdgeTarget(Node, EI);
-        // Figure out which edge this targets...
-        unsigned Offset = std::distance(GTraits::child_begin(TargetNode),
-                                        TargetIt);
-        if (Offset > 64) Offset = 64;  // Targetting the trancated part?
-        O << ":g" << Offset;        
+      if (NodeType *TargetNode = *EI) {
+        O << "\tNode" << (void*)Node << ":g" << i << " -> Node"
+          << (void*)TargetNode;
+        if (DOTTraits::edgeTargetsEdgeSource(Node, EI)) {
+          typename GTraits::ChildIteratorType TargetIt =
+            DOTTraits::getEdgeTarget(Node, EI);
+          // Figure out which edge this targets...
+          unsigned Offset = std::distance(GTraits::child_begin(TargetNode),
+                                          TargetIt);
+          if (Offset > 64) Offset = 64;  // Targetting the trancated part?
+          O << ":g" << Offset;        
+        }
+        
+        std::string EdgeAttributes = DOTTraits::getEdgeAttributes(Node, EI);
+        if (!EdgeAttributes.empty())
+          O << "[" << EdgeAttributes << "]";
+        O << ";\n";
       }
-
-      std::string EdgeAttributes = DOTTraits::getEdgeAttributes(Node, EI);
-      if (!EdgeAttributes.empty())
-        O << "[" << EdgeAttributes << "]";
-      O << ";\n";
     }
   }