| 1 19 20 package soot.toolkits.graph; 21 22 import soot.*; 23 import soot.toolkits.scalar.*; 24 import soot.toolkits.graph.*; 25 import soot.jimple.*; 26 import java.util.*; 27 import soot.util.*; 28 29 39 public class CytronDominanceFrontier implements DominanceFrontier 40 { 41 protected DominatorTree dt; 42 protected Map nodeToFrontier; 43 44 public CytronDominanceFrontier(DominatorTree dt) 45 { 46 this.dt = dt; 47 nodeToFrontier = new HashMap(); 48 bottomUpDispatch(dt.getHead()); 49 } 50 51 public List getDominanceFrontierOf(DominatorNode node) 52 { 53 ArrayList frontier = (ArrayList) nodeToFrontier.get(node); 54 55 if(frontier == null) 56 throw new RuntimeException ("Frontier not defined for node: " + node); 57 58 return (List) frontier.clone(); 59 } 60 61 protected boolean isFrontierKnown(DominatorNode node) 62 { 63 return nodeToFrontier.containsKey(node); 64 } 65 66 70 protected void bottomUpDispatch(DominatorNode node) 71 { 72 76 if(isFrontierKnown(node)) 77 return; 78 79 Iterator children = dt.getChildrenOf(node).iterator(); 80 81 while(children.hasNext()){ 82 DominatorNode child = (DominatorNode) children.next(); 83 84 if(!isFrontierKnown(child)) 85 bottomUpDispatch(child); 86 } 87 88 processNode(node); 89 } 90 91 110 protected void processNode(DominatorNode node) 111 { 112 List dominanceFrontier = new ArrayList(); 113 114 { 116 Iterator succsIt = dt.getSuccsOf(node).iterator(); 117 118 while(succsIt.hasNext()){ 119 DominatorNode succ = (DominatorNode) succsIt.next(); 120 121 if(!dt.isImmediateDominatorOf(node, succ)) 122 dominanceFrontier.add(succ); 123 } 124 } 125 126 { 128 Iterator childIt = dt.getChildrenOf(node).iterator(); 129 130 while(childIt.hasNext()){ 131 DominatorNode child = (DominatorNode) childIt.next(); 132 133 Iterator childFrontIt = getDominanceFrontierOf(child).iterator(); 134 135 while(childFrontIt.hasNext()){ 136 DominatorNode childFront = (DominatorNode) childFrontIt.next(); 137 138 if(!dt.isImmediateDominatorOf(node, childFront)) 139 dominanceFrontier.add(childFront); 140 } 141 } 142 } 143 144 nodeToFrontier.put(node, dominanceFrontier); 145 } 146 } 147 148 | Popular Tags |