checkpoint
authoradam <adam@megacz.com>
Fri, 6 May 2005 11:15:27 +0000 (11:15 +0000)
committeradam <adam@megacz.com>
Fri, 6 May 2005 11:15:27 +0000 (11:15 +0000)
darcs-hash:20050506111527-5007d-1ce97cb9ea04d3c83e519d1ab51ce07a1d7634d9.gz

Makefile
src/edu/berkeley/cs/megacz/Transformer.java

index d9b8c02..828aeba 100644 (file)
--- 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
 
index fa8922d..8473f80 100644 (file)
@@ -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("<init>", 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("<init>", 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("<init>")) continue;
             if (m.hasActiveBody() && !m.isStatic()) m.setActiveBody(fixBody(m.getActiveBody()));
             if (m.getName().equals("<init>")) continue;
             if (m.getName().equals("<clinit>")) continue;