* tracepoint.c (condition_true_at_tracepoint): Don't run compiled
authorPedro Alves <palves@redhat.com>
Sun, 20 Jun 2010 22:18:48 +0000 (22:18 +0000)
committerPedro Alves <palves@redhat.com>
Sun, 20 Jun 2010 22:18:48 +0000 (22:18 +0000)
conditions in gdbserver.

gdb/gdbserver/ChangeLog
gdb/gdbserver/tracepoint.c

index 06c634303249ef1b90811283bff6231aba0d433d..f25e40980f46775a65cf33dbfaf79e4f8a02965c 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-20  Pedro Alves  <pedro@codesourcery.com>
+
+       * tracepoint.c (condition_true_at_tracepoint): Don't run compiled
+       conditions in gdbserver.
+
 2010-06-19  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * spu-low.c (spu_read_memory): Wrap around local store limit.
index 5f2e6b6ffb8d279eb9d6421f4f7bdd57b6ac2e38..6557749273393aabb6d27603bee142382e5335d4 100644 (file)
@@ -3923,9 +3923,25 @@ condition_true_at_tracepoint (struct tracepoint_hit_ctx *ctx,
   ULONGEST value = 0;
   enum eval_result_type err;
 
+  /* Presently, gdbserver doesn't run compiled conditions, only the
+     IPA does.  If the program stops at a fast tracepoint's address
+     (e.g., due to a breakpoint, trap tracepoint, or stepping),
+     gdbserver preemptively collect the fast tracepoint.  Later, on
+     resume, gdbserver steps over the fast tracepoint like it steps
+     over breakpoints, so that the IPA doesn't see that fast
+     tracepoint.  This avoids double collects of fast tracepoints in
+     that stopping scenario.  Having gdbserver itself handle the fast
+     tracepoint gives the user a consistent view of when fast or trap
+     tracepoints are collected, compared to an alternative where only
+     trap tracepoints are collected on stop, and fast tracepoints on
+     resume.  When a fast tracepoint is being processed by gdbserver,
+     it is always the non-compiled condition expression that is
+     used.  */
+#ifdef IN_PROCESS_AGENT
   if (tpoint->compiled_cond)
     err = ((condfn) (uintptr_t) (tpoint->compiled_cond)) (ctx, &value);
   else
+#endif
     err = eval_agent_expr (ctx, NULL, tpoint->cond, &value);
 
   if (err != expr_eval_no_error)