|
From: <sv...@va...> - 2005-05-12 18:05:02
|
Author: sewardj
Date: 2005-05-12 19:05:00 +0100 (Thu, 12 May 2005)
New Revision: 3686
Modified:
trunk/memcheck/mc_include.h
trunk/memcheck/mc_main.c
trunk/memcheck/mc_translate.c
Log:
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.
Modified: trunk/memcheck/mc_include.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_include.h 2005-05-12 18:02:50 UTC (rev 3685)
+++ trunk/memcheck/mc_include.h 2005-05-12 18:05:00 UTC (rev 3686)
@@ -70,6 +70,8 @@
extern VGA_REGPARM(1) UWord MC_(helperc_LOADV4) ( Addr );
extern VGA_REGPARM(1) ULong MC_(helperc_LOADV8) ( Addr );
=20
+extern void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len );
+
/* Functions defined in mc_translate.c */
extern IRBB* MC_(instrument) ( IRBB* bb_in, VexGuestLayout* layout,
IRType gWordTy, IRType hWordTy );
Modified: trunk/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_main.c 2005-05-12 18:02:50 UTC (rev 3685)
+++ trunk/memcheck/mc_main.c 2005-05-12 18:05:00 UTC (rev 3686)
@@ -909,6 +909,14 @@
);
=20
=20
+void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len )
+{
+ tl_assert(sizeof(UWord) =3D=3D sizeof(SizeT));
+ // VG_(printf)("helperc_MAKE_STACK_UNINIT %p %d\n", base, len );
+ mc_make_writable(base, len);
+}
+
+
/*------------------------------------------------------------*/
/*--- Checking memory ---*/
/*------------------------------------------------------------*/
Modified: trunk/memcheck/mc_translate.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_translate.c 2005-05-12 18:02:50 UTC (rev 3685)
+++ trunk/memcheck/mc_translate.c 2005-05-12 18:05:00 UTC (rev 3686)
@@ -2404,7 +2404,27 @@
=20
}
=20
+/* 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.
=20
+ We call=20
+ void MC_(helperc_MAKE_STACK_UNINIT) ( Addr base, UWord len );
+*/
+static
+void do_AbiHint ( MCEnv* mce, IRExpr* base, Int len )
+{
+ IRDirty* di;
+ di =3D 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;
=20
+ case Ist_AbiHint:
+ do_AbiHint( &mce, st->Ist.AbiHint.base, st->Ist.AbiHint.len =
);
+ break;
+
default:
VG_(printf)("\n");
ppIRStmt(st);
|