package olhotak.liveness; import soot.*; import soot.util.*; import java.util.*; import soot.jimple.*; import soot.toolkits.graph.*; import soot.toolkits.scalar.*; class LiveVariablesAnalysis extends BackwardFlowAnalysis { protected void copy(Object src, Object dest) { FlowSet srcSet = (FlowSet) src; FlowSet destSet = (FlowSet) dest; srcSet.copy(destSet); } protected void merge(Object src1, Object src2, Object dest) { FlowSet srcSet1 = (FlowSet) src1; FlowSet srcSet2 = (FlowSet) src2; FlowSet destSet = (FlowSet) dest; srcSet1.union(srcSet2, destSet); } protected void flowThrough(Object srcValue, Object unit, Object destValue) { FlowSet dest = (FlowSet) destValue; FlowSet src = (FlowSet) srcValue; Unit s = (Unit) unit; src.copy (dest); // Take out kill set Iterator boxIt = s.getDefBoxes().iterator(); while (boxIt.hasNext()) { ValueBox box = (ValueBox) boxIt.next(); Value value = box.getValue(); if (value instanceof Local) dest.remove(value); } // Add gen set boxIt = s.getUseBoxes().iterator(); while (boxIt.hasNext()) { ValueBox box = (ValueBox) boxIt.next(); Value value = box.getValue(); if (value instanceof Local) dest.add(value); } } protected Object entryInitialFlow() { return new ArraySparseSet(); } protected Object newInitialFlow() { return new ArraySparseSet(); } LiveVariablesAnalysis(DirectedGraph g) { super(g); doAnalysis(); } }