#   Copyright 1998-2020 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_trace_common_supports_arch] {
    unsupported "no trace-common.h support for arch"
    return -1
}
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested "failed to compile"
    return -1
}
gdb_load $binfile
gdb_test "tstop"       ".*" ""
gdb_test "tfind none"  ".*" ""
runto_main
gdb_reinitialize_dir $srcdir/$subdir

if { ![gdb_target_supports_trace] } then {
    unsupported "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 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_no_output "tstart" "survive the long packet send"
gdb_breakpoint "end" qualified
gdb_test "continue" \
    "Continuing.*Breakpoint $decimal, end.*" \
    "run trace experiment"

gdb_test_no_output "tstop" "confirm: survived the long packet send"

