Control flow graph

Reference

Control flow graph algorithms.

Functions present:

  • dominators
  • post dominators
  • reachability
  • dominator tree
  • dominance frontier
class ppci.graph.cfg.ControlFlowGraph

Control flow graph.

Has methods to query properties of the control flow graph and its nodes.

Such as: - Dominators - Strict dominators - Immediate dominators - Post dominators - Strict post dominators - Immediate post dominators - Reachable nodes - Loops

bottom_up(tree)

Generator that yields all nodes in bottom up way

calculate_dominance_frontier()

Calculate the dominance frontier.

Algorithm from Ron Cytron et al.

how to calculate the dominance frontier for all nodes using the dominator tree.

calculate_loops()

Calculate loops by use of the dominator info

calculate_reach()

Calculate which nodes can reach what other nodes

children(n)

Return all children for node n

dominates(one, other)

Test whether a node dominates another node.

To test this, use the dominator tree, check where of the other node is below the one node in the tree by comparing discovery and finish intervals.

get_immediate_dominator(node)

Retrieve a nodes immediate dominator

get_immediate_post_dominator(node)

Retrieve a nodes immediate post dominator

post_dominates(one, other)

Test whether a node post dominates another node

strictly_dominates(one, other)

Test whether a node strictly dominates another node

validate()

Run some sanity checks on the control flow graph

class ppci.graph.cfg.ControlFlowNode(graph, name=None)
can_reach(other)

Test if this node can reach the another node

dominates(other)

Test whether this node dominates the other node

post_dominates(other)

Test whether this node post-dominates the other node

reached()

Test if this node is reached

class ppci.graph.cfg.DomTreeNode(node, children, interval)

A single node in the dominator tree.

below(other)

Test if this node is a descendant of this node.

below_or_same(other)

Test if this node is a descendant of this node (or is self)

class ppci.graph.cfg.Loop(header, rest)
header

Alias for field number 0

rest

Alias for field number 1

ppci.graph.cfg.bottom_up(tree)

Generator that yields all nodes in bottom up way

ppci.graph.cfg.bottom_up_recursive(tree)

Generator that yields all nodes in bottom up way

ppci.graph.cfg.ir_function_to_graph(ir_function)

Take an ir function and create a cfg of it

ppci.graph.cfg.pre_order(tree)

Traverse tree in pre-order