This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Fix PR14617: New MI notification on tracepoint modified.
- From: Yao Qi <yao at codesourcery dot com>
- To: <gdb-patches at sourceware dot org>
- Date: Thu, 18 Oct 2012 18:36:26 +0800
- Subject: [PATCH] Fix PR14617: New MI notification on tracepoint modified.
Hi,
As PR gdb/14617 described, when the passcount of a tracepoint is
modified, GDB doesn't emit any notification. This patch adds a
new notification '=tracepoint-modified' for the changes to
tracepoint-specific attributes. The reason I don't use
'=breakpoint-modified' notification is that IMO, it is about
changes to general breakpoints (breakpoint, tracepoint, catchpoint,
etc), so I don't want to put tracepoint-specific stuff into
it.
Regression tested on x86_64-linux with both native and gdbserver,
OK to apply?
gdb/doc:
* gdb.texinfo (GDB/MI Async Records): Document new MI notificaiton
"=tracepoint-modified".
* observer.texi (GDB Observers): Change the parameter of observer
"tracepoint-modified".
gdb:
Fix PR gdb/14617.
* NEWS: Mention new MI notification "=tracepoint-modified".
* breakpoint.c (trace_pass_set_count): Update caller of
observer_notify_tracepoint_modified.
* mi/mi-cmd-break.c (mi_cmd_break_passcount): Likewise.
* mi/mi-interp.c: Declare 'mi_tracepoint_modified'.
(mi_interpreter_init): Attach 'mi_tracepoint_modified'
to 'tracepoint-modified' observer.
(mi_breakpoint_modified): New.
* observer.sh (struct objfile;): Declare 'struct tracepoint'.
gdb/testsuite:
Fix PR gdb/14617.
* gdb.mi/mi-breakpoint-changed.exp (test_insert_delete_modify):
Remove setup_kfail, and update test.
---
gdb/NEWS | 2 ++
gdb/breakpoint.c | 2 +-
gdb/doc/gdb.texinfo | 5 +++++
gdb/doc/observer.texi | 6 +++---
gdb/mi/mi-cmd-break.c | 2 +-
gdb/mi/mi-interp.c | 19 +++++++++++++++++++
gdb/observer.sh | 1 +
gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp | 3 +--
8 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 0d13c19..485c21b 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -66,6 +66,8 @@ py [command]
"=memory-changed".
** Download of tracepoints are now notified using new async record
"=tracepoint-downloaded".
+ ** Passcount of tracepoint changes are now notified using new async record
+ "=tracepoint-modified".
*** Changes in GDB 7.5
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 3d69d41..e233cd0 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -15246,7 +15246,7 @@ static void
trace_pass_set_count (struct tracepoint *tp, int count, int from_tty)
{
tp->pass_count = count;
- observer_notify_tracepoint_modified (tp->base.number);
+ observer_notify_tracepoint_modified (tp);
if (from_tty)
printf_filtered (_("Setting tracepoint %d's passcount to %d\n"),
tp->base.number, count);
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index dbdf39b..64cda47 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -27685,6 +27685,11 @@ breakpoint commands; @xref{GDB/MI Breakpoint Commands}. The
Note that if a breakpoint is emitted in the result record of a
command, then it will not also be emitted in an async record.
+@item =tracepoint-modified,bkpt=@{number=@var{id},passcount=@var{count}@}
+Reports that a tracepoint-specific attribute was modified. The @var{id}
+is the ordinal number of tracepoint and @var{count} is the passcount
+of the tracepoint.
+
@item =tracepoint-downloaded,id="@var{number}",address="@var{addr}"
Reports that a tracepoint was downloaded to target. The @var{number}
is the ordinal number of the tracepoint. The @var{addr} is the
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index 9fd92fb..e2033a6 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -189,9 +189,9 @@ A tracepoint has been destroyed. The argument @var{tpnum} is the
number of the newly-destroyed tracepoint.
@end deftypefun
-@deftypefun void tracepoint_modified (int @var{tpnum})
-A tracepoint has been modified in some way. The argument @var{tpnum}
-is the number of the modified tracepoint.
+@deftypefun void tracepoint_modified (struct tracepoint *@var{t})
+A tracepoint has been modified in some way. The argument @var{t}
+is the pointer to the modified tracepoint.
@end deftypefun
@deftypefun void tracepoint_downloaded (struct bp_location *@var{loc})
diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c
index 2fe84dc..e3f709e 100644
--- a/gdb/mi/mi-cmd-break.c
+++ b/gdb/mi/mi-cmd-break.c
@@ -200,7 +200,7 @@ mi_cmd_break_passcount (char *command, char **argv, int argc)
if (t)
{
t->pass_count = p;
- observer_notify_tracepoint_modified (n);
+ observer_notify_tracepoint_modified (t);
}
else
{
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index d83d493..ec14f03 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -76,6 +76,7 @@ static void mi_tsv_deleted (const char *name);
static void mi_breakpoint_created (struct breakpoint *b);
static void mi_breakpoint_deleted (struct breakpoint *b);
static void mi_breakpoint_modified (struct breakpoint *b);
+static void mi_tracepoint_modified (struct tracepoint *t);
static void mi_tracepoint_downloaded (struct bp_location *loc);
static void mi_command_param_changed (const char *param, const char *value);
static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr,
@@ -141,6 +142,7 @@ mi_interpreter_init (struct interp *interp, int top_level)
observer_attach_breakpoint_created (mi_breakpoint_created);
observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
observer_attach_breakpoint_modified (mi_breakpoint_modified);
+ observer_attach_tracepoint_modified (mi_tracepoint_modified);
observer_attach_tracepoint_downloaded (mi_tracepoint_downloaded);
observer_attach_command_param_changed (mi_command_param_changed);
observer_attach_memory_changed (mi_memory_changed);
@@ -683,6 +685,23 @@ mi_breakpoint_modified (struct breakpoint *b)
gdb_flush (mi->event_channel);
}
+/* Emit notification about modified tracepoint. */
+
+static void
+mi_tracepoint_modified (struct tracepoint *t)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ target_terminal_ours ();
+
+ fprintf_unfiltered (mi->event_channel,
+ "tracepoint-modified,bkpt={number=\"%d\""
+ ",passcount=\"%d\"}\n",
+ t->base.number, t->pass_count);
+
+ gdb_flush (mi->event_channel);
+}
+
/* Emit notification about downloaded tracepoint. MI frontends may
check whether tracepoints are downloaded or not and display
downloaded ones and un-downloaded ones differently. */
diff --git a/gdb/observer.sh b/gdb/observer.sh
index 3df6578..00e3e90 100755
--- a/gdb/observer.sh
+++ b/gdb/observer.sh
@@ -65,6 +65,7 @@ struct objfile;
struct thread_info;
struct inferior;
struct bp_location;
+struct tracepoint;
EOF
;;
esac
diff --git a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp
index 773f588..2a5ab1a 100644
--- a/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp
+++ b/gdb/testsuite/gdb.mi/mi-breakpoint-changed.exp
@@ -120,10 +120,9 @@ proc test_insert_delete_modify { } {
{.*=breakpoint-modified,bkpt=\{number="5",.*,ignore=\"1\".*\}.*\n\^done} \
$test
# 5. when modifying pass count.
- setup_kfail gdb/14617 *-*-*
set test "passcount 1 4"
mi_gdb_test $test \
- {.*=breakpoint-modified,bkpt=\{number="4",.*\}.*\n\^done} \
+ {.*=tracepoint-modified,bkpt=\{number="4",passcount="1".*\}.*\n\^done} \
$test
# Delete some breakpoints and verify that '=breakpoint-deleted
--
1.7.7.6