From: Bart Van Assche Date: Sat, 29 Mar 2008 14:42:59 +0000 (+0000) Subject: Removed --trace-mem which traced all memory accesses. Added support for multiple... X-Git-Tag: svn/VALGRIND_3_4_0~781 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=44d59037f3dd5816b9056bd7b324690a99da8789;p=thirdparty%2Fvalgrind.git Removed --trace-mem which traced all memory accesses. Added support for multiple --trace-address options. A range size can now be specified to the VG_USERREQ__DRD_START_TRACE_ADDR client request. Added VG_USERREQ__DRD_STOP_TRACE_ADDR client request. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7814 --- diff --git a/exp-drd/drd_clientreq.c b/exp-drd/drd_clientreq.c index 109247b688..84ce5a020d 100644 --- a/exp-drd/drd_clientreq.c +++ b/exp-drd/drd_clientreq.c @@ -109,8 +109,12 @@ static Bool drd_handle_client_request(ThreadId vg_tid, UWord* arg, UWord* ret) thread_new_segment(PtThreadIdToDrdThreadId(arg[1])); break; - case VG_USERREQ__DRD_TRACE_ADDR: - drd_trace_addr(arg[1]); + case VG_USERREQ__DRD_START_TRACE_ADDR: + drd_start_tracing_address_range(arg[1], arg[1] + arg[2]); + break; + + case VG_USERREQ__DRD_STOP_TRACE_ADDR: + drd_stop_tracing_address_range(arg[1], arg[1] + arg[2]); break; case VG_USERREQ__SET_PTHREADID: diff --git a/exp-drd/drd_clientreq.h b/exp-drd/drd_clientreq.h index 7e4868d3d4..08a6d4a448 100644 --- a/exp-drd/drd_clientreq.h +++ b/exp-drd/drd_clientreq.h @@ -25,9 +25,12 @@ enum { /* To ask the drd tool to start a new segment in the specified thread. */ VG_USERREQ__DRD_START_NEW_SEGMENT, /* args: POSIX thread ID. */ - /* To ask the drd tool to trace all accesses to the specified address. */ - VG_USERREQ__DRD_TRACE_ADDR, - /* args: Addr. */ + /* To ask the drd tool to trace all accesses to the specified range. */ + VG_USERREQ__DRD_START_TRACE_ADDR, + /* args: Addr, SizeT. */ + /* To ask the drd tool to stop tracing accesses to the specified range. */ + VG_USERREQ__DRD_STOP_TRACE_ADDR, + /* args: Addr, SizeT. */ /* Tell the core the pthread_t of the running thread */ VG_USERREQ__SET_PTHREADID, diff --git a/exp-drd/drd_main.c b/exp-drd/drd_main.c index baed74b444..efcf6e60bb 100644 --- a/exp-drd/drd_main.c +++ b/exp-drd/drd_main.c @@ -63,8 +63,6 @@ static void drd_start_client_code(const ThreadId tid, const ULong bbs_done); static Bool drd_print_stats = False; static Bool drd_trace_fork_join = False; -static Bool drd_trace_mem = False; -static Addr drd_trace_address = 0; static Bool s_drd_var_info = False; static Bool s_show_stack_usage = False; @@ -99,7 +97,6 @@ static Bool drd_process_cmd_line_option(Char* arg) else VG_BOOL_CLO(arg, "--trace-csw", trace_csw) else VG_BOOL_CLO(arg, "--trace-danger-set", trace_danger_set) else VG_BOOL_CLO(arg, "--trace-fork-join", drd_trace_fork_join) - else VG_BOOL_CLO(arg, "--trace-mem", drd_trace_mem) else VG_BOOL_CLO(arg, "--trace-mutex", trace_mutex) else VG_BOOL_CLO(arg, "--trace-rwlock", trace_rwlock) else VG_BOOL_CLO(arg, "--trace-segment", trace_segment) @@ -116,7 +113,8 @@ static Bool drd_process_cmd_line_option(Char* arg) set_show_conflicting_segments(show_confl_seg); if (trace_address) { - drd_trace_address = VG_(strtoll16)(trace_address, 0); + const Addr addr = VG_(strtoll16)(trace_address, 0); + drd_start_tracing_address_range(addr, addr + 1); } if (trace_barrier != -1) barrier_set_trace(trace_barrier); @@ -221,7 +219,7 @@ static VG_REGPARM(2) void drd_trace_load(Addr addr, SizeT size) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, size)) { drd_trace_mem_access(addr, size, eLoad); } @@ -240,7 +238,7 @@ static VG_REGPARM(1) void drd_trace_load_1(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 1)) { drd_trace_mem_access(addr, 1, eLoad); } @@ -259,7 +257,7 @@ static VG_REGPARM(1) void drd_trace_load_2(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 2)) { drd_trace_mem_access(addr, 2, eLoad); } @@ -278,7 +276,7 @@ static VG_REGPARM(1) void drd_trace_load_4(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 4)) { drd_trace_mem_access(addr, 4, eLoad); } @@ -297,7 +295,7 @@ static VG_REGPARM(1) void drd_trace_load_8(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 8)) { drd_trace_mem_access(addr, 8, eLoad); } @@ -323,7 +321,7 @@ VG_REGPARM(2) void drd_trace_store(Addr addr, SizeT size) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, size)) { drd_trace_mem_access(addr, size, eStore); } @@ -342,7 +340,7 @@ static VG_REGPARM(1) void drd_trace_store_1(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 1)) { drd_trace_mem_access(addr, 1, eStore); } @@ -361,7 +359,7 @@ static VG_REGPARM(1) void drd_trace_store_2(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 2)) { drd_trace_mem_access(addr, 2, eStore); } @@ -380,7 +378,7 @@ static VG_REGPARM(1) void drd_trace_store_4(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 4)) { drd_trace_mem_access(addr, 4, eStore); } @@ -399,7 +397,7 @@ static VG_REGPARM(1) void drd_trace_store_8(Addr addr) if (! running_thread_is_recording()) return; - if (drd_trace_mem || (addr == drd_trace_address)) + if (range_any_is_traced(addr, 8)) { drd_trace_mem_access(addr, 8, eStore); } @@ -460,11 +458,9 @@ static void drd_post_mem_write(const CorePart part, static void drd_start_using_mem(const Addr a1, const SizeT len) { - const Addr a2 = a1 + len; - - tl_assert(a1 < a2); + tl_assert(a1 < a1 + len); - if (a1 <= drd_trace_address && drd_trace_address < a2) + if (range_any_is_traced(a1, len)) { drd_trace_mem_access(a1, len, eStart); } @@ -476,7 +472,7 @@ static void drd_stop_using_mem(const Addr a1, const SizeT len) tl_assert(a1 < a2); - if (a1 <= drd_trace_address && drd_trace_address < a2) + if (range_any_is_traced(a1, len)) { drd_trace_mem_access(a1, len, eEnd); } @@ -593,10 +589,6 @@ void drd_post_thread_join(DrdThreadId drd_joiner, DrdThreadId drd_joinee) barrier_thread_delete(drd_joinee); } -void drd_trace_addr(const Addr addr) -{ - drd_trace_address = addr; -} /* Called after a thread has performed its last memory access. */ static void drd_thread_finished(ThreadId vg_tid) diff --git a/exp-drd/drd_suppression.c b/exp-drd/drd_suppression.c index 91fcbdea7b..63c7251d19 100644 --- a/exp-drd/drd_suppression.c +++ b/exp-drd/drd_suppression.c @@ -35,6 +35,7 @@ static struct bitmap* s_suppressed; static Bool s_trace_suppression; +Bool g_any_address_traced = False; // Function definitions. @@ -81,7 +82,7 @@ void drd_finish_suppression(const Addr a1, const Addr a2) VG_(get_and_pp_StackTrace)(VG_(get_running_tid)(), 12); tl_assert(False); } - bm_clear(s_suppressed, a1, a2); + bm_clear_store(s_suppressed, a1, a2); } /** @@ -104,6 +105,33 @@ Bool drd_is_any_suppressed(const Addr a1, const Addr a2) return bm_has_any(s_suppressed, a1, a2, eStore); } +void drd_start_tracing_address_range(const Addr a1, const Addr a2) +{ + tl_assert(a1 < a2); + + bm_access_range_load(s_suppressed, a1, a2); + if (! g_any_address_traced) + { + g_any_address_traced = True; + } +} + +void drd_stop_tracing_address_range(const Addr a1, const Addr a2) +{ + tl_assert(a1 < a2); + + bm_clear_load(s_suppressed, a1, a2); + if (g_any_address_traced) + { + g_any_address_traced = bm_has_any(s_suppressed, 0, ~(Addr)0, eLoad); + } +} + +Bool drd_is_any_traced(const Addr a1, const Addr a2) +{ + return bm_has_any(s_suppressed, a1, a2, eLoad); +} + void drd_suppression_stop_using_mem(const Addr a1, const Addr a2) { if (s_trace_suppression) diff --git a/exp-drd/drd_suppression.h b/exp-drd/drd_suppression.h index ab018b91af..593fe08d9d 100644 --- a/exp-drd/drd_suppression.h +++ b/exp-drd/drd_suppression.h @@ -4,6 +4,10 @@ #include "pub_tool_basics.h" + +extern Bool g_any_address_traced; + + void suppression_set_trace(const Bool trace_suppression); void drd_suppression_init(void); void drd_start_suppression(const Addr a1, const Addr a2, @@ -11,7 +15,17 @@ void drd_start_suppression(const Addr a1, const Addr a2, void drd_finish_suppression(const Addr a1, const Addr a2); Bool drd_is_suppressed(const Addr a1, const Addr a2); Bool drd_is_any_suppressed(const Addr a1, const Addr a2); +void drd_start_tracing_address_range(const Addr a1, const Addr a2); +void drd_stop_tracing_address_range(const Addr a1, const Addr a2); +Bool drd_is_any_traced(const Addr a1, const Addr a2); void drd_suppression_stop_using_mem(const Addr a1, const Addr a2); +static __inline__ +int range_any_is_traced(const Addr addr, const SizeT size) +{ + return (g_any_address_traced && drd_is_any_traced(addr, addr + size)); +} + + #endif // __PUB_CORE_DRD_H diff --git a/exp-drd/drd_track.h b/exp-drd/drd_track.h index bf4c9ff3c4..d718c6f229 100644 --- a/exp-drd/drd_track.h +++ b/exp-drd/drd_track.h @@ -25,8 +25,6 @@ void drd_post_thread_join(DrdThreadId joiner, DrdThreadId joinee); -void drd_trace_addr(const Addr addr); - void drd_pre_mutex_init(Addr mutex, const MutexT mutex_type); void drd_post_mutex_destroy(Addr mutex, const MutexT mutex_type); void drd_pre_mutex_lock(const Addr mutex, const MutexT mutex_type,