checkpoint
authoradam <adam@megacz.com>
Fri, 6 May 2005 08:54:37 +0000 (08:54 +0000)
committeradam <adam@megacz.com>
Fri, 6 May 2005 08:54:37 +0000 (08:54 +0000)
darcs-hash:20050506085437-5007d-f87dd68c8c79849f0950f47bcb0ebe8989936687.gz

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

index fae81c5..d9b8c02 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,14 +2,32 @@
 sootcp    = lib/soot.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/classes.jar
 
 #mainclass = edu.berkeley.cs.megacz.Test
-mainclass = org.ibex.graphics.Mesh
+#mainclass = org.ibex.graphics.Mesh
 
 go:
-       javac -classpath lib/soot.jar -d bin `find src/ -name \*.java`
+       javac -classpath lib/soot.jar:bin -d bin `find src/ -name \*.java`
        mkdir -p in
-       cd in; for A in /Users/megacz/ibex.org.arenaj/jar/*.jar; do jar xf $$A; done
-       mkdir -p out
-       java -cp bin:lib/soot.jar edu.berkeley.cs.megacz.Transformer -keep-line-number -app -i org.ibex.graphics -d out -cp ${sootcp}:in ${mainclass}
+#      cd in; for A in /Users/megacz/ibex.org.arenaj/jar/*.jar; do jar xf $$A; done
+#      mkdir -p out
+#      java -cp bin:lib/soot.jar edu.berkeley.cs.megacz.Transformer -keep-line-number -app -i org.ibex.graphics -d out -cp ${sootcp}:in org.ibex.graphics.Mesh
+       java -cp bin:lib/soot.jar edu.berkeley.cs.megacz.Transformer \
+               -keep-line-number \
+               -app -i org.ibex.graphics \
+               -w \
+               -d out \
+               -cp ${sootcp}:bin \
+               -p cg enabled:false \
+               -p cg.cha enabled:false \
+               -p cg.spark enabled:false \
+               -p cg.paddle enabled:false \
+               -p wjap.ra enabled:false \
+               -p wjap.umt enabled:false \
+               -p wjap.uft enabled:false \
+               -p wjap.tqt enabled:false \
+               -p wjap.cgg enabled:false \
+               edu.berkeley.cs.megacz.GCBench
+
+
 #      java -jar lib/soot.jar -app -i org.ibex.graphics -f d -d outsrc -cp ${sootcp}:out ${mainclass}
 #      cd out; find . -name \*.class -exec jad {} \;
 #      cat out/Test.jad
index 453a2fb..fa8922d 100644 (file)
@@ -5,18 +5,20 @@ import soot.util.*;
 import java.io.*;
 import java.util.*;
 
-public class Transformer extends BodyTransformer {    
+public class Transformer extends SceneTransformer {    
 
     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);
@@ -78,6 +80,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(c) == 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)));
+
+            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 +115,48 @@ 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"));
+        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();
+        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);
+        body.getUnits().add(Jimple.v().newAssignStmt(l, sfr));
+        body.getUnits().add(Jimple.v().newAssignStmt(l2, Jimple.v().newAddExpr(l, IntConstant.v(1))));
+        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();
+    }
+
     public void nuke(SootClass c) {
         for(Iterator it = c.getFields().iterator(); it.hasNext();) {
             SootField f = (SootField)it.next();
@@ -125,10 +175,12 @@ 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 (m.hasActiveBody() && !m.isStatic()) m.setActiveBody(fixBody(m.getActiveBody()));
             if (m.getName().equals("<init>")) continue;
             if (m.getName().equals("<clinit>")) continue;
             //if (map.get(m) != null) continue;
@@ -203,6 +255,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 +289,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);
                         }