void UseDefMgr::setMDSSAInfo(IR * ir, MDSSAInfo * mdssainfo) { ASSERT0(ir && mdssainfo); if (ir->getAI() == NULL) { IR_ai(ir) = m_ru->allocAIContainer(); } IR_ai(ir)->set(mdssainfo); }
Dbx * get_dbx(IR const* ir) { if (IR_ai(ir) == NULL) { return NULL; } DbxAttachInfo * da = (DbxAttachInfo*)IR_ai(ir)->get(AI_DBX); if (da == NULL) { return NULL; } return &da->dbx; }
//Get line number in source code that corresponding to the IR. UINT get_lineno(IR const* ir) { if (IR_ai(ir) == NULL || !IR_ai(ir)->is_init()) { return 0; } DbxAttachInfo * da = (DbxAttachInfo*)IR_ai(ir)->get(AI_DBX); if (da == NULL) { return 0; } return DBX_lineno(&da->dbx); }
//Copy dbx from 'src' to 'tgt'. void copyDbx(IR * tgt, IR const* src, Region * ru) { ASSERT0(ru); if (IR_ai(src) == NULL) { return; } DbxAttachInfo * src_da = (DbxAttachInfo*)IR_ai(src)->get(AI_DBX); if (IR_ai(tgt) == NULL) { if (src_da == NULL) { return; } IR_ai(tgt) = ru->allocAIContainer(); } ASSERT0(IR_ai(tgt)); if (src_da == NULL) { IR_ai(tgt)->clean(AI_DBX); return; } DbxAttachInfo * tgt_da = (DbxAttachInfo*)IR_ai(tgt)->get(AI_DBX); if (tgt_da == NULL) { tgt_da = (DbxAttachInfo*)smpoolMalloc( sizeof(DbxAttachInfo), ru->get_pool()); ASSERT0(tgt_da); tgt_da->init(); IR_ai(tgt)->set((BaseAttachInfo*)tgt_da); } tgt_da->dbx.copy(src_da->dbx); }
MDSSAInfo * UseDefMgr::genMDSSAInfo(IR * ir) { ASSERT0(ir); if (ir->getAI() == NULL) { IR_ai(ir) = m_ru->allocAIContainer(); } MDSSAInfo * mdssainfo = (MDSSAInfo*)ir->getAI()->get(AI_MD_SSA); if (mdssainfo == NULL) { mdssainfo = allocMDSSAInfo(); IR_ai(ir)->set(mdssainfo); } return mdssainfo; }
//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; }
void set_lineno(IR * ir, UINT lineno, Region * ru) { DbxAttachInfo * da; ASSERT0(ru); if (IR_ai(ir) == NULL) { IR_ai(ir) = ru->allocAIContainer(); da = (DbxAttachInfo*)smpoolMalloc( sizeof(DbxAttachInfo), ru->get_pool()); ASSERT0(da); da->init(); IR_ai(ir)->set((BaseAttachInfo*)da); } else { IR_ai(ir)->init(); da = (DbxAttachInfo*)IR_ai(ir)->get(AI_DBX); if (da == NULL) { da = (DbxAttachInfo*)smpoolMalloc( sizeof(DbxAttachInfo), ru->get_pool()); ASSERT0(da); da->init(); ASSERT0(da); IR_ai(ir)->set((BaseAttachInfo*)da); } } DBX_lineno(&da->dbx) = lineno; }
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); }