1 19 20 package soot.jimple.toolkits.pointer; 21 import soot.tagkit.*; 22 import soot.*; 23 import java.util.*; 24 import soot.toolkits.graph.*; 25 import soot.jimple.toolkits.callgraph.*; 26 import soot.jimple.*; 27 import java.io.*; 28 29 public class SideEffectTagger extends BodyTransformer 30 { 31 public SideEffectTagger( Singletons.Global g ) {} 32 public static SideEffectTagger v() { return G.v().soot_jimple_toolkits_pointer_SideEffectTagger(); } 33 34 public int numRWs = 0; 35 public int numWRs = 0; 36 public int numRRs = 0; 37 public int numWWs = 0; 38 public int numNatives = 0; 39 public Date startTime = null; 40 boolean optionNaive = false; 41 private CallGraph cg; 42 43 protected class UniqueRWSets { 44 protected ArrayList l = new ArrayList(); 45 RWSet getUnique( RWSet s ) { 46 if( s == null ) return s; 47 for( Iterator retIt = l.iterator(); retIt.hasNext(); ) { 48 final RWSet ret = (RWSet) retIt.next(); 49 if( ret.isEquivTo( s ) ) return ret; 50 } 51 l.add( s ); 52 return s; 53 } 54 Iterator iterator() { 55 return l.iterator(); 56 } 57 short indexOf( RWSet s ) { 58 short i = 0; 59 for( Iterator retIt = l.iterator(); retIt.hasNext(); ) { 60 final RWSet ret = (RWSet) retIt.next(); 61 if( ret.isEquivTo( s ) ) return i; 62 i++; 63 } 64 return -1; 65 } 66 } 67 68 protected void initializationStuff( String phaseName ) { 69 G.v().Union_factory = new UnionFactory() { 70 public Union newUnion() { return new MemoryEfficientRasUnion(); } 73 }; 74 75 if( startTime == null ) { 76 startTime = new Date(); 77 } 78 cg = Scene.v().getCallGraph(); 79 } 80 protected Object keyFor( Stmt s ) { 81 if( s.containsInvokeExpr() ) { 82 if( optionNaive ) throw new RuntimeException ( "shouldn't get here" ); 83 Iterator it = cg.edgesOutOf( s ); 84 if( !it.hasNext() ) { 85 return Collections.EMPTY_LIST; 86 } 87 ArrayList ret = new ArrayList(); 88 while( it.hasNext() ) { 89 ret.add( it.next() ); 90 } 91 return ret; 92 } else { 93 return s; 94 } 95 } 96 protected void internalTransform(Body body, String phaseName, Map options) 97 { 98 initializationStuff( phaseName ); 99 SideEffectAnalysis sea = Scene.v().getSideEffectAnalysis(); 100 optionNaive = PhaseOptions.getBoolean( options, "naive" ); 101 if( !optionNaive ) { 102 sea.findNTRWSets( body.getMethod() ); 103 } 104 HashMap stmtToReadSet = new HashMap(); 105 HashMap stmtToWriteSet = new HashMap(); 106 UniqueRWSets sets = new UniqueRWSets(); 107 boolean justDoTotallyConservativeThing = 108 body.getMethod().getName().equals( "<clinit>" ); 109 for( Iterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) { 110 final Stmt stmt = (Stmt) stmtIt.next(); 111 if( justDoTotallyConservativeThing 112 || ( optionNaive && stmt.containsInvokeExpr() ) ) { 113 stmtToReadSet.put( stmt, sets.getUnique( new FullRWSet() ) ); 114 stmtToWriteSet.put( stmt, sets.getUnique( new FullRWSet() ) ); 115 continue; 116 } 117 Object key = keyFor( stmt ); 118 if( !stmtToReadSet.containsKey( key ) ) { 119 stmtToReadSet.put( key, 120 sets.getUnique( sea.readSet( body.getMethod(), stmt ) ) ); 121 stmtToWriteSet.put( key, 122 sets.getUnique( sea.writeSet( body.getMethod(), stmt ) ) ); 123 } 124 } 125 DependenceGraph graph = new DependenceGraph(); 126 for( Iterator outerIt = sets.iterator(); outerIt.hasNext(); ) { 127 final RWSet outer = (RWSet) outerIt.next(); 128 129 for( Iterator innerIt = sets.iterator(); innerIt.hasNext(); ) { 130 131 final RWSet inner = (RWSet) innerIt.next(); 132 if( inner == outer ) break; 133 if( outer.hasNonEmptyIntersection( inner ) ) { 134 graph.addEdge( sets.indexOf( outer ), sets.indexOf( inner ) ); 137 } 138 } 139 } 140 body.getMethod().addTag( graph ); 141 for( Iterator stmtIt = body.getUnits().iterator(); stmtIt.hasNext(); ) { 142 final Stmt stmt = (Stmt) stmtIt.next(); 143 Object key; 144 if( optionNaive && stmt.containsInvokeExpr() ) { 145 key = stmt; 146 } else { 147 key = keyFor( stmt ); 148 } 149 RWSet read = (RWSet) stmtToReadSet.get( key ); 150 RWSet write = (RWSet) stmtToWriteSet.get( key ); 151 if( read != null || write != null ) { 152 DependenceTag tag = new DependenceTag(); 153 if( read != null && read.getCallsNative() ) { 154 tag.setCallsNative(); 155 numNatives++; 156 } else if( write != null && write.getCallsNative() ) { 157 tag.setCallsNative(); 158 numNatives++; 159 } 160 tag.setRead( sets.indexOf( read ) ); 161 tag.setWrite( sets.indexOf( write ) ); 162 stmt.addTag( tag ); 163 164 189 } 190 } 191 } 192 } 193 194 195 | Popular Tags |