gdb/
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.mi / mi2-var-cmd.exp
1 # Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2004, 2007, 2008, 2009
2 # Free Software Foundation, Inc.
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 # Test essential Machine interface (MI) operations
18 #
19 # Verify that, using the MI, we can create, update, delete variables.
20 #
21
22
23 load_lib mi-support.exp
24 set MIFLAGS "-i=mi2"
25
26 gdb_exit
27 if [mi_gdb_start] {
28 continue
29 }
30
31 set testfile "var-cmd"
32 set srcfile ${testfile}.c
33 set binfile ${objdir}/${subdir}/mi2-var-cmd
34 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
35 untested mi2-var-cmd.exp
36 return -1
37 }
38
39 mi_delete_breakpoints
40 mi_gdb_reinitialize_dir $srcdir/$subdir
41 mi_gdb_load ${binfile}
42
43
44 ##### #####
45 # #
46 # Variable Creation tests #
47 # #
48 ##### #####
49
50 # Test: c_variable-1.1
51 # Desc: Create global variable
52
53 mi_create_varobj "global_simple" "global_simple" "create global variable"
54
55 # Test: c_variable-1.2
56 # Desc: Create non-existent variable
57
58 mi_gdb_test "112-var-create bogus_unknown_variable * bogus_unknown_variable" \
59 "112\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
60 "create non-existent variable"
61
62 # Test: c_variable-1.3
63 # Desc: Create out of scope variable
64
65 mi_gdb_test "113-var-create argc * argc" \
66 "113\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
67 "create out of scope variable"
68
69 mi_runto do_locals_tests
70
71 set line_dlt_first_real [gdb_get_line_number "linteger = 1234;"]
72
73 mi_continue_to_line $line_dlt_first_real "step to real start of do_locals_test"
74
75
76 # Test: c_variable-1.4
77 # Desc: create local variables
78
79 mi_create_varobj_checked linteger linteger int "create local variable linteger"
80
81 mi_create_varobj_checked lpinteger lpinteger {int \*} "create local variable lpinteger"
82
83 mi_create_varobj_checked lcharacter lcharacter\[0\] char "create local variable lcharacter"
84
85 mi_create_varobj_checked lpcharacter lpcharacter {char \*} "create local variable lpcharacter"
86
87 mi_create_varobj_checked llong llong "long int" "create local variable llong"
88
89 mi_create_varobj_checked lplong lplong {long int \*} "create local variable lplong"
90
91 mi_create_varobj_checked lfloat lfloat float "create local variable lfloat"
92
93 mi_create_varobj_checked lpfloat lpfloat {float \*} "create local variable lpfloat"
94
95 mi_create_varobj_checked ldouble ldouble double "create local variable ldouble"
96
97 mi_create_varobj_checked lpdouble lpdouble {double \*} "create local variable lpdouble"
98
99 mi_create_varobj_checked lsimple lsimple "struct _simple_struct" "create local variable lsimple"
100
101 mi_create_varobj_checked lpsimple lpsimple {struct _simple_struct \*} "create local variable lpsimple"
102
103 mi_create_varobj_checked func func {void \(\*\)\((void|)\)} "create local variable func"
104
105 # Test: c_variable-1.5
106 # Desc: create lsimple.character
107 mi_create_varobj_checked lsimple.character lsimple.character "char" \
108 "create lsimple.character"
109
110 # Test: c_variable-1.6
111 # Desc: create lpsimple->integer
112 mi_create_varobj_checked lsimple->integer lsimple->integer "int" \
113 "create lsimple->integer"
114
115 # Test: c_variable-1.7
116 # Desc: crate lsimple.integer
117 mi_create_varobj_checked lsimple.integer lsimple.integer "int" \
118 "create lsimple.integer"
119
120
121 # Test: c_variable-1.9
122 # Desc: create type name
123 # Type names (like int, long, etc..) are all proper expressions to gdb.
124 # make sure variable code does not allow users to create variables, though.
125 mi_gdb_test "-var-create int * int" \
126 "&\"Attempt to use a type name as an expression.\\\\n\".*\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
127 "create int"
128
129 # The number 0 must be an invalid frame address and linteger a local variable.
130 mi_gdb_test "-var-create invalidframe 0 linteger" \
131 "\\^error,msg=\"Failed to find the specified frame\"" \
132 "create variable with invalid FRAME-ADDR"
133
134
135 ##### #####
136 # #
137 # Value changed tests #
138 # #
139 ##### #####
140
141 # Test: c_variable-2.1
142 # Desc: check whether values changed at do_block_tests
143 mi_gdb_test "-var-update *" \
144 "\\^done,changelist=\\\[\\\]" \
145 "update all vars"
146
147 # Step over "linteger = 1234;"
148 set line_dlt_linteger [gdb_get_line_number "lpinteger = &linteger;"]
149 mi_step_to "do_locals_tests" "" "var-cmd.c" $line_dlt_linteger "step at do_locals_test"
150
151 # Test: c_variable-2.2
152 # Desc: check whether only linteger changed values
153 mi_gdb_test "-var-update *" \
154 "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
155 "update all vars: linteger changed"
156
157 # Step over "lpinteger = &linteger;"
158 mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 1] "step at do_locals_tests (2)"
159
160 # Test: c_variable-2.3
161 # Desc: check whether only lpinteger changed
162 mi_gdb_test "-var-update *" \
163 "\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
164 "update all vars: lpinteger changed"
165
166 # Step over "lcharacter = 'a';"
167 mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 2] "step at do_locals_tests (3)"
168
169 # Test: c_variable-2.4
170 # Desc: check whether only lcharacter changed
171 mi_gdb_test "-var-update *" \
172 "\\^done,changelist=\\\[\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
173 "update all vars: lcharacter changed"
174
175 # Step over "lpcharacter = &lcharacter;"
176 mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 3] "step at do_locals_tests (4)"
177
178 # Test: c_variable-2.5
179 # Desc: check whether only lpcharacter changed
180 mi_gdb_test "-var-update *" \
181 "\\^done,changelist=\\\[\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
182 "update all vars: lpcharacter changed"
183
184
185 # Step over:
186 # llong = 2121L;
187 # lplong = &llong;
188 # lfloat = 2.1;
189 # lpfloat = &lfloat;
190 # ldouble = 2.718281828459045;
191 # lpdouble = &ldouble;
192 # lsimple.integer = 1234;
193 # lsimple.unsigned_integer = 255;
194 # lsimple.character = 'a';
195
196 mi_execute_to "exec-step 9" "end-stepping-range" "do_locals_tests" "" \
197 "var-cmd.c" [expr $line_dlt_linteger + 12] "" "step at do_locals_tests (5)"
198
199 # Test: c_variable-2.6
200 # Desc: check whether llong, lplong, lfloat, lpfloat, ldouble, lpdouble, lsimple.integer,
201 # lsimple.unsigned_character lsimple.integer lsimple.character changed
202 mi_gdb_test "-var-update *" \
203 "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpdouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lplong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
204 "update all vars: many changed"
205
206 # Step over:
207 # lsimple.signed_character = 21;
208 # lsimple.char_ptr = &lcharacter;
209 # lpsimple = &lsimple;
210 # func = nothing;
211
212 set line_dlt_4321 [gdb_get_line_number "linteger = 4321;"]
213
214 mi_execute_to "exec-step 4" "end-stepping-range" "do_locals_tests" "" \
215 "var-cmd.c" $line_dlt_4321 "" "step at do_locals_tests (6)"
216
217 # Test: c_variable-2.7
218 # Desc: check whether (lsimple.signed_character, lsimple.char_ptr) lpsimple, func changed
219 mi_gdb_test "-var-update *" \
220 "\\^done,changelist=\\\[\{name=\"func\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpsimple\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
221 "update all vars: func and lpsimple changed"
222
223 # Step over
224 # linteger = 4321;
225 # lcharacter = 'b';
226 # llong = 1212L;
227 # lfloat = 1.2;
228 # ldouble = 5.498548281828172;
229 # lsimple.integer = 255;
230 # lsimple.unsigned_integer = 4321;
231 # lsimple.character = 'b';
232
233 mi_execute_to "exec-step 8" "end-stepping-range" "do_locals_tests" "" \
234 "var-cmd.c" [expr $line_dlt_4321 + 8] "" "step at do_locals_tests (7)"
235
236 # Test: c_variable-2.8
237 # Desc: check whether linteger, lcharacter, llong, lfoat, ldouble, lsimple.integer,
238 # lpsimple.integer lsimple.character changed
239 # Note: this test also checks that lpsimple->integer and lsimple.integer have
240 # changed (they are the same)
241 mi_gdb_test "-var-update *" \
242 "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
243 "update all vars: lsimple and others changed"
244
245
246 ###
247 #
248 # Test assignment to variables. More tests on assignment are in other files.
249 #
250 ###
251 mi_gdb_test "-var-assign global_simple 0" \
252 "\\^error,msg=\"mi_cmd_var_assign: Variable object is not editable\"" \
253 "assign to global_simple"
254
255 mi_gdb_test "-var-assign linteger 3333" \
256 "\\^done,value=\"3333\"" \
257 "assign to linteger"
258
259 # Allow lpcharacter to update, optionally. Because it points to a
260 # char variable instead of a zero-terminated string, if linteger is
261 # directly after it in memory the printed characters may appear to
262 # change.
263 set lpchar_update "\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},"
264 mi_gdb_test "-var-update *" \
265 "\\^done,changelist=\\\[($lpchar_update)?\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
266 "update all vars: linteger changed after assign"
267
268 mi_gdb_test "-var-assign linteger 3333" \
269 "\\^done,value=\"3333\"" \
270 "assign to linteger again, same value"
271
272 mi_gdb_test "-var-update *" \
273 "\\^done,changelist=\\\[\\\]" \
274 "update all vars: linteger not changed after same assign"
275
276 mi_gdb_test "-var-evaluate-expression linteger" \
277 "\\^done,value=\"3333\"" \
278 "eval linteger"
279
280 mi_gdb_test "-var-assign lpinteger \"&linteger + 3\"" \
281 "\\^done,value=\"$hex\"" \
282 "assign to lpinteger"
283
284 mi_gdb_test "-var-update *" \
285 "\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
286 "update all vars: lpinteger changed after assign"
287
288 mi_gdb_test "-var-update *" \
289 "\\^done,changelist=\\\[\\\]" \
290 "update all vars: no changes on second update"
291
292 mi_gdb_test "-var-evaluate-expression lpinteger" \
293 "\\^done,value=\"$hex\"" \
294 "eval lpinteger"
295
296 # reset the values to the original ones so that the rest of the file doesn't suffer.
297
298 mi_gdb_test "-var-assign linteger 4321" \
299 "\\^done,value=\"4321\"" \
300 "assign to linteger"
301
302 mi_gdb_test "-var-assign lpinteger &linteger" \
303 "\\^done,value=\"$hex\"" \
304 "assign to lpinteger"
305
306 mi_gdb_test "-var-assign lcharacter 'z'" \
307 "\\^done,value=\"122 'z'\"" \
308 "assign to lcharacter"
309
310 mi_gdb_test "-var-evaluate-expression lcharacter" \
311 "\\^done,value=\"122 'z'\"" \
312 "eval lcharacter"
313
314 mi_gdb_test "-var-assign llong 1313L" \
315 "\\^done,value=\"1313\"" \
316 "assign to llong"
317 mi_gdb_test "-var-evaluate-expression llong" \
318 "\\^done,value=\"1313\"" \
319 "eval llong"
320 mi_gdb_test "-var-assign llong 1212L" \
321 "\\^done,value=\"1212\"" \
322 "assign to llong"
323
324 mi_gdb_test "-var-assign lplong &llong+4" \
325 "\\^done,value=\"$hex\"" \
326 "assign to lplong"
327 mi_gdb_test "-var-evaluate-expression lplong" \
328 "\\^done,value=\"$hex\"" \
329 "eval lplong"
330 mi_gdb_test "-var-assign lplong &llong" \
331 "\\^done,value=\"$hex\"" \
332 "assign to lplong"
333
334 mi_gdb_test "-var-assign lfloat 3.4567" \
335 "\\^done,value=\"3.45.*\"" \
336 "assign to lfloat"
337 mi_gdb_test "-var-evaluate-expression lfloat" \
338 "\\^done,value=\"3.45.*\"" \
339 "eval lfloat"
340 mi_gdb_test "-var-assign lfloat 1.2345" \
341 "\\^done,value=\"1.23.*\"" \
342 "assign to lfloat"
343
344 mi_gdb_test "-var-assign lpfloat &lfloat+4" \
345 "\\^done,value=\"$hex\"" \
346 "assign to lpfloat"
347
348 mi_gdb_test "-var-assign ldouble 5.333318284590435" \
349 "\\^done,value=\"5.333318284590435\"" \
350 "assign to ldouble"
351
352 mi_gdb_test "-var-assign func do_block_tests" \
353 "\\^done,value=\"$hex <do_block_tests>\"" \
354 "assign to func"
355
356 mi_gdb_test "-var-assign lsimple.character 'd'" \
357 "\\^done,value=\"100 'd'\"" \
358 "assign to lsimple.character"
359
360 mi_gdb_test "-var-assign lsimple->integer 222" \
361 "\\^done,value=\"222\"" \
362 "assign to lsimple->integer"
363
364 mi_gdb_test "-var-assign lsimple.integer 333" \
365 "\\^done,value=\"333\"" \
366 "assign to lsimple.integer"
367
368 ######
369 # End of assign tests
370 #####
371
372 set line_subroutine1_body [gdb_get_line_number "global_simple.integer = i + 3;"]
373
374 mi_continue_to "subroutine1"
375
376 # Test: c_variable-2.10
377 # Desc: create variable for locals i,l in subroutine1
378 mi_create_varobj_checked i i int "create i"
379
380 mi_create_varobj_checked l l {long int \*} "create l"
381
382 # Test: c_variable-2.11
383 # Desc: create do_locals_tests local in subroutine1
384 mi_gdb_test "-var-create linteger * linteger" \
385 "\\^error,msg=\"mi_cmd_var_create: unable to create variable object\"" \
386 "create linteger"
387
388 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
389 "var-cmd.c" [expr $line_subroutine1_body + 1] "step at subroutine1"
390
391 # Test: c_variable-2.12
392 # Desc: change global_simple.integer
393 # Note: This also tests whether we are reporting changes in structs properly.
394 # gdb normally would say that global_simple has changed, but we
395 # special case that, since it is not what a human expects to
396 # see.
397
398 setup_xfail *-*-*
399 mi_gdb_test "-var-update *" \
400 "\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \
401 "update all vars: changed FIXME"
402 clear_xfail *-*-*
403
404 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
405 "var-cmd.c" [expr $line_subroutine1_body + 2] "step at subroutine1 (2)"
406
407 # Test: c_variable-2.13
408 # Desc: change subroutine1 local i
409 mi_gdb_test "-var-update *" \
410 "\\^done,changelist=\\\[\{name=\"i\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
411 "update all vars: i changed"
412
413 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
414 "var-cmd.c" [expr $line_subroutine1_body + 3] "step at subroutine1 (3)"
415
416 # Test: c_variable-2.14
417 # Desc: change do_locals_tests local llong
418 mi_gdb_test "-var-update *" \
419 "\\^done,changelist=\\\[\{name=\"llong\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
420 "update all vars: llong changed"
421
422 set line_dlt_call_subroutine1 [gdb_get_line_number "subroutine1 (linteger, &llong);"]
423 mi_next_to "do_locals_tests" "" "var-cmd.c" \
424 [expr $line_dlt_call_subroutine1 + 1] "next out of subroutine1"
425
426 # Test: c_variable-2.15
427 # Desc: check for out of scope subroutine1 locals
428 mi_gdb_test "-var-update *" \
429 "\\^done,changelist=\\\[\{name=\"l\",in_scope=\"false\"\,type_changed=\"false\"},\{name=\"i\",in_scope=\"false\",type_changed=\"false\"\}\\\]" \
430 "update all vars: all now out of scope"
431
432 # Done with locals/globals tests. Erase all variables
433 #delete_all_variables
434 mi_gdb_test "-var-delete global_simple" \
435 "\\^done,ndeleted=\"1\"" \
436 "delete var"
437
438 mi_gdb_test "-var-delete linteger" \
439 "\\^done,ndeleted=\"1\"" \
440 "delete var linteger"
441
442 mi_gdb_test "-var-delete lpinteger" \
443 "\\^done,ndeleted=\"1\"" \
444 "delete var lpinteger"
445
446 mi_gdb_test "-var-delete lcharacter" \
447 "\\^done,ndeleted=\"1\"" \
448 "delete var lcharacter"
449
450 mi_gdb_test "-var-delete lpcharacter" \
451 "\\^done,ndeleted=\"1\"" \
452 "delete var lpcharacter"
453
454 mi_gdb_test "-var-delete llong" \
455 "\\^done,ndeleted=\"1\"" \
456 "delete var llong"
457
458 mi_gdb_test "-var-delete lplong" \
459 "\\^done,ndeleted=\"1\"" \
460 "delete var lplong"
461
462 mi_gdb_test "-var-delete lfloat" \
463 "\\^done,ndeleted=\"1\"" \
464 "delete var lfloat"
465
466 mi_gdb_test "-var-delete lpfloat" \
467 "\\^done,ndeleted=\"1\"" \
468 "delete var lpfloat"
469
470 mi_gdb_test "-var-delete ldouble" \
471 "\\^done,ndeleted=\"1\"" \
472 "delete var ldouble"
473
474 mi_gdb_test "-var-delete lpdouble" \
475 "\\^done,ndeleted=\"1\"" \
476 "delete var lpdouble"
477
478 mi_gdb_test "-var-delete lsimple" \
479 "\\^done,ndeleted=\"1\"" \
480 "delete var lsimple"
481
482 mi_gdb_test "-var-delete lpsimple" \
483 "\\^done,ndeleted=\"1\"" \
484 "delete var lpsimple"
485
486 mi_gdb_test "-var-delete func" \
487 "\\^done,ndeleted=\"1\"" \
488 "delete var func"
489
490 mi_gdb_test "-var-delete lsimple.character" \
491 "\\^done,ndeleted=\"1\"" \
492 "delete var lsimple.character"
493
494 mi_gdb_test "-var-delete lsimple->integer" \
495 "\\^done,ndeleted=\"1\"" \
496 "delete var lsimple->integer"
497
498 mi_gdb_test "-var-delete lsimple.integer" \
499 "\\^done,ndeleted=\"1\"" \
500 "delete var lsimple.integer"
501
502 mi_gdb_test "-var-delete i" \
503 "\\^done,ndeleted=\"1\"" \
504 "delete var i"
505
506 mi_gdb_test "-var-delete l" \
507 "\\^done,ndeleted=\"1\"" \
508 "delete var l"
509
510 # Test whether we can follow the name of a variable through multiple
511 # stack frames.
512 mi_continue_to do_special_tests
513
514 mi_gdb_test "-var-create selected_a @ a" \
515 {\^done,name="selected_a",numchild="0",value=".*",type="int".*} \
516 "create selected_a"
517
518 mi_continue_to incr_a
519
520 mi_gdb_test "-var-update selected_a" \
521 "\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"char\",new_num_children=\"0\"\}\\\]" \
522 "update selected_a in incr_a"
523
524 mi_next "step a line in incr_a"
525 mi_next "return from incr_a to do_special_tests"
526
527 mi_gdb_test "-var-update selected_a" \
528 "\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"int\",new_num_children=\"0\"\}\\\]" \
529 "update selected_a in do_special_tests"
530
531 mi_gdb_test "-file-exec-and-symbols ${binfile}" "\\^done" \
532 "floating varobj invalidation"
533
534
535 mi_gdb_exit
536 return 0
This page took 0.040573 seconds and 4 git commands to generate.