# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013-2020 Free Software Foundation, Inc.
#
# Contributed by Intel Corp. <markus.t.metzger@intel.com>
#
# 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/>.

if { [skip_btrace_tests] } {
    unsupported "target does not support record-btrace"
    return -1
}

# This test is stepping on instruction level.  To guarantee that we always
# get the same execution trace, we use an assembly source file.
#
# We use different assembly sources based on the target architecture.
#
# Luckily, they are similar enough that a single test script can handle
# both.
if [info exists COMPILE] {
    # make check RUNTESTFLAGS="gdb.btrace/stepi.exp COMPILE=1"
    standard_testfile record_goto.c
    lappend opts debug
} elseif {[istarget "i?86-*-*"] || [istarget "x86_64-*-*"]} {
	if {[is_amd64_regs_target]} {
		standard_testfile x86_64-record_goto.S
	} else {
		standard_testfile i686-record_goto.S
	}
} else {
    unsupported "target architecture not supported"
    return -1
}

if [prepare_for_testing "failed to prepare" $testfile $srcfile] {
    return -1
}

if ![runto_main] {
    untested "failed to run to main"
    return -1
}

global gdb_prompt

proc check_replay_at { insn } {
  gdb_test "info record" [multi_line \
    "Active record target: record-btrace" \
    ".*" \
    "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for .*" \
    "Replay in progress\.  At instruction $insn\." \
    ]
}

# trace the call to the test function
gdb_test_no_output "record btrace"
gdb_test "next"

# we start with stepping to make sure that the trace is fetched automatically
gdb_test "reverse-stepi" ".*fun4\.5.*"
gdb_test "reverse-stepi" ".*fun4\.5.*"

# let's check where we are in the trace
with_test_prefix "reverse-stepi to 39" { check_replay_at 39 }

# let's step forward and check again
gdb_test "stepi" ".*fun4\.5.*"
with_test_prefix "stepi to 40" { check_replay_at 40 }

# with the next step, we stop replaying
gdb_test "stepi" ".*main\.3.*"
gdb_test "info record" [multi_line \
  "Active record target: record-btrace" \
  ".*" \
  "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
  ] "stepi to live"

# let's try nexti
gdb_test "reverse-nexti" ".*main\.2.*"
with_test_prefix "reverse-nexti - 1" { check_replay_at 1 }

# we can't reverse-nexti any further
gdb_test "reverse-nexti" "No more reverse-execution history\.\r\n.*main\.2.*"
with_test_prefix "reverse-nexti - 1" { check_replay_at 1 }

# but we can step back again
gdb_test "nexti" ".*main\.3.*" "next, 1.5"
gdb_test "info record" [multi_line \
  "Active record target: record-btrace" \
  ".*" \
  "Recorded 40 instructions in 16 functions \\\(0 gaps\\\) for \[^\\\r\\\n\]*" \
  ] "nexti back"

# let's step from a goto position somewhere in the middle
gdb_test "record goto 22" ".*fun3\.2.*"
with_test_prefix "goto 22" { check_replay_at 22 }

gdb_test "stepi" ".*fun1\.1.*"
with_test_prefix "stepi to 23" { check_replay_at 23 }

gdb_test "reverse-stepi" ".*fun3\.2.*"
with_test_prefix "reverse-stepi to 22" { check_replay_at 22 }

gdb_test "nexti" ".*fun3\.3.*"
with_test_prefix "nexti to 27" { check_replay_at 27 }

gdb_test "reverse-nexti" ".*fun3\.2.*"
with_test_prefix "reverse-nexti to 22" { check_replay_at 22 }

# let's try to step off the left end
gdb_test "record goto begin" ".*main\.2.*"
with_test_prefix "goto begin" { check_replay_at 1 }

gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
with_test_prefix "reverse-stepi at begin" { check_replay_at 1 }

gdb_test "reverse-nexti" "No more reverse-execution history\.\r\n.*main\.2.*"
gdb_test "reverse-nexti" "No more reverse-execution history\.\r\n.*main\.2.*"
with_test_prefix "reverse-nexti at begin" { check_replay_at 1 }

# we can step forward, though
gdb_test "stepi" ".*fun4\.1.*"
with_test_prefix "stepi to 2" { check_replay_at 2 }

# let's try to step off the left end again
gdb_test "reverse-stepi" ".*main\.2.*"
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
gdb_test "reverse-stepi" "No more reverse-execution history\.\r\n.*main\.2.*"
with_test_prefix "reverse-stepi at begin" { check_replay_at 1 }
