/**
*
*/
package soottocfg.soot.transformers;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;
import soot.Body;
import soot.Local;
import soot.Scene;
import soot.SootClass;
import soot.SootMethod;
import soot.Type;
import soot.Unit;
import soot.Value;
import soot.jimple.GotoStmt;
import soot.jimple.IfStmt;
import soot.jimple.IntConstant;
import soot.jimple.InvokeStmt;
import soot.jimple.Jimple;
import soot.jimple.JimpleBody;
import soot.tagkit.Host;
/**
* @author schaef
*
*/
public abstract class AbstractSceneTransformer {
public abstract void applyTransformation();
protected Set<JimpleBody> getSceneBodies() {
Set<JimpleBody> bodies = new LinkedHashSet<JimpleBody>();
for (SootClass sc : new LinkedList<SootClass>(Scene.v().getClasses())) {
if (sc.resolvingLevel() >= SootClass.BODIES) {
for (SootMethod sm : sc.getMethods()) {
if (sm.isConcrete()) {
bodies.add((JimpleBody) sm.retrieveActiveBody());
}
}
}
}
return bodies;
}
/**
* Creates a jimple AssingStmt left:=right and copies the tags
* from createdFrom.
*
* @param left
* @param right
* @param createdFrom
* @return
*/
protected Unit assignStmtFor(Value left, Value right, Host createdFrom) {
Unit stmt = Jimple.v().newAssignStmt(left, right);
stmt.addAllTagsOf(createdFrom);
return stmt;
}
/**
* Creates a new jimple IfStmt and adds all tags from createdFrom to this
* statement.
*
* @param condition
* @param target
* @param createdFrom
* @return
*/
protected Unit ifStmtFor(Value condition, Unit target, Host createdFrom) {
IfStmt stmt = Jimple.v().newIfStmt(condition, target);
stmt.addAllTagsOf(createdFrom);
return stmt;
}
/**
* Creates a new jimple GotoStmt and adds all tags from createdFrom to this
* statement.
*
* @param target
* @param createdFrom
* @return
*/
protected Unit gotoStmtFor(Unit target, Host createdFrom) {
GotoStmt stmt = Jimple.v().newGotoStmt(target);
stmt.addAllTagsOf(createdFrom);
return stmt;
}
protected Unit invokeStmtFor(Value ivk, Host createdFrom) {
InvokeStmt stmt = Jimple.v().newInvokeStmt(ivk);
stmt.addAllTagsOf(createdFrom);
return stmt;
}
protected Value jimpleEqZero(Value v) {
return Jimple.v().newEqExpr(v, IntConstant.v(0));
}
protected Value jimpleNeZero(Value v) {
return Jimple.v().newNeExpr(v, IntConstant.v(0));
}
private long counter = 0;
protected Local getFreshLocal(Body body, Type t) {
Local local = Jimple.v().newLocal("$helper" + (counter++), t);
body.getLocals().add(local);
return local;
}
}