ROSE  0.9.9.109
DataflowCFG.h
1 #ifndef DATAFLOW_CFG_H
2 #define DATAFLOW_CFG_H
3 
4 #include "genericDataflowCommon.h"
5 #include <map>
6 #include <string>
7 #include <vector>
8 
9 namespace VirtualCFG {
10 
11 // "Interesting" node and edge filters for use with dataflow analyses
12 class DataflowEdge;
13 
14 bool defaultFilter (CFGNode cfgn);
15 
16 class DataflowNode {
17  public:
18  CFGNode n;
19  bool (*filter) (CFGNode cfgn); // a filter function to decide which raw CFG node to show (if return true) or hide (otherwise)
20 
21  // We enforce the user codes (the framework) of DataflowNode to explicitly set filter, or provide default filter on their own
22  DataflowNode(CFGNode n, bool (*f) (CFGNode)): n(n), filter(f) {}
23  // By default, the default filter function is used unless otherwise specified
24 // DataflowNode(CFGNode n, bool (*f) (CFGNode) = defaultFilter): n(n), filter(f) {}
25  DataflowNode(const DataflowNode& dfn): n(dfn.n), filter (dfn.filter) {}
26 
27  std::string toString() const {return n.toString();}
28  std::string toStringForDebugging() const {return n.toStringForDebugging();}
29  std::string id() const {return n.id();}
30  SgNode* getNode() const {return n.getNode();}
31  unsigned int getIndex() const {return n.getIndex();}
32  std::vector<DataflowEdge> outEdges() const;
33  std::vector<DataflowEdge> inEdges() const;
34  bool isInteresting() const;
35  bool operator==(const DataflowNode& o) const {return n == o.n;}
36  bool operator!=(const DataflowNode& o) const {return !(*this == o);}
37  bool operator<(const DataflowNode& o) const {return n < o.n;}
38 
39  std::string str(std::string indent="") const;
40 };
41 
42 typedef std::map<SgNode*, DataflowNode> m_AST2CFG;
43 
44 class DataflowEdge {
45  CFGPath p;
46  bool (*filter) (CFGNode cfgn);
47 
48  public:
49 // DataflowEdge(CFGPath p, bool (*f) (CFGNode) = defaultFilter): p(p), filter(f) {}
50  DataflowEdge(CFGPath p, bool (*f) (CFGNode) ): p(p), filter(f) {}
51  DataflowEdge(const DataflowEdge& dfe): p(dfe.p), filter(dfe.filter) {}
52 
53  std::string toString() const {return p.toString();}
54  std::string toStringForDebugging() const {return p.toStringForDebugging();}
55  std::string id() const {return p.id();}
56  DataflowNode source() const {return DataflowNode(p.source(), filter);}
57  DataflowNode target() const {return DataflowNode(p.target(), filter);}
58  EdgeConditionKind condition() const {return p.condition();}
59  SgExpression* caseLabel() const {return p.caseLabel();}
60  SgExpression* conditionBasedOn() const {return p.conditionBasedOn();}
61  std::vector<SgInitializedName*> scopesBeingExited() const {return p.scopesBeingExited();}
62  std::vector<SgInitializedName*> scopesBeingEntered() const {return p.scopesBeingEntered();}
63  bool operator==(const DataflowEdge& o) const {return p == o.p;}
64  bool operator!=(const DataflowEdge& o) const {return p != o.p;}
65  //bool operator<(const DataflowEdge& o) const {return p < o.p;}
66 };
67 
68 //inline DataflowNode makeDataflowCfg(SgNode* start, bool (*f) (CFGNode) = defaultFilter) {
69 inline DataflowNode makeDataflowCfg(SgNode* start, bool (*f) (CFGNode) ) {
70  // Returns CFG node for just before start
71  return DataflowNode(cfgBeginningOfConstruct(start), f);
72 }
73 
74 bool isDataflowInteresting(CFGNode cn);
75 }
76 
77 #endif
unsigned int getIndex() const
An identifying index within the AST node given by getNode()
Definition: virtualCFG.h:88
std::string id() const
ID to use for Dot, etc.
This class represents the notion of an expression. Expressions are derived from SgLocatedNodes, since similar to statement, expressions have a concrete location within the user's source code.
A node in the control flow graph.
Definition: virtualCFG.h:67
This class represents the base class for all IR nodes within Sage III.
Definition: Cxx_Grammar.h:8322
std::string toStringForDebugging() const
String for debugging graphs.
SgNode * getNode() const
The underlying AST node.
Definition: virtualCFG.h:86
std::string toString() const
Pretty string for Dot node labels, etc.