# Copyright (C) 2014-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/>.

# In this test we're looking at how gdb handles backtraces and
# investigating the stack depth when confronted with an "invalid" stack,
# that is a stack where the first few frames are normal, and then there's a
# frame where the stack in unreadable.
#
# One interesting bug that has been observed is that gdb will sometime
# exhibit different behaviour the first time a stack command is run
# compared to the second (and later) times a command is run.  This is
# because the first time a command is run gdb actually tries to figure out
# the answer, while the second (and later) times gdb relies on the answer
# cached from the first time.  As a result in this test each command is
# run twice, and we restart gdb before testing each different command to
# ensure that nothing is being cached.

set opts {}
standard_testfile .c

if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping ${testfile}."
    return
}
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} $opts] } {
    return -1
}

if ![runto breakpt] {
    return -1
}

# Use 'bt no-filters' here as the python filters will raise their own
# error during initialisation, the no-filters case is simpler.

gdb_test "bt no-filters" "^bt no-filters\r\n#0 +$hex in func2 \\(\\)\r\nBacktrace stopped: Cannot access memory at address 0x\[0-9a-f\]+" \
	 "first backtrace, with error message"

gdb_test "bt no-filters" "^bt no-filters\r\n#0 +$hex in func2 \\(\\)\r\nBacktrace stopped: Cannot access memory at address 0x\[0-9a-f\]+" \
	 "second backtrace, with error message"

clean_restart ${binfile}

if ![runto breakpt] {
    return -1
}

gdb_test "interpreter-exec mi \"-stack-info-depth\"" \
    "\\^done,depth=\"1\"" \
    "check mi -stack-info-depth command, first time"

gdb_test "interpreter-exec mi \"-stack-info-depth\"" \
    "\\^done,depth=\"1\"" \
    "check mi -stack-info-depth command, second time"

clean_restart ${binfile}

if ![runto breakpt] {
    return -1
}

gdb_test "interpreter-exec mi \"-stack-list-frames\"" \
    "\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"func2\"(,arch=\"\[^\"\]+\")?\}\\\]" \
    "check mi -stack-list-frames command, first time"

gdb_test "interpreter-exec mi \"-stack-list-frames\"" \
    "\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"func2\"(,arch=\"\[^\"\]+\")?\}\\\]" \
    "check mi -stack-list-frames command, second time"
