#   Copyright 1998, 2007, 2008, 2009 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 srcfile gdb_c_test.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-sections CS\n"
    gdb_expect {
	-re "MIS-MATCHED.*$gdb_prompt $" {
	    untested packetlen.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/packetlen
    if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	    executable {debug nowarnings}] != "" } {
	untested packetlen.exp
	return -1
    }
    gdb_load $binfile
    gdb_test "tstop"       "" ""
    gdb_test "tfind none"  "" ""
    runto_main
}
gdb_reinitialize_dir $srcdir/$subdir

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

#
# Test collecting a whole bunch of stuff at a single tracepoint.
# The test is whether this crashes GDB.
#

gdb_delete_tracepoints
gdb_test "trace gdb_c_test" "" ""
gdb_trace_setactions "setup collect actions" \
	"" \
	"collect parm\[0\], parm\[1\], parm\[2\], parm\[3\]" "^$" \
	"collect parm\[4\], parm\[5\], parm\[6\], parm\[7\]" "^$" \
	"collect p, local_reg, local_static, local_static_sizeof" "^$" \
	"collect local_long, stack_ptr, end_of_stack" "^$" \
	"collect gdb_char_test, gdb_short_test, gdb_long_test" "^$" \
	"collect gdb_arr_test, gdb_struct1_test, gdb_struct2_test" "^$" \
	"collect gdb_structp_test, gdb_structpp_test, gdb_union1_test" "^$" \
	"end" ""

gdb_test "tstart" "" "survive the long packet send"
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" "" "confirm: survived the long packet send"

