void AddOpRhsTypeHelper(IRSB* sb, IRExpr* arg, IntTyStateHint hint, Addr addr) { IRDirty * d; HWord tmpname; switch (arg->tag) { case(Iex_RdTmp): tmpname = (HWord)arg->Iex.RdTmp.tmp; d = unsafeIRDirty_0_N(0, "EmitTmpHelper", &EmitTmpHelper, mkIRExprVec_4( mkIRExpr_HWord(tmpname), mkIRExpr_HWord(hint), mkIRExpr_HWord(counter), mkIRExpr_HWord(addr) ) ); setHelperAnns(d); addStmtToIRSB(sb,IRStmt_Dirty(d)); break; default: break; } return; }
void AddStoreHelper(IRSB* sb, IRExpr* addr, IRExpr* data) { IRDirty* d; HWord tmpname; switch (addr->tag) { case (Iex_RdTmp): switch (data->tag) { case (Iex_RdTmp): tmpname = (HWord) data->Iex.RdTmp.tmp; d = unsafeIRDirty_0_N(0, "EmitStoreAddr2TmpHelper", &EmitStoreAddr2TmpHelper, mkIRExprVec_3(addr, mkIRExpr_HWord(tmpname), mkIRExpr_HWord(counter) ) ); setHelperAnns(d); addStmtToIRSB(sb, IRStmt_Dirty(d)); break; case (Iex_Const): /* add code to emit new tyvar for memory address */ d = unsafeIRDirty_0_N(0, "EmitStoreAddr2ConstHelper", &EmitStoreAddr2ConstHelper, mkIRExprVec_1(addr ) ); setHelperAnns(d); addStmtToIRSB(sb,IRStmt_Dirty(d)); break; default: /* Should not reach here. */ ppIRExpr(data); vpanic("Bad store address!\n"); break; } break; default: break; } return; }
void AddPutHelper(IRSB* sb, Int offset, IRExpr* data) { IRDirty * d; HWord h_offset = (HWord)(offset); HWord lhs_name; switch (data->tag) { case(Iex_Const): d = unsafeIRDirty_0_N(0, "EmitPutConstHelper", &EmitPutConstHelper, mkIRExprVec_2(mkIRExpr_HWord(h_offset), mkIRExpr_HWord(counter) ) ); setHelperAnns(d); addStmtToIRSB(sb, IRStmt_Dirty(d)); break; case(Iex_RdTmp): lhs_name = (HWord)data->Iex.RdTmp.tmp; d = unsafeIRDirty_0_N(0, "EmitPutTmpHelper", &EmitPutTmpHelper, mkIRExprVec_3(mkIRExpr_HWord(h_offset), mkIRExpr_HWord(lhs_name), mkIRExpr_HWord(counter) ) ); setHelperAnns(d); addStmtToIRSB(sb, IRStmt_Dirty(d)); break; default: break; } return; }
void AddLoadHelper(IRSB* sb, IRTemp lhs, IRExpr* addr) { IRDirty * d; ULong lhs_int; lhs_int = (HWord)lhs; d = unsafeIRDirty_0_N(0, "EmitLoadTmp2AddrHelper", &EmitRdTmpTmp2TmpHelper, mkIRExprVec_3( mkIRExpr_HWord(lhs_int), addr, mkIRExpr_HWord(counter) ) ); setHelperAnns(d); addStmtToIRSB(sb,IRStmt_Dirty(d)); return; }
void AddBinopHelper(IRSB* sb,IRStmt* st) { IROp op; IRDirty* d1; IRDirty* d2; IRExpr* arg1; IRExpr* arg2; HWord lhs,tmpname; // HWord cur_ctr = (HWord)counter; vassert(st->tag = Ist_WrTmp); op = (HWord)st->Ist.WrTmp.data->Iex.Binop.op; arg1 = st->Ist.WrTmp.data->Iex.Binop.arg1; arg2 = st->Ist.WrTmp.data->Iex.Binop.arg2; lhs = (HWord)st->Ist.WrTmp.tmp; d1 = unsafeIRDirty_0_N(0, "EmitNewTmpTyvarHelper", &EmitNewTmpTyvarHelper, mkIRExprVec_2( mkIRExpr_HWord(lhs), mkIRExpr_HWord(counter) ) ); setHelperAnns(d1); addStmtToIRSB(sb,IRStmt_Dirty(d1)); if (arg1->tag == Iex_RdTmp && arg2->tag == Iex_RdTmp) { d2 = unsafeIRDirty_0_N(0, "EmitBinopTmpTmpTypeHelper", &EmitBinopTmpTmpTypeHelper, mkIRExprVec_5( mkIRExpr_HWord(lhs), mkIRExpr_HWord(op), mkIRExpr_HWord((HWord)arg1->Iex.RdTmp.tmp), mkIRExpr_HWord((HWord)arg2->Iex.RdTmp.tmp), mkIRExpr_HWord(counter) ) ); setHelperAnns(d2); addStmtToIRSB(sb,IRStmt_Dirty(d2)); } if ((arg1->tag == Iex_RdTmp && arg2->tag == Iex_Const) || (arg1->tag == Iex_Const && arg2->tag == Iex_RdTmp)) { if (arg1->tag == Iex_RdTmp) tmpname = (HWord)arg1->Iex.RdTmp.tmp; else if (arg2->tag == Iex_RdTmp) tmpname = (HWord)arg2->Iex.RdTmp.tmp; else vpanic("Neither arg1 nor arg2 is a tmp! \n"); d2 = unsafeIRDirty_0_N(0, "EmitBinopTmpConstTypeHelper", &EmitBinopTmpConstTypeHelper, mkIRExprVec_4( mkIRExpr_HWord(lhs), mkIRExpr_HWord(op), mkIRExpr_HWord(tmpname), mkIRExpr_HWord(counter) ) ); setHelperAnns(d2); addStmtToIRSB(sb,IRStmt_Dirty(d2)); } return; }
void AddGetHelper(IRSB* sb, IRTemp lhs, Int offset, Addr addr) { ULong offset_cur = (HWord)offset; ULong lhs_int = (HWord)lhs; IRDirty* d1,*d2; d1 = unsafeIRDirty_0_N(0, "EmitGetTmp2RegHelper", &EmitGetTmp2RegHelper, mkIRExprVec_3( mkIRExpr_HWord(lhs_int), mkIRExpr_HWord(offset_cur), mkIRExpr_HWord(counter) ) ); setHelperAnns(d1); addStmtToIRSB(sb,IRStmt_Dirty(d1)); Addr relateaddr = getAddrOf(getVarOf(locToHashKey(offset_cur,0,RegLoc))); ThreadId tid = VG_(get_running_tid)(); tl_assert(VG_INVALID_THREADID != tid); ThreadState* tst = VG_(get_ThreadState)(tid); // SizeT argRDI = tst->arch.vex.guest_RDI; // SizeT argRSI = tst->arch.vex.guest_RSI; VexGuestArchState* t = &(tst->arch.vex); ULong argRDI; ULong argRSI; /* if(offset == 64) { argRSI = *(&(t->guest_RSI)); VG_(message)(Vg_UserMsg, "argRSI %ld \n", argRSI); VG_(message)(Vg_UserMsg, "(SSizeT)argRSI %ld \n", (SSizeT)argRSI); } */ //VG_(message)(Vg_UserMsg, "addr is %lx \n", addr); if(isRealloc) { if(argNum == 1 && offset == 64) { //argRSI = *(&(tst->arch.vex) + offset); argRSI = *(&(t->guest_RSI)); // VG_(message)(Vg_UserMsg, "realloc arg %lu \n", argRSI); /* if((SSizeT)argRSI < 0) { VG_(message)(Vg_UserMsg, "ERROR realloc arg %ld ", (SSizeT)argRSI); //VG_printf("ERROR realloc arg %ld ",(SSizeT)argRSI); if(relateaddr != 0) VG_(message)(Vg_UserMsg, "(come from 0x%lx)", relateaddr); //VG_printf("(come from 0x%x)",relateaddr); VG_(message)(Vg_UserMsg, "\n"); //VG_printf("\n"); } */ d2 = unsafeIRDirty_0_N(2, "trace_error", &trace_error, mkIRExprVec_3( mkIRExpr_HWord(argRSI), mkIRExpr_HWord(addr), mkIRExpr_HWord(relateaddr) ) ); setHelperAnns(d2); addStmtToIRSB(sb,IRStmt_Dirty(d2)); argNum--; isRealloc = 0; } } else if(argNum > 0) { if(offset == 72) { argRDI = *(&(t->guest_RDI)); // VG_(message)(Vg_UserMsg, "alloc arg %lu \n", argRDI); /* if((SSizeT)argRDI < 0) { VG_(message)(Vg_UserMsg, "ERROR malloc/calloc/new/[] new first arg %ld ", (SSizeT)argRDI); //VG_printf("ERROR malloc/calloc/new/[] new first arg %ld ",(SSizeT)argRDI); if(relateaddr != 0) VG_(message)(Vg_UserMsg, "(come from 0x%lx)", relateaddr); //VG_printf("(come from 0x%x)",relateaddr); VG_(message)(Vg_UserMsg, "\n"); //VG_printf("\n"); } */ d2 = unsafeIRDirty_0_N(2, "trace_error", &trace_error, mkIRExprVec_3( mkIRExpr_HWord(argRDI), mkIRExpr_HWord(addr), mkIRExpr_HWord(relateaddr) ) ); setHelperAnns(d2); addStmtToIRSB(sb,IRStmt_Dirty(d2)); argNum--; } else if(offset == 64) { argRSI = *(&(t->guest_RSI)); // VG_(message)(Vg_UserMsg, "alloc arg %lu \n", argRSI); /* if((SSizeT)argRSI < 0) { VG_(message)(Vg_UserMsg, "ERROR calloc/memalign second arg %ld ", (SSizeT)argRSI); //VG_printf("ERROR calloc/memalign second arg %ld ",(SSizeT)argRSI); if(relateaddr != -1) VG_(message)(Vg_UserMsg, "(come from 0x%lx)", relateaddr); //VG_printf("(come from 0x%x)",relateaddr); VG_(message)(Vg_UserMsg, "\n"); //VG_printf("\n"); } */ d2 = unsafeIRDirty_0_N(2, "trace_error", &trace_error, mkIRExprVec_3( mkIRExpr_HWord(argRSI), mkIRExpr_HWord(addr), mkIRExpr_HWord(relateaddr) ) ); setHelperAnns(d2); addStmtToIRSB(sb,IRStmt_Dirty(d2)); argNum--; } } return; }
void findRepMovIRExpr(IRBB * bb, IRStmt * s, findRepMovContext * context, UInt tagVal) { IROp theOp; IRExpr * expr; IRExpr * arg1; IRExpr * arg2; UInt tmpName; IRDirty * d; expr = s->Ist.Tmp.data; switch (expr->tag) { case Iex_Binop: theOp = expr->Iex.Binop.op; arg1 = expr->Iex.Binop.arg1; arg2 = expr->Iex.Binop.arg2; switch(theOp) { case Iop_Sub32: case Iop_Sub16: case Iop_Sub8: if (arg2->tag == Iex_Const && arg1->tag == Iex_Tmp) { tmpName = (UInt) arg1->Iex.Tmp.tmp; context->subTmpVars[tmpName] = 1; if (checkTmpRepMov(tmpName, context) == 1) { // VG_(printf)("XXX tmpName: %u BB %u flagged by checkTmpRepMov! \n", tmpName, tagVal); d = unsafeIRDirty_0_N(0, "emitFlaggedTmpRepMov", &emitFlaggedTmpRepMov, mkIRExprVec_2( mkIRExpr_HWord(tmpName), mkIRExpr_HWord(tagVal) ) ); setHelperAnns(d); addStmtToIRBB(bb, IRStmt_Dirty(d)); } } break; case Iop_CmpEQ32: case Iop_CmpEQ16: case Iop_CmpEQ8: if (arg2->tag == Iex_Const && arg1->tag == Iex_Tmp) { tmpName = (UInt) arg1->Iex.Tmp.tmp; if (arg2->Iex.Const.con->Ico.U32 == 0) { context->cmpZeroTmpVars[tmpName] = 1; if (checkTmpRepMov(tmpName, context) == 1) { // VG_(printf)("XXX tmpName: %u BB %u flagged by checkTmpRepMov! \n", tmpName, tagVal); d = unsafeIRDirty_0_N(0, "emitFlaggedTmpRepMov", &emitFlaggedTmpRepMov, mkIRExprVec_2( mkIRExpr_HWord(tmpName), mkIRExpr_HWord(tagVal) ) ); setHelperAnns(d); addStmtToIRBB(bb, IRStmt_Dirty(d)); } } } break; default: break; } default: break; } return; }