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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

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 old new add } {
    global gdb_prompt
    gdb_test "tbreak wack_${t}"
    gdb_test "continue" "register ${t} l = u;" "continue set ${t}"
    gdb_test "next" "l = add_${t} .l, v.;" "next ${t}"
    gdb_test "print l" " = ${old}" "print old ${t}"
    gdb_test "set variable l = 4"
    gdb_test "print l" " = ${new}" "print new ${t}"
    gdb_test "next" "return l;"
    gdb_test "print l" " = ${add}" "print add ${t}"
}

check_set "char" "1 ..001." "4 ..004." "6 ..006."
check_set "short" "1" "4" "6"
check_set "int" "1" "4" "6"
check_set "long" "1" "4" "6"
check_set "float" "1" "4" "6"
check_set "double" "1" "4" "6"

#

proc up_set { t old new } {
    global gdb_prompt
    gdb_test "tbreak add_${t}"
    gdb_test "continue" "return u . v;" "continue up ${t}"
    gdb_test "up" "l = add_${t} .l, v.;" "up ${t}"
    gdb_test "print l" " = ${old}" "print old up ${t}"
    gdb_test "set variable l = 4"
    gdb_test "print l" " = ${new}" "print new up ${t}"
}

up_set "char" "1 ..001." "4 ..004."
up_set "short" "1" "4"
up_set "int" "1" "4"
up_set "long" "1" "4"
up_set "float" "1" "4"
up_set "double" "1" "4"

#

proc check_struct { t old new } {
    global gdb_prompt
    gdb_test "tbreak wack_struct_${t}"
    gdb_test "continue" "int i; register struct s_${t} u = z_${t};" \
	    "continue set struct ${t}"
    gdb_test "next 2" "add_struct_${t} .u.;"
    gdb_test "print u" " = ${old}" "old check struct ${t}"
    gdb_test "set variable u = s_${t}"
    gdb_test "print u" " = ${new}" "new check struct ${t}"
}

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 } {
    global gdb_prompt
    gdb_test "tbreak add_struct_${t}"
    gdb_test "continue" "for .i = 0; i < sizeof .s. / sizeof .s.s.0..; i..." \
	    "continue up struct ${t}"
    gdb_test "up" "u = add_struct_${t} .u.;" "up struct ${t}"
    gdb_test "print u" " = ${old}" "old up struct ${t}"
    gdb_test "set variable u = s_${t}"
    gdb_test "print u" " = ${new}" "new up struct ${t}"
}

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

