From: adam Date: Fri, 6 May 2005 08:54:37 +0000 (+0000) Subject: checkpoint X-Git-Url: http://git.megacz.com/?p=org.ibex.arenaj.git;a=commitdiff_plain;h=b5cb3733c4dcd25a8ef793436074ee1d0d8162db checkpoint darcs-hash:20050506085437-5007d-f87dd68c8c79849f0950f47bcb0ebe8989936687.gz --- diff --git a/Makefile b/Makefile index fae81c5..d9b8c02 100644 --- 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 diff --git a/src/edu/berkeley/cs/megacz/Transformer.java b/src/edu/berkeley/cs/megacz/Transformer.java index 453a2fb..fa8922d 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -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("", 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("")) continue; if (m.getName().equals("")) 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); }