#   Copyright 1998-2013 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/>.

# This file was written by Michael Snyder (msnyder@cygnus.com)

load_lib "trace-support.exp"


gdb_exit
gdb_start

standard_testfile actions.c
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested while-stepping.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

#
# test while-stepping command
#

gdb_delete_tracepoints
set trcpt1 [gdb_gettpnum gdb_c_test]
if { $trcpt1 <= 0 } then {
    fail "Could not find gdb_c_test function"
    return
}

# 5.12 basic while-stepping command (collect regs)

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+not installed on target." \
	"5.12: set a tracepoint, stepcount is zero"

set stepcount 12

gdb_trace_setactions "5.12: set stepcount to $stepcount" \
	"" \
	"while-stepping $stepcount" "" \
	"collect \$regs" "^$" \
	"end" ""

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+while-stepping 12.*" \
	"5.12: info trace shows \"while-stepping\""

# 5.13 step out of context while collecting local variable
#      [deferred to dynamic test section]

proc while_stepping_bogus_arg { bogus msgstring } {
    global gdb_prompt

    gdb_trace_setactions "$msgstring" \
	    "" \
	    "while-stepping $bogus" ".*while-stepping step count"
}

# 5.14 while-stepping (no argument)

while_stepping_bogus_arg "" "5.14: while-stepping null stepcount"

# 5.15 while-stepping (zero stepcount)

while_stepping_bogus_arg "0" "5.15: while-stepping rejects zero stepcount"

# 5.16 while-stepping without collecting anything
gdb_trace_setactions "5.16: step without collecting anything" \
	"" \
	"while-stepping $stepcount" "^$" \
	"end" ""

gdb_test "info tracepoints" \
    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
.*while-stepping $stepcount.*
.*end.*" \
	"5.16: confirm actions, step without collecting anything"

gdb_test "break main"
gdb_run_cmd
gdb_test "" "Breakpoint .*"
if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

gdb_trace_setactions "set stepcount to $stepcount" \
	"" \
	"while-stepping $stepcount" "" \
	"collect \$regs " "^$" \
	"collect \$locals " "^$" \
	"end" ""

proc check_tracepoint { data_source } {
    with_test_prefix "$data_source" {
	global srcfile
	global stepcount

	gdb_test "info tracepoints" \
	    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint     keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+while-stepping $stepcount.*
\[\t \]+collect \\\$regs.*
\[\t \]+collect \\\$locals.*
\[\t \]+end.*"
    }
}

gdb_test_no_output "tstart"
check_tracepoint "live"
gdb_test_no_output "tstop"
set tracefile [standard_output_file ${testfile}]
gdb_test "tsave ${tracefile}.tf" \
    "Trace data saved to file '${tracefile}.tf'\.\\r" \
    "save tfile trace file"
gdb_test "tsave -ctf ${tracefile}.ctf" \
    "Trace data saved to directory '${tracefile}.ctf'\.\\r" \
    "save ctf trace file"

# Restart GDB and read the trace data in tfile target.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd $binfile
gdb_test "target tfile ${tracefile}.tf" ".*" \
    "change to tfile target"
check_tracepoint "tfile"

# Try to read ctf data if GDB supports.
set gdb_can_read_ctf_data 0
gdb_test_multiple "target ctf" "" {
    -re "Undefined target command: \"ctf\"\.  Try \"help target\"\.\r\n$gdb_prompt $" {
	set gdb_can_read_ctf_data 0
    }
    -re "No CTF directory specified.*\r\n$gdb_prompt $" {
	set gdb_can_read_ctf_data 1
    }
}

if { $gdb_can_read_ctf_data } {
    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_file_cmd $binfile
    gdb_test "target ctf ${tracefile}.ctf" ".*" \
	"change to ctf target"
    check_tracepoint "ctf"
}
