From 251e990674d9861b29d569abe3648cad09355107 Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 6 May 2005 11:15:27 +0000 Subject: [PATCH] checkpoint darcs-hash:20050506111527-5007d-1ce97cb9ea04d3c83e519d1ab51ce07a1d7634d9.gz --- Makefile | 6 +++ src/edu/berkeley/cs/megacz/Transformer.java | 70 +++++++++++++++++++++------ 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index d9b8c02..828aeba 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,12 @@ #cp = lib/soot.jar:/Users/megacz/ibex.org/jar/org.ibex.core.jar:/Users/megacz/ibex.org/jar/org.ibex.util.jar:/Users/megacz/ibex.org/jar/org.ibex.js.jar:/Users/megacz/ibex.org/jar/org.ibex.net.jar:/Users/megacz/ibex.org/jar/org.ibex.io.jar:bin sootcp = lib/soot.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/classes.jar +# IVME Paper +doc/charts/%.pdf: doc/charts/%.dat doc/charts/%.gnuplot + cd doc/charts; gnuplot $*.gnuplot + cd doc/charts; chmod +x boxfill.pl; ./boxfill.pl -g -o unfilled.eps $*.eps + cd doc/charts; ps2pdf $*.eps + #mainclass = edu.berkeley.cs.megacz.Test #mainclass = org.ibex.graphics.Mesh diff --git a/src/edu/berkeley/cs/megacz/Transformer.java b/src/edu/berkeley/cs/megacz/Transformer.java index fa8922d..8473f80 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -7,6 +7,8 @@ import java.util.*; public class Transformer extends SceneTransformer { + public static final int initialSize = 100; + private static Transformer instance = new Transformer(); private Transformer() { } @@ -54,7 +56,7 @@ public class Transformer extends SceneTransformer { 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()); @@ -67,8 +69,8 @@ public class Transformer extends SceneTransformer { 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); @@ -82,14 +84,14 @@ public class Transformer extends SceneTransformer { } public SootFieldRef getGladiatorFieldMaxRef(SootClass c) { SootClass mc = Scene.v().getMainClass(); - String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_max"; - if (map.get(c) == null) { + 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(0))); + body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, IntConstant.v(initialSize))); map.put(c, f); } @@ -123,7 +125,7 @@ public class Transformer extends SceneTransformer { //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")); - fixClass(Scene.v().getSootClass("edu.berkeley.cs.megacz.GCBench")); + 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")); } @@ -138,23 +140,60 @@ public class Transformer extends SceneTransformer { method.setActiveBody(body = Jimple.v().newBody(method)); body.setMethod(method); ((JimpleBody)body).insertIdentityStmts(); - InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldSizeRef(sc)); - InstanceFieldRef maxField = Jimple.v().newInstanceFieldRef(body.getThisLocal(), getGladiatorFieldMaxRef(sc)); 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)); - /* - body.getUnits().add(Jimple.v().newIfStmt(Jimple.v().newLtExpr(l2, l3), - Jimple.v().newReturnStmt(l2))); - */ - body.getUnits().add(Jimple.v().newReturnStmt(l2)); - body.validate(); + 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) { @@ -180,6 +219,7 @@ public class Transformer extends SceneTransformer { List list = new LinkedList(); list.addAll(c.getMethods()); for(Iterator it = list.iterator(); it.hasNext();) { SootMethod m = (SootMethod)it.next(); + 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; -- 1.7.10.4