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

# Copyright 2002, 2003, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

if $tracelevel {
    strace $tracelevel
}

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile "store"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

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 "set variable l = 4" "" \
	"${prefix}; setting l to 4"
    gdb_test "print l" " = ${new}" \
	"${prefix}; print new l, expecting ${l}"
    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 "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 "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 "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 "set variable u = F_${t}"
    gdb_test "print u" " = {i = 0, j = 0, k = 0}" "new field ${t}"

    gdb_test "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 "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 "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 "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 "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 "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.

