|
From: <sv...@va...> - 2011-12-17 13:04:24
|
Author: bart
Date: 2011-12-17 12:59:45 +0000 (Sat, 17 Dec 2011)
New Revision: 12310
Log:
DRD, load/store tracing: avoid evaluating the address expression twice
Modified:
trunk/drd/drd_load_store.c
Modified: trunk/drd/drd_load_store.c
===================================================================
--- trunk/drd/drd_load_store.c 2011-12-17 12:53:23 UTC (rev 12309)
+++ trunk/drd/drd_load_store.c 2011-12-17 12:59:45 UTC (rev 12310)
@@ -329,9 +329,15 @@
/**
* Instrument the client code to trace a memory load (--trace-addr).
*/
-static void instr_trace_mem_load(IRSB* const bb, IRExpr* const addr_expr,
- const HWord size)
+static IRExpr* instr_trace_mem_load(IRSB* const bb, IRExpr* addr_expr,
+ const HWord size)
{
+ IRTemp tmp;
+
+ tmp = newIRTemp(bb->tyenv, typeOfIRExpr(bb->tyenv, addr_expr));
+ addStmtToIRSB(bb, IRStmt_WrTmp(tmp, addr_expr));
+ addr_expr = IRExpr_RdTmp(tmp);
+
addStmtToIRSB(bb,
IRStmt_Dirty(
unsafeIRDirty_0_N(/*regparms*/2,
@@ -339,6 +345,8 @@
VG_(fnptr_to_fnentry)
(drd_trace_mem_load),
mkIRExprVec_2(addr_expr, mkIRExpr_HWord(size)))));
+
+ return addr_expr;
}
/**
@@ -493,7 +501,7 @@
addStmtToIRSB(bb, IRStmt_Dirty(di));
}
-static void instrument_store(IRSB* const bb, IRExpr* const addr_expr,
+static void instrument_store(IRSB* const bb, IRExpr* addr_expr,
IRExpr* const data_expr)
{
IRExpr* size_expr;
@@ -503,8 +511,12 @@
size = sizeofIRType(typeOfIRExpr(bb->tyenv, data_expr));
- if (UNLIKELY(DRD_(any_address_is_traced)()))
+ if (UNLIKELY(DRD_(any_address_is_traced)())) {
+ IRTemp tmp = newIRTemp(bb->tyenv, typeOfIRExpr(bb->tyenv, addr_expr));
+ addStmtToIRSB(bb, IRStmt_WrTmp(tmp, addr_expr));
+ addr_expr = IRExpr_RdTmp(tmp);
instr_trace_mem_store(bb, addr_expr, NULL, data_expr);
+ }
if (!s_check_stack_accesses && is_stack_access(bb, addr_expr))
return;
@@ -610,11 +622,12 @@
case Ist_WrTmp:
if (instrument) {
const IRExpr* const data = st->Ist.WrTmp.data;
+ IRExpr* addr_expr = data->Iex.Load.addr;
if (data->tag == Iex_Load) {
- if (UNLIKELY(DRD_(any_address_is_traced)()))
- instr_trace_mem_load(bb, data->Iex.Load.addr,
+ if (UNLIKELY(DRD_(any_address_is_traced)())) {
+ addr_expr = instr_trace_mem_load(bb, addr_expr,
sizeofIRType(data->Iex.Load.ty));
-
+ }
instrument_load(bb, data->Iex.Load.addr,
sizeofIRType(data->Iex.Load.ty));
}
@@ -698,11 +711,12 @@
/* LL */
dataTy = typeOfIRTemp(bb_in->tyenv, st->Ist.LLSC.result);
if (instrument) {
+ IRExpr* addr_expr = st->Ist.LLSC.addr;
if (UNLIKELY(DRD_(any_address_is_traced)()))
- instr_trace_mem_load(bb, st->Ist.LLSC.addr,
- sizeofIRType(dataTy));
+ addr_expr = instr_trace_mem_load(bb, addr_expr,
+ sizeofIRType(dataTy));
- instrument_load(bb, st->Ist.LLSC.addr, sizeofIRType(dataTy));
+ instrument_load(bb, addr_expr, sizeofIRType(dataTy));
}
} else {
/* SC */
|