1# Copyright 1999-2020 Free Software Foundation, Inc. 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 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 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. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# Test essential Machine interface (MI) operations 17# 18# Verify that, using the MI, we can create, update, delete variables. 19# 20 21 22load_lib mi-support.exp 23set MIFLAGS "-i=mi" 24 25gdb_exit 26if [mi_gdb_start] { 27 continue 28} 29 30standard_testfile var-cmd.c 31 32if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 33 untested "failed to compile" 34 return -1 35} 36 37mi_delete_breakpoints 38mi_gdb_reinitialize_dir $srcdir/$subdir 39mi_gdb_load ${binfile} 40 41 42##### ##### 43# # 44# Variable Creation tests # 45# # 46##### ##### 47 48# Test: c_variable-1.1 49# Desc: Create global variable 50 51mi_create_varobj "global_simple" "global_simple" "create global variable" 52 53# PR mi/15863 54# Attempt to update the varobj before running the inferior. 55mi_gdb_test "-var-update *" \ 56 "\\^done,changelist=\\\[\\\]" \ 57 "update varobj before running inferior" 58 59# Test: c_variable-1.2 60# Desc: Create non-existent variable 61 62mi_gdb_test "112-var-create bogus_unknown_variable * bogus_unknown_variable" \ 63 "112\\^error,msg=\"-var-create: unable to create variable object\"" \ 64 "create non-existent variable" 65 66# Test: c_variable-1.3 67# Desc: Create out of scope variable 68 69mi_gdb_test "113-var-create argc * argc" \ 70 "113\\^error,msg=\"-var-create: unable to create variable object\"" \ 71 "create out of scope variable" 72 73with_test_prefix "first run" { 74 mi_runto do_locals_tests 75} 76 77set line_dlt_first_real [gdb_get_line_number "linteger = 1234;"] 78 79mi_continue_to_line $line_dlt_first_real "step to real start of do_locals_test" 80 81 82# Test: c_variable-1.4 83# Desc: create local variables 84 85mi_create_varobj_checked linteger linteger int "create local variable linteger" 86 87mi_create_varobj_checked lpinteger lpinteger {int \*} "create local variable lpinteger" 88 89mi_create_varobj_checked lcharacter lcharacter\[0\] char "create local variable lcharacter" 90 91mi_create_varobj_checked lpcharacter lpcharacter {char \*} "create local variable lpcharacter" 92 93mi_create_varobj_checked llong llong "long" "create local variable llong" 94 95mi_create_varobj_checked lplong lplong {long \*} "create local variable lplong" 96 97mi_create_varobj_checked lfloat lfloat float "create local variable lfloat" 98 99mi_create_varobj_checked lpfloat lpfloat {float \*} "create local variable lpfloat" 100 101mi_create_varobj_checked ldouble ldouble double "create local variable ldouble" 102 103mi_create_varobj_checked lpdouble lpdouble {double \*} "create local variable lpdouble" 104 105mi_create_varobj_checked lsimple lsimple "struct _simple_struct" "create local variable lsimple" 106 107mi_create_varobj_checked lpsimple lpsimple {struct _simple_struct \*} "create local variable lpsimple" 108 109mi_create_varobj_checked func func {void \(\*\)\((void|)\)} "create local variable func" 110 111# Test: c_variable-1.5 112# Desc: create lsimple.character 113mi_create_varobj_checked lsimple.character lsimple.character "char" \ 114 "create lsimple.character" 115 116# Test: c_variable-1.6 117# Desc: create lpsimple->integer 118mi_create_varobj_checked lsimple->integer lsimple->integer "int" \ 119 "create lsimple->integer" 120 121# Test: c_variable-1.7 122# Desc: create lsimple.integer 123mi_create_varobj_checked lsimple.integer lsimple.integer "int" \ 124 "create lsimple.integer" 125 126 127# Test: c_variable-1.9 128# Desc: create type name 129# Type names (like int, long, etc..) are all proper expressions to gdb. 130# make sure variable code does not allow users to create variables, though. 131mi_gdb_test "-var-create int * int" \ 132 "&\"Attempt to use a type name as an expression.\\\\n\".*\\^error,msg=\"-var-create: unable to create variable object\"" \ 133 "create int" 134 135 136##### ##### 137# # 138# Value changed tests # 139# # 140##### ##### 141 142# Test: c_variable-2.1 143# Desc: check whether values changed at do_block_tests 144mi_gdb_test "-var-update *" \ 145 "\\^done,changelist=\\\[\\\]" \ 146 "update all vars" 147 148# Step over "linteger = 1234;" 149set line_dlt_linteger [gdb_get_line_number "lpinteger = &linteger;"] 150mi_step_to "do_locals_tests" "" "var-cmd.c" $line_dlt_linteger "step at do_locals_test" 151 152# Test: c_variable-2.2 153# Desc: check whether only linteger changed values 154mi_gdb_test "-var-update *" \ 155 "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 156 "update all vars: linteger changed" 157 158# Step over "lpinteger = &linteger;" 159mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 1] "step at do_locals_tests (2)" 160 161# Test: c_variable-2.3 162# Desc: check whether only lpinteger changed 163mi_gdb_test "-var-update *" \ 164 "\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 165 "update all vars: lpinteger changed" 166 167# Step over "lcharacter = 'a';" 168mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 2] "step at do_locals_tests (3)" 169 170# Test: c_variable-2.4 171# Desc: check whether only lcharacter changed 172mi_gdb_test "-var-update *" \ 173 "\\^done,changelist=\\\[\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 174 "update all vars: lcharacter changed" 175 176# Step over "lpcharacter = &lcharacter;" 177mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 3] "step at do_locals_tests (4)" 178 179# Test: c_variable-2.5 180# Desc: check whether only lpcharacter changed 181mi_gdb_test "-var-update *" \ 182 "\\^done,changelist=\\\[\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 183 "update all vars: lpcharacter changed" 184 185 186# Step over: 187# llong = 2121L; 188# lplong = &llong; 189# lfloat = 2.1; 190# lpfloat = &lfloat; 191# ldouble = 2.718281828459045; 192# lpdouble = &ldouble; 193# lsimple.integer = 1234; 194# lsimple.unsigned_integer = 255; 195# lsimple.character = 'a'; 196 197mi_execute_to "exec-step 9" "end-stepping-range" "do_locals_tests" "" \ 198 "var-cmd.c" [expr $line_dlt_linteger + 12] "" "step at do_locals_tests (5)" 199 200# Test: c_variable-2.6 201# Desc: check whether llong, lplong, lfloat, lpfloat, ldouble, lpdouble, lsimple.integer, 202# lsimple.unsigned_character lsimple.integer lsimple.character changed 203mi_gdb_test "-var-update *" \ 204 "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpdouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lplong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 205 "update all vars: many changed" 206 207# Step over: 208# lsimple.signed_character = 21; 209# lsimple.char_ptr = &lcharacter; 210# lpsimple = &lsimple; 211# func = nothing; 212 213set line_dlt_4321 [gdb_get_line_number "linteger = 4321;"] 214 215mi_execute_to "exec-step 4" "end-stepping-range" "do_locals_tests" "" \ 216 "var-cmd.c" $line_dlt_4321 "" "step at do_locals_tests (6)" 217 218# Test: c_variable-2.7 219# Desc: check whether (lsimple.signed_character, lsimple.char_ptr) lpsimple, func changed 220mi_gdb_test "-var-update *" \ 221 "\\^done,changelist=\\\[\{name=\"func\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpsimple\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 222 "update all vars: func and lpsimple changed" 223 224# Step over 225# linteger = 4321; 226# lcharacter = 'b'; 227# llong = 1212L; 228# lfloat = 1.2; 229# ldouble = 5.498548281828172; 230# lsimple.integer = 255; 231# lsimple.unsigned_integer = 4321; 232# lsimple.character = 'b'; 233 234mi_execute_to "exec-step 8" "end-stepping-range" "do_locals_tests" "" \ 235 "var-cmd.c" [expr $line_dlt_4321 + 8] "" "step at do_locals_tests (7)" 236 237# Test: c_variable-2.8 238# Desc: check whether linteger, lcharacter, llong, lfoat, ldouble, lsimple.integer, 239# lpsimple.integer lsimple.character changed 240# Note: this test also checks that lpsimple->integer and lsimple.integer have 241# changed (they are the same) 242mi_gdb_test "-var-update *" \ 243 "\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 244 "update all vars: lsimple and others changed" 245 246 247### 248# 249# Test assignment to variables. More tests on assignment are in other files. 250# 251### 252mi_gdb_test "-var-assign global_simple 0" \ 253 "\\^error,msg=\"-var-assign: Variable object is not editable\"" \ 254 "assign to global_simple" 255 256mi_gdb_test "-var-assign linteger 3333" \ 257 "\\^done,value=\"3333\"" \ 258 "assign to linteger, 1st" 259 260# Allow lpcharacter to update, optionally. Because it points to a 261# char variable instead of a zero-terminated string, if linteger is 262# directly after it in memory the printed characters may appear to 263# change. 264set lpchar_update "\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\}," 265mi_gdb_test "-var-update *" \ 266 "\\^done,changelist=\\\[($lpchar_update)?\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 267 "update all vars: linteger changed after assign" 268 269mi_gdb_test "-var-assign linteger 3333" \ 270 "\\^done,value=\"3333\"" \ 271 "assign to linteger again, same value" 272 273mi_gdb_test "-var-update *" \ 274 "\\^done,changelist=\\\[\\\]" \ 275 "update all vars: linteger not changed after same assign" 276 277mi_gdb_test "-var-evaluate-expression linteger" \ 278 "\\^done,value=\"3333\"" \ 279 "eval linteger" 280 281mi_gdb_test "-var-assign lpinteger \"&linteger + 3\"" \ 282 "\\^done,value=\"$hex\"" \ 283 "assign to lpinteger, 1st" 284 285mi_gdb_test "-var-update *" \ 286 "\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 287 "update all vars: lpinteger changed after assign" 288 289mi_gdb_test "-var-update *" \ 290 "\\^done,changelist=\\\[\\\]" \ 291 "update all vars: no changes on second update" 292 293mi_gdb_test "-var-evaluate-expression lpinteger" \ 294 "\\^done,value=\"$hex\"" \ 295 "eval lpinteger" 296 297# reset the values to the original ones so that the rest of the file doesn't suffer. 298 299mi_gdb_test "-var-assign linteger 4321" \ 300 "\\^done,value=\"4321\"" \ 301 "assign to linteger, 2nd" 302 303mi_gdb_test "-var-assign lpinteger &linteger" \ 304 "\\^done,value=\"$hex\"" \ 305 "assign to lpinteger, 2nd" 306 307mi_gdb_test "-var-assign lcharacter 'z'" \ 308 "\\^done,value=\"122 'z'\"" \ 309 "assign to lcharacter" 310 311mi_gdb_test "-var-evaluate-expression lcharacter" \ 312 "\\^done,value=\"122 'z'\"" \ 313 "eval lcharacter" 314 315mi_gdb_test "-var-assign llong 1313L" \ 316 "\\^done,value=\"1313\"" \ 317 "assign to llong, 1st" 318mi_gdb_test "-var-evaluate-expression llong" \ 319 "\\^done,value=\"1313\"" \ 320 "eval llong" 321mi_gdb_test "-var-assign llong 1212L" \ 322 "\\^done,value=\"1212\"" \ 323 "assign to llong, 2nd" 324 325mi_gdb_test "-var-assign lplong &llong+4" \ 326 "\\^done,value=\"$hex\"" \ 327 "assign to lplong, 1st" 328mi_gdb_test "-var-evaluate-expression lplong" \ 329 "\\^done,value=\"$hex\"" \ 330 "eval lplong" 331mi_gdb_test "-var-assign lplong &llong" \ 332 "\\^done,value=\"$hex\"" \ 333 "assign to lplong, 2nd" 334 335mi_gdb_test "-var-assign lfloat 3.4567" \ 336 "\\^done,value=\"3.45.*\"" \ 337 "assign to lfloat, 1st" 338mi_gdb_test "-var-evaluate-expression lfloat" \ 339 "\\^done,value=\"3.45.*\"" \ 340 "eval lfloat" 341mi_gdb_test "-var-assign lfloat 1.2345" \ 342 "\\^done,value=\"1.23.*\"" \ 343 "assign to lfloat, 2nd" 344 345mi_gdb_test "-var-assign lpfloat &lfloat+4" \ 346 "\\^done,value=\"$hex\"" \ 347 "assign to lpfloat" 348 349mi_gdb_test "-var-assign ldouble 5.333318284590435" \ 350 "\\^done,value=\"5.333318284590435\"" \ 351 "assign to ldouble" 352 353mi_gdb_test "-var-assign func do_block_tests" \ 354 "\\^done,value=\"$hex <do_block_tests>\"" \ 355 "assign to func" 356 357mi_gdb_test "-var-assign lsimple.character 'd'" \ 358 "\\^done,value=\"100 'd'\"" \ 359 "assign to lsimple.character" 360 361mi_gdb_test "-var-assign lsimple->integer 222" \ 362 "\\^done,value=\"222\"" \ 363 "assign to lsimple->integer" 364 365mi_gdb_test "-var-assign lsimple.integer 333" \ 366 "\\^done,value=\"333\"" \ 367 "assign to lsimple.integer" 368 369mi_gdb_test "-var-update *" \ 370 "\\^done,changelist=.*" \ 371 "var update" 372 373# Check that assignment of function and array values 374# promotes the assigned value to function pointer/data 375# pointer before comparing with the existing value, 376# and does not incorrectly make the value as changed. 377mi_gdb_test "-var-assign func do_block_tests" \ 378 "\\^done,value=\"$hex <do_block_tests>\"" \ 379 "assign same value to func" 380 381mi_gdb_test "-var-update *" \ 382 "\\^done,changelist=\\\[\\\]" \ 383 "assign same value to func (update)" 384 385mi_gdb_test "-var-create array_ptr * array_ptr" \ 386 "\\^done,name=\"array_ptr\",numchild=\"1\",value=\"$hex <array>\",type=\"int \\*\",has_more=\"0\"" \ 387 "create global variable array_ptr" 388 389mi_gdb_test "-var-assign array_ptr array2" \ 390 "\\^done,value=\"$hex <array2>\"" \ 391 "assign array to pointer" 392 393mi_gdb_test "-var-update *" \ 394 "\\^done,changelist=\\\[\{name=\"array_ptr\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 395 "assign array to pointer (update)" 396 397mi_gdb_test "-var-assign array_ptr array2" \ 398 "\\^done,value=\"$hex <array2>\"" \ 399 "assign same array to pointer" 400 401mi_gdb_test "-var-update *" \ 402 "\\^done,changelist=\\\[\\\]" \ 403 "assign same array to pointer (update)" 404 405 406###### 407# End of assign tests 408##### 409 410set line_subroutine1_body [gdb_get_line_number "global_simple.integer = i + 3;"] 411 412mi_continue_to subroutine1 413 414# Test: c_variable-2.10 415# Desc: create variable for locals i,l in subroutine1 416mi_create_varobj_checked i i int "create i" 417 418mi_create_varobj_checked l l {long \*} "create l" 419 420# Test: c_variable-2.11 421# Desc: create do_locals_tests local in subroutine1 422mi_gdb_test "-var-create linteger * linteger" \ 423 "\\^error,msg=\"-var-create: unable to create variable object\"" \ 424 "create linteger" 425 426mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \ 427 "var-cmd.c" [expr $line_subroutine1_body + 1] "step at subroutine1" 428 429# Test: c_variable-2.12 430# Desc: change global_simple.integer 431# Note: This also tests whether we are reporting changes in structs properly. 432# gdb normally would say that global_simple has changed, but we 433# special case that, since it is not what a human expects to 434# see. 435 436setup_xfail *-*-* 437mi_gdb_test "-var-update *" \ 438 "\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \ 439 "update all vars: changed FIXME" 440clear_xfail *-*-* 441 442mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \ 443 "var-cmd.c" [expr $line_subroutine1_body + 2] "step at subroutine1 (2)" 444 445# Test: c_variable-2.13 446# Desc: change subroutine1 local i 447mi_gdb_test "-var-update *" \ 448 "\\^done,changelist=\\\[\{name=\"i\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 449 "update all vars: i changed" 450 451mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \ 452 "var-cmd.c" [expr $line_subroutine1_body + 3] "step at subroutine1 (3)" 453 454# Test: c_variable-2.14 455# Desc: change do_locals_tests local llong 456mi_gdb_test "-var-update *" \ 457 "\\^done,changelist=\\\[\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 458 "update all vars: llong changed" 459 460set line_dlt_call_subroutine1 [gdb_get_line_number "subroutine1 (linteger, &llong);"] 461mi_next_to "do_locals_tests" "" "var-cmd.c" \ 462 [expr $line_dlt_call_subroutine1 + 1] "next out of subroutine1" 463 464# Test: c_variable-2.15 465# Desc: check for out of scope subroutine1 locals 466mi_gdb_test "-var-update *" \ 467 "\\^done,changelist=\\\[\{name=\"l\",in_scope=\"false\"\,type_changed=\"false\",has_more=\"0\"},\{name=\"i\",in_scope=\"false\",type_changed=\"false\",has_more=\"0\"\}\\\]" \ 468 "update all vars: all now out of scope" 469 470# Done with locals/globals tests. Erase all variables 471#delete_all_variables 472mi_gdb_test "-var-delete global_simple" \ 473 "\\^done,ndeleted=\"1\"" \ 474 "delete var" 475 476mi_gdb_test "-var-delete linteger" \ 477 "\\^done,ndeleted=\"1\"" \ 478 "delete var linteger" 479 480mi_gdb_test "-var-delete lpinteger" \ 481 "\\^done,ndeleted=\"1\"" \ 482 "delete var lpinteger" 483 484mi_gdb_test "-var-delete lcharacter" \ 485 "\\^done,ndeleted=\"1\"" \ 486 "delete var lcharacter" 487 488mi_gdb_test "-var-delete lpcharacter" \ 489 "\\^done,ndeleted=\"1\"" \ 490 "delete var lpcharacter" 491 492mi_gdb_test "-var-delete llong" \ 493 "\\^done,ndeleted=\"1\"" \ 494 "delete var llong" 495 496mi_gdb_test "-var-delete lplong" \ 497 "\\^done,ndeleted=\"1\"" \ 498 "delete var lplong" 499 500mi_gdb_test "-var-delete lfloat" \ 501 "\\^done,ndeleted=\"1\"" \ 502 "delete var lfloat" 503 504mi_gdb_test "-var-delete lpfloat" \ 505 "\\^done,ndeleted=\"1\"" \ 506 "delete var lpfloat" 507 508mi_gdb_test "-var-delete ldouble" \ 509 "\\^done,ndeleted=\"1\"" \ 510 "delete var ldouble" 511 512mi_gdb_test "-var-delete lpdouble" \ 513 "\\^done,ndeleted=\"1\"" \ 514 "delete var lpdouble" 515 516mi_gdb_test "-var-delete lsimple" \ 517 "\\^done,ndeleted=\"1\"" \ 518 "delete var lsimple" 519 520mi_gdb_test "-var-delete lpsimple" \ 521 "\\^done,ndeleted=\"1\"" \ 522 "delete var lpsimple" 523 524mi_gdb_test "-var-delete func" \ 525 "\\^done,ndeleted=\"1\"" \ 526 "delete var func" 527 528mi_gdb_test "-var-delete lsimple.character" \ 529 "\\^done,ndeleted=\"1\"" \ 530 "delete var lsimple.character" 531 532mi_gdb_test "-var-delete lsimple->integer" \ 533 "\\^done,ndeleted=\"1\"" \ 534 "delete var lsimple->integer" 535 536mi_gdb_test "-var-delete lsimple.integer" \ 537 "\\^done,ndeleted=\"1\"" \ 538 "delete var lsimple.integer" 539 540mi_gdb_test "-var-delete i" \ 541 "\\^done,ndeleted=\"1\"" \ 542 "delete var i" 543 544mi_gdb_test "-var-delete l" \ 545 "\\^done,ndeleted=\"1\"" \ 546 "delete var l" 547 548# Test whether we can follow the name of a variable through multiple 549# stack frames. 550mi_continue_to do_special_tests 551 552mi_gdb_test "-var-create selected_a @ a" \ 553 {\^done,name="selected_a",numchild="0",value=\".*\",type="int".*} \ 554 "create selected_a" 555 556mi_continue_to incr_a 557 558mi_gdb_test "-var-update selected_a" \ 559 "\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"char\",new_num_children=\"0\",has_more=\"0\"\}\\\]" \ 560 "update selected_a in incr_a" 561 562mi_next "step a line in incr_a" 563mi_next "return from incr_a to do_special_tests" 564 565mi_gdb_test "-var-update selected_a" \ 566 "\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"int\",new_num_children=\"0\",has_more=\"0\"\}\\\]" \ 567 "update selected_a in do_special_tests" 568 569if [is_remote host] { 570 set filename ${testfile} 571} else { 572 set filename ${binfile} 573} 574 575mi_gdb_test "-file-exec-and-symbols ${filename}" "\\^done" \ 576 "floating varobj invalidation" 577 578mi_delete_varobj selected_a "delete selected_a" 579mi_delete_varobj array_ptr "delete array_ptr" 580 581proc set_frozen {varobjs flag} { 582 foreach v $varobjs { 583 mi_gdb_test "-var-set-frozen $v $flag" \ 584 "\\^done" \ 585 "-var-set-frozen $v $flag" 586 } 587} 588 589mi_prepare_inline_tests $srcfile 590mi_run_inline_test frozen 591 592mi_run_inline_test bitfield 593 594# Since the inline test framework does not really work with 595# function calls, first to inline tests and then do the reminder 596# manually. 597mi_run_inline_test floating 598set do_at_tests_callee_breakpoint [gdb_get_line_number "breakpoint inside callee"] 599mi_gdb_test "-break-insert var-cmd.c:$do_at_tests_callee_breakpoint" ".*" \ 600 "inside breakpoint inside callee" 601mi_execute_to "exec-continue" "breakpoint-hit" do_at_tests_callee "" ".*" ".*" \ 602 { "" "disp=\"keep\"" } \ 603 "continue to where i is initialized" 604 605mi_varobj_update F {F} "update F inside callee" 606mi_check_varobj_value F 7 "check F inside callee" 607 608# Test whether bad varobjs crash GDB. 609 610# A varobj we fail to read during -var-update should be considered 611# out of scope. 612mi_gdb_test "-var-create null_ptr * **0" \ 613 {\^done,name="null_ptr",numchild="0",value=".*",type="int",has_more="0"} \ 614 "create null_ptr" 615 616# Allow this to succeed, if address zero is readable, although it 617# will not test what it was meant to. Most important is that GDB 618# does not crash. 619mi_gdb_test "-var-update null_ptr" \ 620 {\^done,changelist=\[.*\]} \ 621 "update null_ptr" 622 623mi_gdb_test "-var-delete null_ptr" \ 624 "\\^done,ndeleted=\"1\"" \ 625 "delete null_ptr" 626 627# When we fail to read a varobj created from a named variable, 628# we evaluate its type instead. Make sure that doesn't blow 629# up by trying to read it again. We can use _end when not running 630# the program to simulate an unreadable variable, if this platform 631# provides _end, but cope if it's missing. 632 633mi_gdb_test "kill" \ 634 {&"kill\\n".*\^done} \ 635 "kill program before endvar" 636 637mi_gdb_test "-var-create endvar * _end" \ 638 {(\^done,name="endvar",numchild="0",value=".*",type=".*"|\^error,msg=".*")} \ 639 "create endvar" 640 641# Allow this to succeed whether the value is readable, unreadable, or 642# missing. Most important is that GDB does not crash. 643mi_gdb_test "-var-update endvar" \ 644 {(\^done,changelist=\[.*\]|\^error,msg=".*not found")} \ 645 "update endvar" 646 647mi_gdb_test "-var-delete endvar" \ 648 {(\^done,ndeleted="1"|\^error,msg=".*not found")} \ 649 "delete endvar" 650 651mi_delete_breakpoints 652 653with_test_prefix "second run" { 654 mi_runto do_locals_tests 655} 656 657mi_create_varobj "L" "lsimple" "in-and-out-of-scope: create varobj" 658mi_check_varobj_value "L" "{...}" "in-and-out-of-scope: check initial value" 659 660mi_runto main 661 662mi_gdb_test "-var-update L" \ 663 {\^done,changelist=\[{name="L",in_scope="false",type_changed="false",has_more="0"}\]} \ 664 "in-and-out-of-scope: out of scope now" 665 666mi_gdb_test "-var-update L" \ 667 {\^done,changelist=\[]} \ 668 "in-and-out-of-scope: out of scope now, not changed" 669 670mi_continue_to do_locals_tests 671 672mi_gdb_test "-var-update L" \ 673 {\^done,changelist=\[{name="L",in_scope="true",type_changed="false",has_more="0"}\]} \ 674 "in-and-out-of-scope: in scope now" 675 676mi_gdb_test "-var-update L" \ 677 {\^done,changelist=\[\]} \ 678 "in-and-out-of-scope: in scope now, not changed" 679 680mi_gdb_exit 681return 0 682