Use the new IRStmt_AbiHints created by the amd64 front end. This
finally makes memcheck able to reliably track the definedness of the
stack on amd64.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3686 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/mc_translate.c b/memcheck/mc_translate.c
index 1e2a7a9..f61570b 100644
--- a/memcheck/mc_translate.c
+++ b/memcheck/mc_translate.c
@@ -2404,6 +2404,26 @@
}
+/* We have an ABI hint telling us that [base .. base+len-1] is to
+ become undefined ("writable"). Generate code to call a helper to
+ notify the A/V bit machinery of this fact.
+
+ We call
+ void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len );
+*/
+static
+void do_AbiHint ( MCEnv* mce, IRExpr* base, Int len )
+{
+ IRDirty* di;
+ di = unsafeIRDirty_0_N(
+ 0/*regparms*/,
+ "MC_(helperc_MAKE_STACK_UNINIT)",
+ &MC_(helperc_MAKE_STACK_UNINIT),
+ mkIRExprVec_2( base, mkIRExpr_HWord( (UInt)len) )
+ );
+ stmt( mce->bb, IRStmt_Dirty(di) );
+}
+
/*------------------------------------------------------------*/
/*--- Memcheck main ---*/
@@ -2493,6 +2513,8 @@
|| isBogusAtom(st->Ist.STle.data);
case Ist_Exit:
return isBogusAtom(st->Ist.Exit.guard);
+ case Ist_AbiHint:
+ return isBogusAtom(st->Ist.AbiHint.base);
case Ist_NoOp:
case Ist_IMark:
case Ist_MFence:
@@ -2612,6 +2634,10 @@
do_shadow_Dirty( &mce, st->Ist.Dirty.details );
break;
+ case Ist_AbiHint:
+ do_AbiHint( &mce, st->Ist.AbiHint.base, st->Ist.AbiHint.len );
+ break;
+
default:
VG_(printf)("\n");
ppIRStmt(st);