retdec
|
A visitor for obtaining the uses of variables in a function. More...
#include <var_uses_visitor.h>
Public Member Functions | |
bool | isUsed (ShPtr< Variable > var, ShPtr< Function > func, bool doNotIncludeFirstUse=false) |
Returns true if var is used in func, false otherwise. More... | |
ShPtr< VarUses > | getUses (ShPtr< Variable > var, ShPtr< Function > func) |
Returns all uses of var in func. More... | |
Caching | |
void | enableCaching () |
Enables caching. More... | |
void | disableCaching () |
Disables caching. More... | |
void | clearCache () |
Clears the cache of the already cached results. More... | |
bool | isCachingEnabled () const |
Returns true if caching is enabled, false otherwise. More... | |
void | stmtHasBeenAdded (ShPtr< Statement > stmt, ShPtr< Function > func) |
Forces cache update (a new statement has been added to a function). More... | |
void | stmtHasBeenChanged (ShPtr< Statement > stmt, ShPtr< Function > func) |
Forces cache update (the given statement in the given function has been altered). More... | |
void | stmtHasBeenRemoved (ShPtr< Statement > stmt, ShPtr< Function > func) |
Forces cache update (the given statement in the given function has been removed). More... | |
Static Public Member Functions | |
static ShPtr< VarUsesVisitor > | create (ShPtr< ValueAnalysis > va, bool enableCaching=false, ShPtr< Module > module=nullptr) |
Creates a new visitor. More... | |
Private Types | |
using | VarUsesMap = std::map< ShPtr< Variable >, ShPtr< VarUses > > |
Mapping of a variable into its uses. More... | |
using | FuncVarUsesMap = std::map< ShPtr< Function >, VarUsesMap > |
Mapping of a function into uses of its variables. More... | |
Private Member Functions | |
VarUsesVisitor (ShPtr< ValueAnalysis > va, bool enableCaching=false) | |
Constructs a new provider. More... | |
void | precomputeEverything (ShPtr< Module > module) |
Pre-computes uses of variables in all functions of the given module. More... | |
void | findAndStoreUses (ShPtr< Statement > stmt) |
Finds uses of var in the given statement and stores them. More... | |
void | dumpCache () |
Dumps cache to standard error. More... | |
Visitor Interface | |
virtual void | visit (ShPtr< AssignStmt > stmt) override |
virtual void | visit (ShPtr< VarDefStmt > stmt) override |
virtual void | visit (ShPtr< CallStmt > stmt) override |
virtual void | visit (ShPtr< ReturnStmt > stmt) override |
virtual void | visit (ShPtr< EmptyStmt > stmt) override |
virtual void | visit (ShPtr< IfStmt > stmt) override |
virtual void | visit (ShPtr< SwitchStmt > stmt) override |
virtual void | visit (ShPtr< WhileLoopStmt > stmt) override |
virtual void | visit (ShPtr< ForLoopStmt > stmt) override |
virtual void | visit (ShPtr< UForLoopStmt > stmt) override |
virtual void | visit (ShPtr< BreakStmt > stmt) override |
virtual void | visit (ShPtr< ContinueStmt > stmt) override |
virtual void | visit (ShPtr< GotoStmt > stmt) override |
virtual void | visit (ShPtr< UnreachableStmt > stmt) override |
virtual void | visit (ShPtr< GlobalVarDef > varDef) override |
virtual void | visit (ShPtr< Function > func) override |
virtual void | visit (ShPtr< AssignStmt > stmt) override |
virtual void | visit (ShPtr< BreakStmt > stmt) override |
virtual void | visit (ShPtr< CallStmt > stmt) override |
virtual void | visit (ShPtr< ContinueStmt > stmt) override |
virtual void | visit (ShPtr< EmptyStmt > stmt) override |
virtual void | visit (ShPtr< ForLoopStmt > stmt) override |
virtual void | visit (ShPtr< UForLoopStmt > stmt) override |
virtual void | visit (ShPtr< GotoStmt > stmt) override |
virtual void | visit (ShPtr< IfStmt > stmt) override |
virtual void | visit (ShPtr< ReturnStmt > stmt) override |
virtual void | visit (ShPtr< SwitchStmt > stmt) override |
virtual void | visit (ShPtr< UnreachableStmt > stmt) override |
virtual void | visit (ShPtr< VarDefStmt > stmt) override |
virtual void | visit (ShPtr< WhileLoopStmt > stmt) override |
virtual void | visit (ShPtr< AddOpExpr > expr) override |
virtual void | visit (ShPtr< AddressOpExpr > expr) override |
virtual void | visit (ShPtr< AndOpExpr > expr) override |
virtual void | visit (ShPtr< ArrayIndexOpExpr > expr) override |
virtual void | visit (ShPtr< AssignOpExpr > expr) override |
virtual void | visit (ShPtr< BitAndOpExpr > expr) override |
virtual void | visit (ShPtr< BitOrOpExpr > expr) override |
virtual void | visit (ShPtr< BitShlOpExpr > expr) override |
virtual void | visit (ShPtr< BitShrOpExpr > expr) override |
virtual void | visit (ShPtr< BitXorOpExpr > expr) override |
virtual void | visit (ShPtr< CallExpr > expr) override |
virtual void | visit (ShPtr< CommaOpExpr > expr) override |
virtual void | visit (ShPtr< DerefOpExpr > expr) override |
virtual void | visit (ShPtr< DivOpExpr > expr) override |
virtual void | visit (ShPtr< EqOpExpr > expr) override |
virtual void | visit (ShPtr< GtEqOpExpr > expr) override |
virtual void | visit (ShPtr< GtOpExpr > expr) override |
virtual void | visit (ShPtr< LtEqOpExpr > expr) override |
virtual void | visit (ShPtr< LtOpExpr > expr) override |
virtual void | visit (ShPtr< ModOpExpr > expr) override |
virtual void | visit (ShPtr< MulOpExpr > expr) override |
virtual void | visit (ShPtr< NegOpExpr > expr) override |
virtual void | visit (ShPtr< NeqOpExpr > expr) override |
virtual void | visit (ShPtr< NotOpExpr > expr) override |
virtual void | visit (ShPtr< OrOpExpr > expr) override |
virtual void | visit (ShPtr< StructIndexOpExpr > expr) override |
virtual void | visit (ShPtr< SubOpExpr > expr) override |
virtual void | visit (ShPtr< TernaryOpExpr > expr) override |
virtual void | visit (ShPtr< Variable > var) override |
virtual void | visit (ShPtr< BitCastExpr > expr) override |
virtual void | visit (ShPtr< ExtCastExpr > expr) override |
virtual void | visit (ShPtr< FPToIntCastExpr > expr) override |
virtual void | visit (ShPtr< IntToFPCastExpr > expr) override |
virtual void | visit (ShPtr< IntToPtrCastExpr > expr) override |
virtual void | visit (ShPtr< PtrToIntCastExpr > expr) override |
virtual void | visit (ShPtr< TruncCastExpr > expr) override |
virtual void | visit (ShPtr< ConstArray > constant) override |
virtual void | visit (ShPtr< ConstBool > constant) override |
virtual void | visit (ShPtr< ConstFloat > constant) override |
virtual void | visit (ShPtr< ConstInt > constant) override |
virtual void | visit (ShPtr< ConstNullPointer > constant) override |
virtual void | visit (ShPtr< ConstString > constant) override |
virtual void | visit (ShPtr< ConstStruct > constant) override |
virtual void | visit (ShPtr< ConstSymbol > constant) override |
virtual void | visit (ShPtr< ArrayType > type) override |
virtual void | visit (ShPtr< FloatType > type) override |
virtual void | visit (ShPtr< IntType > type) override |
virtual void | visit (ShPtr< PointerType > type) override |
virtual void | visit (ShPtr< StringType > type) override |
virtual void | visit (ShPtr< StructType > type) override |
virtual void | visit (ShPtr< FunctionType > type) override |
virtual void | visit (ShPtr< VoidType > type) override |
virtual void | visit (ShPtr< UnknownType > type) override |
![]() | |
virtual void | visit (ShPtr< GlobalVarDef > varDef) override |
virtual void | visit (ShPtr< Function > func) override |
virtual void | visit (ShPtr< AddOpExpr > expr) override |
virtual void | visit (ShPtr< AddressOpExpr > expr) override |
virtual void | visit (ShPtr< AndOpExpr > expr) override |
virtual void | visit (ShPtr< ArrayIndexOpExpr > expr) override |
virtual void | visit (ShPtr< AssignOpExpr > expr) override |
virtual void | visit (ShPtr< BitAndOpExpr > expr) override |
virtual void | visit (ShPtr< BitOrOpExpr > expr) override |
virtual void | visit (ShPtr< BitShlOpExpr > expr) override |
virtual void | visit (ShPtr< BitShrOpExpr > expr) override |
virtual void | visit (ShPtr< BitXorOpExpr > expr) override |
virtual void | visit (ShPtr< CallExpr > expr) override |
virtual void | visit (ShPtr< CommaOpExpr > expr) override |
virtual void | visit (ShPtr< DerefOpExpr > expr) override |
virtual void | visit (ShPtr< DivOpExpr > expr) override |
virtual void | visit (ShPtr< EqOpExpr > expr) override |
virtual void | visit (ShPtr< GtEqOpExpr > expr) override |
virtual void | visit (ShPtr< GtOpExpr > expr) override |
virtual void | visit (ShPtr< LtEqOpExpr > expr) override |
virtual void | visit (ShPtr< LtOpExpr > expr) override |
virtual void | visit (ShPtr< ModOpExpr > expr) override |
virtual void | visit (ShPtr< MulOpExpr > expr) override |
virtual void | visit (ShPtr< NegOpExpr > expr) override |
virtual void | visit (ShPtr< NeqOpExpr > expr) override |
virtual void | visit (ShPtr< NotOpExpr > expr) override |
virtual void | visit (ShPtr< OrOpExpr > expr) override |
virtual void | visit (ShPtr< StructIndexOpExpr > expr) override |
virtual void | visit (ShPtr< SubOpExpr > expr) override |
virtual void | visit (ShPtr< TernaryOpExpr > expr) override |
virtual void | visit (ShPtr< Variable > var) override |
virtual void | visit (ShPtr< BitCastExpr > expr) override |
virtual void | visit (ShPtr< ExtCastExpr > expr) override |
virtual void | visit (ShPtr< FPToIntCastExpr > expr) override |
virtual void | visit (ShPtr< IntToFPCastExpr > expr) override |
virtual void | visit (ShPtr< IntToPtrCastExpr > expr) override |
virtual void | visit (ShPtr< PtrToIntCastExpr > expr) override |
virtual void | visit (ShPtr< TruncCastExpr > expr) override |
virtual void | visit (ShPtr< ConstArray > constant) override |
virtual void | visit (ShPtr< ConstBool > constant) override |
virtual void | visit (ShPtr< ConstFloat > constant) override |
virtual void | visit (ShPtr< ConstInt > constant) override |
virtual void | visit (ShPtr< ConstNullPointer > constant) override |
virtual void | visit (ShPtr< ConstString > constant) override |
virtual void | visit (ShPtr< ConstStruct > constant) override |
virtual void | visit (ShPtr< ConstSymbol > constant) override |
virtual void | visit (ShPtr< ArrayType > type) override |
virtual void | visit (ShPtr< FloatType > type) override |
virtual void | visit (ShPtr< IntType > type) override |
virtual void | visit (ShPtr< PointerType > type) override |
virtual void | visit (ShPtr< StringType > type) override |
virtual void | visit (ShPtr< StructType > type) override |
virtual void | visit (ShPtr< FunctionType > type) override |
virtual void | visit (ShPtr< VoidType > type) override |
virtual void | visit (ShPtr< UnknownType > type) override |
OrderedAllVisitor (bool visitSuccessors=true, bool visitNestedStmts=true) | |
Constructs a new visitor. More... | |
virtual void | visitStmt (ShPtr< Statement > stmt, bool visitSuccessors=true, bool visitNestedStmts=true) |
Visits the given statement, and possibly its successors or nested statements. More... | |
void | restart (bool visitSuccessors=true, bool visitNestedStmts=true) |
"Restarts" the visitor so it is in the state like it was when it was created. More... | |
bool | makeAccessedAndCheckIfAccessed (ShPtr< Type > type) |
Makes the given type accessed. More... | |
![]() | |
virtual | ~Visitor ()=default |
Visitor ()=default | |
![]() | |
NonCopyable (const NonCopyable &)=delete | |
NonCopyable & | operator= (const NonCopyable &)=delete |
NonCopyable ()=default | |
~NonCopyable ()=default | |
Private Attributes | |
ShPtr< Variable > | var |
Variable whose uses are obtained. More... | |
ShPtr< Function > | func |
Function whose body is being traversed. More... | |
ShPtr< ValueAnalysis > | va |
Analysis of values. More... | |
ShPtr< VarUses > | varUses |
Uses of var . More... | |
bool | precomputing |
Are we pre-computing everything? More... | |
bool | precomputingHasBeenDone |
Has everything been successfully precomputed? More... | |
bool | cachingEnabled |
Is caching enabled? More... | |
FuncVarUsesMap | cache |
Cache. More... | |
![]() | |
ShPtr< Statement > | lastStmt |
Statement that has been accessed as the last one. More... | |
StmtUSet | accessedStmts |
A set of all accessed statements. More... | |
TypeUSet | accessedTypes |
A set of all accessed types. More... | |
bool | visitSuccessors |
Should statements' successor be accessed? More... | |
bool | visitNestedStmts |
Should nested statements be accessed? More... | |
A visitor for obtaining the uses of variables in a function.
Use create() to create instances. Instances of this class have reference object semantics.
|
private |
Mapping of a function into uses of its variables.
|
private |
Mapping of a variable into its uses.
|
private |
Constructs a new provider.
For the description of the parameters, see create()
.
void retdec::llvmir2hll::VarUsesVisitor::clearCache | ( | ) |
Clears the cache of the already cached results.
|
static |
Creates a new visitor.
[in] | va | The used analysis of values. |
[in] | enableCaching | If true , it caches the results returned by getUses() until restartCache() or disableCaching() is called. This may speed up subsequent calls to getUses(). |
[in] | module | If non-null, this function pre-computes information for every function and variable in the module. |
enableCaching
has to be true
All methods of this class leave va in a valid state.
void retdec::llvmir2hll::VarUsesVisitor::disableCaching | ( | ) |
Disables caching.
It also clears the cache of the already cached results.
|
private |
Dumps cache
to standard error.
This function should be used only for debugging purposes.
void retdec::llvmir2hll::VarUsesVisitor::enableCaching | ( | ) |
Enables caching.
It also clears the cache of the already cached results.
Finds uses of var
in the given statement and stores them.
It doesn't check nested statements or successors.
ShPtr< VarUses > retdec::llvmir2hll::VarUsesVisitor::getUses | ( | ShPtr< Variable > | var, |
ShPtr< Function > | func | ||
) |
Returns all uses of var in func.
For example, let var1
be a variable used in the following statement
Then, this function obtains obtains
A definition of a variable is also considered to be a use. Function parameters are skipped. Indirect uses are also included in the returned result.
bool retdec::llvmir2hll::VarUsesVisitor::isCachingEnabled | ( | ) | const |
Returns true
if caching is enabled, false
otherwise.
bool retdec::llvmir2hll::VarUsesVisitor::isUsed | ( | ShPtr< Variable > | var, |
ShPtr< Function > | func, | ||
bool | doNotIncludeFirstUse = false |
||
) |
Returns true
if var is used in func, false
otherwise.
[in] | var | Variable whose uses are obtained. |
[in] | func | Function whose body is checked. |
[in] | doNotIncludeFirstUse | Do not consider the first use of var to be a use. |
See the description of getUses()
for more details. If you want to just check whether a variable is used in a function and you don't care about the precise number/places of uses, use this function.
If var
may or must be indirectly used, such a use is also counted as a use.
Pre-computes uses of variables in all functions of the given module.
void retdec::llvmir2hll::VarUsesVisitor::stmtHasBeenAdded | ( | ShPtr< Statement > | stmt, |
ShPtr< Function > | func | ||
) |
Forces cache update (a new statement has been added to a function).
If caching is disabled, it does nothing. Otherwise, the function recomputes what is necessary to recompute.
Important note: The following sets of uses may be modified when this function is called:
dirUses
indirUses
If you are iterating over any of these sets while calling this function, you have to first create a copy of the set and iterate over this set. Otherwise, the result is undefined.void retdec::llvmir2hll::VarUsesVisitor::stmtHasBeenChanged | ( | ShPtr< Statement > | stmt, |
ShPtr< Function > | func | ||
) |
Forces cache update (the given statement in the given function has been altered).
If caching is disabled, it does nothing. Otherwise, the function recomputes what is necessary to recompute.
Important note: The following sets of uses may be modified when this function is called:
dirUses
indirUses
If you are iterating over any of these sets while calling this function, you have to first create a copy of the set and iterate over this set. Otherwise, the result is undefined.void retdec::llvmir2hll::VarUsesVisitor::stmtHasBeenRemoved | ( | ShPtr< Statement > | stmt, |
ShPtr< Function > | func | ||
) |
Forces cache update (the given statement in the given function has been removed).
If caching is disabled, it does nothing. Otherwise, the function recomputes what is necessary to recompute.
Important note: The following sets of uses may be modified when this function is called:
dirUses
indirUses
If you are iterating over any of these sets while calling this function, you have to first create a copy of the set and iterate over this set. Otherwise, the result is undefined.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
private |
Cache.
|
private |
Is caching enabled?
Function whose body is being traversed.
|
private |
Are we pre-computing everything?
|
private |
Has everything been successfully precomputed?
|
private |
Analysis of values.