# This testcase is part of GDB, the GNU debugger.

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

standard_testfile
set executable $testfile

if { [prepare_for_testing "failed to prepare" $executable $srcfile] } {
    return -1
}

if [get_compiler_info] {
    return -1
}

#
# set it up at a breakpoint so we can play with the variable values
#

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

#

proc check_set { t l r new add } {
    global gdb_prompt

    set prefix "var ${t} l"
    gdb_test "tbreak wack_${t}"

    set test "continue to wack_${t}"
    gdb_test_multiple "continue" $test {
	-re "register ${t} l = u, r = v;\r\n$gdb_prompt $" {
	    # See GCC PR debug/53948.
	    send_gdb "next\n"
	    exp_continue
	}
	-re "l = add_${t} .l, r.;\r\n$gdb_prompt $" {
	    pass $test
	}
    }

    set supported 1
    set test "${prefix}; print old l, expecting ${l}"
    gdb_test_multiple "print l" "$test"  {
	-re " = <optimized out>\r\n$gdb_prompt $" {
	    unsupported $test
	    set supported 0
	}
	-re " = ${l}\r\n$gdb_prompt $" {
	    pass $test
	}
    }
    if { $supported } {
	gdb_test "print r" " = ${r}" \
	    "${prefix}; print old r, expecting ${r}"
	gdb_test_no_output "set variable l = 4" \
	    "${prefix}; setting l to 4"
	gdb_test "print l" " = ${new}" \
	    "${prefix}; print new l, expecting ${new}"
	gdb_test "next" "return l \\+ r;" \
	    "${prefix}; next over add call"
	gdb_test "print l" " = ${add}" \
	    "${prefix}; print incremented l, expecting ${add}"
    }
}

check_set "charest" "-1 .*" "-2 .*" "4 ..004." "2 ..002."
check_set "short" "-1" "-2" "4" "2"
check_set "int" "-1" "-2" "4" "2"
check_set "long" "-1" "-2" "4" "2"
check_set "longest" "-1" "-2" "4" "2"
check_set "float" "-1" "-2" "4" "2"
check_set "double" "-1" "-2" "4" "2"
check_set "doublest" "-1" "-2" "4" "2"

#

proc up_set { t l r new } {
    global gdb_prompt

    set prefix "upvar ${t} l"
    gdb_test "tbreak add_${t}"
    gdb_test "continue" "return u . v;" \
	"continue to add_${t}"
    gdb_test "up" "l = add_${t} .l, r.;" \
	"${prefix}; up"

    set supported 1
    set test "${prefix}; print old l, expecting ${l}"
    gdb_test_multiple "print l" "$test"  {
	-re " = <optimized out>\r\n$gdb_prompt $" {
	    unsupported $test
	    set supported 0
	}
	-re " = ${l}\r\n$gdb_prompt $" {
	    pass $test
	}
    }
    if { $supported } {
	gdb_test "print r" " = ${r}" \
	    "${prefix}; print old r, expecting ${r}"
	gdb_test_no_output "set variable l = 4" \
	    "${prefix}; set l to 4"
	gdb_test "print l" " = ${new}" \
	    "${prefix}; print new l, expecting ${new}"
    }
}

up_set "charest" "-1 .*" "-2 .*" "4 ..004."
up_set "short" "-1" "-2" "4"
up_set "int" "-1" "-2" "4"
up_set "long" "-1" "-2" "4"
up_set "longest" "-1" "-2" "4"
up_set "float" "-1" "-2" "4"
up_set "double" "-1" "-2" "4"
up_set "doublest" "-1" "-2" "4"

#

proc check_struct { t old new } {
    set prefix "var struct ${t} u"
    gdb_test "tbreak wack_struct_${t}"
    gdb_test "continue" "int i; register struct s_${t} u = z_${t};" \
	"continue to wack_struct_${t}"
    gdb_test "next 2" "add_struct_${t} .u.;" \
	"${prefix}; next to add_struct_${t} call"
    gdb_test "print u" " = ${old}" \
	"${prefix}; print old u, expecting ${old}"
    gdb_test_no_output "set variable u = s_${t}" \
	"${prefix}; set u to s_${t}"
    gdb_test "print u" " = ${new}" \
	"${prefix}; print new u, expecting ${new}"
}

check_struct "1" "{s = \\{0}}" "{s = \\{1}}"
check_struct "2" "{s = \\{0, 0}}" "{s = \\{1, 2}}"
check_struct "3" "{s = \\{0, 0, 0}}" "{s = \\{1, 2, 3}}"
check_struct "4" "{s = \\{0, 0, 0, 0}}" "{s = \\{1, 2, 3, 4}}"

proc up_struct { t old new } {
    set prefix "up struct ${t} u"
    gdb_test "tbreak add_struct_${t}"
    gdb_test "continue" "for .i = 0; i < sizeof .s. / sizeof .s.s.0..; i..." \
	"continue to add_struct_${t}"
    gdb_test "up" "u = add_struct_${t} .u.;" \
	"${prefix}; up"
    gdb_test "print u" " = ${old}" \
	"${prefix}; print old u, expecting ${old}"
    gdb_test_no_output "set variable u = s_${t}" \
	"${prefix}; set u to s_${t}"
    gdb_test "print u" " = ${new}" \
	"${prefix}; print new u, expecting ${new}"
}

up_struct "1" "{s = \\{0}}" "{s = \\{1}}"
up_struct "2" "{s = \\{0, 0}}" "{s = \\{1, 2}}"
up_struct "3" "{s = \\{0, 0, 0}}" "{s = \\{1, 2, 3}}"
up_struct "4" "{s = \\{0, 0, 0, 0}}" "{s = \\{1, 2, 3, 4}}"

#

proc check_field { t } {
    global gdb_prompt
    gdb_test "tbreak wack_field_${t}"
    gdb_test "continue" "register struct f_${t} u = f_${t};" \
	    "continue field ${t}"

    # Match either the return statement, or the line immediatly after
    # it.  The compiler can end up merging the return statement into
    # the return instruction.
    gdb_test "next" "(return u;|\})" "next field ${t}"

    gdb_test "print u" " = {i = 1, j = 1, k = 1}" "old field ${t}"
    gdb_test_no_output "set variable u = F_${t}"
    gdb_test "print u" " = {i = 0, j = 0, k = 0}" "new field ${t}"

    gdb_test_no_output "set variable u = F_${t}, u.i = f_${t}.i"
    gdb_test "print u" " = {i = 1, j = 0, k = 0}" "f_${t}.i"

    gdb_test_no_output "set variable u = F_${t}, u.j = f_${t}.j"
    gdb_test "print u" " = {i = 0, j = 1, k = 0}" "f_${t}.j"

    gdb_test_no_output "set variable u = F_${t}, u.k = f_${t}.k"
    gdb_test "print u" " = {i = 0, j = 0, k = 1}" "f_${t}.k"

    gdb_test_no_output "set variable u = f_${t}, u.i = F_${t}.i"
    gdb_test "print u" " = {i = 0, j = 1, k = 1}" "F_${t}.i"

    gdb_test_no_output "set variable u = f_${t}, u.j = F_${t}.j"
    gdb_test "print u" " = {i = 1, j = 0, k = 1}" "F_${t}.j"

    gdb_test_no_output "set variable u = f_${t}, u.k = F_${t}.k"
    gdb_test "print u" " = {i = 1, j = 1, k = 0}" "F_${t}.k"

}

check_field 1
check_field 2
check_field 3
check_field 4

#

# WANTED: A fairly portable way of convincing the compiler to split a
# value across memory and registers.

