// //START PRDF // void PRDF::dump() { if (g_tfile == NULL) { return; } fprintf(g_tfile, "\n==---- DUMP PRDF : liveness of PR ----==\n"); List<IRBB*> * bbl = m_ru->get_bb_list(); g_indent = 2; for (IRBB * bb = bbl->get_head(); bb != NULL; bb = bbl->get_next()) { fprintf(g_tfile, "\n\n\n-- BB%d --", BB_id(bb)); DefSBitSetCore * live_in = get_livein(BB_id(bb)); DefSBitSetCore * live_out = get_liveout(BB_id(bb)); DefSBitSetCore * def = get_def(BB_id(bb)); DefSBitSetCore * use = get_use(BB_id(bb)); fprintf(g_tfile, "\nLIVE-IN: "); live_in->dump(g_tfile); fprintf(g_tfile, "\nLIVE-OUT: "); live_out->dump(g_tfile); fprintf(g_tfile, "\nDEF: "); def->dump(g_tfile); fprintf(g_tfile, "\nUSE: "); use->dump(g_tfile); } fflush(g_tfile); }
long itype::invoke( player &p, item &it, const tripoint &pos, const std::string &iuse_name ) const { const use_function *use = get_use( iuse_name ); if( use == nullptr ) { debugmsg( "Tried to invoke %s on a %s, which doesn't have this use_function", iuse_name.c_str(), nname( 1 ).c_str() ); return 0; } return use->call( p, it, false, pos ); }
bool itype::can_use( const std::string &iuse_name ) const { return get_use( iuse_name ) != nullptr; }
void PRDF::computeLocal(IRBB * bb, List<IR const*> & lst) { DefSBitSetCore * gen = get_def(BB_id(bb)); DefSBitSetCore * use = get_use(BB_id(bb)); gen->clean(m_sbs_mgr); use->clean(m_sbs_mgr); for (IR * x = BB_last_ir(bb); x != NULL; x = BB_prev_ir(bb)) { ASSERT0(x->is_stmt()); switch (IR_code(x)) { case IR_ST: lst.clean(); processOpnd(ST_rhs(x), lst, use, gen); break; case IR_STPR: gen->bunion(STPR_no(x), m_sbs_mgr); use->diff(STPR_no(x), m_sbs_mgr); processMay(x, gen, use, true); lst.clean(); processOpnd(STPR_rhs(x), lst, use, gen); break; case IR_SETELEM: gen->bunion(SETELEM_prno(x), m_sbs_mgr); use->diff(SETELEM_prno(x), m_sbs_mgr); processMay(x, gen, use, true); lst.clean(); processOpnd(SETELEM_rhs(x), lst, use, gen); lst.clean(); processOpnd(SETELEM_ofst(x), lst, use, gen); break; case IR_GETELEM: gen->bunion(GETELEM_prno(x), m_sbs_mgr); use->diff(GETELEM_prno(x), m_sbs_mgr); processMay(x, gen, use, true); lst.clean(); processOpnd(GETELEM_base(x), lst, use, gen); lst.clean(); processOpnd(GETELEM_ofst(x), lst, use, gen); break; case IR_STARRAY: lst.clean(); processOpnd(x, lst, use, gen); break; case IR_IST: lst.clean(); processOpnd(x, lst, use, gen); break; case IR_SWITCH: lst.clean(); processOpnd(SWITCH_vexp(x), lst, use, gen); break; case IR_IGOTO: lst.clean(); processOpnd(IGOTO_vexp(x), lst, use, gen); break; case IR_GOTO: break; case IR_CALL: case IR_ICALL: if (x->hasReturnValue()) { gen->bunion(CALL_prno(x), m_sbs_mgr); use->diff(CALL_prno(x), m_sbs_mgr); processMay(x, gen, use, true); } lst.clean(); processOpnd(CALL_param_list(x), lst, use, gen); if (x->is_icall() && ICALL_callee(x)->is_pr()) { use->bunion(PR_no(ICALL_callee(x)), m_sbs_mgr); processMay(ICALL_callee(x), gen, use, false); } break; case IR_TRUEBR: case IR_FALSEBR: lst.clean(); processOpnd(BR_det(x), lst, use, gen); break; case IR_RETURN: lst.clean(); processOpnd(RET_exp(x), lst, use, gen); break; case IR_PHI: gen->bunion(PHI_prno(x), m_sbs_mgr); use->diff(PHI_prno(x), m_sbs_mgr); processMay(x, gen, use, true); lst.clean(); processOpnd(PHI_opnd_list(x), lst, use, gen); break; case IR_REGION: break; default: ASSERT0(0); } } }