#pragma once #include #include #include #include #include #include "IR/IR_basic.h" using CFGNodeCollection = std::list; class CFGNodeType { public: std::vector successors, predecessors; BlockItem *corresponding_block; CFGNodeCollection dom; bool visited; CFGNodeType *idom; std::vector successors_in_dom_tree; CFGNodeCollection dom_frontier; }; class CFGType { public: std::vector> nodes; CFGNodeType *entry; std::unordered_map block_to_node; std::unordered_map label_to_block; }; CFGNodeCollection GetCFGNodeCollectionsIntersection(const CFGNodeCollection &a, const CFGNodeCollection &b); CFGNodeCollection GetCFGNodeCollectionsUnion(const CFGNodeCollection &a, const CFGNodeCollection &b); CFGNodeCollection GetCFGNodeCollectionsDifference(const CFGNodeCollection &a, const CFGNodeCollection &b); bool CFGNodeCollectionIsSame(const CFGNodeCollection &a, const CFGNodeCollection &b); CFGType BuildCFGForFunction(const std::shared_ptr &func);