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);