From d82239f6ad1be37c08754310a5ca8eb1bd10ea67 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 5 May 2005 03:07:52 +0000 Subject: [PATCH] checkpoint darcs-hash:20050505030752-5007d-bc4cc39d0e147ebbee4e80ccc322a66d3f3bb84e.gz --- Makefile | 9 ++-- src/edu/berkeley/cs/megacz/Test.java | 3 +- src/edu/berkeley/cs/megacz/Transformer.java | 60 +++++++++++++++++++++------ 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index 8c55976..7768432 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,13 @@ #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 -cp = lib/soot.jar:bin -sootcp = ${cp}:/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/classes.jar +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 go: rm -rf sootOutput out.jar out javac -classpath lib/soot.jar -d bin `find src/ -name \*.java` - java -cp ${cp} edu.berkeley.cs.megacz.Transformer -app -i edu.berkeley.cs.megacz -outjar -cp ${sootcp} ${mainclass} - mv sootOutput out.jar - mkdir -p out; cd out; jar xvf ../out.jar + 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 diff --git a/src/edu/berkeley/cs/megacz/Test.java b/src/edu/berkeley/cs/megacz/Test.java index a219300..eca2504 100644 --- a/src/edu/berkeley/cs/megacz/Test.java +++ b/src/edu/berkeley/cs/megacz/Test.java @@ -12,12 +12,13 @@ public class Test { Inner z; public void bar(Inner x) { + x.foo = 3; } public Test() { z = new Inner(); Inner q = z; - q.foo = 3; + bar(q); System.out.println(q.foo); } } diff --git a/src/edu/berkeley/cs/megacz/Transformer.java b/src/edu/berkeley/cs/megacz/Transformer.java index 513e0fa..7c49c40 100644 --- a/src/edu/berkeley/cs/megacz/Transformer.java +++ b/src/edu/berkeley/cs/megacz/Transformer.java @@ -15,7 +15,7 @@ public class Transformer extends BodyTransformer { 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())); // Just in case, resolve the PrintStream SootClass. Scene.v().addBasicClass("java.io.PrintStream",SootClass.SIGNATURES); @@ -55,6 +55,7 @@ public class Transformer extends BodyTransformer { return nf; } + private Body body; public SootFieldRef getGladiatorFieldSizeRef(SootClass c) { SootClass mc = Scene.v().getMainClass(); String name = c.getShortName().substring(c.getShortName().lastIndexOf('$')+1) + "_size"; @@ -74,9 +75,29 @@ public class Transformer extends BodyTransformer { return (t instanceof RefType) && isGladiator(((RefType)t).getSootClass()); } - protected void internalTransform(Body body, String phaseName, Map options) { - SootClass c = body.getMethod().getDeclaringClass(); + public SootMethodRef convert(SootMethodRef mr) { + List l = mr.parameterTypes(); + List l2 = new LinkedList(); + for(Iterator it2 = l.iterator(); it2.hasNext();) { + Type t = (Type)it2.next(); + l2.add(isGladiatorType(t) ? IntType.v() : t); + } + return Scene.v().makeMethodRef(mr.declaringClass(), + mr.name(), + l2, + isGladiatorType(mr.returnType()) ? IntType.v() : mr.returnType(), + mr.isStatic()); + } + boolean done = false; + public void internalTransform(Body bz, String phaseName, Map options) { + 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")); + } + public void nuke(SootClass c) { for(Iterator it = c.getFields().iterator(); it.hasNext();) { SootField f = (SootField)it.next(); Type t = f.getType(); @@ -84,29 +105,40 @@ public class Transformer extends BodyTransformer { if (isGladiator(((RefType)t).getSootClass())) f.setType(IntType.v()); } - for(Iterator it = c.methodIterator(); it.hasNext();) { + 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.getName().equals("")) continue; + if (m.getName().equals("")) 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); } - m.setParameterTypes(l2); Type t = m.getReturnType(); - m.setReturnType(isGladiatorType(t) ? IntType.v() : t); - */ + c.removeMethod(m); + SootMethod meth = new SootMethod(m.getName(), l2, isGladiatorType(t) ? IntType.v() : t, m.getModifiers()); + meth.setActiveBody(m.getActiveBody()); + c.addMethod(meth); } + } + + 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()); } - - Chain units = body.getUnits(); - Iterator stmtIt = units.snapshotIterator(); while(stmtIt.hasNext()) { Stmt s = (Stmt) stmtIt.next(); List l = s.getUseAndDefBoxes(); @@ -118,11 +150,12 @@ public class Transformer extends BodyTransformer { if (v instanceof InvokeExpr) { InvokeExpr ie = (InvokeExpr)v; - SootMethod m = ie.getMethod(); - if (isGladiator(m.getDeclaringClass())) { + SootMethodRef mr = ie.getMethodRef(); + if (isGladiator(mr.declaringClass())) { body.getUnits().remove(s); break; } + ie.setMethodRef(convert(mr)); } else if (v instanceof NewExpr) { NewExpr ne = (NewExpr)v; @@ -164,5 +197,6 @@ public class Transformer extends BodyTransformer { } } } + return body; } } -- 1.7.10.4