From e213e5cdb6dc8e744f318190e0d8fd1a9d20c15d Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 5 May 2005 09:21:00 +0000 Subject: [PATCH] checkpoint darcs-hash:20050505092100-5007d-295dd684df0631a3d67504a1ebf22df572d362a3.gz --- Makefile | 16 +-- src/edu/berkeley/cs/megacz/Transformer.java | 149 +++++++++++++++++++++------ 2 files changed, 126 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index 7768432..fae81c5 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,15 @@ #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 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 + +#mainclass = edu.berkeley.cs.megacz.Test +mainclass = org.ibex.graphics.Mesh go: - rm -rf sootOutput out.jar out javac -classpath lib/soot.jar -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 -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 + 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} +# 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 7c49c40..453a2fb 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -36,22 +36,29 @@ public class Transformer extends BodyTransformer { public boolean isGladiator(SootClass c) { return c.implementsInterface("edu.berkeley.cs.megacz.Gladiator"); } public boolean isGladiatorField(SootField f) { return isGladiator(f.getDeclaringClass()) && !f.getName().equals("this") && f.getName().indexOf('$')==-1; } - public SootField getGladiatorField(SootField f) { - SootClass c = f.getDeclaringClass(); + public boolean isGladiatorFieldRef(SootFieldRef f) { + return isGladiator(f.declaringClass()) && !f.name().equals("this") && f.name().indexOf('$')==-1; + } + public SootField getGladiatorField(SootField f) { return getGladiatorField(f.makeRef()); } + public SootField getGladiatorField(SootFieldRef f) { + SootClass c = f.declaringClass(); SootClass oc = Scene.v().getSootClass(c.getName().substring(0, c.getName().lastIndexOf('$'))); - if (map.get(f) != null) return (SootField)map.get(f); - SootField nf = new SootField(c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$" + f.getName(), - f.getType().makeArrayType(), - f.getModifiers()); + String sig = f.declaringClass().getName()+"."+f.name(); + if (map.get(sig) != null) return (SootField)map.get(sig); + Type t = f.type(); + if (t instanceof RefType && isGladiator(((RefType)t).getSootClass())) t = IntType.v(); + SootField nf = new SootField(c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "$" + f.name(), + t.makeArrayType(), + 0); oc.addField(nf); Body body = oc.getMethod("", new LinkedList()).getActiveBody(); - Expr newArr = Jimple.v().newNewArrayExpr(f.getType(), IntConstant.v(1000)); - Local newArrLocal = Jimple.v().newLocal("tmpRef" + (tfr++), f.getType().makeArrayType()); + Expr newArr = Jimple.v().newNewArrayExpr(t, IntConstant.v(100000)); + Local newArrLocal = Jimple.v().newLocal("tmpRef" + (tfr++), f.type().makeArrayType()); body.getLocals().add(newArrLocal); InstanceFieldRef ifr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), nf.makeRef()); body.getUnits().addFirst(Jimple.v().newAssignStmt(ifr, newArrLocal)); body.getUnits().addFirst(Jimple.v().newAssignStmt(newArrLocal, newArr)); - map.put(f, nf); + map.put(sig, nf); return nf; } @@ -62,9 +69,10 @@ public class Transformer extends BodyTransformer { 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))); + + 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); } @@ -94,15 +102,27 @@ public class Transformer extends BodyTransformer { 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")); + //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")); } public void nuke(SootClass c) { for(Iterator it = c.getFields().iterator(); it.hasNext();) { SootField f = (SootField)it.next(); Type t = f.getType(); - if (!(t instanceof RefType)) continue; - if (isGladiator(((RefType)t).getSootClass())) f.setType(IntType.v()); + if (t instanceof RefType) { + RefType rt = (RefType)t; + SootClass sc = rt.getSootClass(); + if (isGladiator(sc)) f.setType(IntType.v()); + } else if (t instanceof ArrayType) { + ArrayType at = (ArrayType)t; + t = at.getElementType(); + if (!(t instanceof RefType)) continue; + RefType rt = (RefType)t; + SootClass sc = rt.getSootClass(); + if (isGladiator(sc)) f.setType(IntType.v().makeArrayType()); + } } List list = new LinkedList(); list.addAll(c.getMethods()); @@ -124,7 +144,19 @@ public class Transformer extends BodyTransformer { } Type t = m.getReturnType(); c.removeMethod(m); - SootMethod meth = new SootMethod(m.getName(), l2, isGladiatorType(t) ? IntType.v() : t, m.getModifiers()); + if (isGladiatorType(t)) { + t = IntType.v(); + Body bod = m.getActiveBody(); + for(Iterator stmtIt = bod.getUnits().snapshotIterator(); stmtIt.hasNext();) { + Stmt s = (Stmt) stmtIt.next(); + if (s instanceof ReturnStmt) { + if (((ReturnStmt)s).getOp().getType() instanceof NullType) { + ((ReturnStmt)s).getOpBox().setValue(IntConstant.v(-1)); + } + } + } + } + SootMethod meth = new SootMethod(m.getName(), l2, t, m.getModifiers()); meth.setActiveBody(m.getActiveBody()); c.addMethod(meth); } @@ -134,19 +166,37 @@ public class Transformer extends BodyTransformer { 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()); } - while(stmtIt.hasNext()) { + for(int qq=0; qq<2; qq++) for(Iterator stmtIt = units.snapshotIterator(); stmtIt.hasNext();) { Stmt s = (Stmt) stmtIt.next(); List l = s.getUseAndDefBoxes(); + 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)); + } + } for(Iterator it = l.iterator(); it.hasNext();) { Object o = it.next(); if (o instanceof ValueBox) { ValueBox vb = (ValueBox)o; Value v = vb.getValue(); + + 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)); + } + } if (v instanceof InvokeExpr) { InvokeExpr ie = (InvokeExpr)v; @@ -155,7 +205,29 @@ public class Transformer extends BodyTransformer { body.getUnits().remove(s); break; } - ie.setMethodRef(convert(mr)); + mr = convert(mr); + ie.setMethodRef(mr); + for(int i=0; i", typelist); + Local loc = viaLocal(Jimple.v().newNewExpr(RefType.v(intClass)), body, s); + List list = new LinkedList(); + list.add(val); + units.insertBefore(Jimple.v().newInvokeStmt(Jimple.v().newSpecialInvokeExpr(loc, + intMethod.makeRef(), + list)), + s); + b.setValue(loc); + } + if (val != null && val.getType() instanceof NullType && mr.parameterType(i) instanceof IntType) { + b.setValue(IntConstant.v(-1)); + } + } } else if (v instanceof NewExpr) { NewExpr ne = (NewExpr)v; @@ -175,24 +247,37 @@ public class Transformer extends BodyTransformer { vb.setValue(ll); } - } else if (v instanceof InstanceFieldRef) { - InstanceFieldRef ifr = (InstanceFieldRef)v; - Type t = ifr.getType(); - if ((t instanceof RefType) && isGladiator(((RefType)t).getSootClass())) { - SootClass tc = ((RefType)t).getSootClass(); + } 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(); - SootFieldRef fr = Scene.v().makeFieldRef(mc, "z", IntType.v(), false); - ifr.setFieldRef(fr); + LinkedList list = new LinkedList(); + list.add(Scene.v().getSootClass("java.lang.Object").getType()); + SootMethodRef mr = Scene.v().makeMethodRef(mc, "zap", list, IntType.v(), true); + Local loc = viaLocal(ce.getOp(), body, s); + List list2 = new LinkedList(); + list2.add(loc); + vb.setValue(viaLocal(Jimple.v().newStaticInvokeExpr(mr, list2), body, s)); } - SootField f = ifr.getField(); - if (isGladiatorField(f)) { - f = getGladiatorField(f); + + } else if (v instanceof InstanceFieldRef) { + InstanceFieldRef ifr = (InstanceFieldRef)v; + SootFieldRef fr = ifr.getFieldRef(); + Type t = fr.type(); + if (isGladiatorFieldRef(fr)) { SootClass mc = Scene.v().getMainClass(); - SootField sf = mc.getField(f.getName(), f.getType()); - InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), sf.makeRef()); + SootFieldRef sf = getGladiatorField(fr).makeRef(); + InstanceFieldRef sfr = Jimple.v().newInstanceFieldRef(body.getThisLocal(), sf); ArrayRef ar = Jimple.v().newArrayRef(viaLocal(sfr, body, s), ifr.getBase()); vb.setValue(ar); } + if ((t instanceof RefType) && isGladiator(((RefType)t).getSootClass())) { + SootClass tc = ((RefType)t).getSootClass(); + SootClass mc = Scene.v().getMainClass(); + ifr.setFieldRef(Scene.v().makeFieldRef(mc, fr.name(), IntType.v(), false)); + } } } } -- 1.7.10.4