ROSE  0.9.6a
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ValuePropagate.h
Go to the documentation of this file.
1 #ifndef VALUE_PROPAGATE_H
2 #define VALUE_PROPAGATE_H
3 
4 #include <DefUseChain.h>
5 #include <ValueAnnot.h>
6 #include <FunctionObject.h>
7 
9 {
11  public:
12  ValuePropagateNode( MultiGraphCreate *c, const AstNodePtr& ref,
13  const AstNodePtr& _stmt, bool def)
14  : DefUseChainNode( c, ref, _stmt, def) {}
15 
16  const HasValueDescriptor& get_desc() const { return desc; }
17  HasValueDescriptor& get_desc() { return desc; }
18  virtual std::string toString() const;
19 };
20 
21 class ROSE_DLL_API HasValueMap : public AstObserver
22 {
23  std::map<AstNodePtr, HasValueDescriptor> valmap;
24 
25  void ObserveCopyAst(AstInterfaceImpl& fa, const AstNodePtr& orig, const AstNodePtr& copy);
26  public:
27  bool has_value( const AstNodePtr& ast, HasValueDescriptor* r = 0) const;
28  void set_val( const AstNodePtr& ast, const HasValueDescriptor& val);
29 
30  void copy_value( AstInterfaceImpl& fa, const AstNodePtr& orig, const AstNodePtr& copy);
31  friend class ValuePropagate;
32 };
33 
35  : public MapObject<SymbolicVal, SymbolicVal>, public SymbolicVisitor
36 {
38  AstInterface& fa;
39 
40  bool usedefault;
41  SymbolicVal repl;
42 
43  void VisitFunction (const SymbolicFunction& u);
44  SymbolicVal operator() ( const SymbolicVal& v);
45  public:
46  HasValueMapReplace ( AstInterface& _fa, HasValueMap& _m, bool _usedefault)
47  : valmap(_m), fa(_fa), usedefault(_usedefault) {}
48 };
49 
50 class ROSE_DLL_API HasValueCodeGen : public Map2Object<AstInterface*, AstNodePtr, AstNodePtr>
51 {
52  std::map<AstNodePtr, AstNodePtr> astmap;
53  public:
54  AstNodePtr operator() (AstInterface* const& fa, const AstNodePtr& orig);
55 };
56 
58 : public DefUseChain<ValuePropagateNode>
59 {
60  std::map<AstNodePtr, ValuePropagateNode*> nodemap;
63 
64  virtual ValuePropagateNode*
65  CreateNode( AstInterface& fa, const AstNodePtr& ref,
66  const AstNodePtr& stmt, bool def);
67 
68  public:
69  ValuePropagate( BaseGraphCreate* c = 0)
71  void build( AstInterface& fa, const AstNodePtr& head,
73  AliasAnalysisInterface& alias,
74  FunctionSideEffectInterface* f = 0);
75  void build (AstInterface& fa, const AstNodePtr& head,
76  AliasAnalysisInterface& alias,
77  FunctionSideEffectInterface* f = 0);
78 
79  bool known_value( const AstNodePtr& exp,
80  HasValueDescriptor* result = 0, bool *change = 0);
81 
82  HasValueMap& get_value_map() { return valmap; }
83 };
84 
85 #endif