⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toir.c

📁 unix下调试内存泄露的工具源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
      }   }   /* Normal case */   return integerGuestReg64Offset(reg);}/* Read the %CL register :: Ity_I8, for shift/rotate operations. */static IRExpr* getIRegCL ( void ){   vassert(!host_is_bigendian);   return IRExpr_Get( OFFB_RCX, Ity_I8 );}/* Write to the %AH register. */static void putIRegAH ( IRExpr* e ){   vassert(!host_is_bigendian);   vassert(typeOfIRExpr(irbb->tyenv, e) == Ity_I8);   stmt( IRStmt_Put( OFFB_RAX+1, e ) );}/* Read/write various widths of %RAX, as it has various   special-purpose uses. */static HChar* nameIRegRAX ( Int sz ){   switch (sz) {      case 1: return "%al";      case 2: return "%ax";      case 4: return "%eax";      case 8: return "%rax";      default: vpanic("nameIRegRAX(amd64)");   }}static IRExpr* getIRegRAX ( Int sz ){   vassert(!host_is_bigendian);   switch (sz) {      case 1: return IRExpr_Get( OFFB_RAX, Ity_I8 );      case 2: return IRExpr_Get( OFFB_RAX, Ity_I16 );      case 4: return IRExpr_Get( OFFB_RAX, Ity_I32 );      case 8: return IRExpr_Get( OFFB_RAX, Ity_I64 );      default: vpanic("getIRegRAX(amd64)");   }}static void putIRegRAX ( Int sz, IRExpr* e ){   IRType ty = typeOfIRExpr(irbb->tyenv, e);   vassert(!host_is_bigendian);   switch (sz) {      case 8: vassert(ty == Ity_I64);              stmt( IRStmt_Put( OFFB_RAX, e ));              break;      case 4: vassert(ty == Ity_I32);              stmt( IRStmt_Put( OFFB_RAX, unop(Iop_32Uto64,e) ));              break;      case 2: vassert(ty == Ity_I16);              stmt( IRStmt_Put( OFFB_RAX, e ));              break;      case 1: vassert(ty == Ity_I8);              stmt( IRStmt_Put( OFFB_RAX, e ));              break;      default: vpanic("putIRegRAX(amd64)");   }}/* Read/write various widths of %RDX, as it has various   special-purpose uses. */static IRExpr* getIRegRDX ( Int sz ){   vassert(!host_is_bigendian);   switch (sz) {      case 1: return IRExpr_Get( OFFB_RDX, Ity_I8 );      case 2: return IRExpr_Get( OFFB_RDX, Ity_I16 );      case 4: return IRExpr_Get( OFFB_RDX, Ity_I32 );      case 8: return IRExpr_Get( OFFB_RDX, Ity_I64 );      default: vpanic("getIRegRDX(amd64)");   }}static void putIRegRDX ( Int sz, IRExpr* e ){   vassert(!host_is_bigendian);   vassert(typeOfIRExpr(irbb->tyenv, e) == szToITy(sz));   switch (sz) {      case 8: stmt( IRStmt_Put( OFFB_RDX, e ));              break;      case 4: stmt( IRStmt_Put( OFFB_RDX, unop(Iop_32Uto64,e) ));              break;      case 2: stmt( IRStmt_Put( OFFB_RDX, e ));              break;      case 1: stmt( IRStmt_Put( OFFB_RDX, e ));              break;      default: vpanic("putIRegRDX(amd64)");   }}/* Simplistic functions to deal with the integer registers as a   straightforward bank of 16 64-bit regs. */static IRExpr* getIReg64 ( UInt regno ){   return IRExpr_Get( integerGuestReg64Offset(regno),                      Ity_I64 );}static void putIReg64 ( UInt regno, IRExpr* e ){   vassert(typeOfIRExpr(irbb->tyenv,e) == Ity_I64);   stmt( IRStmt_Put( integerGuestReg64Offset(regno), e ) );}static HChar* nameIReg64 ( UInt regno ){   return nameIReg( 8, regno, False );}/* Simplistic functions to deal with the lower halves of integer   registers as a straightforward bank of 16 32-bit regs. */static IRExpr* getIReg32 ( UInt regno ){   vassert(!host_is_bigendian);   return IRExpr_Get( integerGuestReg64Offset(regno),                      Ity_I32 );}static void putIReg32 ( UInt regno, IRExpr* e ){   vassert(typeOfIRExpr(irbb->tyenv,e) == Ity_I32);   stmt( IRStmt_Put( integerGuestReg64Offset(regno),                      unop(Iop_32Uto64,e) ) );}static HChar* nameIReg32 ( UInt regno ){   return nameIReg( 4, regno, False );}/* Simplistic functions to deal with the lower quarters of integer   registers as a straightforward bank of 16 16-bit regs. */static IRExpr* getIReg16 ( UInt regno ){   vassert(!host_is_bigendian);   return IRExpr_Get( integerGuestReg64Offset(regno),                      Ity_I16 );}static HChar* nameIReg16 ( UInt regno ){   return nameIReg( 2, regno, False );}/* Sometimes what we know is a 3-bit register number, a REX byte, and   which field of the REX byte is to be used to extend to a 4-bit   number.  These functions cater for that situation.  */static IRExpr* getIReg64rexX ( Prefix pfx, UInt lo3bits ){   vassert(lo3bits < 8);   vassert(IS_VALID_PFX(pfx));   return getIReg64( lo3bits | (getRexX(pfx) << 3) );}static HChar* nameIReg64rexX ( Prefix pfx, UInt lo3bits ){   vassert(lo3bits < 8);   vassert(IS_VALID_PFX(pfx));   return nameIReg( 8, lo3bits | (getRexX(pfx) << 3), False );}static HChar* nameIRegRexB ( Int sz, Prefix pfx, UInt lo3bits ){   vassert(lo3bits < 8);   vassert(IS_VALID_PFX(pfx));   vassert(sz == 8 || sz == 4 || sz == 2 || sz == 1);   return nameIReg( sz, lo3bits | (getRexB(pfx) << 3),                         toBool(sz==1 && !haveREX(pfx)) );}static IRExpr* getIRegRexB ( Int sz, Prefix pfx, UInt lo3bits ){   vassert(lo3bits < 8);   vassert(IS_VALID_PFX(pfx));   vassert(sz == 8 || sz == 4 || sz == 2 || sz == 1);   return IRExpr_Get(             offsetIReg( sz, lo3bits | (getRexB(pfx) << 3),                              toBool(sz==1 && !haveREX(pfx)) ),             szToITy(sz)          );}static void putIRegRexB ( Int sz, Prefix pfx, UInt lo3bits, IRExpr* e ){   vassert(lo3bits < 8);   vassert(IS_VALID_PFX(pfx));   vassert(sz == 8 || sz == 4 || sz == 2 || sz == 1);   vassert(typeOfIRExpr(irbb->tyenv, e) == szToITy(sz));   stmt( IRStmt_Put(             offsetIReg( sz, lo3bits | (getRexB(pfx) << 3),                             toBool(sz==1 && !haveREX(pfx)) ),            sz==4 ? unop(Iop_32Uto64,e) : e   ));}/* Functions for getting register numbers from modrm bytes and REX   when we don't have to consider the complexities of integer subreg   accesses.*//* Extract the g reg field from a modRM byte, and augment it using the   REX.R bit from the supplied REX byte.  The R bit usually is   associated with the g register field.*/static UInt gregOfRexRM ( Prefix pfx, UChar mod_reg_rm ){   Int reg = (Int)( (mod_reg_rm >> 3) & 7 );   reg += (pfx & PFX_REXR) ? 8 : 0;   return reg;}/* Extract the e reg field from a modRM byte, and augment it using the   REX.B bit from the supplied REX byte.  The B bit usually is   associated with the e register field (when modrm indicates e is a   register, that is).*/static UInt eregOfRexRM ( Prefix pfx, UChar mod_reg_rm ){   Int rm;   vassert(epartIsReg(mod_reg_rm));   rm = (Int)(mod_reg_rm & 0x7);   rm += (pfx & PFX_REXB) ? 8 : 0;   return rm;}/* General functions for dealing with integer register access. *//* Produce the guest state offset for a reference to the 'g' register   field in a modrm byte, taking into account REX (or its absence),   and the size of the access.*/static UInt offsetIRegG ( Int sz, Prefix pfx, UChar mod_reg_rm ){   UInt reg;   vassert(!host_is_bigendian);   vassert(IS_VALID_PFX(pfx));   vassert(sz == 8 || sz == 4 || sz == 2 || sz == 1);   reg = gregOfRexRM( pfx, mod_reg_rm );   return offsetIReg( sz, reg, toBool(sz == 1 && !haveREX(pfx)) );}static IRExpr* getIRegG ( Int sz, Prefix pfx, UChar mod_reg_rm ){   return IRExpr_Get( offsetIRegG( sz, pfx, mod_reg_rm ),                      szToITy(sz) );}static void putIRegG ( Int sz, Prefix pfx, UChar mod_reg_rm, IRExpr* e ){   vassert(typeOfIRExpr(irbb->tyenv,e) == szToITy(sz));   if (sz == 4) {      e = unop(Iop_32Uto64,e);   }   stmt( IRStmt_Put( offsetIRegG( sz, pfx, mod_reg_rm ), e ) );}staticHChar* nameIRegG ( Int sz, Prefix pfx, UChar mod_reg_rm ){   return nameIReg( sz, gregOfRexRM(pfx,mod_reg_rm),                        toBool(sz==1 && !haveREX(pfx)) );}/* Produce the guest state offset for a reference to the 'e' register   field in a modrm byte, taking into account REX (or its absence),   and the size of the access.  eregOfRexRM will assert if mod_reg_rm   denotes a memory access rather than a register access.*/static UInt offsetIRegE ( Int sz, Prefix pfx, UChar mod_reg_rm ){   UInt reg;   vassert(!host_is_bigendian);   vassert(IS_VALID_PFX(pfx));   vassert(sz == 8 || sz == 4 || sz == 2 || sz == 1);   reg = eregOfRexRM( pfx, mod_reg_rm );   return offsetIReg( sz, reg, toBool(sz == 1 && !haveREX(pfx)) );}static IRExpr* getIRegE ( Int sz, Prefix pfx, UChar mod_reg_rm ){   return IRExpr_Get( offsetIRegE( sz, pfx, mod_reg_rm ),                      szToITy(sz) );}static void putIRegE ( Int sz, Prefix pfx, UChar mod_reg_rm, IRExpr* e ){   vassert(typeOfIRExpr(irbb->tyenv,e) == szToITy(sz));   if (sz == 4) {      e = unop(Iop_32Uto64,e);   }   stmt( IRStmt_Put( offsetIRegE( sz, pfx, mod_reg_rm ), e ) );}staticHChar* nameIRegE ( Int sz, Prefix pfx, UChar mod_reg_rm ){   return nameIReg( sz, eregOfRexRM(pfx,mod_reg_rm),                        toBool(sz==1 && !haveREX(pfx)) );}/*------------------------------------------------------------*//*--- For dealing with XMM registers                       ---*//*------------------------------------------------------------*///.. static Int segmentGuestRegOffset ( UInt sreg )//.. {//..    switch (sreg) {//..       case R_ES: return OFFB_ES;//..       case R_CS: return OFFB_CS;//..       case R_SS: return OFFB_SS;//..       case R_DS: return OFFB_DS;//..       case R_FS: return OFFB_FS;//..       case R_GS: return OFFB_GS;//..       default: vpanic("segmentGuestRegOffset(x86)");//..    }//.. }static Int xmmGuestRegOffset ( UInt xmmreg ){   switch (xmmreg) {      case 0:  return OFFB_XMM0;      case 1:  return OFFB_XMM1;      case 2:  return OFFB_XMM2;      case 3:  return OFFB_XMM3;      case 4:  return OFFB_XMM4;      case 5:  return OFFB_XMM5;      case 6:  return OFFB_XMM6;      case 7:  return OFFB_XMM7;      case 8:  return OFFB_XMM8;      case 9:  return OFFB_XMM9;      case 10: return OFFB_XMM10;      case 11: return OFFB_XMM11;      case 12: return OFFB_XMM12;      case 13: return OFFB_XMM13;      case 14: return OFFB_XMM14;      case 15: return OFFB_XMM15;      default: vpanic("xmmGuestRegOffset(amd64)");   }}/* Lanes of vector registers are always numbered from zero being the   least significant lane (rightmost in the register).  */static Int xmmGuestRegLane16offset ( UInt xmmreg, Int laneno ){   /* Correct for little-endian host only. */   vassert(!host_is_bigendian);   vassert(laneno >= 0 && laneno < 8);   return xmmGuestRegOffset( xmmreg ) + 2 * laneno;}static Int xmmGuestRegLane32offset ( UInt xmmreg, Int laneno ){   /* Correct for little-endian host only. */   vassert(!host_is_bigendian);   vassert(laneno >= 0 && laneno < 4);   return xmmGuestRegOffset( xmmreg ) + 4 * laneno;}static Int xmmGuestRegLane64offset ( UInt xmmreg, Int laneno ){   /* Correct for little-endian host only. */   vassert(!host_is_bigendian);   vassert(laneno >= 0 && laneno < 2);   return xmmGuestRegOffset( xmmreg ) + 8 * laneno;}//.. static IRExpr* getSReg ( UInt sreg )//.. {//..    return IRExpr_Get( segmentGuestRegOffset(sreg), Ity_I16 );//.. }//.. //.. static void putSReg ( UInt sreg, IRExpr* e )//.. {//..    vassert(typeOfIRExpr(irbb->tyenv,e) == Ity_I16);//..    stmt( IRStmt_Put( segmentGuestRegOffset(sreg), e ) );//.. }static IRExpr* getXMMReg ( UInt xmmreg ){   return IRExpr_Get( xmmGuestRegOffset(xmmreg), Ity_V128 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -