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

if { ![supports_reverse] } {
    untested "target does not support record"
    return -1
}

standard_testfile

set cflags "-mindirect-branch=thunk -mfunction-return=thunk"
if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
        [list debug "additional_flags=$cflags"]] } {
    return -1
}

if { ![runto_main] } {
    return -1
}

# Do repeated stepping COMMANDs in order to reach TARGET from CURRENT
#
#  COMMAND is a stepping command
#  CURRENT is a string matching the current location
#  TARGET  is a string matching the target location
#  TEST    is the test name
#
# The function issues repeated COMMANDs as long as the location matches
# CURRENT up to a maximum of 100 steps.
#
# TEST passes if the resulting location matches TARGET and fails
# otherwise.
#
proc step_until { command current target test } {
    global gdb_prompt

    set count 0
    gdb_test_multiple "$command" "$test" {
        -re "$current.*$gdb_prompt $" {
            incr count
            if { $count < 100 } {
                send_gdb "$command\n"
                exp_continue
            } else {
                fail "$test"
            }
        }
        -re "$target.*$gdb_prompt $" {
            pass "$test"
        }
    }
}

gdb_test_no_output "record"
gdb_test "next" ".*" "record trace"

# Normal stepping steps through all thunks.
gdb_test "reverse-step" "apply\.3.*" "reverse-step into apply"
gdb_test "reverse-step" "inc\.3.*" "reverse-step into inc"
gdb_test "reverse-step" "inc\.2.*" "reverse-step inside inc"
gdb_test "reverse-step" "apply\.2.*" \
    "reverse-step through call thunk into apply, first time"
gdb_test "reverse-step" "main\.2.*" "reverse-step into main"
gdb_test "step" "apply\.2.*" "step into apply"
gdb_test "step" "inc\.2.*" "step through call thunk into inc"
gdb_test "reverse-step" "apply\.2.*" \
    "reverse-step through call thunk into apply, second time"
gdb_test "next" "apply\.3.*" "step through thunks and over inc"
gdb_test "reverse-next" "apply\.2.*" \
    "reverse-step through thunks and over inc"

# We can use instruction stepping to step into thunks.
step_until "stepi" "apply\.2" "indirect_thunk" "stepi into call thunk"
step_until "stepi" "indirect_thunk" "inc" \
    "stepi out of call thunk into inc"
step_until "stepi" "inc" "return_thunk" "stepi into return thunk"
step_until "stepi" "return_thunk" "apply" \
    "stepi out of return thunk back into apply"

step_until "reverse-stepi" "apply" "return_thunk" \
    "reverse-stepi into return thunk"
step_until "reverse-stepi" "return_thunk" "inc" \
    "reverse-stepi out of return thunk into inc"
step_until "reverse-stepi" "inc" "indirect_thunk" \
    "reverse-stepi into call thunk"
step_until "reverse-stepi" "indirect_thunk" "apply" \
    "reverse-stepi out of call thunk into apply"
