00001 00016 #ifndef CFGINTERFACE_H 00017 #define CFGINTERFACE_H 00018 00019 #include <OpenAnalysis/IRInterface/IRHandles.hpp> 00020 #include <OpenAnalysis/Utils/DGraph/DGraphInterface.hpp> 00021 #include <OpenAnalysis/Utils/DGraph/DGraphImplement.hpp> 00022 00023 namespace OA { 00024 namespace CFG { 00025 00026 00027 //====================================================================== 00033 //===================================================================== 00034 enum EdgeType { TRUE_EDGE = 0, FALLTHROUGH_EDGE, FALSE_EDGE, 00035 BACK_EDGE, MULTIWAY_EDGE, BREAK_EDGE, 00036 CONTINUE_EDGE, RETURN_EDGE }; 00037 00038 //------------------------------------------------------------------ 00039 typedef StmtHandleIterator NodeStatementsIteratorInterface; 00040 typedef StmtHandleIterator NodeStatementsRevIteratorInterface; 00041 class NodeInterface; 00042 class EdgeInterface; 00043 class NodesIteratorInterface; 00044 class EdgesIteratorInterface; 00045 class CFGInterface; 00046 00047 //------------------------------------------------------------------ 00050 //------------------------------------------------------------------ 00051 class NodeInterface : public virtual DGraph::NodeInterface 00052 { 00053 public: 00054 NodeInterface () { }; 00055 00057 NodeInterface (OA::StmtHandle n) { }; 00058 00059 //virtual ~Node () = 0; 00060 virtual ~NodeInterface () { }; 00061 00063 //virtual unsigned int getId() const = 0; 00064 00066 virtual unsigned int size () const = 0; 00067 00069 virtual OA_ptr<NodeStatementsIteratorInterface> getNodeStatementsIterator() const = 0; 00070 00072 virtual OA_ptr<NodeStatementsRevIteratorInterface> 00073 getNodeStatementsRevIterator() const = 0; 00074 00075 virtual OA_ptr<EdgesIteratorInterface> 00076 getCFGIncomingEdgesIterator() const = 0; 00077 00078 virtual OA_ptr<EdgesIteratorInterface> 00079 getCFGOutgoingEdgesIterator() const = 0; 00080 00081 virtual OA_ptr<NodesIteratorInterface> 00082 getCFGSourceNodesIterator() const = 0; 00083 00084 virtual OA_ptr<NodesIteratorInterface> 00085 getCFGPredNodesIterator() const = 0; 00086 00087 virtual OA_ptr<NodesIteratorInterface> 00088 getCFGSinkNodesIterator() const = 0; 00089 00090 virtual OA_ptr<NodesIteratorInterface> 00091 getCFGSuccNodesIterator() const = 0; 00092 00093 00094 }; 00095 00096 //------------------------------------------------------------------ 00099 //------------------------------------------------------------------ 00100 class EdgeInterface : public virtual DGraph::EdgeInterface 00101 { 00102 public: 00103 EdgeInterface () { }; 00104 00105 virtual ~EdgeInterface () { }; 00106 00107 virtual OA_ptr<NodeInterface> 00108 getCFGSource() const = 0; 00109 00110 virtual OA_ptr<NodeInterface> 00111 getCFGSink() const = 0; 00112 00113 public: 00114 // get an id unique within instances of Interface::Edge 00115 //virtual unsigned int getId() const = 0; 00116 00118 virtual EdgeType getType() const = 0; 00119 00121 virtual ExprHandle getExpr() const = 0; 00122 00123 }; 00124 00125 00126 class CFGInterface : public virtual DGraph::DGraphInterface 00127 { 00128 public: 00129 CFGInterface() {} 00130 virtual ~CFGInterface () {} 00131 00132 //------------------------------------- 00133 // CFG information access 00134 //------------------------------------- 00135 00137 virtual OA_ptr<NodeInterface> getEntry() const = 0; 00138 00140 virtual OA_ptr<NodeInterface> getExit() const = 0; 00141 00143 virtual SymHandle getName () const = 0; 00144 00145 virtual OA_ptr<NodesIteratorInterface> 00146 getCFGNodesIterator() const = 0; 00147 00148 // method to get a more specific iterator 00149 virtual OA_ptr<EdgesIteratorInterface> 00150 getCFGEdgesIterator() const = 0; 00151 00152 00153 virtual OA_ptr<NodesIteratorInterface> 00154 getCFGEntryNodesIterator() const = 0; 00155 00156 virtual OA_ptr<NodesIteratorInterface> 00157 getCFGExitNodesIterator() const = 0; 00158 00159 00160 virtual OA_ptr<NodesIteratorInterface> 00161 getCFGReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient) = 0; 00162 00163 virtual OA_ptr<NodesIteratorInterface> 00164 getCFGDFSIterator(OA_ptr<NodeInterface> n) = 0; 00165 00166 }; 00167 00168 00169 //------------------------------------------------------------------ 00173 class NodesIteratorInterface : 00174 public virtual DGraph::NodesIteratorInterface { 00175 public: 00176 00177 virtual OA_ptr<NodeInterface> 00178 currentCFGNode() const = 0; 00179 00180 }; 00181 00182 //------------------------------------------------------------------ 00183 class EdgesIteratorInterface : 00184 public virtual DGraph::EdgesIteratorInterface { 00185 public: 00186 00187 virtual OA_ptr<EdgeInterface> 00188 currentCFGEdge() const = 0; 00189 00190 }; 00191 00192 } // end of CFG namespace 00193 } // end of OA namespace 00194 00195 #endif 00196
1.6.1