1 19 20 25 26 package soot.jimple.toolkits.annotation.profiling; 27 28 import soot.*; 29 import soot.jimple.*; 30 import soot.toolkits.graph.*; 31 import soot.util.*; 32 33 import soot.tagkit.*; 34 35 import java.util.*; 36 import soot.options.ProfilingOptions; 37 38 public class ProfilingGenerator extends BodyTransformer 39 { 40 public ProfilingGenerator( Singletons.Global g ) {} 41 public static ProfilingGenerator v() { return G.v().soot_jimple_toolkits_annotation_profiling_ProfilingGenerator(); } 42 43 public String mainSignature = "void main(java.lang.String[])"; 44 45 47 protected void internalTransform(Body body, String phaseName, Map opts) 48 { 49 ProfilingOptions options = new ProfilingOptions( opts ); 50 if (options.notmainentry()) 51 mainSignature = "long runBenchmark(java.lang.String[])"; 52 53 { 54 SootMethod m = body.getMethod(); 55 56 SootClass counterClass = Scene.v().loadClassAndSupport("MultiCounter"); 57 SootMethod reset = counterClass.getMethod("void reset()") ; 58 SootMethod report = counterClass.getMethod("void report()") ; 59 60 boolean isMainMethod= m.getSubSignature().equals(mainSignature); 61 62 Chain units = body.getUnits(); 63 64 if (isMainMethod) 65 { 66 units.addFirst(Jimple.v().newInvokeStmt( 67 Jimple.v().newStaticInvokeExpr(reset.makeRef()))); 68 } 69 70 Iterator stmtIt = body.getUnits().snapshotIterator(); 71 while (stmtIt.hasNext()) 72 { 73 Stmt stmt = (Stmt)stmtIt.next(); 74 75 if (stmt instanceof InvokeStmt) 76 { 77 InvokeExpr iexpr = (InvokeExpr) 78 ((InvokeStmt)stmt).getInvokeExpr() ; 79 80 if (iexpr instanceof StaticInvokeExpr) 81 { 82 SootMethod tempm = ((StaticInvokeExpr)iexpr).getMethod() ; 83 84 if (tempm.getSignature().equals( 85 "<java.lang.System: void exit(int)>")) 86 { 87 units.insertBefore (Jimple.v().newInvokeStmt( 88 Jimple.v().newStaticInvokeExpr(report.makeRef())), stmt) ; 89 90 } 91 } 92 } 93 else 94 if (isMainMethod 95 && ( stmt instanceof ReturnStmt 96 || stmt instanceof ReturnVoidStmt)) 97 { 98 units.insertBefore(Jimple.v().newInvokeStmt( 99 Jimple.v().newStaticInvokeExpr(report.makeRef())), stmt); 100 } 101 } 102 } 103 } 104 } 105 | Popular Tags |