1 19 20 25 26 27 package soot.toolkits.scalar; 28 29 import soot.*; 30 import soot.toolkits.graph.*; 31 import soot.util.*; 32 import java.util.*; 33 import soot.options.*; 34 import soot.toolkits.graph.interaction.*; 35 36 37 38 43 public abstract class BackwardFlowAnalysis extends FlowAnalysis 44 { 45 46 public BackwardFlowAnalysis(DirectedGraph graph) 47 { 48 super(graph); 49 } 50 51 protected boolean isForward() 52 { 53 return false; 54 } 55 56 protected void doAnalysis() 57 { 58 final Map numbers = new HashMap(); 59 List orderedUnits = new PseudoTopologicalOrderer().newList(graph); 60 int i = 1; 61 for( Iterator uIt = orderedUnits.iterator(); uIt.hasNext(); ) { 62 final Object u = (Object ) uIt.next(); 63 numbers.put(u, new Integer (i)); 64 i++; 65 } 66 67 TreeSet changedUnits = new TreeSet( new Comparator() { 68 public int compare(Object o1, Object o2) { 69 Integer i1 = (Integer ) numbers.get(o1); 70 Integer i2 = (Integer ) numbers.get(o2); 71 return -(i1.intValue() - i2.intValue()); 72 } 73 } ); 74 75 76 { 78 Iterator it = graph.iterator(); 79 80 while(it.hasNext()) 81 { 82 Object s = it.next(); 83 84 changedUnits.add(s); 85 86 unitToBeforeFlow.put(s, newInitialFlow()); 87 unitToAfterFlow.put(s, newInitialFlow()); 88 } 89 } 90 91 List tails = graph.getTails(); 92 93 { 96 Iterator it = tails.iterator(); 97 98 while (it.hasNext()) { 99 Object s = it.next(); 100 unitToAfterFlow.put(s, entryInitialFlow()); 102 } 103 } 104 105 { 107 Object previousBeforeFlow = newInitialFlow(); 108 109 while(!changedUnits.isEmpty()) 110 { 111 Object beforeFlow; 112 Object afterFlow; 113 114 Object s = changedUnits.first(); 115 changedUnits.remove(s); 116 boolean isTail = tails.contains(s); 117 118 copy(unitToBeforeFlow.get(s), previousBeforeFlow); 119 120 { 122 List succs = graph.getSuccsOf(s); 123 124 afterFlow = unitToAfterFlow.get(s); 125 126 if(succs.size() == 1) 127 copy(unitToBeforeFlow.get(succs.get(0)), afterFlow); 128 else if(succs.size() != 0) 129 { 130 Iterator succIt = succs.iterator(); 131 132 copy(unitToBeforeFlow.get(succIt.next()), afterFlow); 133 134 while(succIt.hasNext()) 135 { 136 Object otherBranchFlow = unitToBeforeFlow.get(succIt.next()); 137 merge(afterFlow, otherBranchFlow); 138 } 139 140 if(isTail && succs.size() != 0) 141 merge(afterFlow, entryInitialFlow()); 142 } 143 } 144 145 { 147 beforeFlow = unitToBeforeFlow.get(s); 148 if (Options.v().interactive_mode()){ 149 Object savedFlow = newInitialFlow(); 150 if (filterUnitToAfterFlow != null){ 151 savedFlow = filterUnitToAfterFlow.get(s); 152 copy(filterUnitToAfterFlow.get(s), savedFlow); 153 } 154 else { 155 copy(afterFlow, savedFlow); 156 } 157 FlowInfo fi = new FlowInfo(savedFlow, s, false); 158 if (InteractionHandler.v().getStopUnitList() != null && InteractionHandler.v().getStopUnitList().contains(s)){ 159 InteractionHandler.v().handleStopAtNodeEvent(s); 160 } 161 InteractionHandler.v().handleAfterAnalysisEvent(fi); 162 } 163 flowThrough(afterFlow, s, beforeFlow); 164 if (Options.v().interactive_mode()){ 165 Object bSavedFlow = newInitialFlow(); 166 if (filterUnitToBeforeFlow != null){ 167 bSavedFlow = filterUnitToBeforeFlow.get(s); 168 copy(filterUnitToBeforeFlow.get(s), bSavedFlow); 169 } 170 else { 171 copy(beforeFlow, bSavedFlow); 172 } 173 FlowInfo fi = new FlowInfo(bSavedFlow, s, true); 174 InteractionHandler.v().handleBeforeAnalysisEvent(fi); 175 } 176 } 177 178 if(!beforeFlow.equals(previousBeforeFlow)) 180 { 181 Iterator predIt = graph.getPredsOf(s).iterator(); 182 183 while(predIt.hasNext()) 184 { 185 Object pred = predIt.next(); 186 187 changedUnits.add(pred); 188 } 189 } 190 } 191 } 192 } 193 } 194 195 196 197 | Popular Tags |