retdec
|
A recursive creator of control-flow graphs (CFGs) from functions. More...
#include <recursive_cfg_builder.h>
Public Member Functions | |
virtual void | buildCFG () override |
Builds cfg . More... | |
![]() | |
ShPtr< CFG > | getCFG (ShPtr< Function > func) |
Returns a CFG of the given function func. More... | |
Static Public Member Functions | |
static ShPtr< RecursiveCFGBuilder > | create () |
Creates and returns a new RecursiveCFGBuilder. More... | |
Private Types | |
using | StmtNodeMapping = std::unordered_map< ShPtr< Statement >, ShPtr< CFG::Node > > |
Mapping of a statement into its corresponding node. More... | |
Private Member Functions | |
RecursiveCFGBuilder () | |
Constructs a new builder. More... | |
ShPtr< CFG::Node > | addNode (ShPtr< Statement > stmt) |
Adds a (either new or existing) node starting with stmt into the CFG and returns it. More... | |
void | addStatement (ShPtr< Statement > stmt) |
Adds a statement to the current node, visits its successors, and adds a forward or backward edge from the current node to the successor/parent of stmt. More... | |
void | addForwardOrBackwardEdge (ShPtr< Statement > stmt, ShPtr< Expression > edgeCond=nullptr) |
Adds a forward or backward edge from the current node to the successor/parent of stmt. More... | |
ShPtr< CFG::Node > | getIndirectSuccessor (ShPtr< Statement > stmt) |
Returns the (indirect) successor node of the given statement stmt. More... | |
void | visitForOrUForLoop (ShPtr< Statement > loop, ShPtr< Statement > body) |
Implementation of visit() for for loops. More... | |
Visitor Interface | |
virtual void | visit (ShPtr< Function > func) override |
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 | visitStmt (ShPtr< Statement > stmt, bool visitSuccessors=true, bool visitNestedStmts=true) override |
Visits the given statement, and possibly its successors or nested statements. More... | |
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< 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... | |
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 | |
Private Attributes | |
ShPtr< CFG::Node > | currNode |
Currently generated node. More... | |
StmtNodeMapping | firstStmtNodeMapping |
![]() | |
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... | |
Additional Inherited Members | |
![]() | |
CFGBuilder ()=default | |
![]() | |
ShPtr< CFG > | cfg |
A CFG that is currently being built. More... | |
ShPtr< Function > | func |
A function from which the CFG is being built. More... | |
A recursive creator of control-flow graphs (CFGs) from functions.
|
private |
Mapping of a statement into its corresponding node.
|
private |
Constructs a new builder.
|
private |
Adds a forward or backward edge from the current node to the successor/parent of stmt.
[in] | stmt | Statement for which the edge is added. |
[in] | edgeCond | Optional condition of the added edge. |
If stmt->getParent()
does not exist, it implies that there is an implicit return from the function. If it exists and it is a while or for loop, it creates a backward edge. If it is an if or switch statement, it creates a forward edge.
Precondition:
This function may add new nodes.
|
private |
Adds a (either new or existing) node starting with stmt into the CFG and returns it.
Adds a statement to the current node, visits its successors, and adds a forward or backward edge from the current node to the successor/parent of stmt.
Empty statements are skipped (i.e. not added to cfg->stmtNodeMapping
and currNode->stmts
).
|
overridevirtual |
Builds cfg
.
When this function is called, cfg
and func
are correctly initialized.
Implements retdec::llvmir2hll::CFGBuilder.
|
static |
Creates and returns a new RecursiveCFGBuilder.
|
private |
Returns the (indirect) successor node of the given statement stmt.
This function may add new nodes.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
|
overrideprivate |
|
overrideprivate |
|
overrideprivate |
|
overrideprivatevirtual |
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 |
Implementation of visit() for for loops.
|
overrideprivatevirtual |
Visits the given statement, and possibly its successors or nested statements.
[in] | stmt | Statement to be visited. |
[in] | visitSuccessors | If true , a successor of stmt is also visited (and a successor of this successor, and so on). |
[in] | visitNestedStmts | If true , nested statements are also visited, e.g. loop, if, and switch statement's bodies. |
If stmt has already been accessed, this function does nothing. If stmt is the null pointer, it also does nothing. Before visiting stmt, this function adds it to accessedStmts
.
Reimplemented from retdec::llvmir2hll::OrderedAllVisitor.
Currently generated node.
|
private |
Mapping between a statement S
and a node N
of which S
is the first statement.