void ReachingDefinitionAnalysis:: 
operator()( AstInterface& fa, const AstNodePtr& h,  FunctionSideEffectInterface* anal)
{
  assert( g == 0 && pars.size() == 0);

  AstNodePtr body = h;
  if (!fa.IsFunctionDefinition( h, 0, &pars, 0, &body))
     ;//assert(false);

  ReachingDefinitionBase base;
  base.collect_refs( fa, body, anal, &pars);
  base.finalize();
  g = new ReachingDefinitionGenerator( base);
 
  a = anal;

  if (DebugReachingDef())
     std::cerr << "start building reaching definitions \n";
  DataFlowAnalysis<ReachingDefNode, ReachingDefinitions>::operator()( fa, h);
  if (DebugReachingDef()) 
     std::cerr << "finished building reaching definitions \n" << GraphToString(*this);
}
示例#2
0
void PtrAnal:: operator()( AstInterface& fa, const AstNodePtr& funcdef)
{
  AstNodePtr  body;
  AstInterface::AstNodeList params, outpars;
  std::string fname;
  if (!fa.IsFunctionDefinition(funcdef, &fname, &params, &outpars, &body)) {
     std::cerr << "Error: analysis requires function definition as input instead of " << AstToString(funcdef) << std::endl;
     assert(false);
  }
  typedef std::pair<AstNodePtr,std::string>  RefRec;
  std::list<RefRec>  refs;

  fname = Local_GetVarName(fa, AST_NULL, fname);
  fdefined.push_back(fname);

  std::list<std::string> pnames, pres;
  for (AstInterface::AstNodeList::const_iterator p = params.begin(); p != params.end(); ++p) {
       std::string curname = Get_VarName(fa, *p);
       pnames.push_back(curname);
       refs.push_back(RefRec(*p, curname));
  }
  pres.push_back( func_return_name(fname));
  for (AstInterface::AstNodeList::const_iterator p2 = outpars.begin(); 
        p2 != outpars.end(); ++p2) {
       std::string curname = Get_VarName(fa, *p2);
       pres.push_back(curname);
       refs.push_back(RefRec(*p2, curname));
  }
  Stmt stmt_last = funcdef_x(fname, pnames, pres);
  stmts_pushback(stmts,stmt_last);
  for (std::list<RefRec>::const_iterator p3 = refs.begin();
        p3 != refs.end(); ++p3) {
      RefRec cur = *p3;
      namemap[cur.first.get_ptr()] = PtrAnal::VarRef(stmt_last,cur.second);
  }
  ProcessAstTreeBase::operator()(fa, body);
  ControlFlowAnalysis(fa, body, stmt_last);
}