retdec
recursive_cfg_builder.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_GRAPHS_CFG_CFG_BUILDERS_RECURSIVE_CFG_BUILDER_H
8 #define RETDEC_LLVMIR2HLL_GRAPHS_CFG_CFG_BUILDERS_RECURSIVE_CFG_BUILDER_H
9 
15 
16 namespace retdec {
17 namespace llvmir2hll {
18 
27  private OrderedAllVisitor {
28 public:
29  virtual void buildCFG() override;
30 
32 
33 private:
35  using StmtNodeMapping = std::unordered_map<ShPtr<Statement>, ShPtr<CFG::Node>>;
36 
37 private:
39 
43  virtual void visit(ShPtr<Function> func) override;
44  virtual void visit(ShPtr<AssignStmt> stmt) override;
45  virtual void visit(ShPtr<VarDefStmt> stmt) override;
46  virtual void visit(ShPtr<CallStmt> stmt) override;
47  virtual void visit(ShPtr<ReturnStmt> stmt) override;
48  virtual void visit(ShPtr<EmptyStmt> stmt) override;
49  virtual void visit(ShPtr<IfStmt> stmt) override;
50  virtual void visit(ShPtr<SwitchStmt> stmt) override;
51  virtual void visit(ShPtr<WhileLoopStmt> stmt) override;
52  virtual void visit(ShPtr<ForLoopStmt> stmt) override;
53  virtual void visit(ShPtr<UForLoopStmt> stmt) override;
54  virtual void visit(ShPtr<BreakStmt> stmt) override;
55  virtual void visit(ShPtr<ContinueStmt> stmt) override;
56  virtual void visit(ShPtr<GotoStmt> stmt) override;
57  virtual void visit(ShPtr<UnreachableStmt> stmt) override;
58  virtual void visitStmt(ShPtr<Statement> stmt, bool visitSuccessors = true,
59  bool visitNestedStmts = true) override;
61 
63  void addStatement(ShPtr<Statement> stmt);
65  ShPtr<Expression> edgeCond = nullptr);
68 
69 private:
72 
76 };
77 
78 } // namespace llvmir2hll
79 } // namespace retdec
80 
81 #endif
A representation of a control-flow graph (CFG).
A base class for creators of control-flow graphs (CFGs) from functions.
A base class for creators of control-flow graphs (CFGs) from functions.
Definition: cfg_builder.h:31
ShPtr< Function > func
A function from which the CFG is being built.
Definition: cfg_builder.h:43
A visitor that visits everything in an ordered way.
Definition: ordered_all_visitor.h:44
bool visitSuccessors
Should statements' successor be accessed?
Definition: ordered_all_visitor.h:144
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
bool visitNestedStmts
Should nested statements be accessed?
Definition: ordered_all_visitor.h:147
A recursive creator of control-flow graphs (CFGs) from functions.
Definition: recursive_cfg_builder.h:27
virtual void visitStmt(ShPtr< Statement > stmt, bool visitSuccessors=true, bool visitNestedStmts=true) override
Visits the given statement, and possibly its successors or nested statements.
Definition: recursive_cfg_builder.cpp:391
RecursiveCFGBuilder()
Constructs a new builder.
Definition: recursive_cfg_builder.cpp:147
ShPtr< CFG::Node > addNode(ShPtr< Statement > stmt)
Adds a (either new or existing) node starting with stmt into the CFG and returns it.
Definition: recursive_cfg_builder.cpp:426
static ShPtr< RecursiveCFGBuilder > create()
Creates and returns a new RecursiveCFGBuilder.
Definition: recursive_cfg_builder.cpp:179
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.
Definition: recursive_cfg_builder.cpp:481
ShPtr< CFG::Node > currNode
Currently generated node.
Definition: recursive_cfg_builder.h:71
StmtNodeMapping firstStmtNodeMapping
Definition: recursive_cfg_builder.h:75
ShPtr< CFG::Node > getIndirectSuccessor(ShPtr< Statement > stmt)
Returns the (indirect) successor node of the given statement stmt.
Definition: recursive_cfg_builder.cpp:495
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
std::unordered_map< ShPtr< Statement >, ShPtr< CFG::Node > > StmtNodeMapping
Mapping of a statement into its corresponding node.
Definition: recursive_cfg_builder.h:35
void addStatement(ShPtr< Statement > stmt)
Adds a statement to the current node, visits its successors, and adds a forward or backward edge from...
Definition: recursive_cfg_builder.cpp:451
void visitForOrUForLoop(ShPtr< Statement > loop, ShPtr< Statement > body)
Implementation of visit() for for loops.
Definition: recursive_cfg_builder.cpp:570
virtual void buildCFG() override
Builds cfg.
Definition: recursive_cfg_builder.cpp:150
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
Definition: archive_wrapper.h:19
A visitor that visits everything in an ordered way.
Declarations, aliases, macros, etc. for the use of smart pointers.
Aliases for several useful types.