# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2013-2021 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\." \
    ] "check replay at $insn"
}

# trace the call to the test function
with_test_prefix "record" {
    gdb_test_no_output "record btrace"
    gdb_test "next" ".*" "next.1"
}

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

    # let's check where we are in the trace
    check_replay_at 39
}

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

# with the next step, we stop replaying
with_test_prefix "end" {
    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\]*" \
			       ]
}

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

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

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

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

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

    gdb_test "reverse-stepi" ".*fun3\.2.*" "reverse-stepi.3"
    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.*" "reverse-nexti.3"
    with_test_prefix "reverse-nexti to 22" { check_replay_at 22 }
}

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

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

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

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

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