Exemplo n.º 1
0
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; 
}
Exemplo n.º 2
0
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;
} 
Exemplo n.º 3
0
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;    
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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; 
}