e22f8b7c8c
Switch the license of all .f and .f90 files to GPLv3. Switch the license of all .s and .S files to GPLv3.
202 lines
5.9 KiB
Text
202 lines
5.9 KiB
Text
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 2002, 2003, 2004, 2007 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 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}] != "" } {
|
|
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 "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.
|
|
|