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

# This test is to check that a frame's "info frame", especially the
# saved registers list, doesn't change while that frame isn't current.

# It uses the program savedregs.c to construct a somewhat warped
# backtrace (contains both signal and dummy frames) and then, at each
# step checks that non-inner frames have consistent "info frame"
# output.  Note that a frame's "info frame" can only be captured after
# it is non-current (made a call, interrupted, ...), this is because
# instructions executed to perform the call may affect "info frame"
# output.

if [target_info exists gdb,nosignals] {
    verbose "Skipping savedregs.exp because of nosignals."
    continue
}


standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "failed to compile"
    return -1
}

# get things started
clean_restart ${binfile}

# Advance to main
if ![runto_main] then {
    fail "can't run to main"
    return 0
}

proc process_saved_regs { current inner outer } {
    global gdb_prompt
    global expect_out
    global saved_regs

    # Skip the CURRENT frame.

    set level 1

    # Run over the list of INNER frames capturing the "info frame"
    # output for each.  Both dummy and sigtramp frames need to be
    # handled specially: they do not yet have correct function names;
    # and for dummy frames won't have saved registers.  If there's a
    # problem, fail but capture the output anyway, hopefully later
    # "info frame" requests for that same frame will at least fail in
    # a consistent manner (stops propogated fails).

    foreach func $inner {
	set saved_regs($func) "error"
	set test "get $func info frame"
	# Both dummy and sigtramp frames have problems.
	switch $func {
	    dummy {
		# Dummy frame's do not have saved registers, and do
		# not print <dummy>.
		set pat "Stack frame at .*"
	    }
	    sigtramp {
		# Sigtramp frames don't yet print <signal trampoline>.
		set pat "Stack frame at .* Saved registers:.*"
	    }
	    default {
		set pat "Stack frame at .* in $func .*( Saved registers:.*)?"
	    }
	}
	# If the "info frame" barf, capture the output anyway so that
	# it does not cascade further failures.
	gdb_test_multiple "info frame $level" "$test" {
	    -re "($pat)$gdb_prompt " {
		set saved_regs($func) "$expect_out(1,string)"
		pass "$test"
	    }
	    -re "(Stack frame at .*)$gdb_prompt " {
		set saved_regs($func) "$expect_out(1,string)"
		fail "$test"
	    }
	    -re "(Cannot access .*)$gdb_prompt " {
		set saved_regs($func) "$expect_out(1,string)"
		fail "$test"
	    }
	}
	incr level
    }
    
    # Now iterate through the list of OUTER frames checking that the
    # "info frame" output from each still matches what was captured
    # during an early query.  To avoid cascading failures, checking is
    # abandoned after the first failure.  The assumption is that,
    # since frames outer to the botched frame rely on the botched
    # frame's info, those more outer frames are also botched.  Besides
    # we've got the failure we're after.

    set ok 1
    foreach func $outer {
	set test [concat "Check $func info frame; stack contains" \
		      $current $inner $outer]
	if $ok {
	    set ok 0
	    set pat [string_to_regexp "$saved_regs($func)"]
	    gdb_test_multiple "info frame $level" "$test" {
		-re "$pat$gdb_prompt " {
		    pass "$test"
		    set ok 1
		}
	    }
	} {
	    pass "$test (skipped)"
	}
	incr level
    }
}


# Continue to the signal thrower, capture main's saved-reg info.
gdb_test "advance thrower" "thrower .* at .*"
process_saved_regs thrower { main } { }

# Continue to the signal catcher, check main's saved-reg info, capture
# catcher's saved-reg info.
gdb_test "handle SIGSEGV pass print nostop"
gdb_test "handle SIGILL pass print nostop"
gdb_test "advance catcher" "catcher .* at .*"
process_saved_regs catcher { sigtramp thrower } { main }

# Breakpoint at and call the caller function, saved-regs of main and
# catcher, capture caller's registers.
gdb_test "break caller"
gdb_test "call caller (1,2,3,4,5,6,7,8)"
process_saved_regs caller { dummy catcher } { sigtramp thrower main }

# Run to callee, again check everything.
gdb_test "advance callee" "callee .* at .*"
process_saved_regs callee { caller } { dummy catcher sigtramp thrower main }
