//Attemp to compute POINT-TO set via the IR type. virtual MD * comp_point_to_via_type(IR const* ir) { IR_AI * ai = IR_ai(ir); IS_TRUE0(ir && ai); TBAA_AI * ty = (TBAA_AI*)ai->get(IRAI_TBAA); if (ty == NULL) { return NULL; } MD * md = m_tyid2md.get(ty->tyid); if (md != NULL) { return md; } CHAR buf[64]; sprintf(buf, "dummy%d", ty->tyid); VAR * dummy = m_var_mgr->register_var(buf, D_MC, D_UNDEF, 0, 1, 1, VAR_GLOBAL); VAR_is_addr_taken(dummy) = true; VAR_allocable(dummy) = false; m_ru->add_to_var_tab(dummy); MD dummy_md; MD_base(&dummy_md) = dummy; MD_size(&dummy_md) = 0; MD_ty(&dummy_md) = MD_UNBOUND; MD_is_addr_taken(&dummy_md) = true; MD * entry = m_md_sys->register_md(dummy_md); m_tyid2md.set(ty->tyid, entry); return entry; }
//Register exact MD for each global variable. //Note you should call this function as early as possible, e.g, before process //all regions. Because that will assign smaller MD id to global variable. void RegionMgr::registerGlobalMD() { //Only top region can do initialize MD for global variable. ASSERT0(m_var_mgr); VarVec * varvec = m_var_mgr->get_var_vec(); for (INT i = 0; i <= varvec->get_last_idx(); i++) { VAR * v = varvec->get(i); if (v == NULL || VAR_is_local(v)) { continue; } ASSERT0(VAR_is_global(v)); //User sometime intentionally declare non-allocable //global variable to custmized usage. //ASSERT0(VAR_allocable(v)); if (v->is_string() && genDedicateStrMD() != NULL) { continue; } //We allocate MDTab for VAR which is func-decl or fake as well. //Since some Passes such as AA may need fake VAR to do analysis. MD md; MD_base(&md) = v; MD_ofst(&md) = 0; MD_size(&md) = v->getByteSize(get_type_mgr()); if (VAR_is_fake(v) || VAR_is_func_decl(v)) { MD_ty(&md) = MD_UNBOUND; } else { MD_ty(&md) = MD_EXACT; } m_md_sys->registerMD(md); } }
void handle_ld(IR * ld, MD2MDS * mx) { IS_TRUE0(IR_type(ld) == IR_LD && mx); IR_AI * ai = IR_ai(ld); if (ai == NULL) { return; } TBAA_AI * ty = (TBAA_AI*)ai->get(IRAI_TBAA); if (ty == NULL) { return; } MD * md = m_tyid2md.get(ty->tyid); if (md != NULL) { MD const* t = alloc_ld_md(ld); set_point_to_set_add_md(t, *mx, md); return; } CHAR buf[64]; sprintf(buf, "dummy%d", ty->tyid); VAR * dummy = m_var_mgr->register_var(buf, D_MC, D_UNDEF, 0, 1, 1, VAR_GLOBAL); VAR_is_addr_taken(dummy) = true; VAR_allocable(dummy) = false; m_ru->add_to_var_tab(dummy); MD dummy_md; MD_base(&dummy_md) = dummy; MD_size(&dummy_md) = 0; MD_ty(&dummy_md) = MD_UNBOUND; MD_is_addr_taken(&dummy_md) = true; MD * entry = m_md_sys->register_md(dummy_md); m_tyid2md.set(ty->tyid, entry); MD const* t = alloc_ld_md(ld); set_point_to_set_add_md(t, *mx, entry); }