virtual bool Traverse( AstInterface &fa, const AstNodePtr& s, AstInterface::TraversalVisitType t) { HasValueMapReplace valrepl( fa, valmap, false); if (ValueAnnotation::get_inst()->is_value_restrict_op( fa, s, &append, &valrepl, &astcodegen)) return true; AstNodePtr lhs, rhs; AstInterface::AstNodeList vars, args; HasValueDescriptor desc; if (fa.IsAssignment(s, &lhs, &rhs)) { if (append.has_value( rhs, &desc) ) { append( lhs, desc); } } else if (fa.IsVariableDecl( s, &vars, &args)) { AstInterface::AstNodeList::iterator pv = vars.begin(); AstInterface::AstNodeList::iterator pa = args.begin(); while (pv != vars.end()) { lhs = *pv; rhs = *pa; if (append.has_value( rhs, &desc) ) { append( lhs, desc ); } ++pv; ++pa; } } return true; }
bool PtrAnal:: ProcessTree( AstInterface &fa, const AstNodePtr& s, AstInterface::TraversalVisitType t) { if (t == AstInterface::PreVisit) { AstNodePtr lhs, rhs; AstInterface::AstNodeList vars, args; if (fa.IsStatement(s)) { if (DebugAliasAnal()) std::cerr << "pre visiting " << AstToString(s) << "\n"; stmt_active.push_back(stmts.size()); } if (fa.IsReturn(s,&rhs)) { // size_t stmt_firstIndex = stmts.size(); std::string fname = fdefined.back(); if (rhs != AST_NULL) { std::string rhsname = Get_VarName(fa, rhs); Stmt stmt_last = x_eq_y(func_return_name(fname), rhsname); stmts_pushback(stmts,stmt_last); namemap[rhs.get_ptr()] = VarRef(stmt_last, rhsname); } Stmt stmt_last = funcexit_x(fname); stmts_pushback(stmts,stmt_last); Skip(s); } else if (fa.IsVariableDecl( s, &vars, &args)) { // size_t stmt_firstIndex = stmts.size(); AstInterface::AstNodeList::const_iterator pv = vars.begin(); AstInterface::AstNodeList::const_iterator pa = args.begin(); while (pv != vars.end()) { AstNodePtr v = *pv; AstNodePtr a = *pa; if (a != AST_NULL) { ProcessAssign(fa, v, a); } ++pv; ++pa; } Skip(s); } else if ( (lhs = fa.IsExpression(s)) != AST_NULL) { ProcessExpression(fa, "", lhs); Skip(s); } } else { if (DebugAliasAnal()) std::cerr << "post visiting " << AstToString(s) << "\n"; if (fa.IsStatement(s)) { size_t stmt_firstIndex = stmt_active.back(); stmt_active.pop_back(); if (stmt_firstIndex < stmts.size()) { if (DebugAliasAnal()) std::cerr << "setting stmt mapping \n"; stmtmap[s.get_ptr()] = pair<size_t,size_t>(stmt_firstIndex, stmts.size()-1); } else if (DebugAliasAnal()) std::cerr << "no translation: " << AstToString(s) << "\n"; } } return true; }