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

# 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 {
    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 }
