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

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

clean_restart ${binfile}

if ![runto break_me] then {
  perror "Couldn't run ${testfile}"
  return
}

# Test with "print frame-arguments" set to "all"

gdb_test_no_output "set print frame-arguments all" \
         "set print frame-arguments all"
gdb_test "frame 1" \
         ".*in call_me \\(i=3, f=5, s=({a = 3, b = 5}|<optimized out>), ss=0x\[0-9a-f\]\+, u=({.*}|<optimized out>), e=green\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to all"

# Test with "print frame-arguments" set to "scalars"

gdb_test_no_output "set print frame-arguments scalars" \
         "set print frame-arguments scalars"
gdb_test "frame 1" \
         ".*in call_me \\(i=3, f=5, s=\\.\\.\\., ss=0x\[0-9a-f\]\+, u=\\.\\.\\., e=green\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to scalars"

# Test with "print frame-arguments" set to "none"

gdb_test_no_output "set print frame-arguments none" \
         "set print frame-arguments none"
gdb_test "frame 1" \
         ".*in call_me \\(i=\\.\\.\\., f=\\.\\.\\., s=\\.\\.\\., ss=\\.\\.\\., u=\\.\\.\\., e=\\.\\.\\.\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to none"

# Test with "print frame-arguments" set to "presence"

gdb_test_no_output "set print frame-arguments presence" \
         "set print frame-arguments presence"
gdb_test "frame 1" \
         ".*in call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to presence"
gdb_test "frame 2" \
         ".*in main \\(\\) at .*frame-args\\.c:.*" \
         "frame 2 (no args) with print frame-arguments set to presence"


# Test with "print frame-info" set to "location-and-address"
gdb_test_no_output "set print frame-info location-and-address" \
    "set print frame-info location-and-address"
gdb_test "frame 1" \
    ".*0x.* in call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
    "frame 1 with print frame-info set to location-and-address"

# Test with "print address" set to "off" ...
gdb_test_no_output "set print address off" \
    "set print address off"

# ... and "location-and-address" (previously set)
gdb_test "frame 1" \
    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
    "frame 1 with print frame-info set to location-and-address and address off"

# ... and "location"
gdb_test_no_output "set print frame-info location" \
    "set print frame-info location"
gdb_test "frame 1" \
    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*" \
    "frame 1 with print frame-info set to location and address off"

# ... and "short-location"
gdb_test_no_output "set print frame-info short-location" \
    "set print frame-info short-location"
gdb_test "frame 1" \
    "#1  call_me \\(\\.\\.\\.\\)" \
    "frame 1 with print frame-info set to short-location and address off"

# ... and "source-and-location"
gdb_test_no_output "set print frame-info source-and-location" \
    "set print frame-info source-and-location"
gdb_test "frame 1" \
    "#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*\r\n\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);" \
    "frame 1 with print frame-info set to source-and-location and address off"

# ... and "source-line".
gdb_test_no_output "set print frame-info source-line" \
    "set print frame-info source-line"
gdb_test "frame 1" \
    "\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);" \
    "frame 1 with print frame-info set to source-line and address off"


# Verify overriding of the global setting by the backtrace -frame-info option.
gdb_test "backtrace -frame-info source-and-location 2" \
    ".*\r\n.*\r\n#1  call_me \\(\\.\\.\\.\\) at .*frame-args\\.c:.*\r\n\[1-9\]\[0-9\]*\[ \t\]*break_me \\(\\);.*" \
    "backtrace -frame-info source-and-location 2 overriding print frame-info set to source-line"
