[PATCH] Print trace state variables

Stan Shebs
2010-12-09T22:38:12Z

[-- Attachment #1: Type: text/plain, Size: 1152 bytes --]

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 <stan@codesourcery.com>

* value.c (value_of_internalvar): Add case for trace state
variables.

* gdb.trace/tsv.exp: Test print command on trace state variables.

[-- Attachment #2: ptsv-patch-1 --]
[-- Type: text/plain, Size: 4504 bytes --]

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 \]+.*<undefined>.*" \
"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"
+