ROSE  0.9.6a
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cong_staticCFG.h
Go to the documentation of this file.
1 /*
2  * File: staticCFG.h
3  * Author: Cong Hou [hou_cong@gatech.edu]
4  */
5 
6 #ifndef ________CFG_H__________
7 #define ________CFG_H__________
8 
9 #include <rose.h>
10 #include <filteredCFG.h>
11 #include <boost/function.hpp>
12 #include <boost/graph/adjacency_list.hpp>
13 #include <boost/shared_ptr.hpp>
14 
15 
16 // Pre-declaration.
18 
19 
20 namespace StaticCFG
21 {
22 
23 typedef boost::function<bool(const VirtualCFG::CFGNode&)> CFGNodeFilter;
24 
25 
28 
29 typedef boost::shared_ptr<CFGNode> CFGNodePtr;
30 typedef boost::shared_ptr<CFGEdge> CFGEdgePtr;
31 
33 {
34  bool operator()(const VirtualCFG::CFGNode& cfgNode) const
35  { return true; }
36 };
37 
39 {
40  bool operator()(const VirtualCFG::CFGNode& cfgNode) const
41  { return cfgNode.isInteresting(); }
42 };
43 
44 
45 class ControlFlowGraph : public boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS,
46 CFGNodePtr, CFGEdgePtr>
47 {
48  public:
49  typedef boost::graph_traits<ControlFlowGraph> GraphTraits;
50  typedef GraphTraits::vertex_descriptor Vertex;
51  typedef GraphTraits::edge_descriptor Edge;
52 
53  typedef std::map<Vertex, Vertex> VertexVertexMap;
54  typedef std::set<Vertex> Vertices;
55 
56  protected:
57 
60 
63 
66 
69 
71  std::map<CFGNode, Vertex> nodesToVertices_;
72 
75 
78 
79  public:
80 
83  : funcDef_(NULL),
85  entry_(GraphTraits::null_vertex()),
86  exit_(GraphTraits::null_vertex())
87  {
88  }
89 
91  explicit ControlFlowGraph(
92  SgFunctionDefinition* funcDef,
93  const CFGNodeFilter& cfgNodeFilter = DefaultFilter())
94  : funcDef_(funcDef),
95  filter_(cfgNodeFilter),
96  entry_(GraphTraits::null_vertex()),
97  exit_(GraphTraits::null_vertex())
98  {
99  build(funcDef);
100  }
101 
103  void build(SgFunctionDefinition* funcDef);
104 
107  { return funcDef_; }
108 
110  Vertex getEntry() const { return entry_; }
111 
113  Vertex getExit() const { return exit_; }
114 
116  void setEntry(Vertex entry) { entry_ = entry; }
117 
119  void setExit(Vertex exit) { exit_ = exit; }
120 
123  const VertexVertexMap& getDominatorTree() const;
124 
126  const VertexVertexMap& getPostdominatorTree() const;
127 
130 
132  void toDot(const std::string& filename) const;
133 
135  std::vector<CFGNodePtr> getAllNodes() const;
136 
138  std::vector<CFGEdgePtr> getAllEdges() const;
139 
142  Vertex getVertexForNode(const CFGNode& node) const;
143 
146  bool isReducible() const { return true; }
147 
149  std::set<Edge> getAllBackEdges() const;
150 
152  Vertices getAllLoopHeaders() const;
153 
156  std::map<Vertex, Vertices> getAllLoops() const;
157 
158  protected:
159 
161  void buildCFG(const CFGNode& node,
162  std::map<CFGNode, Vertex>& nodesAdded,
163  std::set<CFGNode>& nodesProcessed);
164 
166  void setEntryAndExit();
167 
169  { return CFGNodePtr(new CFGNode(node)); }
170 
172  { return CFGEdgePtr(new CFGEdge(edge)); }
173 
175  void writeGraphNode(std::ostream& out, const Vertex& node) const;
176 
178  void writeGraphEdge(std::ostream& out, const Edge& edge) const;
179 
180 
181  protected:
184  {
186  : cfg1(g1), cfg2(g2) {}
187 
188  void operator()(const Vertex& v1, Vertex& v2) const
189  { cfg2[v2] = cfg1[v1]; }
190 
193  };
194 
196  struct EdgeCopier
197  {
199  : cfg1(g1), cfg2(g2) {}
200 
201  void operator()(const Edge& e1, Edge& e2) const
202  { cfg2[e2] = cfg1[e1]; }
203 
206  };
207 };
208 
209 
211 void writeCFGNode(std::ostream& out, const CFGNode& cfgNode);
212 
214 void writeCFGEdge(std::ostream& out, const CFGEdge& e);
215 
216 
217 } // end of namespace StaticCFG
218 
219 
220 #endif /* ________CFG_H__________ */
221