From: Julian Seward Date: Thu, 8 Jul 2004 14:23:22 +0000 (+0000) Subject: - Mucho x86 to IR hacking. X-Git-Tag: svn/VALGRIND_3_0_1^2~1269 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc2080784ce039d71ed470cf9040c8b05d011695;p=thirdparty%2Fvalgrind.git - Mucho x86 to IR hacking. - Build with Intel icc as it can warn about int-enum mismatches git-svn-id: svn://svn.valgrind.org/vex/trunk@65 --- diff --git a/VEX/Makefile b/VEX/Makefile index f841b13e6d..0299a1e0cc 100644 --- a/VEX/Makefile +++ b/VEX/Makefile @@ -27,8 +27,20 @@ PRIV_INCLUDES = -Ipriv/ir -Ipriv/main -Ipriv/host-generic \ APP_OBJS = test_main.o -CC = gcc341 -CCFLAGS = -g -Wall -Wshadow +#CC = gcc341 +#CCFLAGS = -g -Wall -Wshadow + +CC = icc +CCFLAGS = -g -Wbrief -Wall -wd981 -wd279 -wd1287 -wd869 \ + -wd810 -wd1419 -wd181 -wd111 -wd167 +# 981: operands are evaluated in unspecified order +# 279: controlling expression is constant +# 1287: invalid attribute for parameter +# 869: parameter "..." was never referenced +# 810: conversion from "int" to "Char={char}" may lose significant bits +# 181: argument is incompatible with corresponding format string conversion +# 111: statement is unreachable +# 167: argument of type unsigned char incompatible with formal of type char all: libvex.a $(APP_OBJS) $(CC) $(CCFLAGS) -o vex $(APP_OBJS) libvex.a diff --git a/VEX/priv/guest-x86/x86guest_defs.h b/VEX/priv/guest-x86/x86guest_defs.h index 7e2504563b..066086084a 100644 --- a/VEX/priv/guest-x86/x86guest_defs.h +++ b/VEX/priv/guest-x86/x86guest_defs.h @@ -20,7 +20,7 @@ /*---------------------------------------------------------*/ extern -IRBB* bbToIR_X86Instr ( Char* x86code, +IRBB* bbToIR_X86Instr ( UChar* x86code, Addr64 eip, Int* guest_bytes_read, Bool (*byte_accessible)(Addr64), diff --git a/VEX/priv/guest-x86/x86toIR.c b/VEX/priv/guest-x86/x86toIR.c index e956eeeff8..9ac4b84a08 100644 --- a/VEX/priv/guest-x86/x86toIR.c +++ b/VEX/priv/guest-x86/x86toIR.c @@ -177,29 +177,29 @@ static IRExpr* getIReg ( Int sz, UInt archreg ) } /* Ditto, but write to a reg instead. */ -static IRStmt* putIReg ( Int sz, UInt archreg, IRExpr* e ) +static void putIReg ( Int sz, UInt archreg, IRExpr* e ) { vassert(sz == 1 || sz == 2 || sz == 4); vassert(archreg < 8); vassert(!host_is_bigendian); vassert(sz == 4); - return IRStmt_Put(OFFB_EAX + 4*archreg, e); + stmt( IRStmt_Put(OFFB_EAX + 4*archreg, e) ); } -static IRStmt* assign ( IRTemp dst, IRExpr* e ) +static void assign ( IRTemp dst, IRExpr* e ) { - return IRStmt_Tmp(dst, e); + stmt( IRStmt_Tmp(dst, e) ); } -static IRStmt* storeLE ( IRExpr* addr, IRExpr* data ) +static void storeLE ( IRExpr* addr, IRExpr* data ) { - return IRStmt_STle(addr,data); + stmt( IRStmt_STle(addr,data) ); } -static IRStmt* copyToFrom ( IRTemp dst, IRTemp src ) +static void copyToFrom ( IRTemp dst, IRTemp src ) { - return IRStmt_Tmp(dst, IRExpr_Tmp(src)); + stmt( IRStmt_Tmp(dst, IRExpr_Tmp(src)) ); } static IRExpr* binop ( IROp op, IRExpr* a1, IRExpr* a2 ) @@ -217,6 +217,65 @@ static IRExpr* mkU32 ( UInt i ) return IRExpr_Const(IRConst_U32(i)); } +static IRExpr* mkU ( IRType ty, UInt i ) +{ + if (ty == Ity_I8) return IRExpr_Const(IRConst_U8(i)); + if (ty == Ity_I16) return IRExpr_Const(IRConst_U16(i)); + if (ty == Ity_I32) return IRExpr_Const(IRConst_U32(i)); + vpanic("mkU(x86)"); +} + +static IRExpr* loadLE ( IRType ty, IRExpr* data ) +{ + return IRExpr_LDle(ty,data); +} + +static IROp mkSizedOp ( IRType ty, IROp op8 ) +{ + vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32); + vassert(op8 == Iop_Add8 || op8 == Iop_Sub8 + || op8 == Iop_Adc8 || op8 == Iop_Sbb8 + || op8 == Iop_Mul8 + || op8 == Iop_Or8 || op8 == Iop_And8 || op8 == Iop_Xor8 + || op8 == Iop_Shl8 || op8 == Iop_Shr8 || op8 == Iop_Sar8 + || op8 == Iop_Not8 || op8 == Iop_Neg8 ); + return (IROp)( + ((Int)op8) + (ty==Ity_I8 ? 0 : (ty==Ity_I16 ? 1 : 2)) + ); +} + +static IRType szToTy ( Int n ) +{ + switch (n) { + case 1: return Ity_I8; + case 2: return Ity_I16; + case 4: return Ity_I32; + default: vpanic("szToTy(x86)"); + } +} + + +/*------------------------------------------------------------*/ +/*--- Helpers for %eflags. ---*/ +/*------------------------------------------------------------*/ + +static void setFlagsARITH ( IRTemp dstAfter, + IRTemp src, + IRTemp dstBefore, + IRType ty, + IROp op8 ) +{ + vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32); + switch (op8) { + case Iop_Sub8: + /* CC_SRC = %s, CC_DST = %d afterwards */ + + default: + ppIROp(op8); + vpanic("setFlagsARITH(x86)"); + } +} + //-- /*------------------------------------------------------------*/ //-- /*--- CPU feature set stuff ---*/ @@ -480,15 +539,15 @@ static IRExpr* mkU32 ( UInt i ) //-- } -//-- -//-- static Char* nameGrp1 ( Int opc_aux ) -//-- { -//-- static Char* grp1_names[8] -//-- = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" }; -//-- if (opc_aux < 0 || opc_aux > 7) VG_(core_panic)("nameGrp1"); -//-- return grp1_names[opc_aux]; -//-- } -//-- + +static Char* nameGrp1 ( Int opc_aux ) +{ + static Char* grp1_names[8] + = { "add", "or", "adc", "sbb", "and", "sub", "xor", "cmp" }; + if (opc_aux < 0 || opc_aux > 7) vpanic("nameGrp1(x86)"); + return grp1_names[opc_aux]; +} + //-- static Char* nameGrp2 ( Int opc_aux ) //-- { //-- static Char* grp2_names[8] @@ -583,8 +642,7 @@ const Char* nameIReg ( Int size, Int reg ) //-- } //-- } -static -const Char nameISize ( Int size ) +static Char nameISize ( Int size ) { switch (size) { case 4: return 'l'; @@ -792,6 +850,7 @@ IRExpr* disAMode ( Int* len, UChar sorb, UInt delta, UChar* buf ) { UChar rm = mod_reg_rm; DIS(buf, "%s(%s)", sorbTxt(sorb), nameIReg(4,rm)); *len = 1; + vpanic("amode 1"); return handleSegOverride(sorb, getIReg(4,rm)); } @@ -804,6 +863,7 @@ IRExpr* disAMode ( Int* len, UChar sorb, UInt delta, UChar* buf ) UInt d = getSDisp8(delta); DIS(buf, "%s%d(%s)", sorbTxt(sorb), d, nameIReg(4,rm)); *len = 2; + vpanic("amode 2"); return handleSegOverride(sorb, binop(Iop_Add32,getIReg(4,rm),mkU32(d))); } @@ -817,6 +877,7 @@ IRExpr* disAMode ( Int* len, UChar sorb, UInt delta, UChar* buf ) UInt d = getUDisp32(delta); DIS(buf, "%s0x%x(%s)", sorbTxt(sorb), d, nameIReg(4,rm)); *len = 5; + vpanic("amode 3"); return handleSegOverride(sorb, binop(Iop_Add32,getIReg(4,rm),mkU32(d))); } @@ -833,6 +894,7 @@ IRExpr* disAMode ( Int* len, UChar sorb, UInt delta, UChar* buf ) { UInt d = getUDisp32(delta); *len = 5; DIS(buf, "%s(0x%x)", sorbTxt(sorb), d); + vpanic("amode 4"); return handleSegOverride(sorb, mkU32(d)); } @@ -866,6 +928,7 @@ IRExpr* disAMode ( Int* len, UChar sorb, UInt delta, UChar* buf ) DIS(buf, "%s(%s,%s,%d)", sorbTxt(sorb), nameIReg(4,base_r), nameIReg(4,index_r), 1<