CSFIActivity/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
00050 class NodeInterface : public virtual DGraph::NodeInterface {
00051 public:
00052 NodeInterface () {}
00053 ~NodeInterface () { }
00054
00055
00056
00057
00058
00059 virtual NodeType getType() const = 0;
00060
00061 virtual ProcHandle getProc() const = 0;
00062
00063 virtual OA_ptr<Location> getLoc() const = 0;
00064
00065 OA::SymHandle getSym();
00066
00068 virtual unsigned int size () const = 0;
00069
00070
00072
00073
00074
00076
00077
00078
00079
00080 virtual OA_ptr<EdgesIteratorInterface> getDUGIncomingEdgesIterator() const = 0;
00081
00082 virtual OA_ptr<EdgesIteratorInterface> getDUGOutgoingEdgesIterator() const = 0;
00083
00084 virtual OA_ptr<NodesIteratorInterface> getDUGSourceNodesIterator() const = 0;
00085
00086 virtual OA_ptr<NodesIteratorInterface> getDUGSinkNodesIterator() const = 0;
00087
00088 virtual void markVaried(std::list<CallHandle>&,
00089 OA_ptr<Activity::ActivityIRInterface>,
00090 std::set<OA_ptr<EdgeInterface> >&,
00091 std::set<std::pair<unsigned,unsigned> >&,
00092 ProcHandle, unsigned,
00093 OA_ptr<EdgeInterface>,
00094 bool) = 0;
00095
00096 virtual void markUseful(std::list<CallHandle>&,
00097 OA_ptr<Activity::ActivityIRInterface>,
00098 std::set<OA_ptr<EdgeInterface> >&,
00099 std::set<std::pair<unsigned,unsigned> >&,
00100 ProcHandle, unsigned,
00101 OA_ptr<EdgeInterface>) = 0;
00102
00103 virtual bool isPathFrom(OA_ptr<NodeInterface>,
00104 std::set<OA_ptr<NodeInterface> >&) = 0;
00105
00106 virtual void dump(std::ostream& os) = 0;
00107 virtual void dumpbase(std::ostream& os) = 0;
00108 virtual void dump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) = 0;
00109 virtual void dumpdot(std::ostream& os, OA_ptr<DUGIRInterface> ir) = 0;
00110 virtual void longdump(std::ostream& os, OA_ptr<IRHandlesIRInterface> ir) = 0;
00111 virtual void output(OA::IRHandlesIRInterface& ir) = 0;
00112
00113 virtual void findOutgoingNodes(ProcHandle, std::set<SymHandle>&,
00114 std::set<SymHandle>&) = 0;
00115
00116
00117 virtual bool hasEdgesToOtherProc(ProcHandle, std::set<SymHandle>&) = 0;
00118 virtual bool hasEdgesFromOtherProc(ProcHandle, std::set<SymHandle>&) = 0;
00119
00120
00121 };
00122
00123
00124 class EdgeInterface : public virtual DGraph::EdgeInterface {
00125 public:
00126 EdgeInterface () {}
00127 ~EdgeInterface () {}
00128
00129
00130
00131
00132
00133 virtual EdgeType getType() const = 0;
00134
00135 virtual ProcHandle getSourceProc() const = 0;
00136 virtual ProcHandle getSinkProc() const = 0;
00137 virtual CallHandle getCall() const = 0;
00138 virtual ProcHandle getProc() const = 0;
00139
00140 virtual OA_ptr<NodeInterface> getDUGSource() const = 0;
00141
00142 virtual OA_ptr<NodeInterface> getDUGSink() const = 0;
00143 virtual void dumpdot(std::ostream& os, OA_ptr<DUGIRInterface> ir) = 0;
00144
00145
00146 };
00147
00148
00149
00153 class NodesIteratorInterface : public virtual DGraph::NodesIteratorInterface
00154 {
00155 public:
00156 NodesIteratorInterface () {}
00157 ~NodesIteratorInterface () {}
00158 virtual OA_ptr<NodeInterface> currentDUGNode() const = 0;
00159 };
00160
00161
00165 class EdgesIteratorInterface : public virtual DGraph::EdgesIteratorInterface
00166 {
00167 public:
00168 EdgesIteratorInterface () {}
00169 ~EdgesIteratorInterface () {}
00170 virtual OA_ptr<EdgeInterface> currentDUGEdge() const = 0;
00171 };
00172
00173
00174 class DUGInterface : public virtual DGraph::DGraphInterface {
00175
00176
00177 public:
00178 DUGInterface () { }
00179 virtual ~DUGInterface () { }
00180
00181 virtual OA_ptr<NodesIteratorInterface>
00182 getDUGNodesIterator() const = 0;
00183
00184 virtual OA_ptr<EdgesIteratorInterface>
00185 getDUGEdgesIterator() const = 0;
00186
00187 virtual OA_ptr<NodesIteratorInterface>
00188 getDUGEntryNodesIterator() const = 0;
00189
00190
00191 virtual OA_ptr<NodesIteratorInterface>
00192 getDUGExitNodesIterator() const = 0;
00193
00194 virtual OA_ptr<NodesIteratorInterface>
00195 getDUGReversePostDFSIterator(DGraph::DGraphEdgeDirection pOrient) = 0;
00196
00197 virtual OA_ptr<NodesIteratorInterface>
00198 getDUGDFSIterator(OA_ptr<NodeInterface> n) = 0;
00199
00200
00201 };
00202
00203
00204 }
00205 }
00206
00207 #endif