X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fcs%2Fmegacz%2FTransformer.java;h=8473f8008696b8f0af0d972550a460f1f8450d75;hb=251e990674d9861b29d569abe3648cad09355107;hp=453a2fb09b8147bd57e59b8f56c47f3d53cef94b;hpb=e213e5cdb6dc8e744f318190e0d8fd1a9d20c15d;p=org.ibex.arenaj.git diff --git a/src/edu/berkeley/cs/megacz/Transformer.java b/src/edu/berkeley/cs/megacz/Transformer.java index 453a2fb..8473f80 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -5,18 +5,22 @@ import soot.util.*; import java.io.*; import java.util.*; -public class Transformer extends BodyTransformer { +public class Transformer extends SceneTransformer { + + public static final int initialSize = 100; private static Transformer instance = new Transformer(); - private Transformer() {} + private Transformer() { + } public static Transformer v() { return instance; } - + public static void main(String[] args) { 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())); + //PackManager.v().allPacks().add(v()); + PackManager.v().getPack("wjtp").add(new Transform("wjtp.tx", Transformer.v())); // Just in case, resolve the PrintStream SootClass. Scene.v().addBasicClass("java.io.PrintStream",SootClass.SIGNATURES); soot.Main.main(args); @@ -52,7 +56,7 @@ public class Transformer extends BodyTransformer { 0); oc.addField(nf); Body body = oc.getMethod("", new LinkedList()).getActiveBody(); - Expr newArr = Jimple.v().newNewArrayExpr(t, IntConstant.v(100000)); + Expr newArr = Jimple.v().newNewArrayExpr(t, IntConstant.v(initialSize)); Local newArrLocal = Jimple.v().newLocal("tmpRef" + (tfr++), f.type().makeArrayType()); body.getLocals().add(newArrLocal); InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), nf.makeRef()); @@ -65,8 +69,8 @@ public class Transformer extends BodyTransformer { private Body body; public SootFieldRef getGladiatorFieldSizeRef(SootClass c) { SootClass mc = Scene.v().getMainClass(); - String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_size"; - if (map.get(c) == null) { + String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$size"; + if (map.get(name) == null) { SootField f = new SootField(name, IntType.v()); mc.addField(f); @@ -78,6 +82,21 @@ public class Transformer extends BodyTransformer { } return Scene.v().makeFieldRef(mc, name, IntType.v(), false); } + public SootFieldRef getGladiatorFieldMaxRef(SootClass c) { + SootClass mc = Scene.v().getMainClass(); + String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$max"; + if (map.get(name) == null) { + SootField f = new SootField(name, IntType.v()); + mc.addField(f); + + Body body = mc.getMethod("", new LinkedList()).getActiveBody(); + InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), f.makeRef()); + body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, IntConstant.v(initialSize))); + + map.put(c, f); + } + return Scene.v().makeFieldRef(mc, name, IntType.v(), false); + } public boolean isGladiatorType(Type t) { return (t instanceof RefType) && isGladiator(((RefType)t).getSootClass()); @@ -98,15 +117,85 @@ public class Transformer extends BodyTransformer { } boolean done = false; - public void internalTransform(Body bz, String phaseName, Map options) { - System.out.println("============= " + phaseName); + public void internalTransform(String phaseName, Map options) { + System.out.println("============="); if (done) return; done = true; //nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.Test$Inner")); //nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.Test")); - nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh")); - nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh$Triangle")); + //nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh")); + //nuke(Scene.v().getSootClass("org.ibex.graphics.Mesh$Triangle")); + fixClass(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench$Node")); + nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench$Node")); + nuke(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench")); + } + + public void fixClass(SootClass sc) { + SootClass mc = Scene.v().getMainClass(); + String incFuncName = sc.getShortName().substring(sc.getShortName().lastIndexOf('$')+1) + "$$inc"; + SootMethod method = new SootMethod(incFuncName, new LinkedList(), + IntType.v(), Modifier.PRIVATE, + new LinkedList()); + mc.addMethod(method); + method.setActiveBody(body = Jimple.v().newBody(method)); + body.setMethod(method); + ((JimpleBody)body).insertIdentityStmts(); + Local l = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); + body.getLocals().add(l); + Local l2 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); + body.getLocals().add(l2); + Local l3 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); + body.getLocals().add(l3); + InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldSizeRef(sc)); + body.getUnits().add(Jimple.v().newAssignStmt(l, sfr)); + body.getUnits().add(Jimple.v().newAssignStmt(l2, Jimple.v().newAddExpr(l, IntConstant.v(1)))); + InstanceFieldRef maxField = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldMaxRef(sc)); + body.getUnits().add(Jimple.v().newAssignStmt(l3, maxField)); + Stmt stmt = Jimple.v().newReturnStmt(l2); + body.getUnits().add(Jimple.v().newIfStmt(Jimple.v().newLtExpr(l2, l3), stmt)); + + Local l4 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); + body.getLocals().add(l4); + body.getUnits().add(Jimple.v().newAssignStmt(l4, Jimple.v().newShlExpr(l3, IntConstant.v(1)))); + body.getUnits().add(Jimple.v().newAssignStmt(maxField, l4)); + + for(Iterator it = sc.getFields().iterator(); it.hasNext();) { + SootField f = getGladiatorField((SootField)it.next()); + InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), f.makeRef()); + Local ll0 = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType()); + body.getLocals().add(ll0); + body.getUnits().add(Jimple.v().newAssignStmt(ll0, ifr)); + Local ll = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType()); + body.getLocals().add(ll); + body.getUnits().add(Jimple.v().newAssignStmt(ll, + Jimple.v().newNewArrayExpr(((ArrayType)f.getType()).getElementType(), + l4))); + Type ot = Scene.v().getSootClass("java.lang.Object").getType(); + List types = new LinkedList(); + types.add(ot); + types.add(IntType.v()); + types.add(ot); + types.add(IntType.v()); + types.add(IntType.v()); + SootMethodRef arrayCopy = + Scene.v().makeMethodRef(Scene.v().getSootClass("java.lang.System"), + "arraycopy", + types, + VoidType.v(), + true); + List args = new LinkedList(); + args.add(ll0); + args.add(IntConstant.v(0)); + args.add(ll); + args.add(IntConstant.v(0)); + args.add(l3); + body.getUnits().add(Jimple.v().newInvokeStmt(Jimple.v().newStaticInvokeExpr(arrayCopy, args))); + body.getUnits().add(Jimple.v().newAssignStmt(ifr,ll)); + } + + body.getUnits().add(stmt); } + public void nuke(SootClass c) { for(Iterator it = c.getFields().iterator(); it.hasNext();) { SootField f = (SootField)it.next(); @@ -125,10 +214,13 @@ public class Transformer extends BodyTransformer { } } + //if (isGladiator(c)) fixClass(c); + 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 (isGladiator(c) && m.getName().equals("")) continue; + if (m.hasActiveBody() && !m.isStatic()) m.setActiveBody(fixBody(m.getActiveBody())); if (m.getName().equals("")) continue; if (m.getName().equals("")) continue; //if (map.get(m) != null) continue; @@ -203,6 +295,7 @@ public class Transformer extends BodyTransformer { SootMethodRef mr = ie.getMethodRef(); if (isGladiator(mr.declaringClass())) { body.getUnits().remove(s); + qq = 0; break; } mr = convert(mr); @@ -236,14 +329,10 @@ public class Transformer extends BodyTransformer { SootClass mc = Scene.v().getMainClass(); SootClass sc = ((RefType)ne.getBaseType()).getSootClass(); System.out.println(sc); - InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), - getGladiatorFieldSizeRef(sc)); - Local ll = viaLocal(sfr, body, s); - Local ll2 = Jimple.v().newLocal("tmpRef" + (tfr++), IntType.v()); - body.getLocals().add(ll2); - Stmt stmt = Jimple.v().newAssignStmt(ll2, Jimple.v().newAddExpr(ll, IntConstant.v(1))); - units.insertBefore(stmt, s); - units.insertAfter(Jimple.v().newAssignStmt(sfr, ll2), stmt); + String incFuncName = sc.getShortName().substring(sc.getShortName().lastIndexOf('$')+1) + "$$inc"; + SootMethodRef smr = Scene.v().makeMethodRef(mc, incFuncName, new LinkedList(), IntType.v(), false); + Expr invokeExpr = Jimple.v().newSpecialInvokeExpr(body.getThisLocal(), smr); + Local ll = viaLocal(invokeExpr, body, s); vb.setValue(ll); }