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
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);
}
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());
}
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();
}
}
+ //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;
SootMethodRef mr = ie.getMethodRef();
if (isGladiator(mr.declaringClass())) {
body.getUnits().remove(s);
+ qq = 0;
break;
}
mr = convert(mr);
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);
}