Eliminated per-thread start/stop recording mechanism, which should make DRD a little bit faster. malloc()/free() is now intercepted on all platforms instead of just on i386.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7519 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-drd/drd_main.c b/exp-drd/drd_main.c
index c4de749..67b583f 100644
--- a/exp-drd/drd_main.c
+++ b/exp-drd/drd_main.c
@@ -150,10 +150,8 @@
{
Segment* sg;
- thread_set_vg_running_tid(VG_(get_running_tid)());
-
- if (! thread_is_recording(thread_get_running_tid()))
- return;
+ tl_assert(thread_get_running_tid()
+ == VgThreadIdToDrdThreadId(VG_(get_running_tid())));
#if 1
if (drd_trace_mem || (addr == drd_trace_address))
@@ -192,10 +190,8 @@
{
Segment* sg;
- thread_set_vg_running_tid(VG_(get_running_tid)());
-
- if (! thread_is_recording(thread_get_running_tid()))
- return;
+ tl_assert(thread_get_running_tid()
+ == VgThreadIdToDrdThreadId(VG_(get_running_tid())));
#if 1
if (drd_trace_mem || (addr == drd_trace_address))
@@ -242,23 +238,50 @@
}
}
+static void drd_pre_mem_read_asciiz(const CorePart part,
+ const ThreadId tid,
+ Char* const s,
+ const Addr a)
+{
+ const char* p = (void*)a;
+ SizeT size = 0;
+
+ /* Note: the expression '*p' reads client memory and may crash if the */
+ /* client provided an invalid pointer ! */
+ while (*p)
+ {
+ p++;
+ size++;
+ }
+ // To do: find out what a reasonable upper limit on 'size' is.
+ tl_assert(size < 4096);
+ if (size > 0)
+ {
+ drd_trace_load(a, size);
+ }
+}
+
static void drd_post_mem_write(const CorePart part,
const ThreadId tid,
const Addr a,
const SizeT size)
{
+ thread_set_vg_running_tid(VG_(get_running_tid)());
if (size > 0)
{
drd_trace_store(a, size);
}
}
-static void drd_start_using_mem(const Addr a1, const Addr a2)
+static void drd_start_using_mem(const Addr a1, const SizeT len)
{
+ const Addr a2 = a1 + len;
+
+ tl_assert(a1 < a2);
+
thread_set_vg_running_tid(VG_(get_running_tid)());
- if (a1 <= drd_trace_address && drd_trace_address < a2
- && thread_is_recording(thread_get_running_tid()))
+ if (a1 <= drd_trace_address && drd_trace_address < a2)
{
VG_(message)(Vg_UserMsg, "start 0x%lx size %ld %s (tracing 0x%lx)",
a1, a2 - a1, thread_get_name(thread_get_running_tid()),
@@ -268,10 +291,13 @@
}
}
-static void drd_stop_using_mem(const Addr a1, const Addr a2)
+static void drd_stop_using_mem(const Addr a1, const SizeT len)
{
- if (a1 <= drd_trace_address && drd_trace_address < a2
- && thread_is_recording(thread_get_running_tid()))
+ const Addr a2 = a1 + len;
+
+ tl_assert(a1 < a2);
+
+ if (a1 <= drd_trace_address && drd_trace_address < a2)
{
VG_(message)(Vg_UserMsg, "end 0x%lx size %ld %s (tracing 0x%lx)",
a1, a2 - a1, thread_get_name(thread_get_running_tid()),
@@ -284,13 +310,20 @@
drd_suppression_stop_using_mem(a1, a2);
}
+static
+void drd_start_using_mem_w_perms(const Addr a, const SizeT len,
+ const Bool rr, const Bool ww, const Bool xx)
+{
+ drd_start_using_mem(a, len);
+}
+
/* Called by the core when the stack of a thread grows, to indicate that */
/* the addresses in range [ a, a + len [ may now be used by the client. */
/* Assumption: stacks grow downward. */
static void drd_start_using_mem_stack(const Addr a, const SizeT len)
{
thread_set_stack_min(thread_get_running_tid(), a - VG_STACK_REDZONE_SZB);
- drd_start_using_mem(a, a + len);
+ drd_start_using_mem(a, len);
}
/* Called by the core when the stack of a thread shrinks, to indicate that */
@@ -301,18 +334,17 @@
thread_set_vg_running_tid(VG_(get_running_tid)());
thread_set_stack_min(thread_get_running_tid(),
a + len - VG_STACK_REDZONE_SZB);
- drd_stop_using_mem(a, a + len);
+ drd_stop_using_mem(a, len);
}
-static void drd_start_using_mem_mmap(Addr a, SizeT len,
- Bool rr, Bool ww, Bool xx)
+static void drd_start_using_mem_stack_signal(const Addr a, const SizeT len)
{
- drd_start_using_mem(a, a + len);
+ drd_start_using_mem(a, len);
}
-static void drd_stop_using_mem_munmap(Addr a, SizeT len)
+static void drd_stop_using_mem_stack_signal(Addr a, SizeT len)
{
- drd_stop_using_mem(a, a + len);
+ drd_stop_using_mem(a, len);
}
static
@@ -797,15 +829,22 @@
drd_print_usage,
drd_print_debug_usage);
+ // Error handling.
drd_register_error_handlers();
// Core event tracking.
VG_(track_pre_mem_read) (drd_pre_mem_read);
+ VG_(track_pre_mem_read_asciiz) (drd_pre_mem_read_asciiz);
VG_(track_post_mem_write) (drd_post_mem_write);
+ VG_(track_new_mem_brk) (drd_start_using_mem);
+ VG_(track_new_mem_mmap) (drd_start_using_mem_w_perms);
VG_(track_new_mem_stack) (drd_start_using_mem_stack);
+ VG_(track_new_mem_stack_signal) (drd_start_using_mem_stack_signal);
+ VG_(track_new_mem_startup) (drd_start_using_mem_w_perms);
+ VG_(track_die_mem_brk) (drd_stop_using_mem);
+ VG_(track_die_mem_munmap) (drd_stop_using_mem);
VG_(track_die_mem_stack) (drd_stop_using_mem_stack);
- VG_(track_new_mem_mmap) (drd_start_using_mem_mmap);
- VG_(track_die_mem_munmap) (drd_stop_using_mem_munmap);
+ VG_(track_die_mem_stack_signal) (drd_stop_using_mem_stack_signal);
VG_(track_start_client_code) (drd_start_client_code);
VG_(track_pre_thread_ll_create) (drd_pre_thread_create);
VG_(track_pre_thread_first_insn)(drd_post_thread_create);