]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Removed --trace-mem which traced all memory accesses. Added support for multiple...
authorBart Van Assche <bvanassche@acm.org>
Sat, 29 Mar 2008 14:42:59 +0000 (14:42 +0000)
committerBart Van Assche <bvanassche@acm.org>
Sat, 29 Mar 2008 14:42:59 +0000 (14:42 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7814

exp-drd/drd_clientreq.c
exp-drd/drd_clientreq.h
exp-drd/drd_main.c
exp-drd/drd_suppression.c
exp-drd/drd_suppression.h
exp-drd/drd_track.h

index 109247b688fe03af475009af44621de8adaeac95..84ce5a020d44a05b62122925de912034b68856d0 100644 (file)
@@ -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:
index 7e4868d3d4db27af107a435a6ef0bb36fa07f537..08a6d4a4488f1dae6139228a4aa48bcc455b9c62 100644 (file)
@@ -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,
index baed74b444d1e4d28e20ba59d730769ad19d8698..efcf6e60bb26494a35f8754791b9750ffadedc68 100644 (file)
@@ -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)
index 91fcbdea7bf8e2659b75071b348d895bb81d65e0..63c7251d19aec161fb8df6227402583e12dc3913 100644 (file)
@@ -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)
index ab018b91af49e11a24f56edb5941e7a549f61ca1..593fe08d9db9fc58a03d631f37db00461a6ca9c2 100644 (file)
@@ -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
index bf4c9ff3c4dff171750375019e89af9bb7048a3a..d718c6f2291a8cd23ea76221065b259145dfd5ac 100644 (file)
@@ -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,