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; }
std::string PtrAnal:: Get_VarName(AstInterface& fa, const AstNodePtr& rhs) { NameMap::const_iterator p = namemap.find(rhs.get_ptr()); if (p != namemap.end()) { VarRef cur = (*p).second; return cur.name; } std::string readname, res; AstNodePtr readscope; AstNodePtr lhs1, rhs1; bool readlhs; if (fa.IsVarRef(rhs, 0, &readname, &readscope)) { assert(readname != ""); res = Local_GetVarName(fa, readscope, readname); } else if (fa.IsConstant(rhs,&res,&readname)) { if (res == "string") { readname = Local_GetVarName(fa, rhs); Stmt stmt = allocate_x(readname); stmts_pushback(stmts,stmt); res= readname; } else res = Local_GetConstName(fa, readname); } else if (fa.IsUnaryOp(rhs) || fa.IsBinaryOp(rhs) || fa.IsFunctionCall(rhs)) { readname = Local_GetVarName(fa, rhs); ProcessExpression(fa, readname, rhs); res = readname; } else if (fa.IsAssignment(rhs,&lhs1,&rhs1,&readlhs)) { ProcessAssign(fa, lhs1, rhs1, readlhs); VarRef cur = namemap[lhs1.get_ptr()]; if (cur.name == "") { std::cerr << "does not have map for " << AstToString(lhs1) << " in " << AstToString(rhs) << "\n"; assert(0); } namemap[rhs.get_ptr()] = cur; res = cur.name; } else { std::cerr << "No name found for " << AstToString(rhs) << "\n"; assert(false); } if (res == "") { std::cerr << "No name found for " << AstToString(rhs) << "\n"; assert(false); } return res; }