Date endSimplify = new Date();
reportTime( "Pointer Graph simplified", startSimplify, endSimplify );
if( opts.force_gc() ) doGC();
// Dump pag
PAGDumper dumper = null;
if( opts.dump_pag() || opts.dump_solution() ) {
dumper = new PAGDumper( pag, output_dir );
}
if( opts.dump_pag() ) dumper.dump();
// Propagate
Date startProp = new Date();
final Propagator[] propagator = new Propagator[1];
switch( opts.propagator() ) {
case SparkOptions.propagator_iter:
propagator[0] = new PropIter( pag );
break;
case SparkOptions.propagator_worklist:
propagator[0] = new PropWorklist( pag );
break;
case SparkOptions.propagator_cycle:
propagator[0] = new PropCycle( pag );
break;
case SparkOptions.propagator_merge:
propagator[0] = new PropMerge( pag );
break;
case SparkOptions.propagator_alias:
propagator[0] = new PropAlias( pag );
break;
case SparkOptions.propagator_none:
break;
default:
throw new RuntimeException();
}
if( propagator[0] != null ) propagator[0].propagate();
Date endProp = new Date();
reportTime( "Propagation", startProp, endProp );
reportTime( "Solution found", startSimplify, endProp );
if( opts.force_gc() ) doGC();
if( !opts.on_fly_cg() || opts.vta() ) {
CallGraphBuilder cgb = new CallGraphBuilder( pag );
cgb.build();
}
if( opts.verbose() ) {
G.v().out.println( "[Spark] Number of reachable methods: "
+Scene.v().getReachableMethods().size() );
}
if( opts.set_mass() ) findSetMass( pag );
if( opts.dump_answer() ) new ReachingTypeDumper( pag, output_dir ).dump();
if( opts.dump_solution() ) dumper.dumpPointsToSets();
if( opts.dump_html() ) new PAG2HTML( pag, output_dir ).dump();
Scene.v().setPointsToAnalysis( pag );
if( opts.add_tags() ) {
addTags( pag );
}