From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27911 invoked by alias); 9 Dec 2010 22:38:12 -0000 Received: (qmail 27739 invoked by uid 22791); 9 Dec 2010 22:38:10 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 09 Dec 2010 22:38:04 +0000 Received: (qmail 2010 invoked from network); 9 Dec 2010 22:38:03 -0000 Received: from unknown (HELO macbook-2.local) (stan@127.0.0.2) by mail.codesourcery.com with ESMTPA; 9 Dec 2010 22:38:03 -0000 Message-ID: <4D015A4A.7040500@codesourcery.com> Date: Thu, 09 Dec 2010 22:38:00 -0000 From: Stan Shebs User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.12) Gecko/20101027 Thunderbird/3.1.6 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [PATCH] Print trace state variables Content-Type: multipart/mixed; boundary="------------050803020807090905060401" 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: 2010-12/txt/msg00124.txt.bz2 This is a multi-part message in MIME format. --------------050803020807090905060401 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1152 This patch remedies an oversight in recent tracepoint work, by adding printing of trace state variables. While you can see tsv values using "info tvariables", it's much more useful to be able to include them in print commands and expressions in general; you can then display them in different formats, or compute the difference between a tsv and some other value. The manual already documents this as working, only the code to do it has been missing. :-) This has been in CodeSourcery's version for some time, but I set it aside for awhile because it seemed a little kludgy to add a tracepoint-specific case into general evaluation. On the plus side, its effect is localized, and should be safe for a 7.2 update release, where it will be useful for work on trace support in Eclipse. There are no regressions testing with either i386-linux native or GDBserver. If this seems reasonable, I'll put in both trunk and 7.2 branch. Stan 2010-12-08 Stan Shebs * value.c (value_of_internalvar): Add case for trace state variables. * gdb.trace/tsv.exp: Test print command on trace state variables. --------------050803020807090905060401 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="ptsv-patch-1" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ptsv-patch-1" Content-length: 4504 Index: value.c =================================================================== RCS file: /cvs/src/src/gdb/value.c,v retrieving revision 1.118 diff -p -r1.118 value.c *** value.c 29 Nov 2010 21:18:16 -0000 1.118 --- value.c 9 Dec 2010 01:03:40 -0000 *************** *** 42,47 **** --- 42,49 ---- #include "python/python.h" + #include "tracepoint.h" + /* Prototypes for exported functions. */ void _initialize_values (void); *************** struct value * *** 1197,1202 **** --- 1199,1220 ---- value_of_internalvar (struct gdbarch *gdbarch, struct internalvar *var) { struct value *val; + struct trace_state_variable *tsv; + + /* If there is a trace state variable of the same name, assume that + is what we really want to see. */ + tsv = find_trace_state_variable (var->name); + if (tsv) + { + tsv->value_known = target_get_trace_state_variable_value (tsv->number, + &(tsv->value)); + if (tsv->value_known) + val = value_from_longest (builtin_type (gdbarch)->builtin_int64, + tsv->value); + else + val = allocate_value (builtin_type (gdbarch)->builtin_void); + return val; + } switch (var->kind) { Index: testsuite/gdb.trace/tsv.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.trace/tsv.exp,v retrieving revision 1.5 diff -p -r1.5 tsv.exp *** testsuite/gdb.trace/tsv.exp 2 Jun 2010 21:55:28 -0000 1.5 --- testsuite/gdb.trace/tsv.exp 9 Dec 2010 01:03:40 -0000 *************** set srcfile ${testfile}.c *** 27,41 **** set binfile $objdir/$subdir/tsv if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ executable {debug nowarnings}] != "" } { ! untested tracecmd.exp return -1 } ! gdb_reinitialize_dir $srcdir/$subdir ! ! # If testing on a remote host, download the source file. ! # remote_download host $srcdir/$subdir/$srcfile ! ! gdb_file_cmd $binfile gdb_test "tvariable \$tvar1" \ "Trace state variable \\\$tvar1 created, with initial value 0." \ --- 27,36 ---- set binfile $objdir/$subdir/tsv if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ executable {debug nowarnings}] != "" } { ! untested tsv.exp return -1 } ! gdb_load $binfile gdb_test "tvariable \$tvar1" \ "Trace state variable \\\$tvar1 created, with initial value 0." \ *************** gdb_test "info tvariables" \ *** 72,77 **** --- 67,75 ---- \\\$tvar3\[\t \]+1234567000000\[\t \]+.*.*" \ "List tvariables" + gdb_test "print \$tvar2" " = void" \ + "Print a trace state variable before run" + gdb_test_no_output "delete tvariable \$tvar2" \ "delete trace state variable" *************** gdb_test "info tvariables" \ *** 91,94 **** --- 89,150 ---- "No trace state variables.*" \ "List tvariables after deleting all" + # Now try running a trace. + + runto_main + gdb_reinitialize_dir $srcdir/$subdir + + # The rest of the testing needs actual tracing to work. + if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + } + + # define relative source line numbers: + # all subsequent line numbers are relative to this first one (baseline) + + set baseline [gdb_find_recursion_test_baseline $srcfile]; + if { $baseline == -1 } then { + fail "Could not find gdb_recursion_test function" + return; + } + + set testline1 [expr $baseline + 7] + + gdb_delete_tracepoints + set trcpt1 [gdb_gettpnum gdb_c_test]; + set trcpt2 [gdb_gettpnum gdb_asm_test]; + set trcpt3 [gdb_gettpnum $testline1]; + if { $trcpt1 <= 0 || $trcpt2 <= 0 || $trcpt3 <= 0 } then { + fail "setting tracepoints" + return; + } + + gdb_test "tvariable \$tvar5 = 15" \ + "Trace state variable \\\$tvar5 created, with initial value 15." \ + "Create a trace state variable tvar5" + + gdb_trace_setactions "collect tsv for first tracepoint" \ + "$trcpt1" \ + "collect \$tvar5 += 1" "^$" + + gdb_test "tstart" ".*" "" + + gdb_test "print \$tvar5" " = 15" \ + "Print a trace state variable at start of run" + + # Be sure not to fall off the end of the program. + gdb_test "break end" ".*" "" + gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + + gdb_test "print \$tvar5" " = 16" \ + "Print a trace state variable during run" + + gdb_test "tstop" ".*" "" + + gdb_test "print \$tvar5" " = 16" \ + "Print a trace state variable after run" + --------------050803020807090905060401--