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
00032
00033 enum EdgeType { CFLOW_EDGE, CALL_EDGE, RETURN_EDGE, PARAM_EDGE };
00034
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
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
00076
00077
00079
00080
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;
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
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 }
00207 }
00208
00209 #endif