| 1 19 20 25 26 27 28 package soot.jimple.toolkits.scalar; 29 import soot.options.*; 30 31 import soot.util.*; 32 import soot.*; 33 import soot.jimple.*; 34 import java.io.*; 35 import java.util.*; 36 import soot.toolkits.graph.*; 37 import soot.toolkits.exceptions.PedanticThrowAnalysis; 38 39 public class UnreachableCodeEliminator extends BodyTransformer 40 { 41 public UnreachableCodeEliminator( Singletons.Global g ) {} 42 public static UnreachableCodeEliminator v() { return G.v().soot_jimple_toolkits_scalar_UnreachableCodeEliminator(); } 43 44 protected void internalTransform(Body b, String phaseName, Map options) 45 { 46 new Instance().internalTransform(b, phaseName, options); 47 } 48 49 class Instance { 50 ExceptionalUnitGraph stmtGraph; 51 HashSet visited; 52 int numPruned; 53 54 protected void internalTransform(Body b, String phaseName, Map options) 55 { 56 StmtBody body = (StmtBody)b; 57 58 if (Options.v().verbose()) 59 G.v().out.println("[" + body.getMethod().getName() + "] Eliminating unreachable code..."); 60 61 numPruned = 0; 62 63 if (PhaseOptions.getBoolean(options, "remove-unreachable-traps")) { 64 stmtGraph = new ExceptionalUnitGraph(body); 65 } else { 66 stmtGraph = new ExceptionalUnitGraph(body, PedanticThrowAnalysis.v(), 72 false); 73 } 74 visited = new HashSet(); 75 76 Map handlerToTraps = new HashMap(); 79 for( Iterator trapIt = body.getTraps().iterator(); trapIt.hasNext(); ) { 80 final Trap trap = (Trap) trapIt.next(); 81 Unit handler = trap.getHandlerUnit(); 82 Set handlersTraps = (Set) handlerToTraps.get(handler); 83 if (handlersTraps == null) { 84 handlersTraps = new ArraySet(3); 85 handlerToTraps.put(handler, handlersTraps); 86 } 87 handlersTraps.add(trap); 88 } 89 90 94 if (!body.getUnits().isEmpty()) { 95 LinkedList startPoints = new LinkedList(); 96 startPoints.addLast(body.getUnits().getFirst()); 97 98 visitStmts(startPoints); 99 } 100 101 Iterator stmtIt = body.getUnits().snapshotIterator(); 102 while (stmtIt.hasNext()) 103 { 104 Stmt stmt = (Stmt)stmtIt.next(); 106 107 if (!visited.contains(stmt)) 108 { 109 body.getUnits().remove(stmt); 110 Set traps = (Set) handlerToTraps.get(stmt); 111 if (traps != null) { 112 for( Iterator trapIt = traps.iterator(); trapIt.hasNext(); ) { 113 final Trap trap = (Trap) trapIt.next(); 114 body.getTraps().remove(trap); 115 } 116 } 117 numPruned++; 118 } 119 } 120 if (Options.v().verbose()) 121 G.v().out.println("[" + body.getMethod().getName() + "] Removed " + numPruned + " statements..."); 122 123 { 137 Iterator trapIt = b.getTraps().iterator(); 138 139 while(trapIt.hasNext()) 140 { 141 Trap t = (Trap) trapIt.next(); 142 143 if(t.getBeginUnit() == t.getEndUnit()) 144 trapIt.remove(); 145 } 146 } 147 148 } 150 private void visitStmts(LinkedList st) { 151 152 154 while (!st.isEmpty()) { 155 Object stmt = st.removeLast(); 156 if (!visited.contains(stmt)) { 157 visited.add(stmt); 158 Iterator succIt = stmtGraph.getSuccsOf(stmt).iterator(); 159 while (succIt.hasNext()) { 160 Object o = succIt.next(); 161 if (!visited.contains(o)) 162 st.addLast(o); 163 } 164 } 165 } 166 } 168 } 169 } | Popular Tags |