00001 00015 #ifndef CallGraphInterface_H 00016 #define CallGraphInterface_H 00017 00018 //-------------------------------------------------------------------- 00019 // standard headers 00020 #ifdef NO_STD_CHEADERS 00021 # include <string.h> 00022 #else 00023 # include <cstring> 00024 #endif 00025 00026 // STL headers 00027 #include <list> 00028 #include <map> 00029 00030 // OpenAnalysis headers 00031 #include <OpenAnalysis/Utils/OA_ptr.hpp> 00032 #include <OpenAnalysis/IRInterface/IRHandles.hpp> 00033 #include <OpenAnalysis/Utils/DGraph/DGraphInterface.hpp> 00034 00035 #include <OpenAnalysis/Utils/Iterator.hpp> 00036 //-------------------------------------------------------------------- 00037 00038 namespace OA { 00039 namespace CallGraph { 00040 00041 //-------------------------------------------------------------------- 00047 class CallGraphInterface; 00048 class NodesIteratorInterface; 00049 class EdgesIteratorInterface; 00050 class NodeInterface; 00051 class EdgeInterface; 00052 00053 00054 // Changes here must be also reflected in CallGraph.C:edgeTypeToString? 00055 enum EdgeType { NORMAL_EDGE = 0 }; 00056 00057 00058 class CallGraphInterface : public virtual DGraph::DGraphInterface { 00059 00060 public: 00061 ~CallGraphInterface() { } 00062 //------------------------------------- 00063 // CallGraph information access 00064 //------------------------------------- 00065 00068 virtual OA_ptr<ProcHandleIterator> getCalleeProcIter(CallHandle) = 0; 00069 00070 //--------------------------------------------------------- 00071 // CallGraph iterators 00072 //--------------------------------------------------------- 00073 00074 virtual OA_ptr<NodesIteratorInterface> getCallGraphNodesIterator() const = 0; 00075 00076 virtual OA_ptr<EdgesIteratorInterface> getCallGraphEdgesIterator() const = 0; 00077 00078 virtual OA_ptr<NodesIteratorInterface> getCallGraphEntryNodesIterator() const = 0; 00079 00080 virtual OA_ptr<NodesIteratorInterface> getCallGraphExitNodesIterator() const = 0; 00081 00082 virtual OA_ptr<NodesIteratorInterface> 00083 getCallGraphReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient) = 0; 00084 00085 virtual OA_ptr<NodesIteratorInterface> getCallGraphDFSIterator(OA_ptr<NodeInterface> n) = 0; 00086 00087 virtual const SymHandle subprog_name () = 0; 00088 00089 virtual void dump (std::ostream& os, OA_ptr<IRHandlesIRInterface>) = 0; 00090 00091 }; 00092 00093 00094 00095 00096 //------------------------------------------------------------------ 00100 class NodesIteratorInterface : public virtual DGraph::NodesIteratorInterface { 00101 public: 00102 00103 ~NodesIteratorInterface() { } 00104 00105 virtual OA_ptr<NodeInterface> currentCallGraphNode() const = 0; 00106 00107 }; 00108 00109 00110 00111 //------------------------------------------------------------------ 00112 class EdgesIteratorInterface : public virtual DGraph::EdgesIteratorInterface { 00113 public: 00114 00115 ~EdgesIteratorInterface() { } 00116 00117 virtual OA_ptr<EdgeInterface> currentCallGraphEdge() const = 0; 00118 00119 }; 00120 00121 00122 class NodeCallsIterator; 00123 //-------------------------------------------------------- 00124 class NodeInterface : public virtual DGraph::NodeInterface { 00125 public: 00126 00127 ~NodeInterface() { } 00128 00130 //virtual unsigned int getId() const = 0; 00131 00132 virtual bool isDefined() const = 0; 00133 00134 virtual bool isCalled() const = 0; 00135 00136 virtual ProcHandle getProc() const = 0; 00137 00138 virtual SymHandle getProcSym() const = 0; 00139 00140 virtual OA_ptr<EdgesIteratorInterface> getCallGraphIncomingEdgesIterator() const = 0; 00141 00142 virtual OA_ptr<EdgesIteratorInterface> getCallGraphOutgoingEdgesIterator() const = 0; 00143 00144 virtual OA_ptr<NodesIteratorInterface> getCallGraphSourceNodesIterator() const = 0; 00145 00146 virtual OA_ptr<NodesIteratorInterface> getCallGraphSinkNodesIterator() const = 0; 00147 00148 }; 00149 00150 00151 00152 //-------------------------------------------------------- 00153 class EdgeInterface : public virtual DGraph::EdgeInterface { 00154 public: 00155 00156 ~EdgeInterface() { } 00157 00159 //virtual unsigned int getId() const = 0; 00160 00162 virtual CallHandle getCallHandle() const = 0; 00163 00164 virtual EdgeType getType() const = 0; 00165 00166 virtual OA_ptr<NodeInterface> getCallGraphSource() const = 0; 00167 00168 virtual OA_ptr<NodeInterface> getCallGraphSink() const = 0; 00169 00170 00171 }; 00172 00173 00174 //-------------------------------------------------------- 00175 00176 class NodeCallsIteratorInterface : public Iterator 00177 { 00178 public: 00179 00180 ~NodeCallsIteratorInterface() { } 00181 00182 virtual void operator ++ () = 0; 00183 00184 virtual bool isValid() = 0; 00185 00186 virtual CallHandle current() = 0; 00187 00188 }; 00189 00190 //-------------------------------------------------------------------- 00191 00192 } // end of CallGraph namespace 00193 } // end of OA namespace 00194 00195 #endif
1.6.1