#   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/>.

# 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 {
    load_lib "emc-support.exp"
    set testfile "gdb_c_test"
    set srcfile  $testfile.c
    set binfile [board_info target d490_binfile];
    gdb_test "set remotetimeout 6" "" ""
    set timeout 500
    gdb_target_monitor "$binfile"
    # Give a TSTOP and ignore errors, to make sure any previous trace is off
    gdb_test "tstop" "" ""
    gdb_test "tfind none"  "" ""
    send_gdb "compare-section CS\n"
    gdb_expect {
	-re "MIS-MATCHED.*$gdb_prompt $" {
	    untested while-dyn.exp
	    return -1
	    all tests in this module will fail.";
	}
	-re ".*$gdb_prompt $" { }
    }
} 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-dyn.exp
	return -1
    }
    gdb_load $binfile
    gdb_test "tstop"       "" ""
    gdb_test "tfind none"  "" ""
    runto_main
}
gdb_reinitialize_dir $srcdir/$subdir

# We generously give ourselves one "pass" if we successfully 
# detect that this test cannot be run on this target!
if { ![gdb_target_supports_trace] } then {
    pass "Current target does not support trace"
    return 1;

}

# If testing on a remote host, download the source file.
# remote_download host $srcdir/$subdir/$srcfile

#
# test while-stepping dynamically (live target)
#

## verify number of trace frames collected matches stepcount

gdb_delete_tracepoints
gdb_test "trace gdb_c_test" \
	"Tracepoint $decimal at .*" \
	"Set tracepoint at gdb_c_test"

gdb_trace_setactions "5.12: define while-stepping <stepcount>" \
	"" \
	"collect \$fp" "^$" \
	"while-stepping 5" "^$" \
	"collect p" "^$" \
	"end" "^$" \
	"end" ""

gdb_test "tstart" "" ""

if [istarget "m68k-*-elf"] then {
    gdb_emclaptop_command "85,1,2,3,4,5,6"
    sleep 5
} else {
    gdb_test "break end" "" ""
    gdb_test "continue" \
	    "Continuing.*Breakpoint $decimal, end.*" \
	    "run trace experiment"
}

gdb_test "tstop" "" ""

gdb_tfind_test "5.12: frame 5 should be the last one collected" "5" "5"

send_gdb "tfind 6\n"
gdb_expect {
    -re "failed to find.*$gdb_prompt $" {
	pass "5.12: trace stopped after 5 stepping frames"
    }
    -re ".*$gdb_prompt $" {
	fail "5.12: trace stopped after 5 stepping frames"
    }
}

gdb_test "tfind none" "" ""
