retdec
used_vars_visitor.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_ANALYSIS_USED_VARS_VISITOR_H
8 #define RETDEC_LLVMIR2HLL_ANALYSIS_USED_VARS_VISITOR_H
9 
10 #include <cstddef>
11 #include <map>
12 
18 
19 namespace retdec {
20 namespace llvmir2hll {
21 
22 class Value;
23 
31 class UsedVars {
32  friend class UsedVarsVisitor;
33 
34 public:
36  using var_iterator = VarSet::const_iterator;
37 
38 public:
39  UsedVars(const UsedVars &other) = default;
40 
41  UsedVars &operator=(const UsedVars &other) = default;
42  bool operator==(const UsedVars &other) const;
43  bool operator!=(const UsedVars &other) const;
44 
45  VarSet getReadVars() const;
46  VarSet getWrittenVars() const;
47  VarSet getAllVars() const;
48  std::size_t getCount(bool read = true, bool written = true) const;
49  std::size_t getNumOfUses(ShPtr<Variable> var) const;
50  bool isUsed(ShPtr<Variable> var, bool read = true,
51  bool written = true) const;
52 
55  var_iterator read_begin() const;
56  var_iterator read_end() const;
57 
59  var_iterator written_end() const;
60 
61  var_iterator all_begin() const;
62  var_iterator all_end() const;
64 
65 private:
67  using VarCountMap = std::map<ShPtr<Variable>, std::size_t>;
68 
69 private:
70  UsedVars();
71 
72  void clear();
73 
74 private:
77 
80 
83 
86 };
87 
100  public Caching<ShPtr<Value>, ShPtr<UsedVars>> {
101 
102 public:
104 
105  static ShPtr<UsedVarsVisitor> create(bool visitSuccessors = true,
106  bool visitNestedStmts = true, bool enableCaching = false);
108  bool visitSuccessors = true, bool visitNestedStmts = true);
109 
110 private:
111  explicit UsedVarsVisitor(bool visitSuccessors = true,
112  bool visitNestedStmts = true, bool enableCaching = false);
113 
117  virtual void visit(ShPtr<Function> func) override;
118  virtual void visit(ShPtr<Variable> var) override;
119  virtual void visit(ShPtr<ArrayIndexOpExpr> expr) override;
120  virtual void visit(ShPtr<StructIndexOpExpr> expr) override;
121  virtual void visit(ShPtr<DerefOpExpr> expr) override;
122  virtual void visit(ShPtr<AssignStmt> stmt) override;
123  virtual void visit(ShPtr<VarDefStmt> stmt) override;
124  virtual void visit(ShPtr<ForLoopStmt> stmt) override;
126 
127 private:
130 
132  bool writing;
133 
136 
139 };
140 
141 } // namespace llvmir2hll
142 } // namespace retdec
143 
144 #endif
A mixin for enabling caching of computed results.
A mixin for enabling caching of computed results.
Definition: caching.h:51
void enableCaching()
Enables caching.
Definition: caching.h:60
A visitor that visits everything in an ordered way.
Definition: ordered_all_visitor.h:44
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
A visitor for obtaining the used variables in a value.
Definition: used_vars_visitor.h:100
UsedVarsVisitor(bool visitSuccessors=true, bool visitNestedStmts=true, bool enableCaching=false)
Constructs a new visitor.
Definition: used_vars_visitor.cpp:180
ShPtr< UsedVars > getUsedVars_(ShPtr< Value > value)
Definition: used_vars_visitor.cpp:194
ShPtr< UsedVars > usedVars
Used variables that are currently being computed.
Definition: used_vars_visitor.h:129
static ShPtr< UsedVars > getUsedVars(ShPtr< Value > value, bool visitSuccessors=true, bool visitNestedStmts=true)
Returns the set of used variables in the given value.
Definition: used_vars_visitor.cpp:259
bool visitNestedStmts
Should nested statements be accessed?
Definition: used_vars_visitor.h:138
bool writing
Are we writing into a variable?
Definition: used_vars_visitor.h:132
bool visitSuccessors
Should statements' successor be accessed?
Definition: used_vars_visitor.h:135
static ShPtr< UsedVarsVisitor > create(bool visitSuccessors=true, bool visitNestedStmts=true, bool enableCaching=false)
Definition: used_vars_visitor.cpp:237
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
Used variables for a value (expression, statement).
Definition: used_vars_visitor.h:31
VarSet getReadVars() const
Returns the variables that are read.
Definition: used_vars_visitor.cpp:52
bool operator==(const UsedVars &other) const
Returns true if the current object is equal to other, false otherwise.
Definition: used_vars_visitor.cpp:34
void clear()
Clears all private containers.
Definition: used_vars_visitor.cpp:168
VarSet writtenVars
Set of variables into which something is written.
Definition: used_vars_visitor.h:79
var_iterator all_begin() const
Returns an iterator to the first variable.
Definition: used_vars_visitor.cpp:136
VarSet getWrittenVars() const
Returns the variables that are written into.
Definition: used_vars_visitor.cpp:59
VarSet::const_iterator var_iterator
Variables iterator.
Definition: used_vars_visitor.h:36
var_iterator written_end() const
Returns an iterator past the last written variable.
Definition: used_vars_visitor.cpp:129
std::size_t getNumOfUses(ShPtr< Variable > var) const
Returns the number of uses of var.
Definition: used_vars_visitor.cpp:94
VarSet allVars
Set of all variables (read or written).
Definition: used_vars_visitor.h:82
var_iterator read_end() const
Returns an iterator past the last read variable.
Definition: used_vars_visitor.cpp:115
std::size_t getCount(bool read=true, bool written=true) const
Returns the number of used variables.
Definition: used_vars_visitor.cpp:78
bool isUsed(ShPtr< Variable > var, bool read=true, bool written=true) const
Returns true if var is used, false otherwise.
Definition: used_vars_visitor.cpp:154
bool operator!=(const UsedVars &other) const
Returns true if the current object is not equal to other, false otherwise.
Definition: used_vars_visitor.cpp:45
UsedVars(const UsedVars &other)=default
std::map< ShPtr< Variable >, std::size_t > VarCountMap
Mapping of a variable into a count.
Definition: used_vars_visitor.h:67
UsedVars()
Constructs a new UsedVars object.
Definition: used_vars_visitor.cpp:28
var_iterator written_begin() const
Returns an iterator to the first written variable.
Definition: used_vars_visitor.cpp:122
var_iterator read_begin() const
Returns an iterator to the first read variable.
Definition: used_vars_visitor.cpp:108
VarSet getAllVars() const
Returns read variables merged with written-into variables.
Definition: used_vars_visitor.cpp:66
UsedVars & operator=(const UsedVars &other)=default
VarCountMap numOfVarUses
Number of uses of a variable.
Definition: used_vars_visitor.h:85
var_iterator all_end() const
Returns an iterator past the last variable.
Definition: used_vars_visitor.cpp:143
VarSet readVars
Set of variables that are read.
Definition: used_vars_visitor.h:76
A mixin to make classes non-copyable.
Definition: non_copyable.h:27
A library providing API for working with back-end IR.
std::shared_ptr< T > ShPtr
An alias for a shared pointer.
Definition: smart_ptr.h:18
std::set< ShPtr< Variable > > VarSet
Set of variables.
Definition: types.h:57
Definition: archive_wrapper.h:19
A mixin to make classes non-copyable.
A visitor that visits everything in an ordered way.
Declarations, aliases, macros, etc. for the use of smart pointers.
Aliases for several useful types.