Yet another optimization: do not instrument loads and stores that match the address pattern (stack pointer + offset) when data race detection on stack variables is disabled.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8236 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_main.c b/exp-drd/drd_main.c
index 5b688ec..9760ca1 100644
--- a/exp-drd/drd_main.c
+++ b/exp-drd/drd_main.c
@@ -38,6 +38,7 @@
#include "drd_thread_bitmap.h"
#include "drd_track.h"
#include "drd_vc.h"
+#include "libvex_guest_offsets.h"
#include "priv_drd_clientreq.h"
#include "pub_drd_bitmap.h"
#include "pub_tool_vki.h" // Must be included before pub_tool_libcproc
@@ -843,6 +844,50 @@
}
}
+#if defined(VGA_x86)
+#define STACK_POINTER_OFFSET OFFSET_x86_ESP
+#elif defined(VGA_amd64)
+#define STACK_POINTER_OFFSET OFFSET_amd64_RSP
+#elif defined(VGA_ppc32)
+#define STACK_POINTER_OFFSET ((OFFSET_ppc32_GPR0 + OFFSET_ppc32_GPR2) / 2)
+#elif defined(VGA_ppc64)
+#define STACK_POINTER_OFFSET ((OFFSET_ppc64_GPR0 + OFFSET_ppc64_GPR2) / 2)
+#else
+#error Unknown architecture.
+#endif
+
+
+/** Return true if and only if addr_expr matches the pattern (SP) or
+ * <offset>(SP).
+ */
+static Bool is_stack_access(IRSB* const bb, IRExpr* const addr_expr)
+{
+ Bool result = False;
+
+ if (addr_expr->tag == Iex_RdTmp)
+ {
+ int i;
+ for (i = 0; i < bb->stmts_size; i++)
+ {
+ if (bb->stmts[i]
+ && bb->stmts[i]->tag == Ist_WrTmp
+ && bb->stmts[i]->Ist.WrTmp.tmp == addr_expr->Iex.RdTmp.tmp)
+ {
+ IRExpr* e = bb->stmts[i]->Ist.WrTmp.data;
+ if (e->tag == Iex_Get && e->Iex.Get.offset == STACK_POINTER_OFFSET)
+ {
+ result = True;
+ }
+
+ //ppIRExpr(e);
+ //VG_(printf)(" (%s)\n", result ? "True" : "False");
+ break;
+ }
+ }
+ }
+ return result;
+}
+
static void instrument_load(IRSB* const bb,
IRExpr* const addr_expr,
const HWord size)
@@ -863,6 +908,9 @@
mkIRExpr_HWord(size)))));
}
+ if (! s_drd_check_stack_accesses && is_stack_access(bb, addr_expr))
+ return;
+
switch (size)
{
case 1:
@@ -925,6 +973,9 @@
mkIRExpr_HWord(size)))));
}
+ if (! s_drd_check_stack_accesses && is_stack_access(bb, addr_expr))
+ return;
+
switch (size)
{
case 1: