NewExprTree.hpp

Go to the documentation of this file.
00001 
00015 #ifndef NewExprTree_H
00016 #define NewExprTree_H
00017 #include <set>
00018 #include <map>
00019 
00020 // OpenAnalysis headers
00021 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00022 #include <OpenAnalysis/Utils/OA_ptr.hpp>
00023 #include <OpenAnalysis/Utils/Tree.hpp>
00024 #include <OpenAnalysis/IRInterface/ConstValBasicInterface.hpp>
00025 #include <OpenAnalysis/IRInterface/OpBasicInterface.hpp>
00026 #include <OpenAnalysis/MemRefExpr/MemRefExpr.hpp>
00027 
00028 #include <OpenAnalysis/ExprTree/ExprTree.hpp>
00029 
00030 namespace OA {
00031 using namespace std;
00032 
00033 class NewExprTree;
00034 
00035 // to avoid circular reference in header files
00036 class NewExprTreeVisitor;
00037 
00038 
00039 
00040 //--------------------------------------------------------------------
00044   class NewExprTree : public ExprTree {
00045 public:
00046   class Node;
00047   class Edge;
00048 
00049 public:
00050   NewExprTree();
00051   virtual ~NewExprTree();
00052   
00053   OA_ptr<Node>  getRoot() { 
00054     OA_ptr<Tree::Node> n = Tree::getRoot();
00055     return n.convert<Node>(); 
00056   }
00057 
00058 
00060   void acceptVisitor(NewExprTreeVisitor& pVisitor);
00061 
00062   //-------------------------------------
00063   // construction
00064   //-------------------------------------
00065   void connect(OA_ptr<Node> src, OA_ptr<Node> dst) 
00066       { OA_ptr<Edge> e; e = new Edge(src,dst); addEdge(e); }
00067   void disconnect(OA_ptr<Edge> e) { removeEdge(e.convert<Tree::Edge>()); }
00068   void copyAndConnectSubTree(OA_ptr<Node> src, OA_ptr<NewExprTree> subtree);
00069   
00070 
00071   //*****************************************************************
00072   // Ordering Operations
00073   //*****************************************************************
00074   // an ordering for expression trees, needed for use within STL containers
00075   bool operator<(NewExprTree &rhs);
00076   bool operator==(NewExprTree &rhs);
00077 private:
00078   bool compareTreesRootedAt(OA_ptr<Node> rootLHS, OA_ptr<Node> rootRHS);
00079 public:
00080 
00081   //--------------------------------------------------------
00082   class Node : public Tree::Node {
00083   public:
00084     Node()
00085       : Tree::Node() { }
00086     Node(const std::string& x)
00087       : Tree::Node(), mName(x) { }
00088     virtual ~Node() { }
00089     
00090     // A name for this node (useful for debugging)
00091     std::string& getName() { return mName; }
00092 
00094     virtual OA_ptr<Node> copy() = 0;
00095 
00097     virtual bool isaOpNode() { return false; }
00098     virtual bool isaCallNode() { return false; }
00099     virtual bool isaMemRefNode() { return false; }
00100     virtual bool isaConstSymNode() { return false; }
00101     virtual bool isaConstValNode() { return false; }
00102 
00104     // NOTE: could give this a default implementation if wanted to
00105     // have ExprTree visitors have default implementation for nodes
00106     // they don't know about
00107     virtual void acceptVisitor(NewExprTreeVisitor&) = 0;
00108     virtual void dump(std::ostream& os) { Tree::Node::dump(os); }
00109     virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00110 
00111     //*****************************************************************
00112     // Annotation Interface
00113     //*****************************************************************
00114     virtual void output(IRHandlesIRInterface& ir) { Tree::Node::output(ir); }
00115    
00116     //*****************************************************************
00117     // Ordering Operations
00118     //*****************************************************************
00119     virtual bool operator<(Node& rhs) = 0;
00120     virtual int getOrder() = 0;
00121 
00122   private:
00123     std::string mName;
00124     //std::string mAttr;
00125   }; // end of Node
00126 
00127   class OpNode : public Node {
00128   public:
00129     OpNode() : Node("OpNode") { }
00130     OpNode(OA_ptr<OpBasicInterface> op) : Node("OpNode"), mOpInterface(op) {}
00131     virtual ~OpNode() { }
00132 
00134     OA_ptr<Node> copy() 
00135       { OA_ptr<Node> ret; ret = new OpNode(mOpInterface); return ret; }
00136 
00137     bool isaOpNode() { return true; }
00138     OA_ptr<OpBasicInterface> getOpInterface() { return mOpInterface; }
00139     void dump(std::ostream& os) { Node::dump(os); }
00140     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00141 
00142     void acceptVisitor(NewExprTreeVisitor& pVisitor);
00143 
00144     //*****************************************************************
00145     // Annotation Interface
00146     //*****************************************************************
00147     void output(IRHandlesIRInterface& ir);
00148 
00149     //*****************************************************************
00150     // Ordering Operations
00151     //*****************************************************************
00152     bool operator<(Node& rhs);
00153     bool operator<(OpNode& rhs);
00154     virtual int getOrder() { return sOrder; }
00155 
00156   private:
00157     static const int sOrder = 100;
00158     OA_ptr<OpBasicInterface> mOpInterface;
00159   };
00160 
00161   class CallNode : public Node {
00162   public:
00163     CallNode() : Node("CallNode") { }
00164     CallNode(CallHandle h) : Node("CallNode"), mHandle(h) {}
00165     virtual ~CallNode() { }
00166 
00168     OA_ptr<Node> copy() 
00169       { OA_ptr<Node> ret; ret = new CallNode(mHandle); return ret; }
00170 
00171     bool isaCallNode() { return true; }
00172     CallHandle getHandle() { return mHandle; }
00173     void dump(std::ostream& os) { Node::dump(os); }
00174     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00175 
00176     void acceptVisitor(NewExprTreeVisitor& pVisitor);
00177 
00178     //*****************************************************************
00179     // Annotation Interface
00180     //*****************************************************************
00181     void output(IRHandlesIRInterface& ir) ;
00182 
00183     //*****************************************************************
00184     // Ordering Operations
00185     //*****************************************************************
00186     bool operator<(Node& rhs);
00187     bool operator<(CallNode& rhs);
00188     virtual int getOrder() { return sOrder; }
00189 
00190   private:
00191     //Changed from ExprHandle to CallHandle by LMR. 6.8.06
00192      static const int sOrder = 500;
00193      CallHandle mHandle;
00194   };
00195 
00196   class MemRefNode : public Node {
00197   public:
00198     MemRefNode() : Node("MemRefNode") { }
00199     MemRefNode(OA_ptr<MemRefExpr> mre) : Node("MemRefNode"), mMRE(mre) {}
00200     virtual ~MemRefNode() { }
00201 
00203     OA_ptr<Node> copy() 
00204       { OA_ptr<Node> ret; ret = new MemRefNode(mMRE); return ret; }
00205 
00206     bool isaMemRefNode() { return true; }
00207     OA_ptr<MemRefExpr> getMRE() { return mMRE; }
00208     void dump(std::ostream& os) { Node::dump(os); }
00209     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00210 
00211     void acceptVisitor(NewExprTreeVisitor& pVisitor);
00212 
00213     //*****************************************************************
00214     // Annotation Interface
00215     //*****************************************************************
00216     void output(IRHandlesIRInterface& ir) ;
00217 
00218     //*****************************************************************
00219     // Ordering Operations
00220     //*****************************************************************
00221     bool operator<(Node& rhs);
00222     bool operator<(MemRefNode& rhs);
00223     virtual int getOrder() { return sOrder; }
00224 
00225   private:
00226     static const int sOrder = 200;
00227     OA_ptr<MemRefExpr> mMRE;
00228   };
00229 
00230   class ConstSymNode : public Node {
00231   public:
00232     ConstSymNode() : Node("ConstSymNode") { }
00233     ConstSymNode(ConstSymHandle h) : Node("ConstSymNode"), mHandle(h) {}
00234     virtual ~ConstSymNode() { }
00235 
00237     OA_ptr<Node> copy() 
00238       { OA_ptr<Node> ret; ret = new ConstSymNode(mHandle); return ret; }
00239 
00240     bool isaConstSymNode() { return true; }
00241     ConstSymHandle getHandle() { return mHandle; }
00242     void dump(std::ostream& os) { Node::dump(os); }
00243     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00244 
00245     void acceptVisitor(NewExprTreeVisitor& pVisitor);
00246 
00247     //*****************************************************************
00248     // Annotation Interface
00249     //*****************************************************************
00250     void output(IRHandlesIRInterface& ir) ;
00251 
00252     //*****************************************************************
00253     // Ordering Operations
00254     //*****************************************************************
00255     bool operator<(Node& rhs);
00256     bool operator<(ConstSymNode& rhs);
00257     virtual int getOrder() { return sOrder; }
00258 
00259   private:
00260     static const int sOrder = 300;
00261     ConstSymHandle mHandle;
00262   };
00263 
00264   class ConstValNode : public Node {
00265   public:
00266     ConstValNode() : Node("ConstValNode") { }
00267     ConstValNode(OA_ptr<ConstValBasicInterface> constInter) :
00268         Node("ConstValNode"),
00269         mConstValInter(constInter)
00270     { }
00271     virtual ~ConstValNode() { }
00272 
00274     OA_ptr<Node> copy() 
00275       { OA_ptr<Node> ret; ret = new ConstValNode(mConstValInter); return ret; }
00276 
00277     bool isaConstValNode() { return true; }
00278     OA_ptr<ConstValBasicInterface> getConstValInterface() {
00279         return mConstValInter;
00280     }
00281     void dump(std::ostream& os) { Node::dump(os); }
00282     void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00283 
00284     void acceptVisitor(NewExprTreeVisitor& pVisitor);
00285 
00286     //*****************************************************************
00287     // Annotation Interface
00288     //*****************************************************************
00289     void output(IRHandlesIRInterface& ir) ;
00290 
00291     //*****************************************************************
00292     // Ordering Operations
00293     //*****************************************************************
00294     bool operator<(Node& rhs);
00295     bool operator<(ConstValNode& rhs);
00296     virtual int getOrder() { return sOrder; }
00297 
00298   private:
00299     static const int sOrder = 400;
00300     OA_ptr<ConstValBasicInterface> mConstValInter;
00301   };
00302   
00303   //--------------------------------------------------------
00304   class Edge : public Tree::Edge {
00305   public:
00306     Edge(OA_ptr<Node> n1, OA_ptr<Node> n2)
00307       : Tree::Edge(n1, n2) { }
00308     virtual ~Edge() { }
00309     
00310     // included here to return subclass node type
00311     OA_ptr<Node>  parent () const { 
00312       OA_ptr<Tree::Node> n = Tree::Edge::parent();
00313       return n.convert<Node>();
00314     }
00315     OA_ptr<Node>  source () const { return parent(); }
00316     OA_ptr<Node>  tail () const { return parent(); }
00317     OA_ptr<Node>  child () const { 
00318       OA_ptr<Tree::Node> n = Tree::Edge::child();
00319       return n.convert<Node>(); 
00320     }
00321     OA_ptr<Node>  sink () const { return child(); }
00322     OA_ptr<Node>  head () const { return child(); }
00323 
00324     void dump(std::ostream& os);
00325     void dump() { dump(std::cout); }
00326 
00327   private:
00328   };  
00329   //--------------------------------------------------------
00330   
00331   //------------------------------------------------------------------
00338   class NodesIterator : public Tree::NodesIterator {
00339   public:
00340     NodesIterator (Tree& t) : Tree::NodesIterator(t) {}
00341     virtual ~NodesIterator () {}
00342     OA_ptr<Node>  current() const { 
00343       OA_ptr<Tree::Node> n = Tree::NodesIterator::current();
00344       return n.convert<Node>(); 
00345     }
00346   };
00347   
00348   //------------------------------------------------------------------
00355   class EdgesIterator : public Tree::EdgesIterator {
00356   public:
00357     EdgesIterator (Tree& t) : Tree::EdgesIterator(t) {}
00358     virtual ~EdgesIterator () {}
00359     OA_ptr<Edge>  current() const { 
00360       OA_ptr<Tree::Edge> e = Tree::EdgesIterator::current();
00361       return e.convert<Edge>(); 
00362     }
00363   };
00364 
00365   //------------------------------------------------------------------
00369   class OutEdgesIterator : public Tree::OutEdgesIterator {
00370   public:
00371     OutEdgesIterator (Node&  n) : Tree::OutEdgesIterator(n) {}
00372     virtual ~OutEdgesIterator () {}
00373     OA_ptr<Edge>  current() const { 
00374       OA_ptr<Tree::Edge> e = Tree::OutEdgesIterator::current();
00375       return e.convert<Edge>(); 
00376     }
00377   };
00378   
00379   //------------------------------------------------------------------
00384   class ChildNodesIterator : public Tree::ChildNodesIterator {
00385   public:
00386     ChildNodesIterator (Node&  n) : Tree::ChildNodesIterator(n) {}
00387     ~ChildNodesIterator () {}
00388     OA_ptr<Node>  current() const { 
00389       OA_ptr<Tree::Node> n = Tree::ChildNodesIterator::current();
00390       return n.convert<Node>();
00391     }
00392   };
00393  
00394   void str(std::ostream& os);
00395   
00396   void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir);
00397   //void dump() { dump(std::cout); }
00398 
00399   //*****************************************************************
00400   // Annotation Interface
00401   //*****************************************************************
00402   void output(IRHandlesIRInterface& ir) ;
00403 
00404   //------------------------------------------------------------------
00408   class PreOrderIterator : public Tree::PreOrderIterator {
00409   public:
00410     PreOrderIterator (Tree& t) : Tree::PreOrderIterator(t) {}
00411     virtual ~PreOrderIterator () {}
00412     OA_ptr<Node>  current() const { 
00413       OA_ptr<Tree::Node> n = PreOrderIterator::current();
00414       return n.convert<Node>();
00415     }
00416   };
00417   //------------------------------------------------------------------
00421   class PostOrderIterator : public Tree::PostOrderIterator {
00422   public:
00423     PostOrderIterator (Tree& t) : Tree::PostOrderIterator(t) {}
00424     virtual ~PostOrderIterator () {}
00425     OA_ptr<Node>  current() const { 
00426       OA_ptr<Tree::Node> n = PostOrderIterator::current();
00427       return n.convert<Node>();
00428     }
00429   };
00430   //------------------------------------------------------------------
00434   class ReversePostOrderIterator : public Tree::ReversePostOrderIterator {
00435   public:
00436     ReversePostOrderIterator (Tree& t) : Tree::ReversePostOrderIterator(t) {}
00437     virtual ~ReversePostOrderIterator () {}
00438     OA_ptr<Node>  current() const { 
00439       OA_ptr<Tree::Node> n = Tree::ReversePostOrderIterator::current();
00440       return n.convert<Node>(); 
00441     }
00442   };
00443  //--------------------------------------------------------------------
00444 };
00445 
00446 
00447 } // end of OA namespace
00448 
00449 #endif