From: Julian Seward Date: Sun, 6 Jul 2003 00:54:47 +0000 (+0000) Subject: Add patch from Nick to get proper backtraces in X-Git-Tag: svn/VALGRIND_2_0_0~65 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=96c305755007482c9047db2fd801ef1fc9a189da;p=thirdparty%2Fvalgrind.git Add patch from Nick to get proper backtraces in MC_(get_or_set_vbits_for_client). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1719 --- diff --git a/addrcheck/ac_main.c b/addrcheck/ac_main.c index fc70ce9361..c7e9dea14a 100644 --- a/addrcheck/ac_main.c +++ b/addrcheck/ac_main.c @@ -762,7 +762,7 @@ static void ac_ACCESS4_SLOWLY ( Addr a ) if (!MAC_(clo_partial_loads_ok) || ((a & 3) != 0) || (!a0ok && !a1ok && !a2ok && !a3ok)) { - MAC_(record_address_error)( a, 4, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 4, False ); return; } @@ -789,7 +789,7 @@ static void ac_ACCESS2_SLOWLY ( Addr a ) /* If an address error has happened, report it. */ if (aerr) { - MAC_(record_address_error)( a, 2, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 2, False ); } } @@ -803,7 +803,7 @@ static void ac_ACCESS1_SLOWLY ( Addr a ) /* If an address error has happened, report it. */ if (aerr) { - MAC_(record_address_error)( a, 1, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 1, False ); } } @@ -908,7 +908,7 @@ void ac_fpu_ACCESS_check_SLOWLY ( Addr addr, Int size ) } if (aerr) { - MAC_(record_address_error)( addr, size, False ); + MAC_(record_address_error)( /*tst*/NULL, addr, size, False ); } } diff --git a/memcheck/mac_needs.c b/memcheck/mac_needs.c index 1713bfd789..daec938493 100644 --- a/memcheck/mac_needs.c +++ b/memcheck/mac_needs.c @@ -382,9 +382,10 @@ static Bool is_just_below_ESP( Addr esp, Addr aa ) return False; } -/* This one called from generated code. */ +/* This one called from generated code and non-generated code. */ -void MAC_(record_address_error) ( Addr a, Int size, Bool isWrite ) +void MAC_(record_address_error) ( ThreadState* tst, Addr a, Int size, + Bool isWrite ) { MAC_Error err_extra; Bool just_below_esp; @@ -401,7 +402,7 @@ void MAC_(record_address_error) ( Addr a, Int size, Bool isWrite ) err_extra.size = size; err_extra.addrinfo.akind = Undescribed; err_extra.addrinfo.maybe_gcc = just_below_esp; - VG_(maybe_record_error)( NULL, AddrErr, a, /*s*/NULL, &err_extra ); + VG_(maybe_record_error)( tst, AddrErr, a, /*s*/NULL, &err_extra ); } /* These ones are called from non-generated code */ diff --git a/memcheck/mac_shared.h b/memcheck/mac_shared.h index 2beb31e043..93bedab6d7 100644 --- a/memcheck/mac_shared.h +++ b/memcheck/mac_shared.h @@ -292,7 +292,8 @@ extern void MAC_(new_block) ( ThreadState* tst, Addr p, UInt size, extern void MAC_(handle_free) ( ThreadState* tst, Addr p, UInt rzB, MAC_AllocKind kind ); -extern void MAC_(record_address_error) ( Addr a, Int size, Bool isWrite ); +extern void MAC_(record_address_error) ( ThreadState* tst, Addr a, + Int size, Bool isWrite ); extern void MAC_(record_core_mem_error) ( ThreadState* tst, Bool isWrite, Char* s ); extern void MAC_(record_param_error) ( ThreadState* tst, Addr a, diff --git a/memcheck/mc_clientreqs.c b/memcheck/mc_clientreqs.c index d99cfa7f93..bc703a4d3e 100644 --- a/memcheck/mc_clientreqs.c +++ b/memcheck/mc_clientreqs.c @@ -219,7 +219,7 @@ Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg, UInt* ret ) error. */ /* VG_(printf)("get_vbits %p %p %d\n", arg[1], arg[2], arg[3] ); */ *ret = MC_(get_or_set_vbits_for_client) - ( arg[1], arg[2], arg[3], False /* get them */ ); + ( tst, arg[1], arg[2], arg[3], False /* get them */ ); break; case VG_USERREQ__SET_VBITS: @@ -227,7 +227,7 @@ Bool SK_(handle_client_request) ( ThreadState* tst, UInt* arg, UInt* ret ) error. */ /* VG_(printf)("set_vbits %p %p %d\n", arg[1], arg[2], arg[3] ); */ *ret = MC_(get_or_set_vbits_for_client) - ( arg[1], arg[2], arg[3], True /* set them */ ); + ( tst, arg[1], arg[2], arg[3], True /* set them */ ); break; default: diff --git a/memcheck/mc_errcontext.c b/memcheck/mc_errcontext.c index a5f1ea58fb..9eb0ae8b31 100644 --- a/memcheck/mc_errcontext.c +++ b/memcheck/mc_errcontext.c @@ -133,14 +133,14 @@ void SK_(pp_SkinError) ( Error* err ) /* Creates a copy of the `extra' part, updates the copy with address info if necessary, and returns the copy. */ -/* This one called from generated code. */ -void MC_(record_value_error) ( Int size ) +/* This one called from generated code and non-generated code. */ +void MC_(record_value_error) ( ThreadState* tst, Int size ) { MAC_Error err_extra; MAC_(clear_MAC_Error)( &err_extra ); err_extra.size = size; - VG_(maybe_record_error)( NULL, ValueErr, /*addr*/0, /*s*/NULL, &err_extra ); + VG_(maybe_record_error)( tst, ValueErr, /*addr*/0, /*s*/NULL, &err_extra ); } /* These two called from non-generated code */ diff --git a/memcheck/mc_include.h b/memcheck/mc_include.h index b0a9864548..63aee187b8 100644 --- a/memcheck/mc_include.h +++ b/memcheck/mc_include.h @@ -144,6 +144,7 @@ extern Bool MC_(check_readable) ( Addr a, UInt len, Addr* bad_addr ); extern void MC_(detect_memory_leaks) ( void ); extern Int MC_(get_or_set_vbits_for_client) ( + ThreadState* tst, Addr dataV, Addr vbitsV, UInt size, @@ -156,7 +157,7 @@ extern void MC_(show_client_block_stats) ( void ); /* Functions defined in vg_memcheck_errcontext.c */ -extern void MC_(record_value_error) ( Int size ); +extern void MC_(record_value_error) ( ThreadState* tst, Int size ); extern void MC_(record_user_error) ( ThreadState* tst, Addr a, Bool isWrite ); extern void MC_(record_overlap_error)( ThreadState* tst, Char* function ); diff --git a/memcheck/mc_main.c b/memcheck/mc_main.c index 38a6ae970b..167a2ba82b 100644 --- a/memcheck/mc_main.c +++ b/memcheck/mc_main.c @@ -938,7 +938,7 @@ static UInt mc_rd_V4_SLOWLY ( Addr a ) if (!MAC_(clo_partial_loads_ok) || ((a & 3) != 0) || (!a0ok && !a1ok && !a2ok && !a3ok)) { - MAC_(record_address_error)( a, 4, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 4, False ); return (VGM_BYTE_VALID << 24) | (VGM_BYTE_VALID << 16) | (VGM_BYTE_VALID << 8) | VGM_BYTE_VALID; } @@ -981,7 +981,7 @@ static void mc_wr_V4_SLOWLY ( Addr a, UInt vbytes ) /* If an address error has happened, report it. */ if (aerr) - MAC_(record_address_error)( a, 4, True ); + MAC_(record_address_error)( /*tst*/NULL, a, 4, True ); } static UInt mc_rd_V2_SLOWLY ( Addr a ) @@ -1000,7 +1000,7 @@ static UInt mc_rd_V2_SLOWLY ( Addr a ) /* If an address error has happened, report it. */ if (aerr) { - MAC_(record_address_error)( a, 2, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 2, False ); vw = (VGM_BYTE_INVALID << 24) | (VGM_BYTE_INVALID << 16) | (VGM_BYTE_VALID << 8) | (VGM_BYTE_VALID); } @@ -1022,7 +1022,7 @@ static void mc_wr_V2_SLOWLY ( Addr a, UInt vbytes ) /* If an address error has happened, report it. */ if (aerr) - MAC_(record_address_error)( a, 2, True ); + MAC_(record_address_error)( /*tst*/NULL, a, 2, True ); } static UInt mc_rd_V1_SLOWLY ( Addr a ) @@ -1039,7 +1039,7 @@ static UInt mc_rd_V1_SLOWLY ( Addr a ) /* If an address error has happened, report it. */ if (aerr) { - MAC_(record_address_error)( a, 1, False ); + MAC_(record_address_error)( /*tst*/NULL, a, 1, False ); vw = (VGM_BYTE_INVALID << 24) | (VGM_BYTE_INVALID << 16) | (VGM_BYTE_INVALID << 8) | (VGM_BYTE_VALID); } @@ -1058,7 +1058,7 @@ static void mc_wr_V1_SLOWLY ( Addr a, UInt vbytes ) /* If an address error has happened, report it. */ if (aerr) - MAC_(record_address_error)( a, 1, True ); + MAC_(record_address_error)( /*tst*/NULL, a, 1, True ); } @@ -1069,22 +1069,22 @@ static void mc_wr_V1_SLOWLY ( Addr a, UInt vbytes ) void MC_(helperc_value_check0_fail) ( void ) { - MC_(record_value_error) ( 0 ); + MC_(record_value_error) ( /*tst*/NULL, 0 ); } void MC_(helperc_value_check1_fail) ( void ) { - MC_(record_value_error) ( 1 ); + MC_(record_value_error) ( /*tst*/NULL, 1 ); } void MC_(helperc_value_check2_fail) ( void ) { - MC_(record_value_error) ( 2 ); + MC_(record_value_error) ( /*tst*/NULL, 2 ); } void MC_(helperc_value_check4_fail) ( void ) { - MC_(record_value_error) ( 4 ); + MC_(record_value_error) ( /*tst*/NULL, 4 ); } @@ -1290,10 +1290,10 @@ void mc_fpu_read_check_SLOWLY ( Addr addr, Int size ) } if (aerr) { - MAC_(record_address_error)( addr, size, False ); + MAC_(record_address_error)( /*tst*/NULL, addr, size, False ); } else { if (verr) - MC_(record_value_error)( size ); + MC_(record_value_error)( /*tst*/NULL, size ); } } @@ -1320,7 +1320,7 @@ void mc_fpu_write_check_SLOWLY ( Addr addr, Int size ) } } if (aerr) { - MAC_(record_address_error)( addr, size, True ); + MAC_(record_address_error)( /*tst*/NULL, addr, size, True ); } } @@ -1332,6 +1332,7 @@ void mc_fpu_write_check_SLOWLY ( Addr addr, Int size ) /* Copy Vbits for src into vbits. Returns: 1 == OK, 2 == alignment error, 3 == addressing error. */ Int MC_(get_or_set_vbits_for_client) ( + ThreadState* tst, Addr dataV, Addr vbitsV, UInt size, @@ -1344,6 +1345,8 @@ Int MC_(get_or_set_vbits_for_client) ( UInt* vbits = (UInt*)vbitsV; UInt szW = size / 4; /* sigh */ UInt i; + UInt* dataP = NULL; /* bogus init to keep gcc happy */ + UInt* vbitsP = NULL; /* ditto */ /* Check alignment of args. */ if (!(IS_ALIGNED4_ADDR(data) && IS_ALIGNED4_ADDR(vbits))) @@ -1353,8 +1356,8 @@ Int MC_(get_or_set_vbits_for_client) ( /* Check that arrays are addressible. */ for (i = 0; i < szW; i++) { - UInt* dataP = &data[i]; - UInt* vbitsP = &vbits[i]; + dataP = &data[i]; + vbitsP = &vbits[i]; if (get_abits4_ALIGNED((Addr)dataP) != VGM_NIBBLE_VALID) { addressibleD = False; break; @@ -1365,12 +1368,12 @@ Int MC_(get_or_set_vbits_for_client) ( } } if (!addressibleD) { - MAC_(record_address_error)( dataV, size, + MAC_(record_address_error)( tst, (Addr)dataP, 4, setting ? True : False ); return 3; } if (!addressibleV) { - MAC_(record_address_error)( vbitsV, size, + MAC_(record_address_error)( tst, (Addr)vbitsP, 4, setting ? False : True ); return 3; } @@ -1380,7 +1383,7 @@ Int MC_(get_or_set_vbits_for_client) ( /* setting */ for (i = 0; i < szW; i++) { if (get_vbytes4_ALIGNED( (Addr)&vbits[i] ) != VGM_WORD_VALID) - MC_(record_value_error)(4); + MC_(record_value_error)(tst, 4); set_vbytes4_ALIGNED( (Addr)&data[i], vbits[i] ); } } else {