1 # Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2004, 2007, 2008, 2009
2 # Free Software Foundation, Inc.
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.
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.
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/>.
17 # Test essential Machine interface (MI) operations
19 # Verify that, using the MI, we can create, update, delete variables.
23 load_lib mi-support.exp
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
40 mi_gdb_reinitialize_dir $srcdir/$subdir
41 mi_gdb_load ${binfile}
46 # Variable Creation tests #
50 # Test: c_variable-1.1
51 # Desc: Create global variable
53 mi_create_varobj "global_simple" "global_simple" "create global variable"
55 # Test: c_variable-1.2
56 # Desc: Create non-existent variable
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"
62 # Test: c_variable-1.3
63 # Desc: Create out of scope variable
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"
69 mi_runto do_locals_tests
71 set line_dlt_first_real [gdb_get_line_number "linteger = 1234;"]
73 mi_continue_to_line $line_dlt_first_real "step to real start of do_locals_test"
76 # Test: c_variable-1.4
77 # Desc: create local variables
79 mi_create_varobj_checked linteger linteger int "create local variable linteger"
81 mi_create_varobj_checked lpinteger lpinteger {int \*} "create local variable lpinteger"
83 mi_create_varobj_checked lcharacter lcharacter\[0\] char "create local variable lcharacter"
85 mi_create_varobj_checked lpcharacter lpcharacter {char \*} "create local variable lpcharacter"
87 mi_create_varobj_checked llong llong "long int" "create local variable llong"
89 mi_create_varobj_checked lplong lplong {long int \*} "create local variable lplong"
91 mi_create_varobj_checked lfloat lfloat float "create local variable lfloat"
93 mi_create_varobj_checked lpfloat lpfloat {float \*} "create local variable lpfloat"
95 mi_create_varobj_checked ldouble ldouble double "create local variable ldouble"
97 mi_create_varobj_checked lpdouble lpdouble {double \*} "create local variable lpdouble"
99 mi_create_varobj_checked lsimple lsimple "struct _simple_struct" "create local variable lsimple"
101 mi_create_varobj_checked lpsimple lpsimple {struct _simple_struct \*} "create local variable lpsimple"
103 mi_create_varobj_checked func func {void \(\*\)\((void|)\)} "create local variable func"
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"
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"
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"
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\"" \
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"
137 # Value changed tests #
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=\\\[\\\]" \
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"
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"
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)"
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"
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)"
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"
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)"
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"
190 # ldouble = 2.718281828459045;
191 # lpdouble = &ldouble;
192 # lsimple.integer = 1234;
193 # lsimple.unsigned_integer = 255;
194 # lsimple.character = 'a';
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)"
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"
207 # lsimple.signed_character = 21;
208 # lsimple.char_ptr = &lcharacter;
209 # lpsimple = &lsimple;
212 set line_dlt_4321 [gdb_get_line_number "linteger = 4321;"]
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)"
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"
228 # ldouble = 5.498548281828172;
229 # lsimple.integer = 255;
230 # lsimple.unsigned_integer = 4321;
231 # lsimple.character = 'b';
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)"
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"
248 # Test assignment to variables. More tests on assignment are in other files.
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"
255 mi_gdb_test "-var-assign linteger 3333" \
256 "\\^done,value=\"3333\"" \
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
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"
268 mi_gdb_test "-var-assign linteger 3333" \
269 "\\^done,value=\"3333\"" \
270 "assign to linteger again, same value"
272 mi_gdb_test "-var-update *" \
273 "\\^done,changelist=\\\[\\\]" \
274 "update all vars: linteger not changed after same assign"
276 mi_gdb_test "-var-evaluate-expression linteger" \
277 "\\^done,value=\"3333\"" \
280 mi_gdb_test "-var-assign lpinteger \"&linteger + 3\"" \
281 "\\^done,value=\"$hex\"" \
282 "assign to lpinteger"
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"
288 mi_gdb_test "-var-update *" \
289 "\\^done,changelist=\\\[\\\]" \
290 "update all vars: no changes on second update"
292 mi_gdb_test "-var-evaluate-expression lpinteger" \
293 "\\^done,value=\"$hex\"" \
296 # reset the values to the original ones so that the rest of the file doesn't suffer.
298 mi_gdb_test "-var-assign linteger 4321" \
299 "\\^done,value=\"4321\"" \
302 mi_gdb_test "-var-assign lpinteger &linteger" \
303 "\\^done,value=\"$hex\"" \
304 "assign to lpinteger"
306 mi_gdb_test "-var-assign lcharacter 'z'" \
307 "\\^done,value=\"122 'z'\"" \
308 "assign to lcharacter"
310 mi_gdb_test "-var-evaluate-expression lcharacter" \
311 "\\^done,value=\"122 'z'\"" \
314 mi_gdb_test "-var-assign llong 1313L" \
315 "\\^done,value=\"1313\"" \
317 mi_gdb_test "-var-evaluate-expression llong" \
318 "\\^done,value=\"1313\"" \
320 mi_gdb_test "-var-assign llong 1212L" \
321 "\\^done,value=\"1212\"" \
324 mi_gdb_test "-var-assign lplong &llong+4" \
325 "\\^done,value=\"$hex\"" \
327 mi_gdb_test "-var-evaluate-expression lplong" \
328 "\\^done,value=\"$hex\"" \
330 mi_gdb_test "-var-assign lplong &llong" \
331 "\\^done,value=\"$hex\"" \
334 mi_gdb_test "-var-assign lfloat 3.4567" \
335 "\\^done,value=\"3.45.*\"" \
337 mi_gdb_test "-var-evaluate-expression lfloat" \
338 "\\^done,value=\"3.45.*\"" \
340 mi_gdb_test "-var-assign lfloat 1.2345" \
341 "\\^done,value=\"1.23.*\"" \
344 mi_gdb_test "-var-assign lpfloat &lfloat+4" \
345 "\\^done,value=\"$hex\"" \
348 mi_gdb_test "-var-assign ldouble 5.333318284590435" \
349 "\\^done,value=\"5.333318284590435\"" \
352 mi_gdb_test "-var-assign func do_block_tests" \
353 "\\^done,value=\"$hex <do_block_tests>\"" \
356 mi_gdb_test "-var-assign lsimple.character 'd'" \
357 "\\^done,value=\"100 'd'\"" \
358 "assign to lsimple.character"
360 mi_gdb_test "-var-assign lsimple->integer 222" \
361 "\\^done,value=\"222\"" \
362 "assign to lsimple->integer"
364 mi_gdb_test "-var-assign lsimple.integer 333" \
365 "\\^done,value=\"333\"" \
366 "assign to lsimple.integer"
369 # End of assign tests
372 set line_subroutine1_body [gdb_get_line_number "global_simple.integer = i + 3;"]
374 mi_continue_to "subroutine1"
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"
380 mi_create_varobj_checked l l {long int \*} "create l"
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\"" \
388 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
389 "var-cmd.c" [expr $line_subroutine1_body + 1] "step at subroutine1"
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
399 mi_gdb_test "-var-update *" \
400 "\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \
401 "update all vars: changed FIXME"
404 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
405 "var-cmd.c" [expr $line_subroutine1_body + 2] "step at subroutine1 (2)"
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"
413 mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
414 "var-cmd.c" [expr $line_subroutine1_body + 3] "step at subroutine1 (3)"
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"
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"
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"
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\"" \
438 mi_gdb_test "-var-delete linteger" \
439 "\\^done,ndeleted=\"1\"" \
440 "delete var linteger"
442 mi_gdb_test "-var-delete lpinteger" \
443 "\\^done,ndeleted=\"1\"" \
444 "delete var lpinteger"
446 mi_gdb_test "-var-delete lcharacter" \
447 "\\^done,ndeleted=\"1\"" \
448 "delete var lcharacter"
450 mi_gdb_test "-var-delete lpcharacter" \
451 "\\^done,ndeleted=\"1\"" \
452 "delete var lpcharacter"
454 mi_gdb_test "-var-delete llong" \
455 "\\^done,ndeleted=\"1\"" \
458 mi_gdb_test "-var-delete lplong" \
459 "\\^done,ndeleted=\"1\"" \
462 mi_gdb_test "-var-delete lfloat" \
463 "\\^done,ndeleted=\"1\"" \
466 mi_gdb_test "-var-delete lpfloat" \
467 "\\^done,ndeleted=\"1\"" \
470 mi_gdb_test "-var-delete ldouble" \
471 "\\^done,ndeleted=\"1\"" \
474 mi_gdb_test "-var-delete lpdouble" \
475 "\\^done,ndeleted=\"1\"" \
476 "delete var lpdouble"
478 mi_gdb_test "-var-delete lsimple" \
479 "\\^done,ndeleted=\"1\"" \
482 mi_gdb_test "-var-delete lpsimple" \
483 "\\^done,ndeleted=\"1\"" \
484 "delete var lpsimple"
486 mi_gdb_test "-var-delete func" \
487 "\\^done,ndeleted=\"1\"" \
490 mi_gdb_test "-var-delete lsimple.character" \
491 "\\^done,ndeleted=\"1\"" \
492 "delete var lsimple.character"
494 mi_gdb_test "-var-delete lsimple->integer" \
495 "\\^done,ndeleted=\"1\"" \
496 "delete var lsimple->integer"
498 mi_gdb_test "-var-delete lsimple.integer" \
499 "\\^done,ndeleted=\"1\"" \
500 "delete var lsimple.integer"
502 mi_gdb_test "-var-delete i" \
503 "\\^done,ndeleted=\"1\"" \
506 mi_gdb_test "-var-delete l" \
507 "\\^done,ndeleted=\"1\"" \
510 # Test whether we can follow the name of a variable through multiple
512 mi_continue_to do_special_tests
514 mi_gdb_test "-var-create selected_a @ a" \
515 {\^done,name="selected_a",numchild="0",value=".*",type="int".*} \
518 mi_continue_to incr_a
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"
524 mi_next "step a line in incr_a"
525 mi_next "return from incr_a to do_special_tests"
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"
531 mi_gdb_test "-file-exec-and-symbols ${binfile}" "\\^done" \
532 "floating varobj invalidation"