checkpoint
authoradam <adam@megacz.com>
Thu, 5 May 2005 03:07:52 +0000 (03:07 +0000)
committeradam <adam@megacz.com>
Thu, 5 May 2005 03:07:52 +0000 (03:07 +0000)
darcs-hash:20050505030752-5007d-bc4cc39d0e147ebbee4e80ccc322a66d3f3bb84e.gz

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

index 8c55976..7768432 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,13 @@
 #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
-cp        =  lib/soot.jar:bin
-sootcp    = ${cp}:/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/classes.jar
+sootcp    = lib/soot.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/classes.jar
 #mainclass = org.ibex.graphics.Mesh
 mainclass = edu.berkeley.cs.megacz.Test
 
 go:
        rm -rf sootOutput out.jar out
        javac -classpath lib/soot.jar -d bin `find src/ -name \*.java`
-       java -cp ${cp} edu.berkeley.cs.megacz.Transformer -app -i edu.berkeley.cs.megacz -outjar -cp ${sootcp} ${mainclass}
-       mv sootOutput out.jar
-       mkdir -p out; cd out; jar xvf ../out.jar
+       mkdir -p out
+       java -cp bin:lib/soot.jar edu.berkeley.cs.megacz.Transformer -app -i edu.berkeley.cs.megacz -d out -cp ${sootcp}:bin ${mainclass}
+       java -jar lib/soot.jar -process-dir out -f d -cp ${sootcp}:out edu.berkeley.cs.megacz.Test
        cd out; find . -name \*.class -exec jad {} \;
        cat out/Test.jad
index a219300..eca2504 100644 (file)
@@ -12,12 +12,13 @@ public class Test {
     Inner z;
 
     public void bar(Inner x) {
+        x.foo = 3;
     }
 
     public Test() {
         z = new Inner();
         Inner q = z;
-        q.foo = 3;
+        bar(q);
         System.out.println(q.foo);
     }
 }
index 513e0fa..7c49c40 100644 (file)
@@ -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("<init>")) continue;
+            if (m.getName().equals("<clinit>")) 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;
     }
 }