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

# Copyright 2002-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
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_l 1
    set test "${prefix}; print old l, expecting ${l}"
    gdb_test_multiple "print l" "$test"  {
	-re -wrap " = <optimized out>" {
	    unsupported $test
	    set supported_l 0
	}
	-re -wrap " = ${l}" {
	    pass $test
	}
    }

    set test "${prefix}; print old r, expecting ${r}"
    gdb_test_multiple "print r" "$test"  {
	-re -wrap " = <optimized out>" {
	    unsupported $test
	}
	-re -wrap " = ${r}" {
	    pass $test
	}
    }

    if { $supported_l } {
	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"
    if { $supported_l } {
	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_l 1
    set test "${prefix}; print old l, expecting ${l}"
    gdb_test_multiple "print l" "$test"  {
	-re -wrap " = <optimized out>" {
	    unsupported $test
	    set supported_l 0
	}
	-re -wrap " = ${l}" {
	    pass $test
	}
    }

    set test "${prefix}; print old r, expecting ${r}"
    gdb_test_multiple "print r" "$test"  {
	-re -wrap " = <optimized out>" {
	    unsupported $test
	}
	-re -wrap " = ${r}" {
	    pass $test
	}
    }

    if { $supported_l } {
	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.

