-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;
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) {
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());
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());
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,
}
}
- //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.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);
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));
}
}
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));
}
}
} 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);
} 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);
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());
}
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));
}
}