CSFSActivity/DUGInterface.hpp

Go to the documentation of this file.
00001 
00017 //--------------------------------------------------------------------
00018 //--------------------------------------------------------------------
00019 
00020 #ifndef DUGInterface_H
00021 #define DUGInterface_H
00022 
00023 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00024 #include <OpenAnalysis/Utils/DGraph/DGraphInterface.hpp>
00025 
00026 //--------------------------------------------------------------------
00027 
00028 namespace OA {
00029   namespace DUG {
00030       
00031 // Changes here must be also reflected in edgeTypeToString 
00032 // and nodeTypeToString.
00033 enum EdgeType { CFLOW_EDGE, CALL_EDGE, RETURN_EDGE, PARAM_EDGE };
00034 //enum NodeType { CFLOW_NODE, CALL_NODE, RETURN_NODE, ENTRY_NODE, EXIT_NODE };
00035 enum NodeType { FORMALPARAM_NODE, NONEFORMAL_NODE };
00036  
00037 //--------------------------------------------------------------------
00043   class NodeInterface;
00044   class EdgeInterface;
00045   class NodesIteratorInterface;
00046   class EdgesIteratorInterface;
00047   class DUGInterface;
00048  
00049   typedef std::pair<IRHandle,SymHandle> IRSymHandle;
00050 
00051   //--------------------------------------------------------
00052   class NodeInterface : public virtual DGraph::NodeInterface {
00053   public:
00054     NodeInterface () {}
00055     ~NodeInterface () { }
00056     
00057     //========================================================
00058     // Info specific to DUG
00059     //========================================================
00060     
00061     virtual NodeType getType() const = 0;
00062 
00063     virtual ProcHandle getProc() const = 0;
00064 
00065     virtual OA_ptr<Location> getLoc() const = 0;
00066    
00067     virtual SymHandle getSym() const = 0;
00068     virtual IRHandle getDef() const = 0;
00069   
00071     virtual unsigned int size () const = 0;
00072 
00073     /*
00075     virtual OA_ptr<CFG::NodeStatementsIteratorInterface> 
00076         getNodeStatementsIterator() const = 0;
00077 
00079     virtual OA_ptr<CFG::NodeStatementsRevIteratorInterface> 
00080         getNodeStatementsRevIterator() const = 0;
00081         */
00082 
00083     virtual OA_ptr<EdgesIteratorInterface> getDUGIncomingEdgesIterator() const = 0;
00084 
00085     virtual OA_ptr<EdgesIteratorInterface> getDUGOutgoingEdgesIterator() const = 0;
00086 
00087     virtual OA_ptr<NodesIteratorInterface> getDUGSourceNodesIterator() const = 0;
00088 
00089     virtual OA_ptr<NodesIteratorInterface> getDUGSinkNodesIterator() const = 0;
00090 
00091     virtual void markVaried(std::list<CallHandle>&,
00092                     OA_ptr<Activity::ActivityIRInterface>,
00093                     std::set<OA_ptr<EdgeInterface> >&,
00094                     std::set<std::pair<unsigned,unsigned> >&,
00095                     ProcHandle, SymHandle,
00096                     OA_ptr<EdgeInterface>) = 0;
00097 
00098     virtual void markUseful(std::list<CallHandle>&,
00099                     OA_ptr<Activity::ActivityIRInterface>,
00100                     std::set<OA_ptr<EdgeInterface> >&,
00101                     std::set<std::pair<unsigned,unsigned> >&,
00102                     ProcHandle, SymHandle,
00103                     OA_ptr<EdgeInterface>) = 0;
00104 
00105     virtual bool isPathFrom(OA_ptr<NodeInterface>,
00106                     std::set<OA_ptr<NodeInterface> >&) = 0;
00107 
00108     virtual void dump(std::ostream& os) = 0;  // for full override
00109     virtual void dumpbase(std::ostream& os) = 0;
00110     virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) = 0;
00111     virtual void dumpdot(std::ostream& os, OA_ptr<DUGIRInterface> ir) = 0;
00112     virtual void longdump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) = 0;
00113     virtual void output(OA::IRHandlesIRInterface& ir) = 0;
00114 
00115     virtual void findOutgoingNodes(ProcHandle, std::set<IRSymHandle>&, 
00116                    std::set<IRSymHandle>&) = 0;
00117     virtual void findIncomingNodes(ProcHandle, std::set<IRSymHandle>&, 
00118                    std::set<IRSymHandle>&) = 0;
00119     virtual bool hasEdgesToOtherProc(ProcHandle, std::set<IRSymHandle>&) = 0;
00120     virtual bool hasEdgesFromOtherProc(ProcHandle, std::set<IRSymHandle>&) = 0;
00121 
00122 
00123   };
00124   
00125   //--------------------------------------------------------
00126   class EdgeInterface : public virtual DGraph::EdgeInterface {
00127   public:
00128     EdgeInterface () {}
00129     ~EdgeInterface () {}
00130     
00131     //========================================================
00132     // Info specific to DUG
00133     //========================================================
00134     
00135     virtual EdgeType getType() const = 0;
00136 
00137     virtual ProcHandle getSourceProc() const = 0;
00138     virtual ProcHandle getSinkProc() const = 0;
00139     virtual CallHandle getCall() const = 0;
00140     virtual ProcHandle getProc() const = 0;
00141 
00142     virtual OA_ptr<NodeInterface> getDUGSource() const = 0;
00143 
00144     virtual OA_ptr<NodeInterface> getDUGSink() const = 0;
00145     virtual void dumpdot(std::ostream& os, OA_ptr<DUGIRInterface> ir) = 0;
00146 
00147 
00148   }; 
00149   
00150  
00151   //------------------------------------------------------------------
00155   class NodesIteratorInterface :  public virtual DGraph::NodesIteratorInterface
00156   {
00157   public:
00158     NodesIteratorInterface () {}
00159     ~NodesIteratorInterface () {}
00160     virtual OA_ptr<NodeInterface> currentDUGNode() const = 0;
00161   };
00162   
00163   //------------------------------------------------------------------
00167   class EdgesIteratorInterface :  public virtual DGraph::EdgesIteratorInterface
00168   {
00169   public:
00170     EdgesIteratorInterface () {}
00171     ~EdgesIteratorInterface () {}
00172     virtual OA_ptr<EdgeInterface> currentDUGEdge() const = 0;
00173   };
00174   
00175 
00176 class DUGInterface : public virtual DGraph::DGraphInterface {
00177 
00178 //------------------------------------------------------------------
00179 public:
00180   DUGInterface () { } 
00181   virtual ~DUGInterface () { }
00182   
00183   virtual OA_ptr<NodesIteratorInterface>
00184       getDUGNodesIterator() const = 0;
00185 
00186   virtual OA_ptr<EdgesIteratorInterface>
00187       getDUGEdgesIterator() const = 0;
00188 
00189   virtual OA_ptr<NodesIteratorInterface>
00190       getDUGEntryNodesIterator() const = 0;
00191 
00192 
00193   virtual OA_ptr<NodesIteratorInterface>
00194       getDUGExitNodesIterator() const = 0;
00195 
00196   virtual OA_ptr<NodesIteratorInterface>
00197     getDUGReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient) = 0;
00198 
00199   virtual OA_ptr<NodesIteratorInterface>
00200       getDUGDFSIterator(OA_ptr<NodeInterface> n) = 0;
00201 
00202   
00203 };
00204 //--------------------------------------------------------------------
00205 
00206   } // end of DUG namespace
00207 } // end of OA namespace
00208 
00209 #endif

Generated on Sat Oct 31 05:21:21 2009 for OpenAnalysis by  doxygen 1.6.1