retdec
|
A CFG traversal for computing OptimFuncInfos. More...
#include <optim_func_info_cfg_traversal.h>
Static Public Member Functions | |
static ShPtr< OptimFuncInfo > | getOptimFuncInfo (ShPtr< Module > module, ShPtr< OptimCallInfoObtainer > cio, ShPtr< ValueAnalysis > va, ShPtr< CFG > cfg) |
Computes OptimFuncInfo for the function specified by its CFG. More... | |
Private Types | |
using | VarToVarMap = std::map< ShPtr< Variable >, ShPtr< Variable > > |
A mapping of a variable into another variable. More... | |
Private Member Functions | |
OptimFuncInfoCFGTraversal (ShPtr< Module > module, ShPtr< OptimCallInfoObtainer > cio, ShPtr< ValueAnalysis > va, ShPtr< CFG > cfg) | |
Constructs a new traverser. More... | |
ShPtr< OptimFuncInfo > | performComputation () |
Computes the FuncInfo and returns it. More... | |
void | precomputeAlwaysModifiedVarsBeforeRead () |
Precomputes funcInfo->isAlwaysModifiedBeforeRead for traversedFunc . More... | |
void | updateFuncInfo (ShPtr< Statement > stmt) |
Updates funcInfo by the information obtained from the given statement. More... | |
bool | checkExitNodesPredecessor (ShPtr< CFG::Node > node) |
Checks the selected predecessor of the exit node of cfg . More... | |
virtual bool | visitStmt (ShPtr< Statement > stmt) override |
Visits the given statement stmt. More... | |
virtual bool | getEndRetVal () const override |
Returns the value that should be returned when an end of the traversal is reached. More... | |
virtual bool | combineRetVals (bool origRetVal, bool newRetVal) const override |
Computes a new return value from the original return value (origRetVal) and the new return value (newRetVal). More... | |
Private Attributes | |
ShPtr< Module > | module |
Module which contains the function specified by its CFG. More... | |
VarSet | globalVars |
ShPtr< CG > | cg |
Call graph of the module. More... | |
ShPtr< OptimCallInfoObtainer > | cio |
The used call info obtainer. More... | |
ShPtr< ValueAnalysis > | va |
Analysis of values. More... | |
ShPtr< CFG > | cfg |
The CFG that is being traversed. More... | |
ShPtr< Function > | traversedFunc |
The function whose CFG is being traversed. More... | |
ShPtr< CG::CalledFuncs > | calledFuncs |
Called functions from traversedFunc . More... | |
ShPtr< OptimFuncInfo > | funcInfo |
The currently computed FuncInfo. More... | |
VarToVarMap | storedGlobalVars |
Additional Inherited Members | |
![]() | |
CFGTraversal (ShPtr< CFG > cfg, bool defaultCurrRetVal) | |
Constructs a new traverser. More... | |
~CFGTraversal ()=default | |
bool | getCurrRetVal () const |
Returns the value that should be returned as the result of visiting a statement. More... | |
bool | performTraversal (ShPtr< Statement > startStmt) |
Performs a traversal of the current CFG, starting at startStmt. More... | |
bool | performTraversalFromSuccessors (ShPtr< Statement > stmt) |
Performs a traversal of the current CFG, starting at the successor(s) of stmt. More... | |
bool | performReverseTraversal (ShPtr< Statement > startStmt) |
Performs a reverse traversal of the current CFG, starting at startStmt. More... | |
bool | performReverseTraversalFromPredecessors (ShPtr< Statement > stmt) |
Performs a reverse traversal of the current CFG, starting at the predecessor(s) of stmt. More... | |
![]() | |
ShPtr< CFG > | cfg |
CFG that is being traversed. More... | |
StmtUSet | checkedStmts |
Statements that have been checked (to prevent looping). More... | |
bool | currRetVal |
Current return value of visitStmt(). More... | |
bool | stopTraversal |
Should the traversal be stopped? More... | |
A CFG traversal for computing OptimFuncInfos.
This class is meant to be used in OptimCallInfoObtainer.
Instances of this class have reference object semantics. This is a concrete traverser which should not be subclassed.
|
private |
A mapping of a variable into another variable.
|
private |
Constructs a new traverser.
See getOptimFuncInfo() for the description of parameters.
|
private |
Checks the selected predecessor of the exit node of cfg
.
true
if the next exit node's predecessor should be checked, false
otherwise. If false
is returned, it means that no variables from storedGlobalVars can be marked as 'never modified'.This function checks that every variable from storedGlobalVars
is retrieved its original value before the node exits.
|
overrideprivatevirtual |
Computes a new return value from the original return value (origRetVal) and the new return value (newRetVal).
Implements retdec::llvmir2hll::CFGTraversal.
|
overrideprivatevirtual |
Returns the value that should be returned when an end of the traversal is reached.
For example, the end may mean the end node of the CFG or a statement that has already been traversed.
Implements retdec::llvmir2hll::CFGTraversal.
|
static |
Computes OptimFuncInfo for the function specified by its CFG.
[in] | module | Module which contains the function specified by its CFG. |
[in] | cio | The used call info obtainer. |
[in] | va | The used analysis of values. |
[in] | cfg | CFG that should be traversed. |
This function leaves va in a valid state.
|
private |
Computes the FuncInfo and returns it.
|
private |
Precomputes funcInfo->isAlwaysModifiedBeforeRead
for traversedFunc
.
|
private |
Updates funcInfo
by the information obtained from the given statement.
|
overrideprivatevirtual |
Visits the given statement stmt.
return true
if the traversing should continue, false
otherwise.
Note: checkedStmts
is modified in CFGTraversal, so it is not necessary for the implementation of this function to add stmt to checkedStmts
.
If you want the traversal to end prematurely, set the stopTraversal variable to true
. Otherwise, if you just return false
, the traversal may still continue from other branches because of recursion.
Implements retdec::llvmir2hll::CFGTraversal.
|
private |
Called functions from traversedFunc
.
The CFG that is being traversed.
|
private |
The used call info obtainer.
|
private |
The currently computed FuncInfo.
|
private |
Global variables in module
. This is here to speedup the traversal. By using this set, we do not have to ask module
every time we need such information.
|
private |
Global variables that (1) are read into local variables at the beginning of the function's body and (2) the local variables are just read, not modified.
The function whose CFG is being traversed.
|
private |
Analysis of values.