X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fcs%2Fmegacz%2FTransformer.java;h=7c49c405c0062de85a352dc2e360bd9171d32879;hb=d82239f6ad1be37c08754310a5ca8eb1bd10ea67;hp=513e0fa801604a4afc38885274b1ebd7d4230f48;hpb=0baf4f123d065336c4c084b15b0806e785a56dff;p=org.ibex.arenaj.git diff --git a/src/edu/berkeley/cs/megacz/Transformer.java b/src/edu/berkeley/cs/megacz/Transformer.java index 513e0fa..7c49c40 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -15,7 +15,7 @@ public class Transformer extends BodyTransformer { if(args.length == 0) { System.out.println("Syntax: java " + v().getClass().getName() + " [soot options]"); System.exit(0); - } + } PackManager.v().getPack("jtp").add(new Transform("jtp.instrumenter", Transformer.v())); // Just in case, resolve the PrintStream SootClass. Scene.v().addBasicClass("java.io.PrintStream",SootClass.SIGNATURES); @@ -55,6 +55,7 @@ public class Transformer extends BodyTransformer { return nf; } + private Body body; public SootFieldRef getGladiatorFieldSizeRef(SootClass c) { SootClass mc = Scene.v().getMainClass(); String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_size"; @@ -74,9 +75,29 @@ public class Transformer extends BodyTransformer { return (t instanceof RefType) && isGladiator(((RefType)t).getSootClass()); } - protected void internalTransform(Body body, String phaseName, Map options) { - SootClass c = body.getMethod().getDeclaringClass(); + public SootMethodRef convert(SootMethodRef mr) { + List l = mr.parameterTypes(); + List l2 = new LinkedList(); + for(Iterator it2 = l.iterator(); it2.hasNext();) { + Type t = (Type)it2.next(); + l2.add(isGladiatorType(t) ? IntType.v() : t); + } + return Scene.v().makeMethodRef(mr.declaringClass(), + mr.name(), + l2, + isGladiatorType(mr.returnType()) ? IntType.v() : mr.returnType(), + mr.isStatic()); + } + boolean done = false; + public void internalTransform(Body bz, String phaseName, Map options) { + System.out.println("============= " + phaseName); + if (done) return; + done = true; + nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.Test$Inner")); + nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.Test")); + } + public void nuke(SootClass c) { for(Iterator it = c.getFields().iterator(); it.hasNext();) { SootField f = (SootField)it.next(); Type t = f.getType(); @@ -84,29 +105,40 @@ public class Transformer extends BodyTransformer { if (isGladiator(((RefType)t).getSootClass())) f.setType(IntType.v()); } - for(Iterator it = c.methodIterator(); it.hasNext();) { + List list = new LinkedList(); list.addAll(c.getMethods()); + for(Iterator it = list.iterator(); it.hasNext();) { SootMethod m = (SootMethod)it.next(); + if (m.hasActiveBody()) m.setActiveBody(fixBody(m.getActiveBody())); + if (m.getName().equals("")) continue; + if (m.getName().equals("")) continue; + //if (map.get(m) != null) continue; + //map.put(m, Boolean.TRUE); System.out.println(m.getName() + " -- " + m.getActiveBody()); - /* List l2 = new LinkedList(); List l = m.getParameterTypes(); for(Iterator it2 = l.iterator(); it2.hasNext();) { Type t = (Type)it2.next(); + //l2.add(t); l2.add(isGladiatorType(t) ? IntType.v() : t); + //if (isGladiatorType(t)) System.out.println("ought to swap " + t); } - m.setParameterTypes(l2); Type t = m.getReturnType(); - m.setReturnType(isGladiatorType(t) ? IntType.v() : t); - */ + c.removeMethod(m); + SootMethod meth = new SootMethod(m.getName(), l2, isGladiatorType(t) ? IntType.v() : t, m.getModifiers()); + meth.setActiveBody(m.getActiveBody()); + c.addMethod(meth); } + } + + protected Body fixBody(Body body) { + this.body = body; + Chain units = body.getUnits(); + Iterator stmtIt = units.snapshotIterator(); for(Iterator it = body.getLocals().snapshotIterator(); it.hasNext();) { Local l = (Local)it.next(); if (isGladiatorType(l.getType())) l.setType(IntType.v()); } - - Chain units = body.getUnits(); - Iterator stmtIt = units.snapshotIterator(); while(stmtIt.hasNext()) { Stmt s = (Stmt) stmtIt.next(); List l = s.getUseAndDefBoxes(); @@ -118,11 +150,12 @@ public class Transformer extends BodyTransformer { if (v instanceof InvokeExpr) { InvokeExpr ie = (InvokeExpr)v; - SootMethod m = ie.getMethod(); - if (isGladiator(m.getDeclaringClass())) { + SootMethodRef mr = ie.getMethodRef(); + if (isGladiator(mr.declaringClass())) { body.getUnits().remove(s); break; } + ie.setMethodRef(convert(mr)); } else if (v instanceof NewExpr) { NewExpr ne = (NewExpr)v; @@ -164,5 +197,6 @@ public class Transformer extends BodyTransformer { } } } + return body; } }