private String getCommaSeparatedPath(DFANode node, DFAGraph graph, List<DFANode> pdtNodeList) { LinkedList<DFANode> list = new LinkedList<DFANode>(); list.add(node); Set<DFANode> preds = node.getPreds(); while (preds != null && preds.size() > 0) { DFANode parent = preds.iterator().next(); list.addFirst(parent); preds = parent.getPreds(); } StringBuffer retStr = new StringBuffer(); for (DFANode dfa : list) { retStr.append(pdtNodeList.indexOf(dfa)); retStr.append(","); } if (PrintTools.getVerbosity() > 1) System.out.println( "String: " + retStr.toString() + ", for node: " + ((DFANode) ((DFANode) node.getData("revNode")).getData("cfgNode")).getData("ir") + "(" + ((DFANode) ((DFANode) node.getData("revNode")).getData("cfgNode")).getData("tag") + ")"); return retStr.toString(); }
private Set<CFGEdge> extractNonPostdominatingEdges( DFAGraph reverseCFG, DFAGraph postDomTree, Procedure proc) { if (PrintTools.getVerbosity() > 1) System.out.println("[extractNonPostdominatingEdges]Proc: " + proc.getSymbolName()); Set<CFGEdge> retSet = new HashSet<CFGEdge>(); // extract all the edges from CFG Set<CFGEdge> allEdgeList = new HashSet<CFGEdge>(); Iterator<DFANode> iter = reverseCFG.iterator(); while (iter.hasNext()) { DFANode currentNode = iter.next(); Set<DFANode> predSet = currentNode.getPreds(); for (DFANode pred : predSet) { // In the reversed cfg, pred is succ in CFG allEdgeList.add(new CFGEdge(currentNode, pred)); } } List<DFANode> entryNodes = postDomTree.getEntryNodes(); if (entryNodes.size() != 1) { throw new RuntimeException( "Size of Entry node on PD Tree is not 1. Size: " + entryNodes.size()); } DFANode entryNode = entryNodes.get(0); // extract edge which head does not postdominate tail // (head is not parent of tail on PostDomTree) for (CFGEdge edge : allEdgeList) { // DFANode pdtTail = (DFANode) edge.tail.getData("pdtNode"); DFANode pdtHead = (DFANode) edge.head.getData("pdtNode"); Set<DFANode> predSet = pdtTail.getPreds(); boolean postDom = false; while (predSet.size() != 0) { if (predSet.size() > 1) { throw new RuntimeException("The size of predecessor is expected to be less than 2"); } DFANode pdtNode = predSet.iterator().next(); if (pdtNode.equals(pdtHead)) { postDom = true; break; } predSet = pdtNode.getPreds(); } if (postDom == false) { retSet.add(edge); if (PrintTools.getVerbosity() > 1) System.out.println( "Found Edge: " + ((DFANode) edge.tail.getData("cfgNode")).getData("ir") + " --> " + ((DFANode) edge.head.getData("cfgNode")).getData("ir") + "(" + ((DFANode) edge.head.getData("cfgNode")).getData("tag") + ")"); } } return retSet; }
private Set<DFANode> getControlDependentSet(CFGEdge edge, DFANode commonAncestor) { Set<DFANode> retSet = new HashSet<DFANode>(); DFANode pdtHead = edge.head.getData("pdtNode"); Set<DFANode> preds = pdtHead.getPreds(); retSet.add(pdtHead); while (preds != null && preds.size() > 0) { DFANode parent = preds.iterator().next(); if (parent.equals(commonAncestor)) { break; } retSet.add(parent); preds = parent.getPreds(); } return retSet; }