retdec
var_uses_visitor.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_ANALYSIS_VAR_USES_VISITOR_H
8 #define RETDEC_LLVMIR2HLL_ANALYSIS_VAR_USES_VISITOR_H
9 
10 #include <map>
11 
17 
18 namespace retdec {
19 namespace llvmir2hll {
20 
24 class VarUses {
25 public:
29 
32 
35 
38 
41 };
42 
49 // Note: Support/Caching hasn't been used because storing and obtaining results
50 // using Support/Caching would be tedious (we use a map of maps in this
51 // class). We rather use a custom caching mechanism.
54 public:
56  bool doNotIncludeFirstUse = false);
58 
61  void enableCaching();
62  void disableCaching();
63  void clearCache();
64  bool isCachingEnabled() const;
69 
71  bool enableCaching = false, ShPtr<Module> module = nullptr);
72 
73 private:
75  // Note: Using a hash table (i.e. std::unordered_map) does not
76  // significantly speeds up the execution.
77  using VarUsesMap = std::map<ShPtr<Variable>, ShPtr<VarUses>>;
78 
80  using FuncVarUsesMap = std::map<ShPtr<Function>, VarUsesMap>;
81 
82 private:
84 
87  void dumpCache();
88 
92  virtual void visit(ShPtr<AssignStmt> stmt) override;
93  virtual void visit(ShPtr<VarDefStmt> stmt) override;
94  virtual void visit(ShPtr<CallStmt> stmt) override;
95  virtual void visit(ShPtr<ReturnStmt> stmt) override;
96  virtual void visit(ShPtr<EmptyStmt> stmt) override;
97  virtual void visit(ShPtr<IfStmt> stmt) override;
98  virtual void visit(ShPtr<SwitchStmt> stmt) override;
99  virtual void visit(ShPtr<WhileLoopStmt> stmt) override;
100  virtual void visit(ShPtr<ForLoopStmt> stmt) override;
101  virtual void visit(ShPtr<UForLoopStmt> stmt) override;
102  virtual void visit(ShPtr<BreakStmt> stmt) override;
103  virtual void visit(ShPtr<ContinueStmt> stmt) override;
104  virtual void visit(ShPtr<GotoStmt> stmt) override;
105  virtual void visit(ShPtr<UnreachableStmt> stmt) override;
107 
108 private:
111 
114 
117 
120 
123 
126 
129 
132 };
133 
134 } // namespace llvmir2hll
135 } // namespace retdec
136 
137 #endif
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 uses of variables in a function.
Definition: var_uses_visitor.h:53
std::map< ShPtr< Function >, VarUsesMap > FuncVarUsesMap
Mapping of a function into uses of its variables.
Definition: var_uses_visitor.h:80
void enableCaching()
Enables caching.
Definition: var_uses_visitor.cpp:136
std::map< ShPtr< Variable >, ShPtr< VarUses > > VarUsesMap
Mapping of a variable into its uses.
Definition: var_uses_visitor.h:77
void precomputeEverything(ShPtr< Module > module)
Pre-computes uses of variables in all functions of the given module.
Definition: var_uses_visitor.cpp:355
bool precomputingHasBeenDone
Has everything been successfully precomputed?
Definition: var_uses_visitor.h:125
bool cachingEnabled
Is caching enabled?
Definition: var_uses_visitor.h:128
bool precomputing
Are we pre-computing everything?
Definition: var_uses_visitor.h:122
VarUsesVisitor(ShPtr< ValueAnalysis > va, bool enableCaching=false)
Constructs a new provider.
Definition: var_uses_visitor.cpp:43
void stmtHasBeenAdded(ShPtr< Statement > stmt, ShPtr< Function > func)
Forces cache update (a new statement has been added to a function).
Definition: var_uses_visitor.cpp:183
ShPtr< ValueAnalysis > va
Analysis of values.
Definition: var_uses_visitor.h:116
bool isUsed(ShPtr< Variable > var, ShPtr< Function > func, bool doNotIncludeFirstUse=false)
Returns true if var is used in func, false otherwise.
Definition: var_uses_visitor.cpp:66
ShPtr< VarUses > getUses(ShPtr< Variable > var, ShPtr< Function > func)
Returns all uses of var in func.
Definition: var_uses_visitor.cpp:103
bool isCachingEnabled() const
Returns true if caching is enabled, false otherwise.
Definition: var_uses_visitor.cpp:162
ShPtr< VarUses > varUses
Uses of var.
Definition: var_uses_visitor.h:119
void clearCache()
Clears the cache of the already cached results.
Definition: var_uses_visitor.cpp:154
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
ShPtr< Variable > var
Variable whose uses are obtained.
Definition: var_uses_visitor.h:110
void disableCaching()
Disables caching.
Definition: var_uses_visitor.cpp:146
void stmtHasBeenRemoved(ShPtr< Statement > stmt, ShPtr< Function > func)
Forces cache update (the given statement in the given function has been removed).
Definition: var_uses_visitor.cpp:299
void dumpCache()
Dumps cache to standard error.
Definition: var_uses_visitor.cpp:440
FuncVarUsesMap cache
Cache.
Definition: var_uses_visitor.h:131
void findAndStoreUses(ShPtr< Statement > stmt)
Finds uses of var in the given statement and stores them.
Definition: var_uses_visitor.cpp:392
ShPtr< Function > func
Function whose body is being traversed.
Definition: var_uses_visitor.h:113
static ShPtr< VarUsesVisitor > create(ShPtr< ValueAnalysis > va, bool enableCaching=false, ShPtr< Module > module=nullptr)
Creates a new visitor.
Definition: var_uses_visitor.cpp:335
void stmtHasBeenChanged(ShPtr< Statement > stmt, ShPtr< Function > func)
Forces cache update (the given statement in the given function has been altered).
Definition: var_uses_visitor.cpp:248
Representation of uses of a variable.
Definition: var_uses_visitor.h:24
ShPtr< Variable > var
Variable whose uses this class contains.
Definition: var_uses_visitor.h:31
VarUses(ShPtr< Variable > var=nullptr, ShPtr< Function > func=nullptr, StmtSet dirUses=StmtSet(), StmtSet indirUses=StmtSet())
Definition: var_uses_visitor.h:26
StmtSet dirUses
Direct uses of var.
Definition: var_uses_visitor.h:37
StmtSet indirUses
Indirect uses of var (may or must).
Definition: var_uses_visitor.h:40
ShPtr< Function > func
Function which contains the uses.
Definition: var_uses_visitor.h:34
A mixin to make classes non-copyable.
Definition: non_copyable.h:27
ShPtr< Module > module
The current module.
Definition: hll_writer.cpp:100
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< Statement > > StmtSet
Set of statements.
Definition: types.h:69
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.
An analysis for obtaining information about a value.