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

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] {
    fail "can't run to main to check for trace support"
    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.*"
