# Copyright 2014-2021 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/>.

load_lib "trace-support.exp"

standard_testfile read-memory.c
set executable $testfile

if [prepare_for_testing "failed to prepare for trace tests" \
	$executable $srcfile [list debug]] {
    return -1
}

if ![runto_main] {
    return -1
}

if ![gdb_target_supports_trace] {
    unsupported "target does not support trace"
    return -1
}

gdb_test "trace start" ".*"
gdb_breakpoint "end"

gdb_test_no_output "tstart"

gdb_test "continue" ".*Breakpoint \[0-9\]+, end .*"

set tracefile [standard_output_file ${testfile}]

# Save trace frames to tfile.
gdb_test "tsave ${tracefile}.tf" \
    "Trace data saved to file '${tracefile}.tf'.*" \
    "save tfile trace file"

# Change target to tfile.
set test "change to tfile target"
gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
    -re "A program is being debugged already.  Kill it. .y or n. " {
	send_gdb "y\n"
	exp_continue
    }
    -re "$gdb_prompt $" {
	pass "$test"
    }
}

gdb_test "tfind 0" "Found trace frame 0, tracepoint .*"

gdb_test "interpreter-exec mi \"-trace-find frame-number 0\"" "done.*"
