1 19 20 package soot.jimple.toolkits.annotation.defs; 21 22 import soot.*; 23 import soot.toolkits.scalar.*; 24 import soot.toolkits.graph.*; 25 import soot.tagkit.*; 26 import java.util.*; 27 import soot.jimple.*; 28 29 public class ReachingDefsTagger extends BodyTransformer { 30 31 32 public ReachingDefsTagger(Singletons.Global g) {} 33 public static ReachingDefsTagger v() { return G.v().soot_jimple_toolkits_annotation_defs_ReachingDefsTagger();} 34 35 protected void internalTransform(Body b, String phaseName, Map options){ 36 37 UnitGraph g = new ExceptionalUnitGraph(b); 38 LocalDefs sld = new SmartLocalDefs(g, new SimpleLiveLocals(g)); 39 40 Iterator it = b.getUnits().iterator(); 41 while (it.hasNext()){ 42 Stmt s = (Stmt)it.next(); 43 Iterator usesIt = s.getUseBoxes().iterator(); 45 while (usesIt.hasNext()){ 46 ValueBox vbox = (ValueBox)usesIt.next(); 47 if (vbox.getValue() instanceof Local) { 48 Local l = (Local)vbox.getValue(); 49 Iterator rDefsIt = sld.getDefsOfAt(l, s).iterator(); 51 while (rDefsIt.hasNext()){ 52 Stmt next = (Stmt)rDefsIt.next(); 53 String info = l+" has reaching def: "+next.toString(); 54 s.addTag(new LinkTag(info, next, b.getMethod().getDeclaringClass().getName(), "Reaching Defs")); 55 } 56 } 57 } 58 } 59 } 60 } 61 | Popular Tags |