Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Yao Qi <yao@codesourcery.com>
To: Pedro Alves <palves@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: Re: [PATCH] Add breakpoint_created observer to update tracepoint_count.
Date: Fri, 09 Nov 2012 01:09:00 -0000	[thread overview]
Message-ID: <509C57B2.5020806@codesourcery.com> (raw)
In-Reply-To: <509AA4C6.2030102@redhat.com>

On 11/08/2012 02:13 AM, Pedro Alves wrote:
> No need to install an observer for a notification that is emitted in the same
> module the new observer is in.  This is internals of the breakpoints module.
> All set_breakpoint_count's calls are centralized in install_breakpoint, through
> set_breakpoint_number.  All but break-range's, that is.  I don't recall why
> that doesn't use install_breakpoint.  Maybe it should.
> 

My original thought is to move tracepoint-related code from
breakpoint.c to tracepoint.c, so register a breakpoint_created observer
in tracepoint.c to update 'tracepoint_count'.  Unfortunately,
tracepoint commands use some breakpoint internal macros that prevent
moving them to tracepoint.c, so I move the observer register code back
to breakpoint.c.

Yes, it is not necessary to register a observer to update some state in
the same module.

> We should be able to put 'if (is_tracepoint) set_tracepoint_count()' in
> install_breakpoint too.

Hmmm, that sounds the right place to update 'tracepoint_count'.  How
about patch below?  A new test is added, without this fix, this test
fails.

-- 
Yao

gdb:

2012-11-09  Yao Qi  <yao@codesourcery.com>

	* breakpoint.c: Declare set_tracepoint_count.
	(install_breakpoint): Call set_tracepoint_count if B is a
	tracepoint.
	(trace_command): Don't call set_tracepoint_count.  Re-indent.
	(strace_command, ftrace_command):
	(create_tracepoint_from_upload): Likewise.

gdb/testsuite:

2012-11-09  Yao Qi  <yao@codesourcery.com>

	* gdb.mi/mi-break.exp (test_abreak_creation): New.
---
 gdb/breakpoint.c                  |   75 ++++++++++++++++++-------------------
 gdb/testsuite/gdb.mi/mi-break.exp |   10 +++++
 2 files changed, 47 insertions(+), 38 deletions(-)

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 092d81e..3763a04 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -261,6 +261,8 @@ static void disable_trace_command (char *, int);
 
 static void trace_pass_command (char *, int);
 
+static void set_tracepoint_count (int num);
+
 static int is_masked_watchpoint (const struct breakpoint *b);
 
 static struct bp_location **get_first_locp_gte_addr (CORE_ADDR address);
@@ -8319,6 +8321,8 @@ install_breakpoint (int internal, struct breakpoint *b, int update_gll)
 {
   add_to_breakpoint_chain (b);
   set_breakpoint_number (internal, b);
+  if (is_tracepoint (b))
+    set_tracepoint_count (breakpoint_count);
   if (!internal)
     mention (b);
   observer_notify_breakpoint_created (b);
@@ -14999,35 +15003,33 @@ trace_command (char *arg, int from_tty)
   else
     ops = &tracepoint_breakpoint_ops;
 
-  if (create_breakpoint (get_current_arch (),
-			 arg,
-			 NULL, 0, NULL, 1 /* parse arg */,
-			 0 /* tempflag */,
-			 bp_tracepoint /* type_wanted */,
-			 0 /* Ignore count */,
-			 pending_break_support,
-			 ops,
-			 from_tty,
-			 1 /* enabled */,
-			 0 /* internal */, 0))
-    set_tracepoint_count (breakpoint_count);
+  create_breakpoint (get_current_arch (),
+		     arg,
+		     NULL, 0, NULL, 1 /* parse arg */,
+		     0 /* tempflag */,
+		     bp_tracepoint /* type_wanted */,
+		     0 /* Ignore count */,
+		     pending_break_support,
+		     ops,
+		     from_tty,
+		     1 /* enabled */,
+		     0 /* internal */, 0);
 }
 
 static void
 ftrace_command (char *arg, int from_tty)
 {
-  if (create_breakpoint (get_current_arch (),
-			 arg,
-			 NULL, 0, NULL, 1 /* parse arg */,
-			 0 /* tempflag */,
-			 bp_fast_tracepoint /* type_wanted */,
-			 0 /* Ignore count */,
-			 pending_break_support,
-			 &tracepoint_breakpoint_ops,
-			 from_tty,
-			 1 /* enabled */,
-			 0 /* internal */, 0))
-    set_tracepoint_count (breakpoint_count);
+  create_breakpoint (get_current_arch (),
+		     arg,
+		     NULL, 0, NULL, 1 /* parse arg */,
+		     0 /* tempflag */,
+		     bp_fast_tracepoint /* type_wanted */,
+		     0 /* Ignore count */,
+		     pending_break_support,
+		     &tracepoint_breakpoint_ops,
+		     from_tty,
+		     1 /* enabled */,
+		     0 /* internal */, 0);
 }
 
 /* strace command implementation.  Creates a static tracepoint.  */
