CallGraphInterface.hpp

Go to the documentation of this file.
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

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