version 0.2
[org.ibex.arenaj.git] / src / org / ibex / arenaj / Main.java
similarity index 86%
rename from src/edu/berkeley/cs/megacz/Transformer.java
rename to src/org/ibex/arenaj/Main.java
index 8473f80..27e2643 100644 (file)
@@ -1,29 +1,53 @@
-package edu.berkeley.cs.megacz;
+package org.ibex.arenaj;
 import soot.*;
 import soot.jimple.*;
 import soot.util.*;
 import java.io.*;
 import java.util.*;
 
-public class Transformer extends SceneTransformer {    
+public class Main extends SceneTransformer {    
 
     public static final int initialSize = 100;
 
-    private static Transformer instance = new Transformer();
-    private Transformer() {
-    }
-    public static Transformer v() { return instance; }
+    private static Main instance = new Main();
+    private Main() { }
+    public static Main v() { return instance; }
    
-    public static void main(String[] args)  {
+    public static void main(String[] args) throws Exception {
         if(args.length == 0) {
             System.out.println("Syntax: java " + v().getClass().getName() + " [soot options]");
             System.exit(0);
         }
-        //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);
+        PackManager.v().getPack("wjtp").add(new Transform("wjtp.tx", Main.v()));
+        String[] args2 = new String[args.length + 11];
+        System.arraycopy(args, 0, args2, 0, args.length-1);
+        String sootcp =
+            System.getProperty("java.class.path") + 
+            File.pathSeparator +
+            System.getProperty("sun.boot.class.path");
+        if (System.getProperty("java.ext.dirs") != null) {
+            StringTokenizer st = new StringTokenizer(File.pathSeparatorChar+"", System.getProperty("java.ext.dirs"));
+            while(st.hasMoreTokens()) {
+                File f = new File(st.nextToken());
+                if (!f.exists() || !f.isDirectory()) continue;
+                String[] jars = f.list();
+                for(int i=0; i<jars.length; i++)
+                    sootcp += File.pathSeparator + jars[i];
+            }
+        }
+        args2[args.length - 1] = "-w";
+        args2[args.length + 0] = "-p";
+        args2[args.length + 1] = "cg";
+        args2[args.length + 2] = "enabled:false";
+        args2[args.length + 3] = "-p";
+        args2[args.length + 4] = "wjap";
+        args2[args.length + 5] = "enabled:false";
+        args2[args.length + 6] = "-keep-line-number";
+        args2[args.length + 7] = "-keep-line-number";
+        args2[args.length + 8] = "-cp";
+        args2[args.length + 9] = sootcp;
+        args2[args.length + 10] = args[args.length-1];
+        soot.Main.main(args2);
     }
 
     static int tfr = 0;
@@ -37,7 +61,7 @@ public class Transformer extends SceneTransformer {
     HashMap map = new HashMap();
     HashSet size_added = new HashSet();
 
-    public boolean isGladiator(SootClass c) { return c.implementsInterface("edu.berkeley.cs.megacz.Gladiator"); }
+    public boolean isGladiator(SootClass c) { return c.implementsInterface("org.ibex.arenaj.Gladiator"); }
     public boolean isGladiatorField(SootField f)
         { return isGladiator(f.getDeclaringClass()) && !f.getName().equals("this") && f.getName().indexOf('$')==-1; }
     public boolean isGladiatorFieldRef(SootFieldRef f) {
@@ -68,7 +92,7 @@ public class Transformer extends SceneTransformer {
 
     private Body body;
     public SootFieldRef getGladiatorFieldSizeRef(SootClass c) {
-        SootClass mc = Scene.v().getMainClass();
+        SootClass mc = getParent(c);
         String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$size";
         if (map.get(name) == null) {
             SootField f = new SootField(name, IntType.v());
@@ -83,7 +107,7 @@ public class Transformer extends SceneTransformer {
         return Scene.v().makeFieldRef(mc, name, IntType.v(), false);
     }
     public SootFieldRef getGladiatorFieldMaxRef(SootClass c) {
-        SootClass mc = Scene.v().getMainClass();
+        SootClass mc = getParent(c);
         String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$$max";
         if (map.get(name) == null) {
             SootField f = new SootField(name, IntType.v());
@@ -118,20 +142,25 @@ public class Transformer extends SceneTransformer {
 
     boolean done = false;
     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"));
-        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"));
+        for(Iterator it = Scene.v().getApplicationClasses().iterator(); it.hasNext();) {
+            SootClass sc = (SootClass)it.next();
+            if (!isGladiator(sc)) continue;
+            System.out.println("fixing Gladiator class: " + sc);
+            fixClass(sc);
+        }
+        for(Iterator it = Scene.v().getApplicationClasses().iterator(); it.hasNext();) {
+            SootClass sc = (SootClass)it.next();
+            System.out.println("        updating class: " + sc);
+            nuke(sc);
+        }
+    }
+
+    public SootClass getParent(SootClass sc) {
+        return Scene.v().getSootClass(sc.getName().substring(0, sc.getName().lastIndexOf('$')));
     }
 
     public void fixClass(SootClass sc) {
-        SootClass mc = Scene.v().getMainClass();
+        SootClass mc = getParent(sc);
         String incFuncName = sc.getShortName().substring(sc.getShortName().lastIndexOf('$')+1) + "$$inc";
         SootMethod method = new SootMethod(incFuncName, new LinkedList(),
                                            IntType.v(), Modifier.PRIVATE,
@@ -214,8 +243,6 @@ public class Transformer extends SceneTransformer {
             }
         }
 
-        //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();
@@ -223,16 +250,11 @@ public class Transformer extends SceneTransformer {
             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;
-            //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);
             }
             Type t = m.getReturnType();
             c.removeMethod(m);
@@ -268,7 +290,6 @@ public class Transformer extends SceneTransformer {
             if (s instanceof DefinitionStmt) {
                 DefinitionStmt ds = (DefinitionStmt)s;
                 if (ds.getLeftOp().getType() instanceof PrimType && ds.getRightOp().getType() instanceof NullType) {
-                    System.out.println("*************************");
                     ds.getRightOpBox().setValue(IntConstant.v(-1));
                 }
             }
@@ -281,11 +302,9 @@ public class Transformer extends SceneTransformer {
                     if (v instanceof BinopExpr) {
                         BinopExpr boe = (BinopExpr)v;
                         if (boe.getOp1().getType() instanceof PrimType && boe.getOp2().getType() instanceof NullType) {
-                            System.out.println("*************************");
                             boe.setOp2(IntConstant.v(-1));
                         }
                         if (boe.getOp2().getType() instanceof PrimType && boe.getOp1().getType() instanceof NullType) {
-                            System.out.println("*************************");
                             boe.setOp1(IntConstant.v(-1));
                         }
                     }
@@ -325,10 +344,8 @@ public class Transformer extends SceneTransformer {
                     } else if (v instanceof NewExpr) {
                         NewExpr ne = (NewExpr)v;
                         if (isGladiatorType(ne.getBaseType())) {
-                            System.out.println("******");
-                            SootClass mc = Scene.v().getMainClass();
                             SootClass sc = ((RefType)ne.getBaseType()).getSootClass();
-                            System.out.println(sc);
+                            SootClass mc = getParent(sc);
                             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);
@@ -339,9 +356,7 @@ public class Transformer extends SceneTransformer {
                     } else if (v instanceof CastExpr) {
                         CastExpr ce = (CastExpr)v;
                         if (isGladiatorType(ce.getCastType())) {
-                            //SootClass intClass = Scene.v().getSootClass("java.lang.Integer");
-                            //SootClass intClass = Scene.v().getSootClass("java.lang.Integer");
-                            SootClass mc = Scene.v().getMainClass();
+                            SootClass mc = getParent(((RefType)ce.getCastType()).getSootClass());
                             LinkedList list = new LinkedList();
                             list.add(Scene.v().getSootClass("java.lang.Object").getType());
                             SootMethodRef mr = Scene.v().makeMethodRef(mc, "zap", list, IntType.v(), true);
@@ -356,7 +371,7 @@ public class Transformer extends SceneTransformer {
                         SootFieldRef fr = ifr.getFieldRef();
                         Type t = fr.type();
                         if (isGladiatorFieldRef(fr)) {
-                            SootClass mc = Scene.v().getMainClass();
+                            SootClass mc = getParent(fr.declaringClass());
                             SootFieldRef sf = getGladiatorField(fr).makeRef();
                             InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), sf);
                             ArrayRef ar = Jimple.v().newArrayRef(viaLocal(sfr, body, s), ifr.getBase());
@@ -364,7 +379,7 @@ public class Transformer extends SceneTransformer {
                         }
                         if ((t instanceof RefType) && isGladiator(((RefType)t).getSootClass())) {
                             SootClass tc = ((RefType)t).getSootClass();
-                            SootClass mc = Scene.v().getMainClass();
+                            SootClass mc = getParent(tc);
                             ifr.setFieldRef(Scene.v().makeFieldRef(mc, fr.name(), IntType.v(), false));
                         }
                     }