#   Copyright 2009, 2010 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}


gdb_exit
gdb_start
set testfile "actions"
set srcfile ${testfile}.c
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." \
  "Create a trace state variable"

gdb_test "tvariable \$tvar2 = 45" \
  "Trace state variable \\\$tvar2 created, with initial value 45." \
  "Create a trace state variable with initial value"

gdb_test "tvariable \$tvar2 = -92" \
  "Trace state variable \\\$tvar2 now has initial value -92." \
  "Change initial value of a trace state variable"

gdb_test "tvariable \$tvar3 = 2 + 3" \
  "Trace state variable \\\$tvar3 created, with initial value 5." \
  "Create a trace state variable with expression"

gdb_test "tvariable \$tvar3 = 1234567000000" \
  "Trace state variable \\\$tvar3 now has initial value 1234567000000." \
  "Init trace state variable to a 64-bit value"

gdb_test "tvariable main" \
  "Syntax must be \\\$NAME \\\[ = EXPR \\\]" \
  "tvariable syntax error, bad name"

gdb_test "tvariable \$tvar1 - 93" \
  "Syntax must be \\\$NAME \\\[ = EXPR \\\]" \
  "tvariable syntax error, not an assignment"

gdb_test "info tvariables" \
    "Name\[\t \]+Initial\[\t \]+Current.*
\\\$tvar1\[\t \]+0\[\t \]+<undefined>.*
\\\$tvar2\[\t \]+-92\[\t \]+<undefined>.*
\\\$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" \
    "Name\[\t \]+Initial\[\t \]+Current.*
\\\$tvar1\[\t \]+0\[\t \]+<undefined>.*
\\\$tvar3\[\t \]+1234567000000\[\t \]+.*<undefined>.*" \
  "List tvariables after deletion"

gdb_test "delete tvariable" \
    "" \
    "Delete all trace state variables" \
    "Delete all trace state variables.*y or n.*$" \
    "y"

gdb_test "info tvariables" \
  "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"


