#   Copyright 1998, 2007, 2008 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

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

load_lib "trace-support.exp";

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

gdb_exit
gdb_start

if [istarget "m68k-*-elf"] then {
    set srcfile gdb_c_test.c
    set binfile [board_info target d490_binfile];
} else {
    set testfile "actions"
    set srcfile ${testfile}.c
    set binfile ${objdir}/${subdir}/${testfile}
    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 Enb Address\[ \]+PassC StepC What.*$trcpt1.*0x.*\[\t \]+\[0-9\]+\[\t \]+0\[\t \]+.*in gdb_c_test.*" \
	"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 Enb Address\[ \]+PassC StepC What.*$trcpt1.*0x.*\[\t \]+\[0-9\]+\[\t \]+$stepcount\[\t \]+.*in gdb_c_test.*" \
	"5.12: confirm stepcount set to $stepcount"

gdb_test "info tracepoints" \
    "Num Enb Address\[ \]+PassC StepC What.*
.*while-stepping $stepcount.*" \
	"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" "\[Ee\]rror|\[Ww\]arning"
}

# 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" \
	".*$trcpt1.*0x.*\[\t \]+\[0-9\]+\[\t \]+$stepcount\[\t \]+.*in gdb_c_test.*\[ \t\]+Actions for tracepoint $trcpt1:.*\[ \t\]+while-stepping $stepcount.*\[ \t\]+end.*\[ \t\]+end.*" \
	"5.16: confirm actions, step without collecting anything"

