void DataFlowAnalysis::run(Program *program) { AnalyzerOptions *options = program->options; bool verbose = options->verbose(); /* Set the PAG options as specified on the command line. */ setPagOptions(*options); setPrefixedPagOptions(options, p_impl); /* Build the program's ICFG if necessary. */ if (program->icfg == NULL) program->icfg = createICFG(program, options); /* Run this analysis. */ if (verbose) { std::cout << "performing analysis " << identifier() << " ... " << std::flush; } TimingPerformance *nestedTimer = new TimingPerformance("Actual data-flow analysis " + identifier() + ":"); p_impl->analysisDoit(program->icfg); delete nestedTimer; if (verbose) std::cout << "done" << std::endl; /* Make results persistent. We always do this (by default) to avoid * problems with garbage collected results. */ p_impl->makePersistent(); #if HAVE_PAG /* If requested, compute call strings from PAG's call string data, and * store them in the ICFG. */ if (options->computeCallStrings()) computeCallStrings(program); #endif }