Add support for graph operations, and add a viewGraph method to SelectionDAG.
authorChris Lattner <sabre@nondot.org>
Mon, 10 Jan 2005 23:05:53 +0000 (23:05 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 10 Jan 2005 23:05:53 +0000 (23:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@19440 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/SelectionDAG.h
include/llvm/CodeGen/SelectionDAGNodes.h

index e6f89e9ec5f57f10a26a29cd9819f1005d6e3ae5..fcf42daf5f66d16eb4f1a332175684926c4fd12b 100644 (file)
@@ -73,6 +73,15 @@ public:
   MachineFunction &getMachineFunction() const { return MF; }
   const TargetMachine &getTarget() { return TM; }
 
+  /// viewGraph - Pop up a ghostview window with the DAG rendered using 'dot'.
+  ///
+  void viewGraph();
+
+
+  typedef std::vector<SDNode*>::const_iterator allnodes_iterator;
+  allnodes_iterator allnodes_begin() const { return AllNodes.begin(); }
+  allnodes_iterator allnodes_end() const { return AllNodes.end(); }
+  
   /// getRoot - Return the root tag of the SelectionDAG.
   ///
   const SDOperand &getRoot() const { return Root; }
@@ -161,6 +170,16 @@ private:
   void DeleteNodeIfDead(SDNode *N, void *NodeSet);
 };
 
+template <> struct GraphTraits<SelectionDAG*> : public GraphTraits<SDNode*> {
+  typedef SelectionDAG::allnodes_iterator nodes_iterator;
+  static nodes_iterator nodes_begin(SelectionDAG *G) {
+    return G->allnodes_begin();
+  }
+  static nodes_iterator nodes_end(SelectionDAG *G) {
+    return G->allnodes_end();
+  }
+};
+
 }
 
 #endif
index 5eb3d5b148f557599996f58cafd81de68fb20362..d61ce2d2b9fafab172015ef91ade4f13e6aaea06 100644 (file)
@@ -20,6 +20,9 @@
 #define LLVM_CODEGEN_SELECTIONDAGNODES_H
 
 #include "llvm/CodeGen/ValueTypes.h"
+#include "llvm/ADT/GraphTraits.h"
+#include "llvm/ADT/GraphTraits.h"
+#include "llvm/ADT/iterator"
 #include "llvm/Support/DataTypes.h"
 #include <cassert>
 #include <vector>
@@ -638,6 +641,61 @@ public:
   }
 };
 
+
+class SDNodeIterator : public forward_iterator<SDNode, ptrdiff_t> {
+  SDNode *Node;
+  unsigned Operand;
+  
+  SDNodeIterator(SDNode *N, unsigned Op) : Node(N), Operand(Op) {}
+public:
+  bool operator==(const SDNodeIterator& x) const {
+    return Operand == x.Operand;
+  }
+  bool operator!=(const SDNodeIterator& x) const { return !operator==(x); }
+
+  const SDNodeIterator &operator=(const SDNodeIterator &I) {
+    assert(I.Node == Node && "Cannot assign iterators to two different nodes!");
+    Operand = I.Operand;
+    return *this;
+  }
+  
+  pointer operator*() const {
+    return Node->getOperand(Operand).Val;
+  }
+  pointer operator->() const { return operator*(); }
+  
+  SDNodeIterator& operator++() {                // Preincrement
+    ++Operand;
+    return *this;
+  }
+  SDNodeIterator operator++(int) { // Postincrement
+    SDNodeIterator tmp = *this; ++*this; return tmp; 
+  }
+
+  static SDNodeIterator begin(SDNode *N) { return SDNodeIterator(N, 0); }
+  static SDNodeIterator end  (SDNode *N) {
+    return SDNodeIterator(N, N->getNumOperands());
+  }
+
+  unsigned getOperand() const { return Operand; }
+  const SDNode *getNode() const { return Node; }
+};
+
+template <> struct GraphTraits<SDNode*> {
+  typedef SDNode NodeType;
+  typedef SDNodeIterator ChildIteratorType;
+  static inline NodeType *getEntryNode(SDNode *N) { return N; }
+  static inline ChildIteratorType child_begin(NodeType *N) { 
+    return SDNodeIterator::begin(N);
+  }
+  static inline ChildIteratorType child_end(NodeType *N) { 
+    return SDNodeIterator::end(N);
+  }
+};
+
+
+
+
 } // end llvm namespace
 
 #endif