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;
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)
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);
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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)
static struct bitmap* s_suppressed;
static Bool s_trace_suppression;
+Bool g_any_address_traced = False;
// Function definitions.
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);
}
/**
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)
#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,
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