#   Copyright 1998-2023 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"

standard_testfile actions.c
require gdb_trace_common_supports_arch
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
	  executable {debug nowarnings}] != "" } {
    untested "failed to compile"
    return -1
}

clean_restart $binfile
gdb_test "tstop"       ".*" ""
gdb_test "tfind none"  ".*" ""
runto_main

if {![gdb_target_supports_trace]} {
    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"

