|
From: <sv...@va...> - 2012-08-29 17:41:01
|
florian 2012-08-29 18:40:52 +0100 (Wed, 29 Aug 2012)
New Revision: 2493
Log:
Fix address computation in IR injection. When loading / storing a
128-bit value as 2 64-bit values, the two memory locations are 8 bytes
apart. Always. Everywhere. Due to a thinko this was busted on 32-bit
eachines.
Also add an assert that values requiring more than 128 bit are currently
not supported.
Modified files:
trunk/priv/ir_inject.c
Modified: trunk/priv/ir_inject.c (+9 -3)
===================================================================
--- trunk/priv/ir_inject.c 2012-08-29 16:00:13 +01:00 (rev 2492)
+++ trunk/priv/ir_inject.c 2012-08-29 18:40:52 +01:00 (rev 2493)
@@ -83,12 +83,14 @@
IROp concat;
IRExpr *addr, *next_addr;
+ vassert(type == Ity_I1 || sizeofIRType(type) <= 16);
+
if (VEX_HOST_WORDSIZE == 8) {
addr = mkU64(haddr);
next_addr = binop(Iop_Add64, addr, mkU64(8));
} else if (VEX_HOST_WORDSIZE == 4) {
addr = mkU32(haddr);
- next_addr = binop(Iop_Add32, addr, mkU32(4));
+ next_addr = binop(Iop_Add32, addr, mkU32(8));
} else {
vpanic("invalid #bytes for address");
}
@@ -149,12 +151,16 @@
next_addr = binop(Iop_Add64, addr, mkU64(8));
} else if (VEX_HOST_WORDSIZE == 4) {
addr = mkU32(haddr);
- next_addr = binop(Iop_Add32, addr, mkU32(4));
+ next_addr = binop(Iop_Add32, addr, mkU32(8));
} else {
vpanic("invalid #bytes for address");
}
- switch (typeOfIRExpr(irsb->tyenv, data)) {
+ IRType type = typeOfIRExpr(irsb->tyenv, data);
+
+ vassert(type == Ity_I1 || sizeofIRType(type) <= 16);
+
+ switch (type) {
case Ity_I128: high = Iop_128HIto64; low = Iop_128to64; goto store128;
case Ity_F128: high = Iop_F128HItoF64; low = Iop_F128LOtoF64; goto store128;
case Ity_D128: high = Iop_D128HItoD64; low = Iop_D128LOtoD64; goto store128;
|