#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
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);
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";
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();
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("<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);
}
- 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();
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;
}
}
}
+ return body;
}
}