Commit | Line | Data |
---|---|---|
ecd75fc8 | 1 | # Copyright 1988-2014 Free Software Foundation, Inc. |
c906108c SS |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 5 | # the Free Software Foundation; either version 3 of the License, or |
c906108c | 6 | # (at your option) any later version. |
e22f8b7c | 7 | # |
c906108c SS |
8 | # This program is distributed in the hope that it will be useful, |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
e22f8b7c | 12 | # |
c906108c | 13 | # You should have received a copy of the GNU General Public License |
e22f8b7c | 14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
c906108c | 15 | |
c906108c SS |
16 | # |
17 | # test special commands (if, while, etc) | |
18 | # | |
c906108c | 19 | |
f76495c8 TT |
20 | standard_testfile |
21 | ||
aa81e255 JK |
22 | if { [prepare_for_testing commands.exp commands run.c {debug additional_flags=-DFAKEARGV}] } { |
23 | return -1 | |
c906108c SS |
24 | } |
25 | ||
c906108c SS |
26 | proc gdbvar_simple_if_test {} { |
27 | global gdb_prompt | |
28 | ||
27d3a1a2 | 29 | gdb_test_no_output "set \$foo = 0" "set foo in gdbvar_simple_if_test" |
c906108c | 30 | # All this test should do is print 0xdeadbeef once. |
42f5c13f MS |
31 | gdb_test "if \$foo == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \ |
32 | "\\\$\[0-9\]* = 0xdeadbeef" "gdbvar_simple_if_test #1" | |
c906108c | 33 | # All this test should do is print 0xfeedface once. |
42f5c13f MS |
34 | gdb_test "if \$foo == 0\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \ |
35 | "\\\$\[0-9\]* = 0xfeedface" "gdbvar_simple_if_test #2" | |
c906108c SS |
36 | } |
37 | ||
38 | proc gdbvar_simple_while_test {} { | |
39 | global gdb_prompt | |
40 | ||
27d3a1a2 | 41 | gdb_test_no_output "set \$foo = 5" "set foo in gdbvar_simple_while_test" |
c906108c | 42 | # This test should print 0xfeedface five times. |
42f5c13f MS |
43 | gdb_test "while \$foo > 0\np/x 0xfeedface\nset \$foo -= 1\nend" \ |
44 | "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
45 | "gdbvar_simple_while_test #1" | |
c906108c SS |
46 | } |
47 | ||
48 | proc gdbvar_complex_if_while_test {} { | |
49 | global gdb_prompt | |
50 | ||
27d3a1a2 MS |
51 | gdb_test_no_output "set \$foo = 4" \ |
52 | "set foo in gdbvar complex_if_while_test" | |
c906108c | 53 | # This test should alternate between 0xdeadbeef and 0xfeedface two times. |
42f5c13f MS |
54 | gdb_test "while \$foo > 0\nset \$foo -= 1\nif \(\$foo % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" \ |
55 | "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
56 | "gdbvar_complex_if_while_test #1" | |
c906108c SS |
57 | } |
58 | ||
59 | proc progvar_simple_if_test {} { | |
60 | global gdb_prompt | |
61 | ||
beb998c6 | 62 | if [target_info exists noargs] { |
c906108c SS |
63 | verbose "Skipping progvar_simple_if_test because of noargs." |
64 | return | |
65 | } | |
66 | ||
67 | if { ![runto factorial] } then { gdb_suppress_tests; } | |
42f5c13f MS |
68 | # Don't depend upon argument passing, since most simulators don't |
69 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 70 | gdb_test "p value=5" ".*" "set value to 5 in progvar_simple_if_test #1" |
c906108c | 71 | # All this test should do is print 0xdeadbeef once. |
42f5c13f MS |
72 | gdb_test "if value == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \ |
73 | "\\\$\[0-9\]* = 0xdeadbeef" \ | |
74 | "progvar_simple_if_test #1" | |
c906108c | 75 | # All this test should do is print 0xfeedface once. |
42f5c13f MS |
76 | gdb_test "if value == 5\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \ |
77 | "\\\$\[0-9\]* = 0xfeedface" \ | |
78 | "progvar_simple_if_test #2" | |
4ec70201 | 79 | gdb_stop_suppressing_tests |
c906108c SS |
80 | } |
81 | ||
82 | proc progvar_simple_while_test {} { | |
83 | global gdb_prompt | |
84 | ||
beb998c6 | 85 | if [target_info exists noargs] { |
c906108c SS |
86 | verbose "Skipping progvar_simple_while_test because of noargs." |
87 | return | |
88 | } | |
89 | ||
27d3a1a2 | 90 | gdb_test_no_output "set args 5" "set args in progvar_simple_while_test" |
c906108c | 91 | if { ![runto factorial] } then { gdb_suppress_tests } |
42f5c13f MS |
92 | # Don't depend upon argument passing, since most simulators don't |
93 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 94 | gdb_test "p value=5" ".*" "set value to 5 in progvar_simple_if_test #2" |
c906108c | 95 | # This test should print 0xfeedface five times. |
42f5c13f MS |
96 | gdb_test "while value > 0\np/x 0xfeedface\nset value -= 1\nend" \ |
97 | "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
98 | "progvar_simple_while_test #1" | |
4ec70201 | 99 | gdb_stop_suppressing_tests |
c906108c SS |
100 | } |
101 | ||
102 | proc progvar_complex_if_while_test {} { | |
103 | global gdb_prompt | |
104 | ||
beb998c6 | 105 | if [target_info exists noargs] { |
c906108c SS |
106 | verbose "Skipping progvar_simple_if_while_test because of noargs." |
107 | return | |
108 | } | |
109 | ||
27d3a1a2 MS |
110 | gdb_test_no_output "set args 4" \ |
111 | "set args in progvar_complex_if_while_test" | |
c906108c | 112 | if { ![runto factorial] } then { gdb_suppress_tests } |
42f5c13f MS |
113 | # Don't depend upon argument passing, since most simulators don't |
114 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 115 | gdb_test "p value=4" ".*" "set value to 4 in progvar_simple_if_test" |
c906108c | 116 | # This test should alternate between 0xdeadbeef and 0xfeedface two times. |
42f5c13f MS |
117 | gdb_test "while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" \ |
118 | "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
119 | "progvar_complex_if_while_test #1" | |
4ec70201 | 120 | gdb_stop_suppressing_tests |
c906108c SS |
121 | } |
122 | ||
123 | proc if_while_breakpoint_command_test {} { | |
beb998c6 | 124 | if [target_info exists noargs] { |
c906108c SS |
125 | verbose "Skipping if_while_breakpoint_command_test because of noargs." |
126 | return | |
127 | } | |
128 | ||
27d3a1a2 MS |
129 | gdb_test_no_output "set args 5" \ |
130 | "set args in if_while_breakpoint_command_test" | |
c906108c | 131 | if { ![runto factorial] } then { gdb_suppress_tests } |
42f5c13f MS |
132 | # Don't depend upon argument passing, since most simulators don't |
133 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 134 | gdb_test "p value=5" ".*" "set value to 5 in progvar_simple_if_test" |
c906108c SS |
135 | delete_breakpoints |
136 | gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #1" | |
137 | ||
ad3986f0 MS |
138 | gdb_test_multiple "commands" \ |
139 | "commands in if_while_breakpoint_command_test" { | |
140 | -re "End with" { | |
141 | pass "commands in if_while_breakpoint_command_test" | |
142 | } | |
c906108c | 143 | } |
ad3986f0 | 144 | |
c906108c | 145 | # This test should alternate between 0xdeadbeef and 0xfeedface two times. |
42f5c13f MS |
146 | gdb_test "while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" \ |
147 | "" \ | |
148 | "commands part 2 in if_while_breakpoint_command_test" | |
149 | gdb_test "continue" \ | |
150 | "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
151 | "if_while_breakpoint_command_test #1" | |
152 | gdb_test "info break" \ | |
153 | "while.*set.*if.*p/x.*else.*p/x.*end.*" \ | |
154 | "info break in if_while_breakpoint_command_test" | |
4ec70201 | 155 | gdb_stop_suppressing_tests |
c906108c SS |
156 | } |
157 | ||
158 | # Test that we can run the inferior from breakpoint commands. | |
02aa71d5 MC |
159 | # |
160 | # The expected behavior is that all commands after the first "step" | |
161 | # shall be ignored. See the gdb manual, "Break Commands", | |
162 | # subsection "Breakpoint command lists". | |
163 | ||
c906108c | 164 | proc infrun_breakpoint_command_test {} { |
beb998c6 | 165 | if [target_info exists noargs] { |
c906108c SS |
166 | verbose "Skipping infrun_breakpoint_command_test because of noargs." |
167 | return | |
168 | } | |
169 | ||
27d3a1a2 MS |
170 | gdb_test_no_output "set args 6" \ |
171 | "set args in infrun_breakpoint_command_test" | |
c906108c | 172 | if { ![runto factorial] } then { gdb_suppress_tests } |
42f5c13f MS |
173 | # Don't depend upon argument passing, since most simulators don't |
174 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 175 | gdb_test "p value=6" ".*" "set value to 6 in progvar_simple_if_test #1" |
c906108c SS |
176 | delete_breakpoints |
177 | gdb_test "break factorial if value == 5" "Breakpoint.*at.*" | |
178 | ||
beb998c6 | 179 | # infrun_breakpoint_command_test - This test was broken into two parts |
c906108c SS |
180 | # to get around a synchronization problem in expect. |
181 | # part1: issue the gdb command "commands" | |
182 | # part2: send the list of commands | |
ad3986f0 MS |
183 | gdb_test_multiple "commands" \ |
184 | "commands in infrun_breakpoint_command_test #1" { | |
185 | -re "End with" { | |
186 | pass "commands in infrun_breakpoint_command_test #1" | |
187 | } | |
c906108c | 188 | } |
02aa71d5 | 189 | gdb_test "step\nstep\nstep\nstep\nend" "" \ |
c906108c | 190 | "commands in infrun_breakpoint_command_test #2" |
085dd6e6 | 191 | |
ad3986f0 MS |
192 | gdb_test "continue" \ |
193 | "Continuing.*.*.*Breakpoint \[0-9\]*, factorial \\(value=5\\).*at.*\[0-9\]*\[ \]*if \\(value > 1\\) \{.*\[0-9\]*\[ \]*value \\*= factorial \\(value - 1\\);.*" \ | |
194 | "continue in infrun_breakpoint_command_test" | |
085dd6e6 | 195 | |
4ec70201 | 196 | gdb_stop_suppressing_tests |
c906108c SS |
197 | } |
198 | ||
199 | proc breakpoint_command_test {} { | |
beb998c6 | 200 | if [target_info exists noargs] { |
c906108c SS |
201 | verbose "Skipping breakpoint_command_test because of noargs." |
202 | return | |
203 | } | |
204 | ||
27d3a1a2 | 205 | gdb_test_no_output "set args 6" "set args in breakpoint_command_test" |
c906108c | 206 | if { ![runto factorial] } then { gdb_suppress_tests; } |
42f5c13f MS |
207 | # Don't depend upon argument passing, since most simulators don't |
208 | # currently support it. Bash value variable to be what we want. | |
f6978de9 | 209 | gdb_test "p value=6" ".*" "set value to 6 in progvar_simple_if_test #2" |
c906108c SS |
210 | delete_breakpoints |
211 | gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #2" | |
212 | gdb_test "commands\nprintf \"Now the value is %d\\n\", value\nend" \ | |
085dd6e6 | 213 | "End with.*" "commands in breakpoint_command_test" |
42f5c13f MS |
214 | gdb_test "continue" \ |
215 | "Breakpoint \[0-9\]*, factorial.*Now the value is 5" \ | |
c906108c SS |
216 | "continue in breakpoint_command_test" |
217 | gdb_test "print value" " = 5" "print value in breakpoint_command_test" | |
4ec70201 | 218 | gdb_stop_suppressing_tests |
c906108c SS |
219 | } |
220 | ||
221 | # Test a simple user defined command (with arguments) | |
222 | proc user_defined_command_test {} { | |
223 | global gdb_prompt | |
224 | ||
27d3a1a2 MS |
225 | gdb_test_no_output "set \$foo = 4" \ |
226 | "set foo in user_defined_command_test" | |
c906108c | 227 | |
ad3986f0 MS |
228 | gdb_test_multiple "define mycommand" \ |
229 | "define mycommand in user_defined_command_test" { | |
230 | -re "End with" { | |
231 | pass "define mycommand in user_defined_command_test" | |
232 | } | |
c906108c | 233 | } |
ad3986f0 | 234 | |
c906108c | 235 | # This test should alternate between 0xdeadbeef and 0xfeedface two times. |
42f5c13f MS |
236 | gdb_test "while \$arg0 > 0\nset \$arg0 -= 1\nif \(\$arg0 % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" \ |
237 | "" \ | |
238 | "enter commands in user_defined_command_test" | |
239 | ||
240 | gdb_test "mycommand \$foo" \ | |
241 | "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \ | |
242 | "execute user defined command in user_defined_command_test" | |
243 | gdb_test "show user mycommand" \ | |
e6ccd35f | 244 | " while \\\$arg0.*set.* if \\\(\\\$arg0.*p/x.* else\[^\n\].*p/x.* end\[^\n\].* end\[^\n\].*" \ |
42f5c13f | 245 | "display user command in user_defined_command_test" |
a9f116cb GKB |
246 | |
247 | # Create and test a user-defined command with an empty body. | |
248 | gdb_test_multiple "define myemptycommand" \ | |
249 | "define myemptycommand in user_defined_command_test" { | |
250 | -re "End with" { | |
251 | pass "define myemptycommand in user_defined_command_test" | |
252 | } | |
253 | } | |
254 | gdb_test "end" \ | |
255 | "" \ | |
256 | "end definition of user-defined command with empty body" | |
257 | ||
258 | gdb_test_no_output "myemptycommand" \ | |
259 | "execute user-defined empty command in user_defined_command_test" | |
260 | ||
261 | gdb_test "show user" \ | |
262 | "User command \"myemptycommand.*" \ | |
263 | "display empty command in command list in user_defined_command_test" | |
264 | ||
265 | gdb_test "show user myemptycommand" \ | |
266 | "User command \"myemptycommand.*" \ | |
267 | "display user-defined empty command in user_defined_command_test" | |
c906108c SS |
268 | } |
269 | ||
085dd6e6 JM |
270 | proc watchpoint_command_test {} { |
271 | global noargs | |
272 | global gdb_prompt | |
273 | ||
beb998c6 | 274 | if [target_info exists noargs] { |
085dd6e6 JM |
275 | verbose "Skipping watchpoint_command_test because of noargs." |
276 | return | |
277 | } | |
278 | ||
bd5ddfe8 DJ |
279 | # Disable hardware watchpoints if necessary. |
280 | if [target_info exists gdb,no_hardware_watchpoints] { | |
35ec993f | 281 | gdb_test_no_output "set can-use-hw-watchpoints 0" "" |
bd5ddfe8 DJ |
282 | } |
283 | ||
27d3a1a2 | 284 | gdb_test_no_output "set args 6" "set args in watchpoint_command_test" |
085dd6e6 JM |
285 | if { ![runto factorial] } then { return } |
286 | delete_breakpoints | |
287 | ||
288 | # Verify that we can create a watchpoint, and give it a commands | |
289 | # list that continues the inferior. We set the watchpoint on a | |
290 | # local variable, too, so that it self-deletes when the watched | |
291 | # data goes out of scope. | |
292 | # | |
293 | # What should happen is: Each time the watchpoint triggers, it | |
294 | # continues the inferior. Eventually, the watchpoint will self- | |
295 | # delete, when the watched variable is out of scope. But by that | |
296 | # time, the inferior should have exited. GDB shouldn't crash or | |
297 | # anything untoward as a result of this. | |
298 | # | |
299 | set wp_id -1 | |
300 | ||
ad3986f0 MS |
301 | gdb_test_multiple "watch local_var" "watch local_var" { |
302 | -re "\[Ww\]atchpoint (\[0-9\]*): local_var.*$gdb_prompt $" { | |
085dd6e6 JM |
303 | set wp_id $expect_out(1,string) |
304 | pass "watch local_var" | |
305 | } | |
085dd6e6 | 306 | } |
7a292a7a | 307 | |
085dd6e6 JM |
308 | if {$wp_id == -1} {return} |
309 | ||
3f9e0d32 | 310 | gdb_test_multiple "commands $wp_id" "begin commands on watch" { |
ad3986f0 MS |
311 | -re "Type commands for breakpoint.*, one per line.*>$" { |
312 | pass "begin commands on watch" | |
313 | } | |
085dd6e6 | 314 | } |
cdac0397 PA |
315 | # See the 'No symbol "value...' fail below. This command will |
316 | # fail if it's executed in the wrong frame. If adjusting the | |
317 | # test, make sure this property holds. | |
ad3986f0 MS |
318 | gdb_test_multiple "print value" "add print command to watch" { |
319 | -re ">$" { | |
320 | pass "add print command to watch" | |
321 | } | |
085dd6e6 | 322 | } |
ad3986f0 MS |
323 | gdb_test_multiple "continue" "add continue command to watch" { |
324 | -re ">$" { | |
325 | pass "add continue command to watch" | |
42f5c13f | 326 | } |
085dd6e6 | 327 | } |
ad3986f0 MS |
328 | gdb_test "end" \ |
329 | "" \ | |
330 | "end commands on watch" | |
331 | ||
cdac0397 | 332 | set test "continue with watch" |
95e4302a JM |
333 | set lno_1 [gdb_get_line_number "commands.exp: hw local_var out of scope" "run.c"] |
334 | set lno_2 [gdb_get_line_number "commands.exp: local_var out of scope" "run.c"] | |
cdac0397 PA |
335 | gdb_test_multiple "continue" "$test" { |
336 | -re "No symbol \"value\" in current context.\r\n$gdb_prompt $" { | |
337 | # Happens if GDB actually runs the watchpoints commands, | |
338 | # even though the watchpoint was deleted for not being in | |
339 | # scope. | |
340 | fail $test | |
341 | } | |
95e4302a | 342 | -re "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*run.c:($lno_1|$lno_2).*$gdb_prompt $" { |
cdac0397 PA |
343 | pass $test |
344 | } | |
345 | } | |
085dd6e6 | 346 | } |
7a292a7a SS |
347 | |
348 | proc test_command_prompt_position {} { | |
349 | global gdb_prompt | |
350 | ||
beb998c6 | 351 | if [target_info exists noargs] { |
7a292a7a SS |
352 | verbose "Skipping test_command_prompt_position because of noargs." |
353 | return | |
354 | } | |
355 | ||
356 | if { ![runto factorial] } then { gdb_suppress_tests; } | |
42f5c13f MS |
357 | # Don't depend upon argument passing, since most simulators don't |
358 | # currently support it. Bash value variable to be what we want. | |
7a292a7a | 359 | delete_breakpoints |
7dbd117d | 360 | gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #3" |
f6978de9 | 361 | gdb_test "p value=5" ".*" "set value to 5 in test_command_prompt_position" |
7a292a7a | 362 | # All this test should do is print 0xdeadbeef once. |
42f5c13f MS |
363 | gdb_test "if value == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \ |
364 | "\\\$\[0-9\]* = 0xdeadbeef" \ | |
365 | "if test in test_command_prompt_position" | |
366 | ||
367 | # Now let's test for the correct position of the '>' in gdb's | |
368 | # prompt for commands. It should be at the beginning of the line, | |
369 | # and not after one space. | |
7a292a7a SS |
370 | |
371 | send_gdb "commands\n" | |
372 | gdb_expect { | |
42f5c13f MS |
373 | -re "Type commands.*End with.*\[\r\n\]>$" { |
374 | send_gdb "printf \"Now the value is %d\\n\", value\n" | |
375 | gdb_expect { | |
376 | -re "^printf.*value\r\n>$" { | |
377 | send_gdb "end\n" | |
378 | gdb_expect { | |
379 | -re "^end\r\n$gdb_prompt $" { | |
380 | pass "> OK in test_command_prompt_position" | |
381 | } | |
382 | -re ".*$gdb_prompt $" { | |
383 | fail "some other message in test_command_prompt_position" | |
384 | } | |
385 | timeout { | |
386 | fail "(timeout) 1 in test_command_prompt_position" | |
387 | } | |
388 | } | |
389 | } | |
390 | -re "^ >$" { fail "> not OK in test_command_prompt_position" } | |
391 | -re ".*$gdb_prompt $" { | |
392 | fail "wrong message in test_command_prompt_position" | |
393 | } | |
394 | timeout { | |
395 | fail "(timeout) 2 in test_command_prompt_position " | |
396 | } | |
397 | } | |
398 | } | |
399 | -re "Type commands.*End with.*\[\r\n\] >$" { | |
400 | fail "prompt not OK in test_command_prompt_position" | |
401 | } | |
402 | -re ".*$gdb_prompt $" { | |
403 | fail "commands in test_command_prompt_position" | |
7a292a7a | 404 | } |
42f5c13f MS |
405 | timeout { fail "(timeout) 3 commands in test_command_prompt_position" } |
406 | } | |
7a292a7a | 407 | |
4ec70201 | 408 | gdb_stop_suppressing_tests |
7a292a7a SS |
409 | } |
410 | ||
411 | ||
003ba290 FN |
412 | |
413 | proc deprecated_command_test {} { | |
003ba290 | 414 | gdb_test "maintenance deprecate blah" "Can't find command.*" \ |
7dbd117d | 415 | "tried to deprecate non-existing command" |
003ba290 | 416 | |
27d3a1a2 | 417 | gdb_test_no_output "maintenance deprecate p \"new_p\"" "maintenance deprecate p \"new_p\" /1/" |
42f5c13f MS |
418 | gdb_test "p 5" \ |
419 | "Warning: 'p', an alias for the command 'print' is deprecated.*Use 'new_p'.*" \ | |
420 | "p deprecated warning, with replacement" | |
7dbd117d | 421 | gdb_test "p 5" ".\[0-9\]* = 5.*" "Deprecated warning goes away /1/" |
003ba290 | 422 | |
27d3a1a2 MS |
423 | gdb_test_no_output "maintenance deprecate p \"new_p\"" "maintenance deprecate p \"new_p\" /2/" |
424 | gdb_test_no_output "maintenance deprecate print \"new_print\"" | |
42f5c13f MS |
425 | gdb_test "p 5" \ |
426 | "Warning: command 'print' \\(p\\) is deprecated.*Use 'new_print'.*" \ | |
427 | "both alias and command are deprecated" | |
7dbd117d | 428 | gdb_test "p 5" ".\[0-9\]* = 5.*" "Deprecated warning goes away /2/" |
003ba290 | 429 | |
27d3a1a2 | 430 | gdb_test_no_output "maintenance deprecate set remote memory-read-packet-size \"srm\" " \ |
7dbd117d | 431 | "deprecate long command /1/" |
42f5c13f MS |
432 | gdb_test "set remote memory-read-packet-size" \ |
433 | "Warning: command 'set remote memory-read-packet-size' is deprecated.*Use 'srm'.*" \ | |
7dbd117d | 434 | "long command deprecated /1/" |
42f5c13f | 435 | |
27d3a1a2 | 436 | gdb_test_no_output "maintenance deprecate set remote memory-read-packet-size" \ |
7dbd117d | 437 | "deprecate long command /2/" |
42f5c13f MS |
438 | gdb_test "set remote memory-read-packet-size" \ |
439 | "Warning: command 'set remote memory-read-packet-size' is deprecated.*No alternative known.*" \ | |
7dbd117d | 440 | "long command deprecated with no alternative /2/" |
42f5c13f MS |
441 | |
442 | gdb_test "maintenance deprecate" \ | |
443 | "\"maintenance deprecate\".*" \ | |
444 | "deprecate with no arguments" | |
003ba290 FN |
445 | } |
446 | ||
c2b8ed2c MS |
447 | proc bp_deleted_in_command_test {} { |
448 | global gdb_prompt | |
449 | ||
c9d37158 DJ |
450 | if [target_info exists noargs] { |
451 | verbose "Skipping bp_deleted_in_command_test because of noargs." | |
452 | return | |
453 | } | |
454 | ||
27d3a1a2 MS |
455 | gdb_test_no_output "set args 1" \ |
456 | "set args in bp_deleted_in_command_test" | |
c2b8ed2c MS |
457 | delete_breakpoints |
458 | ||
459 | # Create a breakpoint, and associate a command-list to it, with | |
460 | # one command that deletes this breakpoint. | |
461 | gdb_test "break factorial" \ | |
42c0c4f1 | 462 | "Breakpoint \[0-9\]+ at .*: file .*run.c, line \[0-9\]+\." \ |
c2b8ed2c MS |
463 | "breakpoint in bp_deleted_in_command_test" |
464 | ||
ad3986f0 MS |
465 | gdb_test_multiple "commands" "begin commands in bp_deleted_in_command_test" { |
466 | -re "Type commands for breakpoint.*>$" { | |
c2b8ed2c MS |
467 | pass "begin commands in bp_deleted_in_command_test" |
468 | } | |
c2b8ed2c | 469 | } |
ad3986f0 MS |
470 | gdb_test_multiple "silent" "add silent command" { |
471 | -re ">$" { | |
472 | pass "add silent command" | |
473 | } | |
c2b8ed2c | 474 | } |
ad3986f0 MS |
475 | gdb_test_multiple "clear factorial" "add clear command" { |
476 | -re ">$" { | |
477 | pass "add clear command" | |
478 | } | |
c2b8ed2c | 479 | } |
ad3986f0 MS |
480 | gdb_test_multiple "printf \"factorial command-list executed\\n\"" \ |
481 | "add printf command" { | |
482 | -re ">$" { | |
483 | pass "add printf command" | |
484 | } | |
c2b8ed2c | 485 | } |
ad3986f0 MS |
486 | gdb_test_multiple "cont" "add cont command" { |
487 | -re ">$" { | |
488 | pass "add cont command" | |
489 | } | |
490 | } | |
491 | gdb_test "end" \ | |
492 | "" \ | |
493 | "end commands" | |
003ba290 | 494 | |
c2b8ed2c MS |
495 | gdb_run_cmd |
496 | gdb_expect { | |
759f0f0b | 497 | -re ".*factorial command-list executed.*$gdb_prompt $" { |
c2b8ed2c MS |
498 | pass "run factorial until breakpoint" |
499 | } | |
500 | -re ".*$gdb_prompt $" { | |
501 | fail "run factorial until breakpoint" | |
502 | } | |
503 | default { fail "(timeout) run factorial until breakpoint" } | |
504 | timeout { fail "(timeout) run factorial until breakpoint" } | |
505 | } | |
506 | } | |
507 | ||
508 | proc temporary_breakpoint_commands {} { | |
509 | global gdb_prompt | |
510 | ||
c9d37158 DJ |
511 | if [target_info exists noargs] { |
512 | verbose "Skipping temporary_breakpoint_commands because of noargs." | |
513 | return | |
514 | } | |
515 | ||
27d3a1a2 MS |
516 | gdb_test_no_output "set args 1" \ |
517 | "set args in temporary_breakpoint_commands" | |
c2b8ed2c MS |
518 | delete_breakpoints |
519 | ||
520 | # Create a temporary breakpoint, and associate a commands list to it. | |
521 | # This test will verify that this commands list is executed when the | |
522 | # breakpoint is hit. | |
523 | gdb_test "tbreak factorial" \ | |
42c0c4f1 | 524 | "Temporary breakpoint \[0-9\]+ at .*: file .*run.c, line \[0-9\]+\." \ |
c2b8ed2c MS |
525 | "breakpoint in temporary_breakpoint_commands" |
526 | ||
ad3986f0 MS |
527 | gdb_test_multiple "commands" \ |
528 | "begin commands in bp_deleted_in_command_test" { | |
529 | -re "Type commands for breakpoint.*>$" { | |
530 | pass "begin commands in bp_deleted_in_command_test" | |
531 | } | |
532 | } | |
533 | gdb_test_multiple "silent" "add silent tbreak command" { | |
534 | -re ">$" { | |
535 | pass "add silent tbreak command" | |
c2b8ed2c | 536 | } |
c2b8ed2c | 537 | } |
38979823 | 538 | gdb_test_multiple "printf \"factorial tbreak commands executed\\n\"" \ |
ad3986f0 MS |
539 | "add printf tbreak command" { |
540 | -re ">$" { | |
541 | pass "add printf tbreak command" | |
542 | } | |
543 | } | |
544 | gdb_test_multiple "cont" "add cont tbreak command" { | |
545 | -re ">$" { | |
546 | pass "add cont tbreak command" | |
547 | } | |
548 | } | |
549 | gdb_test "end" \ | |
550 | "" \ | |
551 | "end tbreak commands" | |
c2b8ed2c MS |
552 | |
553 | gdb_run_cmd | |
554 | gdb_expect { | |
759f0f0b | 555 | -re ".*factorial tbreak commands executed.*$gdb_prompt $" { |
c2b8ed2c MS |
556 | pass "run factorial until temporary breakpoint" |
557 | } | |
558 | timeout { fail "(timeout) run factorial until temporary breakpoint" } | |
559 | } | |
560 | } | |
61d9b92f DJ |
561 | |
562 | # Test that GDB can handle $arg0 outside of user functions without | |
563 | # crashing. | |
564 | proc stray_arg0_test { } { | |
565 | gdb_test "print \$arg0" \ | |
566 | "\\\$\[0-9\]* = void" \ | |
567 | "stray_arg0_test #1" | |
568 | ||
569 | gdb_test "if 1 == 1\nprint \$arg0\nend" \ | |
570 | "\\\$\[0-9\]* = void" \ | |
571 | "stray_arg0_test #2" | |
572 | ||
573 | gdb_test "print \$arg0 = 1" \ | |
574 | "\\\$\[0-9\]* = 1" \ | |
575 | "stray_arg0_test #3" | |
576 | ||
577 | gdb_test "print \$arg0" \ | |
578 | "\\\$\[0-9\]* = 1" \ | |
579 | "stray_arg0_test #4" | |
580 | } | |
e28493f2 | 581 | |
02e7ef19 JB |
582 | # Test that GDB is able to source a file with an indented comment. |
583 | proc source_file_with_indented_comment {} { | |
f76495c8 TT |
584 | set file1 [standard_output_file file1] |
585 | ||
586 | set fd [open "$file1" w] | |
02e7ef19 JB |
587 | puts $fd \ |
588 | {define my_fun | |
589 | #indented comment | |
590 | end | |
591 | echo Done!\n} | |
592 | close $fd | |
593 | ||
f76495c8 | 594 | gdb_test "source $file1" "Done!" "source file with indented comment" |
02e7ef19 JB |
595 | } |
596 | ||
e28493f2 AS |
597 | # Test that GDB can handle arguments when sourcing files recursively. |
598 | # If the arguments are overwritten with ####### then the test has failed. | |
599 | proc recursive_source_test {} { | |
f76495c8 TT |
600 | set file1 [standard_output_file file1] |
601 | set file2 [standard_output_file file2] | |
602 | set file3 [standard_output_file file3] | |
603 | ||
604 | set fd [open "$file1" w] | |
e28493f2 | 605 | puts $fd \ |
f76495c8 TT |
606 | "source $file2 |
607 | abcdef qwerty" | |
e28493f2 AS |
608 | close $fd |
609 | ||
f76495c8 | 610 | set fd [open "$file2" w] |
e28493f2 | 611 | puts $fd \ |
f76495c8 TT |
612 | "define abcdef |
613 | echo 1: <<<\$arg0>>>\\n | |
614 | source $file3 | |
615 | echo 2: <<<\$arg0>>>\\n | |
616 | end" | |
e28493f2 AS |
617 | close $fd |
618 | ||
f76495c8 | 619 | set fd [open "$file3" w] |
e28493f2 AS |
620 | puts $fd \ |
621 | "echo in file3\\n | |
622 | #################################################################" | |
623 | close $fd | |
624 | ||
f76495c8 | 625 | gdb_test "source $file1" \ |
e28493f2 AS |
626 | "1: <<<qwerty>>>\[\r\n]+in file3\[\r\n]+2: <<<qwerty>>>" \ |
627 | "recursive source test" | |
628 | ||
f76495c8 TT |
629 | file delete $file1 |
630 | file delete $file2 | |
631 | file delete $file3 | |
e28493f2 AS |
632 | } |
633 | ||
704a4f78 DJ |
634 | proc gdb_test_no_prompt { command result msg } { |
635 | global gdb_prompt | |
636 | ||
637 | set msg "$command - $msg" | |
638 | set result "^[string_to_regexp $command]\r\n$result$" | |
639 | gdb_test_multiple $command $msg { | |
640 | -re "$result" { | |
641 | pass $msg | |
642 | return 1 | |
643 | } | |
644 | -re "\r\n *>$" { | |
645 | fail $msg | |
646 | return 0 | |
647 | } | |
648 | } | |
649 | return 0 | |
650 | } | |
651 | ||
652 | proc if_commands_test {} { | |
653 | global gdb_prompt | |
654 | ||
27d3a1a2 | 655 | gdb_test_no_output "set \$tem = 1" "set \$tem in if_commands_test" |
704a4f78 DJ |
656 | |
657 | set test "if_commands_test 1" | |
658 | gdb_test_no_prompt "if \$tem == 2" { >} $test | |
659 | gdb_test_no_prompt "break main" { >} $test | |
660 | gdb_test_no_prompt "else" { >} $test | |
661 | gdb_test_no_prompt "break factorial" { >} $test | |
662 | gdb_test_no_prompt "commands" { >} $test | |
663 | gdb_test_no_prompt "silent" { >} $test | |
664 | gdb_test_no_prompt "set \$tem = 3" { >} $test | |
665 | gdb_test_no_prompt "continue" { >} $test | |
666 | gdb_test_multiple "end" "first end - $test" { | |
667 | -re " >\$" { | |
668 | pass "first end - $test" | |
669 | } | |
670 | -re "\r\n>\$" { | |
671 | fail "first end - $test" | |
672 | } | |
673 | } | |
674 | gdb_test_multiple "end" "second end - $test" { | |
42c0c4f1 | 675 | -re "Breakpoint \[0-9\]+ at .*: file .*run.c, line \[0-9\]+\.\r\n$gdb_prompt $" { |
704a4f78 DJ |
676 | pass "second end - $test" |
677 | } | |
678 | -re "Undefined command: \"silent\".*$gdb_prompt $" { | |
679 | fail "second end - $test" | |
680 | } | |
681 | } | |
682 | ||
683 | set test "if_commands_test 2" | |
684 | gdb_test_no_prompt "if \$tem == 1" { >} $test | |
685 | gdb_test_no_prompt "break main" { >} $test | |
686 | gdb_test_no_prompt "else" { >} $test | |
687 | gdb_test_no_prompt "break factorial" { >} $test | |
688 | gdb_test_no_prompt "commands" { >} $test | |
689 | gdb_test_no_prompt "silent" { >} $test | |
690 | gdb_test_no_prompt "set \$tem = 3" { >} $test | |
691 | gdb_test_no_prompt "continue" { >} $test | |
692 | gdb_test_multiple "end" "first end - $test" { | |
693 | -re " >\$" { | |
694 | pass "first end - $test" | |
695 | } | |
696 | -re "\r\n>\$" { | |
697 | fail "first end - $test" | |
698 | } | |
699 | } | |
700 | gdb_test_multiple "end" "second end - $test" { | |
42c0c4f1 | 701 | -re "Breakpoint \[0-9\]+ at .*: file .*run.c, line \[0-9\]+\.\r\n$gdb_prompt $" { |
704a4f78 DJ |
702 | pass "second end - $test" |
703 | } | |
704 | } | |
705 | } | |
706 | ||
353d1d73 JK |
707 | # Verify an error during "commands" commands execution will prevent any other |
708 | # "commands" from other breakpoints at the same location to be executed. | |
709 | ||
710 | proc error_clears_commands_left {} { | |
711 | set test "hook-stop 1" | |
712 | gdb_test_multiple {define hook-stop} $test { | |
713 | -re "End with a line saying just \"end\"\\.\r\n>$" { | |
714 | pass $test | |
715 | } | |
716 | } | |
717 | set test "hook-stop 1a" | |
718 | gdb_test_multiple {echo hook-stop1\n} $test { | |
719 | -re "\r\n>$" { | |
720 | pass $test | |
721 | } | |
722 | } | |
723 | gdb_test_no_output "end" "hook-stop 1b" | |
724 | ||
725 | delete_breakpoints | |
726 | gdb_breakpoint "main" | |
727 | ||
728 | set test "main commands 1" | |
729 | gdb_test_multiple {commands $bpnum} $test { | |
730 | -re "End with a line saying just \"end\"\\.\r\n>$" { | |
731 | pass $test | |
732 | } | |
733 | } | |
734 | set test "main commands 1a" | |
735 | gdb_test_multiple {echo cmd1\n} $test { | |
736 | -re "\r\n>$" { | |
737 | pass $test | |
738 | } | |
739 | } | |
740 | set test "main commands 1b" | |
741 | gdb_test_multiple {errorcommandxy\n} $test { | |
742 | -re "\r\n>$" { | |
743 | pass $test | |
744 | } | |
745 | } | |
746 | gdb_test_no_output "end" "main commands 1c" | |
747 | ||
748 | gdb_breakpoint "main" | |
749 | set test "main commands 2" | |
750 | gdb_test_multiple {commands $bpnum} $test { | |
751 | -re "End with a line saying just \"end\"\\.\r\n>$" { | |
752 | pass $test | |
753 | } | |
754 | } | |
755 | set test "main commands 2a" | |
756 | gdb_test_multiple {echo cmd2\n} $test { | |
757 | -re "\r\n>$" { | |
758 | pass $test | |
759 | } | |
760 | } | |
761 | set test "main commands 2b" | |
762 | gdb_test_multiple {errorcommandyz\n} $test { | |
763 | -re "\r\n>$" { | |
764 | pass $test | |
765 | } | |
766 | } | |
767 | gdb_test_no_output "end" "main commands 2c" | |
768 | ||
769 | gdb_run_cmd | |
87769f59 | 770 | gdb_test "" "hook-stop1\r\n.*\r\ncmd1\r\nUndefined command: \"errorcommandxy\"\\. Try \"help\"\\." "cmd1 error" |
353d1d73 JK |
771 | |
772 | gdb_test {echo idle\n} "\r\nidle" "no cmd2" | |
773 | } | |
774 | ||
fad6eecd TT |
775 | proc redefine_hook_test {} { |
776 | global gdb_prompt | |
777 | ||
778 | gdb_test "define one\nend" \ | |
779 | "" \ | |
780 | "define one" | |
781 | ||
782 | gdb_test "define hook-one\necho hibob\\n\nend" \ | |
783 | "" \ | |
784 | "define hook-one" | |
785 | ||
786 | gdb_test_multiple "define one" "redefine one" { | |
787 | -re "Redefine command .one.. .y or n. $" { | |
788 | send_gdb "y\n" | |
789 | exp_continue | |
790 | } | |
791 | ||
792 | -re "End with" { | |
793 | pass "define one in redefine_hook_test" | |
794 | } | |
795 | default { | |
796 | fail "(timeout or eof) define one in redefine_hook_test" | |
797 | } | |
798 | } | |
799 | ||
800 | gdb_test "end" \ | |
801 | "" \ | |
802 | "enter commands for one redefinition in redefine_hook_test" | |
803 | ||
804 | gdb_test "one" \ | |
805 | "hibob" \ | |
806 | "execute one command in redefine_hook_test" | |
807 | } | |
808 | ||
b05dcbb7 TT |
809 | proc redefine_backtrace_test {} { |
810 | global gdb_prompt | |
811 | ||
812 | gdb_test_multiple "define backtrace" "define backtrace" { | |
d26ccb4f JK |
813 | -re "Really redefine built-in command \"backtrace\"\\? \\(y or n\\) $" { |
814 | pass "define backtrace" | |
b05dcbb7 | 815 | } |
d26ccb4f | 816 | } |
b05dcbb7 | 817 | |
d26ccb4f JK |
818 | gdb_test_multiple "y" "expect response to define backtrace" { |
819 | -re "End with a line saying just \"end\"\\.\r\n>$" { | |
820 | pass "expect response to define backtrace" | |
b05dcbb7 TT |
821 | } |
822 | } | |
d26ccb4f | 823 | |
b05dcbb7 TT |
824 | gdb_test "echo hibob\\n\nend" \ |
825 | "" \ | |
826 | "enter commands in redefine_backtrace_test" | |
827 | ||
828 | gdb_test "backtrace" \ | |
829 | "hibob" \ | |
830 | "execute backtrace command in redefine_backtrace_test" | |
831 | gdb_test "bt" \ | |
832 | "hibob" \ | |
833 | "execute bt command in redefine_backtrace_test" | |
834 | } | |
835 | ||
c906108c SS |
836 | gdbvar_simple_if_test |
837 | gdbvar_simple_while_test | |
838 | gdbvar_complex_if_while_test | |
839 | progvar_simple_if_test | |
840 | progvar_simple_while_test | |
841 | progvar_complex_if_while_test | |
842 | if_while_breakpoint_command_test | |
843 | infrun_breakpoint_command_test | |
844 | breakpoint_command_test | |
845 | user_defined_command_test | |
085dd6e6 | 846 | watchpoint_command_test |
7a292a7a | 847 | test_command_prompt_position |
003ba290 | 848 | deprecated_command_test |
c2b8ed2c MS |
849 | bp_deleted_in_command_test |
850 | temporary_breakpoint_commands | |
61d9b92f | 851 | stray_arg0_test |
02e7ef19 | 852 | source_file_with_indented_comment |
e28493f2 | 853 | recursive_source_test |
704a4f78 | 854 | if_commands_test |
353d1d73 | 855 | error_clears_commands_left |
fad6eecd | 856 | redefine_hook_test |
b05dcbb7 TT |
857 | # This one should come last, as it redefines "backtrace". |
858 | redefine_backtrace_test |