package cdg; import graphutils.AbstractTwoWayGraph; import cfg.CFG; import cfg.CFGEdge; import cfg.nodes.CFGNode; /** * A reverse control flow graph augmented with an edge from the exit node to the * start node. * * @param <V> * the vertex type */ public class ReverseCFG extends AbstractTwoWayGraph<CFGNode, CFGEdge> { private CFGNode entry; private CFGNode exit; private ReverseCFG() { } public static ReverseCFG newInstance(CFG cfg) { ReverseCFG reverseCFG = new ReverseCFG(); for (CFGNode vertex : cfg.getVertices()) { reverseCFG.addVertex(vertex); } for (CFGEdge edge : cfg.getEdges()) { CFGEdge reverseEdge = new CFGEdge(edge.getDestination(), edge.getSource(), edge.getLabel()); reverseCFG.addEdge(reverseEdge); } reverseCFG.entry = cfg.getExitNode(); reverseCFG.exit = cfg.getEntryNode(); CFGEdge augmentedEdge = new CFGEdge(reverseCFG.getEntryNode(), reverseCFG.getExitNode(), CFGEdge.EMPTY_LABEL); reverseCFG.addEdge(augmentedEdge); return reverseCFG; } public CFGNode getEntryNode() { return entry; } public CFGNode getExitNode() { return exit; } }