1 # This testcase is part of GDB
, the GNU debugger.
3 # Copyright
2002-2019 Free Software Foundation
, Inc.
5 # This
program is free software
; you can redistribute it and
/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation
; either version
3 of the License
, or
8 #
(at your option
) any later version.
10 # This
program is distributed in the hope that it will be useful
,
11 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License
for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this
program.
If not
, see
<http
://www.gnu.org
/licenses
/>.
19 set executable $testfile
21 if { [prepare_for_testing
"failed to prepare" $executable $srcfile] } {
25 if [get_compiler_info
] {
30 #
set it up at a breakpoint so we can play with the
variable values
33 if ![runto_main
] then {
34 perror
"couldn't run to breakpoint"
40 proc check_set
{ t l r new add
} {
43 set prefix
"var ${t} l"
44 gdb_test
"tbreak wack_${t}"
46 set test
"continue to wack_${t}"
47 gdb_test_multiple
"continue" $test {
48 -re
"register ${t} l = u, r = v;\r\n$gdb_prompt $" {
49 # See GCC PR debug
/53948.
53 -re
"l = add_${t} .l, r.;\r\n$gdb_prompt $" {
58 gdb_test
"print l" " = ${l}" \
59 "${prefix}; print old l, expecting ${l}"
60 gdb_test
"print r" " = ${r}" \
61 "${prefix}; print old r, expecting ${r}"
62 gdb_test_no_output
"set variable l = 4" \
63 "${prefix}; setting l to 4"
64 gdb_test
"print l" " = ${new}" \
65 "${prefix}; print new l, expecting ${new}"
66 gdb_test
"next" "return l \\+ r;" \
67 "${prefix}; next over add call"
68 gdb_test
"print l" " = ${add}" \
69 "${prefix}; print incremented l, expecting ${add}"
72 check_set
"charest" "-1 .*" "-2 .*" "4 ..004." "2 ..002."
73 check_set
"short" "-1" "-2" "4" "2"
74 check_set
"int" "-1" "-2" "4" "2"
75 check_set
"long" "-1" "-2" "4" "2"
76 check_set
"longest" "-1" "-2" "4" "2"
77 check_set
"float" "-1" "-2" "4" "2"
78 check_set
"double" "-1" "-2" "4" "2"
79 check_set
"doublest" "-1" "-2" "4" "2"
83 proc up_set
{ t l r new
} {
84 set prefix
"upvar ${t} l"
85 gdb_test
"tbreak add_${t}"
86 gdb_test
"continue" "return u . v;" \
87 "continue to add_${t}"
88 gdb_test
"up" "l = add_${t} .l, r.;" \
90 gdb_test
"print l" " = ${l}" \
91 "${prefix}; print old l, expecting ${l}"
92 gdb_test
"print r" " = ${r}" \
93 "${prefix}; print old r, expecting ${r}"
94 gdb_test_no_output
"set variable l = 4" \
95 "${prefix}; set l to 4"
96 gdb_test
"print l" " = ${new}" \
97 "${prefix}; print new l, expecting ${new}"
100 up_set
"charest" "-1 .*" "-2 .*" "4 ..004."
101 up_set
"short" "-1" "-2" "4"
102 up_set
"int" "-1" "-2" "4"
103 up_set
"long" "-1" "-2" "4"
104 up_set
"longest" "-1" "-2" "4"
105 up_set
"float" "-1" "-2" "4"
106 up_set
"double" "-1" "-2" "4"
107 up_set
"doublest" "-1" "-2" "4"
111 proc check_struct
{ t old new
} {
112 set prefix
"var struct ${t} u"
113 gdb_test
"tbreak wack_struct_${t}"
114 gdb_test
"continue" "int i; register struct s_${t} u = z_${t};" \
115 "continue to wack_struct_${t}"
116 gdb_test
"next 2" "add_struct_${t} .u.;" \
117 "${prefix}; next to add_struct_${t} call"
118 gdb_test
"print u" " = ${old}" \
119 "${prefix}; print old u, expecting ${old}"
120 gdb_test_no_output
"set variable u = s_${t}" \
121 "${prefix}; set u to s_${t}"
122 gdb_test
"print u" " = ${new}" \
123 "${prefix}; print new u, expecting ${new}"
126 check_struct
"1" "{s = \\{0}}" "{s = \\{1}}"
127 check_struct
"2" "{s = \\{0, 0}}" "{s = \\{1, 2}}"
128 check_struct
"3" "{s = \\{0, 0, 0}}" "{s = \\{1, 2, 3}}"
129 check_struct
"4" "{s = \\{0, 0, 0, 0}}" "{s = \\{1, 2, 3, 4}}"
131 proc up_struct
{ t old new
} {
132 set prefix
"up struct ${t} u"
133 gdb_test
"tbreak add_struct_${t}"
134 gdb_test
"continue" "for .i = 0; i < sizeof .s. / sizeof .s.s.0..; i..." \
135 "continue to add_struct_${t}"
136 gdb_test
"up" "u = add_struct_${t} .u.;" \
138 gdb_test
"print u" " = ${old}" \
139 "${prefix}; print old u, expecting ${old}"
140 gdb_test_no_output
"set variable u = s_${t}" \
141 "${prefix}; set u to s_${t}"
142 gdb_test
"print u" " = ${new}" \
143 "${prefix}; print new u, expecting ${new}"
146 up_struct
"1" "{s = \\{0}}" "{s = \\{1}}"
147 up_struct
"2" "{s = \\{0, 0}}" "{s = \\{1, 2}}"
148 up_struct
"3" "{s = \\{0, 0, 0}}" "{s = \\{1, 2, 3}}"
149 up_struct
"4" "{s = \\{0, 0, 0, 0}}" "{s = \\{1, 2, 3, 4}}"
153 proc check_field
{ t
} {
155 gdb_test
"tbreak wack_field_${t}"
156 gdb_test
"continue" "register struct f_${t} u = f_${t};" \
157 "continue field ${t}"
159 # Match either the
return statement
, or the line immediatly after
160 # it. The compiler can end up merging the
return statement into
161 # the
return instruction.
162 gdb_test
"next" "(return u;|\})" "next field ${t}"
164 gdb_test
"print u" " = {i = 1, j = 1, k = 1}" "old field ${t}"
165 gdb_test_no_output
"set variable u = F_${t}"
166 gdb_test
"print u" " = {i = 0, j = 0, k = 0}" "new field ${t}"
168 gdb_test_no_output
"set variable u = F_${t}, u.i = f_${t}.i"
169 gdb_test
"print u" " = {i = 1, j = 0, k = 0}" "f_${t}.i"
171 gdb_test_no_output
"set variable u = F_${t}, u.j = f_${t}.j"
172 gdb_test
"print u" " = {i = 0, j = 1, k = 0}" "f_${t}.j"
174 gdb_test_no_output
"set variable u = F_${t}, u.k = f_${t}.k"
175 gdb_test
"print u" " = {i = 0, j = 0, k = 1}" "f_${t}.k"
177 gdb_test_no_output
"set variable u = f_${t}, u.i = F_${t}.i"
178 gdb_test
"print u" " = {i = 0, j = 1, k = 1}" "F_${t}.i"
180 gdb_test_no_output
"set variable u = f_${t}, u.j = F_${t}.j"
181 gdb_test
"print u" " = {i = 1, j = 0, k = 1}" "F_${t}.j"
183 gdb_test_no_output
"set variable u = f_${t}, u.k = F_${t}.k"
184 gdb_test
"print u" " = {i = 1, j = 1, k = 0}" "F_${t}.k"
195 # WANTED
: A fairly portable way of convincing the compiler to split a
196 # value across memory and registers.