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); }
void PtrAnal:: operator()( AstInterface& fa, const AstNodePtr& funcdef) { AstNodePtr body; AstInterface::AstNodeList params, outpars; std::string fname; if (!fa.IsFunctionDefinition(funcdef, &fname, ¶ms, &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); }