package soot.spl.ifds;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.jdt.core.IJavaProject;
import soot.Body;
import soot.Local;
import soot.MethodOrMethodContext;
import soot.Pack;
import soot.PackManager;
import soot.Scene;
import soot.SceneTransformer;
import soot.SootMethod;
import soot.Transform;
import soot.Unit;
import heros.IFDSTabulationProblem;
import soot.jimple.toolkits.callgraph.ReachableMethods;
import soot.jimple.toolkits.ide.icfg.JimpleBasedInterproceduralCFG;
import soot.options.Options;
import soot.util.queue.QueueReader;
import br.ufal.cideei.features.CIDEFeatureExtracterFactory;
import br.ufal.cideei.features.IFeatureExtracter;
import br.ufal.cideei.handlers.AnalysisArgs;
import br.ufal.cideei.soot.instrument.FeatureModelInstrumentorTransformer;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
public class Main {
public static long beforeSootStart;
public static void main(final String classpath, String mainClass, final IJavaProject javaProject, final AnalysisArgs arg) {
try {
String j2me = arg.j2me ? "-j2me -x org. -x com. -x java -ire -allow-phantom-refs " : "";
String string = "-cp "+classpath+" -p cg.spark on -f none -src-prec java -w "+j2me+"-main-class "+mainClass+" "+mainClass;
String[] args = string.split(" ");
if(!arg.includeJDK) Options.v().set_no_bodies_for_excluded(true);
Pack pack = PackManager.v().getPack("wjtp");
if(pack.get("wjtp.ifds")==null) {
pack.add(new Transform("wjtp.ifds", new SceneTransformer() {
@SuppressWarnings("unchecked")
protected void internalTransform(String phaseName, @SuppressWarnings("rawtypes") Map options) {
IFeatureExtracter extracter = CIDEFeatureExtracterFactory.getInstance().getExtracter();
FeatureModelInstrumentorTransformer bodyTransformer = new FeatureModelInstrumentorTransformer(extracter,classpath);
ReachableMethods rm = new ReachableMethods(Scene.v().getCallGraph(), new ArrayList<MethodOrMethodContext>(Scene.v().getEntryPoints()));
rm.update();
QueueReader<MethodOrMethodContext> iter = rm.listener();
while(iter.hasNext()) {
SootMethod m = iter.next().method();
if(m.hasActiveBody()) {
Body b = m.getActiveBody();
bodyTransformer.transform(b);
}
}
final Multimap<SootMethod,Local> initialSeeds = HashMultimap.create();
initialSeeds.put(Scene.v().getMainMethod(), Scene.v().getMainMethod().getActiveBody().getLocals().getFirst());
// IFDSTabulationProblem<Unit,Value,SootMethod> problem = new soot.jimple.interproc.ifds.problems.IFDSUninitializedVariables();
//
//
// SPLIFDSSolver<Value,SootMethod> solver = new SPLIFDSSolver<Value,SootMethod>(problem,alloyFilePath,numFeaturesPresent);
// long before = System.currentTimeMillis();
// System.err.println("Starting solver...");
// solver.solve();
// System.err.println("Solving took: "+(System.currentTimeMillis()-before));
// System.err.println(Scene.v().getMainMethod().getActiveBody());
// Unit ret = Scene.v().getMainMethod().getActiveBody().getUnits().getLast();
// for(Entry<Value, Constraint<String>> l: solver.resultsAt(ret).entrySet()) {
// System.err.print(l.getKey());
// System.err.print("=");
// System.err.println(l.getValue().toString(bodyTransformer.getFeatureNumberer()));
// }
// System.err.println();
// System.err.println(Constraint.FACTORY.getCacheStats());
// IFDSTabulationProblem<Unit, ?, SootMethod> problem = new soot.jimple.interproc.ifds.problems.IFDSReachingDefinitions();
IFDSTabulationProblem<Unit, ?, SootMethod, ?> problem;
try {
Class<IFDSTabulationProblem<Unit, ?, SootMethod, ?>> clazz = (Class<IFDSTabulationProblem<Unit, ?, SootMethod, ?>>) Class.forName("soot.jimple.toolkits.ide.exampleproblems."+arg.analysisClassName);
Constructor<?> constructor = clazz.getDeclaredConstructors()[0];
problem = (IFDSTabulationProblem<Unit, ?, SootMethod, ?>) constructor.newInstance( new JimpleBasedInterproceduralCFG() );
} catch (Exception e) {
throw new RuntimeException(e);
}
PerformanceTestDriver.perfTest(bodyTransformer, problem, javaProject, arg);
}
}));
}
beforeSootStart = System.currentTimeMillis();
soot.Main.main(args);
} catch(RuntimeException e) {
e.printStackTrace();
}
}
}