@@ -15044,18 +15046,17 @@ strace_command (char *arg, int from_tty)
   else
     ops = &tracepoint_breakpoint_ops;
 
-  if (create_breakpoint (get_current_arch (),
-			 arg,
-			 NULL, 0, NULL, 1 /* parse arg */,
-			 0 /* tempflag */,
-			 bp_static_tracepoint /* type_wanted */,
-			 0 /* Ignore count */,
-			 pending_break_support,
-			 ops,
-			 from_tty,
-			 1 /* enabled */,
-			 0 /* internal */, 0))
-    set_tracepoint_count (breakpoint_count);
+  create_breakpoint (get_current_arch (),
+		     arg,
+		     NULL, 0, NULL, 1 /* parse arg */,
+		     0 /* tempflag */,
+		     bp_static_tracepoint /* type_wanted */,
+		     0 /* Ignore count */,
+		     pending_break_support,
+		     ops,
+		     from_tty,
+		     1 /* enabled */,
+		     0 /* internal */, 0);
 }
 
 /* Set up a fake reader function that gets command lines from a linked
@@ -15124,8 +15125,6 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
 			  CREATE_BREAKPOINT_FLAGS_INSERTED))
     return NULL;
 
-  set_tracepoint_count (breakpoint_count);
-  
   /* Get the tracepoint we just created.  */
   tp = get_tracepoint (tracepoint_count);
   gdb_assert (tp != NULL);
diff --git a/gdb/testsuite/gdb.mi/mi-break.exp b/gdb/testsuite/gdb.mi/mi-break.exp
index 573f484..e40f94d 100644
--- a/gdb/testsuite/gdb.mi/mi-break.exp
+++ b/gdb/testsuite/gdb.mi/mi-break.exp
@@ -150,6 +150,14 @@ proc test_rbreak_creation_and_listing {} {
 	    "delete temp breakpoints"
 }
 
+proc test_abreak_creation {} {
+    mi_gdb_test "522-break-insert -a main" \
+	"522\\^done,bkpt=\{number=\"10\",type=\"tracepoint\".*\"\}" \
+	"break-insert -a operation"
+
+    mi_gdb_test "p \$tpnum" ".* = 10.*" "print \$tpnum"
+}
+
 proc test_ignore_count {} {
     global mi_gdb_prompt
     global line_callme_body
@@ -256,5 +264,7 @@ test_disabled_creation
 
 test_breakpoint_commands
 
+test_abreak_creation
+
 mi_gdb_exit
 return 0
-- 
1.7.7.6


  reply	other threads:[~2012-11-09  1:09 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-07  0:50 Yao Qi
2012-11-07 18:13 ` Pedro Alves
2012-11-09  1:09   ` Yao Qi [this message]
2012-11-09  2:28     ` Pedro Alves
2012-11-09  7:26       ` Yao Qi
2012-11-09  9:54         ` Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=509C57B2.5020806@codesourcery.com \
    --to=yao@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox