|
From: <sv...@va...> - 2005-12-26 19:29:38
|
Author: njn
Date: 2005-12-26 19:29:33 +0000 (Mon, 26 Dec 2005)
New Revision: 5442
Log:
Remove unnecessary function pointers. And don't unnecessarily mark redzo=
nes
of new heap blocks as noaccess. Saves 30 lines of code and makes perf/he=
ap
about 3% faster.
Modified:
branches/COMPVBITS/memcheck/mc_include.h
branches/COMPVBITS/memcheck/mc_main.c
branches/COMPVBITS/memcheck/mc_malloc_wrappers.c
Modified: branches/COMPVBITS/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
--- branches/COMPVBITS/memcheck/mc_include.h 2005-12-26 17:58:58 UTC (rev=
5441)
+++ branches/COMPVBITS/memcheck/mc_include.h 2005-12-26 19:29:33 UTC (rev=
5442)
@@ -95,15 +95,13 @@
/* For tracking memory pools. */
extern VgHashTable MC_(mempool_list);
=20
-/* Function pointers for the two tools to track interesting events. */
-extern void (*MC_(new_mem_heap)) ( Addr a, SizeT len, Bool is_inited );
-extern void (*MC_(ban_mem_heap)) ( Addr a, SizeT len );
-extern void (*MC_(die_mem_heap)) ( Addr a, SizeT len );
-extern void (*MC_(copy_mem_heap))( Addr from, Addr to, SizeT len );
+/* Shadow memory functions */
+extern Bool MC_(check_noaccess)( Addr a, SizeT len, Addr* bad_addr );
+extern void MC_(make_noaccess) ( Addr a, SizeT len );
+extern void MC_(make_writable) ( Addr a, SizeT len );
+extern void MC_(make_readable) ( Addr a, SizeT len );
+extern void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT le=
n );
=20
-/* Function pointers for internal sanity checking. */
-extern Bool (*MC_(check_noaccess))( Addr a, SizeT len, Addr* bad_addr );
-
extern void MC_(print_malloc_stats) ( void );
=20
extern void* MC_(malloc) ( ThreadId tid, SizeT n );
Modified: branches/COMPVBITS/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
--- branches/COMPVBITS/memcheck/mc_main.c 2005-12-26 17:58:58 UTC (rev 54=
41)
+++ branches/COMPVBITS/memcheck/mc_main.c 2005-12-26 19:29:33 UTC (rev 54=
42)
@@ -1133,24 +1133,24 @@
=20
/* --- Set permissions for arbitrary address ranges --- */
=20
-static void mc_make_noaccess ( Addr a, SizeT len )
+void MC_(make_noaccess) ( Addr a, SizeT len )
{
- PROF_EVENT(40, "mc_make_noaccess");
- DEBUG("mc_make_noaccess(%p, %lu)\n", a, len);
+ PROF_EVENT(40, "MC_(make_noaccess)");
+ DEBUG("MC_(make_noaccess)(%p, %lu)\n", a, len);
set_address_range_perms ( a, len, VA_BITS64_NOACCESS, SM_DIST_NOACCES=
S );
}
=20
-static void mc_make_writable ( Addr a, SizeT len )
+void MC_(make_writable) ( Addr a, SizeT len )
{
- PROF_EVENT(41, "mc_make_writable");
- DEBUG("mc_make_writable(%p, %lu)\n", a, len);
+ PROF_EVENT(41, "MC_(make_writable)");
+ DEBUG("MC_(make_writable)(%p, %lu)\n", a, len);
set_address_range_perms ( a, len, VA_BITS64_WRITABLE, SM_DIST_WRITABL=
E );
}
=20
-static void mc_make_readable ( Addr a, SizeT len )
+void MC_(make_readable) ( Addr a, SizeT len )
{
- PROF_EVENT(42, "mc_make_readable");
- DEBUG("mc_make_readable(%p, %lu)\n", a, len);
+ PROF_EVENT(42, "MC_(make_readable)");
+ DEBUG("MC_(make_readable)(%p, %lu)\n", a, len);
set_address_range_perms ( a, len, VA_BITS64_READABLE, SM_DIST_READABL=
E );
}
=20
@@ -1158,26 +1158,26 @@
/* --- Block-copy permissions (needed for implementing realloc() and
sys_mremap). --- */
=20
-static void mc_copy_address_range_state ( Addr src, Addr dst, SizeT len =
)
+void MC_(copy_address_range_state) ( Addr src, Addr dst, SizeT len )
{
SizeT i, j;
=20
- DEBUG("mc_copy_address_range_state\n");
- PROF_EVENT(50, "mc_copy_address_range_state");
+ DEBUG("MC_(copy_address_range_state)\n");
+ PROF_EVENT(50, "MC_(copy_address_range_state)");
=20
if (len =3D=3D 0)
return;
=20
if (src < dst) {
for (i =3D 0, j =3D len-1; i < len; i++, j--) {
- PROF_EVENT(51, "mc_copy_address_range_state(loop)");
+ PROF_EVENT(51, "MC_(copy_address_range_state)(loop)");
set_vabits8( dst+j, get_vabits8( src+j ) );
}
}
=20
if (src > dst) {
for (i =3D 0; i < len; i++) {
- PROF_EVENT(51, "mc_copy_address_range_state(loop)");
+ PROF_EVENT(51, "MC_(copy_address_range_state)(loop)");
set_vabits8( dst+i, get_vabits8( src+i ) );
}
}
@@ -1195,13 +1195,13 @@
PROF_EVENT(300, "make_aligned_word32_writable");
=20
# if VG_DEBUG_MEMORY >=3D 2
- mc_make_writable(a, 4);
+ MC_(make_writable)(a, 4);
return;
# endif
=20
if (EXPECTED_NOT_TAKEN(a > MAX_PRIMARY_ADDRESS)) {
PROF_EVENT(301, "make_aligned_word32_writable-slow1");
- mc_make_writable(a, 4);
+ MC_(make_writable)(a, 4);
return;
}
=20
@@ -1220,13 +1220,13 @@
PROF_EVENT(310, "make_aligned_word32_noaccess");
=20
# if VG_DEBUG_MEMORY >=3D 2
- mc_make_noaccess(a, 4);
+ MC_(make_noaccess)(a, 4);
return;
# endif
=20
if (EXPECTED_NOT_TAKEN(a > MAX_PRIMARY_ADDRESS)) {
PROF_EVENT(311, "make_aligned_word32_noaccess-slow1");
- mc_make_noaccess(a, 4);
+ MC_(make_noaccess)(a, 4);
return;
}
=20
@@ -1246,13 +1246,13 @@
PROF_EVENT(320, "make_aligned_word64_writable");
=20
# if VG_DEBUG_MEMORY >=3D 2
- mc_make_writable(a, 8);
+ MC_(make_writable)(a, 8);
return;
# endif
=20
if (EXPECTED_NOT_TAKEN(a > MAX_PRIMARY_ADDRESS)) {
PROF_EVENT(321, "make_aligned_word64_writable-slow1");
- mc_make_writable(a, 8);
+ MC_(make_writable)(a, 8);
return;
}
=20
@@ -1271,13 +1271,13 @@
PROF_EVENT(330, "make_aligned_word64_noaccess");
=20
# if VG_DEBUG_MEMORY >=3D 2
- mc_make_noaccess(a, 8);
+ MC_(make_noaccess)(a, 8);
return;
# endif
=20
if (EXPECTED_NOT_TAKEN(a > MAX_PRIMARY_ADDRESS)) {
PROF_EVENT(331, "make_aligned_word64_noaccess-slow1");
- mc_make_noaccess(a, 8);
+ MC_(make_noaccess)(a, 8);
return;
}
=20
@@ -1297,7 +1297,7 @@
if (VG_IS_4_ALIGNED(new_SP)) {
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP );
} else {
- mc_make_writable ( -VG_STACK_REDZONE_SZB + new_SP, 4 );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + new_SP, 4 );
}
}
=20
@@ -1307,7 +1307,7 @@
if (VG_IS_4_ALIGNED(new_SP)) {
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-4 )=
;
} else {
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-4, 4 );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + new_SP-4, 4 );
}
}
=20
@@ -1320,7 +1320,7 @@
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP )=
;
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP+4 )=
;
} else {
- mc_make_writable ( -VG_STACK_REDZONE_SZB + new_SP, 8 );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + new_SP, 8 );
}
}
=20
@@ -1333,7 +1333,7 @@
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-8 )=
;
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-4 )=
;
} else {
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-8, 8 );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + new_SP-8, 8 );
}
}
=20
@@ -1347,7 +1347,7 @@
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP )=
;
make_aligned_word64_writable ( -VG_STACK_REDZONE_SZB + new_SP+4 )=
;
} else {
- mc_make_writable ( -VG_STACK_REDZONE_SZB + new_SP, 12 );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + new_SP, 12 );
}
}
=20
@@ -1362,7 +1362,7 @@
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-12 =
);
make_aligned_word64_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-8 =
);
} else {
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-12, 12 );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + new_SP-12, 12 );
}
}
=20
@@ -1377,7 +1377,7 @@
make_aligned_word64_writable ( -VG_STACK_REDZONE_SZB + new_SP+4 =
);
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP+12 =
);
} else {
- mc_make_writable ( -VG_STACK_REDZONE_SZB + new_SP, 16 );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + new_SP, 16 );
}
}
=20
@@ -1392,7 +1392,7 @@
make_aligned_word64_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-12 =
);
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-4 =
);
} else {
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-16, 16 );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + new_SP-16, 16 );
}
}
=20
@@ -1411,7 +1411,7 @@
make_aligned_word64_writable ( -VG_STACK_REDZONE_SZB + new_SP+20 =
);
make_aligned_word32_writable ( -VG_STACK_REDZONE_SZB + new_SP+28 =
);
} else {
- mc_make_writable ( -VG_STACK_REDZONE_SZB + new_SP, 32 );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + new_SP, 32 );
}
}
=20
@@ -1430,20 +1430,20 @@
make_aligned_word64_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-12 =
);
make_aligned_word32_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-4 =
);
} else {
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + new_SP-32, 32 );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + new_SP-32, 32 );
}
}
=20
static void mc_new_mem_stack ( Addr a, SizeT len )
{
PROF_EVENT(115, "new_mem_stack");
- mc_make_writable ( -VG_STACK_REDZONE_SZB + a, len );
+ MC_(make_writable) ( -VG_STACK_REDZONE_SZB + a, len );
}
=20
static void mc_die_mem_stack ( Addr a, SizeT len )
{
PROF_EVENT(125, "die_mem_stack");
- mc_make_noaccess ( -VG_STACK_REDZONE_SZB + a, len );
+ MC_(make_noaccess) ( -VG_STACK_REDZONE_SZB + a, len );
}
=20
=20
@@ -1483,7 +1483,7 @@
=20
# if 0
/* Really slow version */
- mc_make_writable(base, len);
+ MC_(make_writable)(base, len);
# endif
=20
# if 0
@@ -1510,7 +1510,7 @@
make_aligned_word64_writable(base + 112);
make_aligned_word64_writable(base + 120);
} else {
- mc_make_writable(base, len);
+ MC_(make_writable)(base, len);
}
# endif=20
=20
@@ -1560,7 +1560,7 @@
}
=20
/* else fall into slow case */
- mc_make_writable(base, len);
+ MC_(make_writable)(base, len);
}
=20
=20
@@ -1585,7 +1585,7 @@
returns False, and if bad_addr is non-NULL, sets *bad_addr to
indicate the lowest failing address. Functions below are
similar. */
-static Bool mc_check_noaccess ( Addr a, SizeT len, Addr* bad_addr )
+Bool MC_(check_noaccess) ( Addr a, SizeT len, Addr* bad_addr )
{
SizeT i;
UWord vabits8;
@@ -1768,29 +1768,19 @@
/* Ignore the permissions, just make it readable. Seems to work... *=
/
DEBUG("mc_new_mem_startup(%p, %llu, rr=3D%u, ww=3D%u, xx=3D%u)\n",
a,(ULong)len,rr,ww,xx);
- mc_make_readable(a, len);
+ MC_(make_readable)(a, len);
}
=20
static
-void mc_new_mem_heap ( Addr a, SizeT len, Bool is_inited )
-{
- if (is_inited) {
- mc_make_readable(a, len);
- } else {
- mc_make_writable(a, len);
- }
-}
-
-static
void mc_new_mem_mmap ( Addr a, SizeT len, Bool rr, Bool ww, Bool xx )
{
- mc_make_readable(a, len);
+ MC_(make_readable)(a, len);
}
=20
static
void mc_post_mem_write(CorePart part, ThreadId tid, Addr a, SizeT len)
{
- mc_make_readable(a, len);
+ MC_(make_readable)(a, len);
}
=20
=20
@@ -3713,17 +3703,17 @@
break;
=20
case VG_USERREQ__MAKE_NOACCESS: /* make no access */
- mc_make_noaccess ( arg[1], arg[2] );
+ MC_(make_noaccess) ( arg[1], arg[2] );
*ret =3D -1;
break;
=20
case VG_USERREQ__MAKE_WRITABLE: /* make writable */
- mc_make_writable ( arg[1], arg[2] );
+ MC_(make_writable) ( arg[1], arg[2] );
*ret =3D -1;
break;
=20
case VG_USERREQ__MAKE_READABLE: /* make readable */
- mc_make_readable ( arg[1], arg[2] );
+ MC_(make_readable) ( arg[1], arg[2] );
*ret =3D -1;
break;
=20
@@ -4124,18 +4114,12 @@
MC_(realloc),
MC_MALLOC_REDZONE_SZB );
=20
- MC_( new_mem_heap) =3D mc_new_mem_heap;
- MC_( ban_mem_heap) =3D mc_make_noaccess;
- MC_(copy_mem_heap) =3D mc_copy_address_range_state;
- MC_( die_mem_heap) =3D mc_make_noaccess;
- MC_(check_noaccess) =3D mc_check_noaccess;
-
VG_(track_new_mem_startup) ( mc_new_mem_startup );
- VG_(track_new_mem_stack_signal)( mc_make_writable );
- VG_(track_new_mem_brk) ( mc_make_writable );
+ VG_(track_new_mem_stack_signal)( MC_(make_writable) );
+ VG_(track_new_mem_brk) ( MC_(make_writable) );
VG_(track_new_mem_mmap) ( mc_new_mem_mmap );
=20
- VG_(track_copy_mem_remap) ( mc_copy_address_range_state );
+ VG_(track_copy_mem_remap) ( MC_(copy_address_range_state) );
=20
// Nb: we don't do anything with mprotect. This means that V bits ar=
e
// preserved if a program, for example, marks some memory as inaccess=
ible
@@ -4148,9 +4132,9 @@
// distinct from V bits, then we could handle all this properly.
VG_(track_change_mem_mprotect) ( NULL );
=20
- VG_(track_die_mem_stack_signal)( mc_make_noaccess );=20
- VG_(track_die_mem_brk) ( mc_make_noaccess );
- VG_(track_die_mem_munmap) ( mc_make_noaccess );=20
+ VG_(track_die_mem_stack_signal)( MC_(make_noaccess) );=20
+ VG_(track_die_mem_brk) ( MC_(make_noaccess) );
+ VG_(track_die_mem_munmap) ( MC_(make_noaccess) );=20
=20
VG_(track_new_mem_stack_4) ( mc_new_mem_stack_4 );
VG_(track_new_mem_stack_8) ( mc_new_mem_stack_8 );
@@ -4166,7 +4150,7 @@
VG_(track_die_mem_stack_32) ( mc_die_mem_stack_32 );
VG_(track_die_mem_stack) ( mc_die_mem_stack );
=20
- VG_(track_ban_mem_stack) ( mc_make_noaccess );
+ VG_(track_ban_mem_stack) ( MC_(make_noaccess) );
=20
VG_(track_pre_mem_read) ( mc_check_is_readable );
VG_(track_pre_mem_read_asciiz) ( mc_check_is_readable_asciiz );
Modified: branches/COMPVBITS/memcheck/mc_malloc_wrappers.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
--- branches/COMPVBITS/memcheck/mc_malloc_wrappers.c 2005-12-26 17:58:58 =
UTC (rev 5441)
+++ branches/COMPVBITS/memcheck/mc_malloc_wrappers.c 2005-12-26 19:29:33 =
UTC (rev 5442)
@@ -51,16 +51,7 @@
static SizeT cmalloc_n_frees =3D 0;
static SizeT cmalloc_bs_mallocd =3D 0;
=20
-/* Function pointers for tracking interesting events. */
-void (*MC_(new_mem_heap)) ( Addr a, SizeT len, Bool is_inited ) =3D NUL=
L;
-void (*MC_(ban_mem_heap)) ( Addr a, SizeT len ) =3D NUL=
L;
-void (*MC_(die_mem_heap)) ( Addr a, SizeT len ) =3D NUL=
L;
-void (*MC_(copy_mem_heap))( Addr from, Addr to, SizeT len ) =3D NUL=
L;
=20
-/* Function pointers for internal sanity checking. */
-Bool (*MC_(check_noaccess))( Addr a, SizeT len, Addr* bad_addr ) =3D NUL=
L;
-
-
/*------------------------------------------------------------*/
/*--- Tracking malloc'd and free'd blocks ---*/
/*------------------------------------------------------------*/
@@ -198,9 +189,10 @@
=20
VG_(HT_add_node)( table, create_MC_Chunk(tid, p, size, kind) );
=20
- MC_(ban_mem_heap)( p-rzB, rzB );
- MC_(new_mem_heap)( p, size, is_zeroed );
- MC_(ban_mem_heap)( p+size, rzB );
+ if (is_zeroed)
+ MC_(make_readable)( p, size );
+ else
+ MC_(make_writable)( p, size );
=20
return (void*)p;
}
@@ -263,11 +255,9 @@
static
void die_and_free_mem ( ThreadId tid, MC_Chunk* mc, SizeT rzB )
{
- /* Note: ban redzones again -- just in case user de-banned them
- with a client request... */
- MC_(ban_mem_heap)( mc->data-rzB, rzB );
- MC_(die_mem_heap)( mc->data, mc->size );
- MC_(ban_mem_heap)( mc->data+mc->size, rzB );
+ /* Note: make redzones noaccess again -- just in case user made them
+ accessible with a client request... */
+ MC_(make_noaccess)( mc->data-rzB, mc->size + 2*rzB );
=20
/* Put it out of harm's way for a while, if not from a client request=
*/
if (MC_AllocCustom !=3D mc->allockind) {
@@ -353,7 +343,7 @@
=20
} else if (old_size > new_size) {
/* new size is smaller */
- MC_(die_mem_heap)( mc->data+new_size, mc->size-new_size );
+ MC_(make_noaccess)( mc->data+new_size, mc->size-new_size );
mc->size =3D new_size;
mc->where =3D VG_(record_ExeContext)(tid);
p_new =3D p_old;
@@ -365,10 +355,10 @@
=20
if (a_new) {
/* First half kept and copied, second half new, red zones as no=
rmal */
- MC_(ban_mem_heap) ( a_new-MC_MALLOC_REDZONE_SZB, MC_MALLOC_REDZ=
ONE_SZB );
- MC_(copy_mem_heap)( (Addr)p_old, a_new, mc->size );
- MC_(new_mem_heap) ( a_new+mc->size, new_size-mc->size, /*init'd=
*/False );
- MC_(ban_mem_heap) ( a_new+new_size, MC_MALLOC_REDZONE_SZB );
+ MC_(make_noaccess)( a_new-MC_MALLOC_REDZONE_SZB, MC_MALLOC_REDZ=
ONE_SZB );
+ MC_(copy_address_range_state)( (Addr)p_old, a_new, mc->size );
+ MC_(make_writable)( a_new+mc->size, new_size-mc->size );
+ MC_(make_noaccess)( a_new+new_size, MC_MALLOC_REDZONE_SZB );
=20
/* Copy from old to new */
VG_(memcpy)((void*)a_new, p_old, mc->size);
@@ -434,11 +424,9 @@
// Clean up the chunks, one by one
VG_(HT_ResetIter)(mp->chunks);
while ( (mc =3D VG_(HT_Next)(mp->chunks)) ) {
- /* Note: ban redzones again -- just in case user de-banned them
- with a client request... */
- MC_(ban_mem_heap)(mc->data-mp->rzB, mp->rzB );
- MC_(die_mem_heap)(mc->data, mc->size );
- MC_(ban_mem_heap)(mc->data+mc->size, mp->rzB );
+ /* Note: make redzones noaccess again -- just in case user made th=
em
+ accessible with a client request... */
+ MC_(make_noaccess)(mc->data-mp->rzB, mc->size + 2*mp->rzB );
}
// Destroy the chunk table
VG_(HT_destruct)(mp->chunks);
|