If an edge points to a field of another memory object, actually reflect this
in the DOT visualization of the DSGraphs.

llvm-svn: 14316
diff --git a/llvm/lib/Analysis/DataStructure/Printer.cpp b/llvm/lib/Analysis/DataStructure/Printer.cpp
index f6e073a..9863875 100644
--- a/llvm/lib/Analysis/DataStructure/Printer.cpp
+++ b/llvm/lib/Analysis/DataStructure/Printer.cpp
@@ -100,6 +100,24 @@
   static std::string getNodeAttributes(const DSNode *N) {
     return "shape=Mrecord";
   }
+
+  static bool edgeTargetsEdgeSource(const void *Node,
+                                    DSNode::const_iterator I) {
+    unsigned O = I.getNode()->getLink(I.getOffset()).getOffset();
+    return (O >> DS::PointerShift) != 0;
+  }
+
+  static DSNode::const_iterator getEdgeTarget(const DSNode *Node,
+                                              DSNode::const_iterator I) {
+    unsigned O = I.getNode()->getLink(I.getOffset()).getOffset();
+    unsigned LinkNo = O >> DS::PointerShift;
+    const DSNode *N = *I;
+    DSNode::const_iterator R = N->begin();
+    for (; LinkNo; --LinkNo)
+      ++R;
+    return R;
+  }
+
   
   /// addCustomGraphFeatures - Use this graph writing hook to emit call nodes
   /// and the return node.