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

# Copyright 2002, 2003, 2004, 2007, 2008, 2009, 2010
# 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/>.

if $tracelevel {
    strace $tracelevel
}

#
# test running programs
#

set testfile "store"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested store.exp
    return -1
}

if [get_compiler_info ${binfile}] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# 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 } {
    set prefix "var ${t} l"
    gdb_test "tbreak wack_${t}"
    gdb_test "continue" "register ${t} l = u, r = v;" \
	"continue to wack_${t}"
    gdb_test "next" "l = add_${t} .l, r.;" \
	"${prefix}; next ${t}"
    gdb_test "print l" " = ${l}" \
	"${prefix}; print old l, expecting ${l}"
    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 } {
    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"
    gdb_test "print l" " = ${l}" \
	"${prefix}; print old l, expecting ${l}"
    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.

