From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32379 invoked by alias); 5 Feb 2013 15:05:43 -0000 Received: (qmail 32362 invoked by uid 22791); 5 Feb 2013 15:05:40 -0000 X-SWARE-Spam-Status: No, hits=-4.6 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 05 Feb 2013 15:05:27 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1U2k5N-0003SH-LZ from Yao_Qi@mentor.com ; Tue, 05 Feb 2013 07:05:25 -0800 Received: from SVR-ORW-FEM-04.mgc.mentorg.com ([147.34.97.41]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 5 Feb 2013 07:05:25 -0800 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server id 14.1.289.1; Tue, 5 Feb 2013 07:05:24 -0800 Message-ID: <51111F75.1020007@codesourcery.com> Date: Tue, 05 Feb 2013 15:05:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Pedro Alves CC: Subject: Re: [PATCH] New MI notification "=tsv-modified" References: <1359560580-1970-1-git-send-email-yao@codesourcery.com> <510C27CE.3090102@redhat.com> <510CCE26.50600@codesourcery.com> <510FF037.8000101@redhat.com> In-Reply-To: <510FF037.8000101@redhat.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-02/txt/msg00119.txt.bz2 On 02/05/2013 01:30 AM, Pedro Alves wrote: > _Which_ value is being talked about here is not explicit. > Trace state variables have_two_ values. The initial value, > and the current value (omitted if doesn't exist yet). I meant the initial value here. > If we list tsvs with MI's -trace-list-variables, we'll indeed > see an "init" and a "current" attribute, for each tsv, and no > attribute named "value". So I think it'd be very good to fix this > before the release, and make the output of the notifications > consistent with the tsv listing output, and the docs clearer. > > E.g.: > (gdb) interpreter-exec mi "-trace-list-variables" > ^done,trace-variables={nr_rows="1",nr_cols="3", > hdr=[{width="15",alignment="-1",col_name="name",colhdr="Name"}, > {width="11",alignment="-1",col_name="initial",colhdr="Initial"}, > {width="11",alignment="-1",col_name="current",colhdr="Current"}], > body=[variable={name="$a",initial="1"}, > variable={name="$b",initial="2",current="3"}] > > SO IOW, =tsv-created should be > > =tsv-created,name=@var{name},initial=@var{value} > > instead of the current > > =tsv-created,name=@var{name},value=@var{value} > > > and =tsv-modified should be > > =tsv-modified,name=@var{name},initial=@var{value} > > instead of the proposed > > =tsv-modified,name=@var{name},value=@var{value} The patch below implements these MI notifications with suggested attributes. "=tsv-modified" is implemented like: =tsv-modified,name=@var{name},initial=@var{initial},current=@var{current} I don't refactor function tvariables_info_1 in this patch, and I'd like to defer this change to next one. Is it OK if no test regression? -- Yao (齐尧) gdb/doc: 2013-02-05 Yao Qi * gdb.texinfo (GDB/MI Async Records): Document new MI notification "=tsv-modified". Update the document of MI notification "=tsv-created". * observer.texi (GDB Observers): New observer tsv_modified. Update observer tsv_created and tsv_deleted. gdb: 2013-02-05 Yao Qi * mi/mi-interp.c: Include "tracepoint.h". (mi_tsv_modified): Declare. (mi_tsv_created, mi_tsv_deleted): Update declaration. (mi_interpreter_init): Call observer_attach_tsv_modified. (mi_tsv_modified): New. (mi_tsv_created, mi_tsv_deleted): Update. * tracepoint.c (trace_variable_command): Call observer_notify_tsv_modified if the initial value of tsv is changed. (delete_trace_state_variable): Call observer_notify_tsv_deleted earlier. (trace_variable_command): Caller update. (create_tsv_from_upload): Likewise. * observer.sh: Declare "struct trace_state_variable". * NEWS: Mention the new MI notification "=tsv-modified". gdb/testsuite: 2013-02-05 Yao Qi * gdb.trace/mi-tsv-changed.exp (test_create_delete_tsv): Rename to ... (test_create_delete_modify_tsv): ... here. New test on modifying the initial value of a tsv. --- gdb/NEWS | 5 ++- gdb/doc/gdb.texinfo | 8 ++++- gdb/doc/observer.texi | 13 ++++++---- gdb/mi/mi-interp.c | 36 +++++++++++++++++++++------ gdb/observer.sh | 1 + gdb/testsuite/gdb.trace/mi-tsv-changed.exp | 22 +++++++++++----- gdb/tracepoint.c | 14 +++++++---- 7 files changed, 70 insertions(+), 29 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 539ceb9..0e01deb 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -121,8 +121,9 @@ show print type typedefs "=cmd-param-changed". ** Trace frame changes caused by command "tfind" are now notified using new async record "=traceframe-changed". - ** The creation and deletion of trace state variables are now notified - using new async records "=tsv-created" and "=tsv-deleted". + ** The creation, deletion and modification of trace state variables + are now notified using new async records "=tsv-created", + "=tsv-deleted" and "=tsv-modified". ** The start and stop of process record are now notified using new async record "=record-started" and "=record-stopped". ** Memory changes are now notified using new async record diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index a8a7284..6762cc9 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -27945,15 +27945,19 @@ Reports that the trace frame was changed and its new number is @var{tfnum}. The number of the tracepoint associated with this trace frame is @var{tpnum}. -@item =tsv-created,name=@var{name},value=@var{value} +@item =tsv-created,name=@var{name},initial=@var{initial} Reports that the new trace state variable @var{name} is created with -value @var{value}. +initial value @var{initial}. @item =tsv-deleted,name=@var{name} @itemx =tsv-deleted Reports that the trace state variable @var{name} is deleted or all trace state variables are deleted. +@item =tsv-modified,name=@var{name},initial=@var{initial},current=@var{current} +Reports that the trace state variable @var{name} is modified with +the initial value @var{initial} and the current value @var{current}. + @item =breakpoint-created,bkpt=@{...@} @itemx =breakpoint-modified,bkpt=@{...@} @itemx =breakpoint-deleted,id=@var{number} diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi index 87c08e1..adb7085 100644 --- a/gdb/doc/observer.texi +++ b/gdb/doc/observer.texi @@ -236,16 +236,19 @@ method is called after a command @code{set @var{param} @var{value}}. is the value of changed parameter. @end deftypefun -@deftypefun void tsv_created (const char *@var{name}, LONGEST @var{value}) -The new trace state variable @var{name} is created with value -@var{value}. +@deftypefun void tsv_created (const struct trace_state_variable *@var{tsv}) +The new trace state variable @var{tsv} is created. @end deftypefun -@deftypefun void tsv_deleted (const char *@var{name}) -The trace state variable @var{name} is deleted. If @var{name} is +@deftypefun void tsv_deleted (const struct trace_state_variable *@var{tsv}) +The trace state variable @var{tsv} is deleted. If @var{tsv} is @code{NULL}, all trace state variables are deleted. @end deftypefun +@deftypefun void tsv_modified (const struct trace_state_variable *@var{tsv}) +The trace state value @var{tsv} is modified. +@end deftypefun + @deftypefun void test_notification (int @var{somearg}) This observer is used for internal testing. Do not use. See testsuite/gdb.gdb/observer.exp. diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index 6617647..6e8ec3f 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -36,6 +36,7 @@ #include "solist.h" #include "gdb.h" #include "objfiles.h" +#include "tracepoint.h" /* These are the interpreter setup, etc. functions for the MI interpreter. */ @@ -71,8 +72,9 @@ static void mi_solib_loaded (struct so_list *solib); static void mi_solib_unloaded (struct so_list *solib); static void mi_about_to_proceed (void); static void mi_traceframe_changed (int tfnum, int tpnum); -static void mi_tsv_created (const char *name, LONGEST value); -static void mi_tsv_deleted (const char *name); +static void mi_tsv_created (const struct trace_state_variable *tsv); +static void mi_tsv_deleted (const struct trace_state_variable *tsv); +static void mi_tsv_modified (const struct trace_state_variable *tsv); static void mi_breakpoint_created (struct breakpoint *b); static void mi_breakpoint_deleted (struct breakpoint *b); static void mi_breakpoint_modified (struct breakpoint *b); @@ -137,6 +139,7 @@ mi_interpreter_init (struct interp *interp, int top_level) observer_attach_traceframe_changed (mi_traceframe_changed); observer_attach_tsv_created (mi_tsv_created); observer_attach_tsv_deleted (mi_tsv_deleted); + observer_attach_tsv_modified (mi_tsv_modified); observer_attach_breakpoint_created (mi_breakpoint_created); observer_attach_breakpoint_deleted (mi_breakpoint_deleted); observer_attach_breakpoint_modified (mi_breakpoint_modified); @@ -563,15 +566,15 @@ mi_traceframe_changed (int tfnum, int tpnum) /* Emit notification on creating a trace state variable. */ static void -mi_tsv_created (const char *name, LONGEST value) +mi_tsv_created (const struct trace_state_variable *tsv) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "tsv-created," - "name=\"%s\",value=\"%s\"\n", - name, plongest (value)); + "name=\"%s\",initial=\"%s\"\n", + tsv->name, plongest (tsv->initial_value)); gdb_flush (mi->event_channel); } @@ -579,21 +582,38 @@ mi_tsv_created (const char *name, LONGEST value) /* Emit notification on deleting a trace state variable. */ static void -mi_tsv_deleted (const char *name) +mi_tsv_deleted (const struct trace_state_variable *tsv) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); - if (name != NULL) + if (tsv != NULL) fprintf_unfiltered (mi->event_channel, "tsv-deleted," - "name=\"%s\"\n", name); + "name=\"%s\"\n", tsv->name); else fprintf_unfiltered (mi->event_channel, "tsv-deleted\n"); gdb_flush (mi->event_channel); } +/* Emit notification on modifying a trace state variable. */ + +static void +mi_tsv_modified (const struct trace_state_variable *tsv) +{ + struct mi_interp *mi = top_level_interpreter_data (); + + target_terminal_ours (); + + fprintf_unfiltered (mi->event_channel, "tsv-modified," + "name=\"%s\",initial=\"%s\",current=\"\%s\"\n", + tsv->name, plongest (tsv->initial_value), + plongest (tsv->value)); + + gdb_flush (mi->event_channel); +} + /* Emit notification about a created breakpoint. */ static void diff --git a/gdb/observer.sh b/gdb/observer.sh index 3ff28a8..7b9e70c 100755 --- a/gdb/observer.sh +++ b/gdb/observer.sh @@ -64,6 +64,7 @@ struct so_list; struct objfile; struct thread_info; struct inferior; +struct trace_state_variable; EOF ;; esac diff --git a/gdb/testsuite/gdb.trace/mi-tsv-changed.exp b/gdb/testsuite/gdb.trace/mi-tsv-changed.exp index 4e7d5a4..5151216 100644 --- a/gdb/testsuite/gdb.trace/mi-tsv-changed.exp +++ b/gdb/testsuite/gdb.trace/mi-tsv-changed.exp @@ -23,9 +23,9 @@ if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ return -1 } -# Test notifications on creating and deleting TSV. +# Test notifications on creating, deleting and modifying TSV. -proc test_create_delete_tsv { } {with_test_prefix "create delete" { +proc test_create_delete_modify_tsv { } {with_test_prefix "create delete modify" { global binfile global decimal @@ -35,10 +35,18 @@ proc test_create_delete_tsv { } {with_test_prefix "create delete" { mi_gdb_load ${binfile} mi_gdb_test "tvariable \$tvar1" \ - ".*=tsv-created,name=\"tvar1\",value=\"0\"\\\\n.*\\^done" \ + ".*=tsv-created,name=\"tvar1\",initial=\"0\"\\\\n.*\\^done" \ "tvariable \$tvar1" + mi_gdb_test "tvariable \$tvar1 = 1" \ + ".*=tsv-modified,name=\"tvar1\",initial=\"1\",current=\"0\"\\\\n.*\\^done" \ + "tvariable \$tvar1 modified" + # No "=tsv-modified" notification is emitted, because the initial + # value is not changed. + mi_gdb_test "tvariable \$tvar1 = 1" \ + ".*\\\$tvar1 = 1\\\\n\"\r\n~\"Trace state .*\\\\n.*\\^done" \ + "tvariable \$tvar1 modified without notification" mi_gdb_test "tvariable \$tvar2 = 45" \ - ".*=tsv-created,name=\"tvar2\",value=\"45\"\\\\n.*\\^done" \ + ".*=tsv-created,name=\"tvar2\",initial=\"45\"\\\\n.*\\^done" \ "tvariable \$tvar2" mi_gdb_test "delete tvariable \$tvar2" \ @@ -121,11 +129,11 @@ proc test_upload_tsv { } { with_test_prefix "upload" { set tsv1_created 0 set tsv2_created 0 gdb_expect { - -re "=tsv-created,name=\"tvar1\",value=\"0\"" { + -re "=tsv-created,name=\"tvar1\",initial=\"0\"" { set tsv1_created 1 exp_continue } - -re "=tsv-created,name=\"tvar2\",value=\"45\"" { + -re "=tsv-created,name=\"tvar2\",initial=\"45\"" { set tsv2_created 1 exp_continue } @@ -148,7 +156,7 @@ proc test_upload_tsv { } { with_test_prefix "upload" { set gdbserver_reconnect_p 0 }} - test_create_delete_tsv + test_create_delete_modify_tsv # Test target supports tracepoints or not. diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index be45cb4..d0a360a 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -351,11 +351,11 @@ delete_trace_state_variable (const char *name) for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) if (strcmp (name, tsv->name) == 0) { + observer_notify_tsv_deleted (tsv); + xfree ((void *)tsv->name); VEC_unordered_remove (tsv_s, tvariables, ix); - observer_notify_tsv_deleted (name); - return; } @@ -408,7 +408,11 @@ trace_variable_command (char *args, int from_tty) tsv = find_trace_state_variable (internalvar_name (intvar)); if (tsv) { - tsv->initial_value = initval; + if (tsv->initial_value != initval) + { + tsv->initial_value = initval; + observer_notify_tsv_modified (tsv); + } printf_filtered (_("Trace state variable $%s " "now has initial value %s.\n"), tsv->name, plongest (tsv->initial_value)); @@ -420,7 +424,7 @@ trace_variable_command (char *args, int from_tty) tsv = create_trace_state_variable (internalvar_name (intvar)); tsv->initial_value = initval; - observer_notify_tsv_created (tsv->name, initval); + observer_notify_tsv_created (tsv); printf_filtered (_("Trace state variable $%s " "created, with initial value %s.\n"), @@ -3586,7 +3590,7 @@ create_tsv_from_upload (struct uploaded_tsv *utsv) tsv->initial_value = utsv->initial_value; tsv->builtin = utsv->builtin; - observer_notify_tsv_created (tsv->name, tsv->initial_value); + observer_notify_tsv_created (tsv); do_cleanups (old_chain); -- 1.7.7.6