# Copyright 2007-2023 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Test essential Machine interface (MI) operations # # Verify that once binary file has changed, GDB correctly handles # previously defined MI variables. # load_lib mi-support.exp set MIFLAGS "-i=mi" standard_testfile var-cmd.c if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { untested "failed to compile" return -1 } # Just change the output binary. set binfile_bis [standard_output_file mi-var-invalidate_bis] if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile_bis}" executable {debug}] != "" } { untested "failed to compile" return -1 } set testfile2 "basics" set srcfile2 ${testfile2}.c set binfile2 [standard_output_file ${testfile2}] if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${binfile2}" executable {debug}] != "" } { untested "failed to compile" return -1 } if {[mi_clean_restart $binfile]} { return } # Desc: Create global variable. mi_create_varobj global_simple global_simple "create global variable" mi_runto do_locals_tests # Desc: create local variables mi_create_varobj linteger linteger "create local variable linteger" # Desc: create floating variable mi_create_floating_varobj float_simple array "create floating variable" # # Reload the same binary. # Global variable should remain, local should be invalidated. # mi_delete_breakpoints mi_gdb_load ${binfile_bis} mi_runto_main # Change format of floating variable immediately after reload reveals a # bug where gdb still uses a free'd pointer. mi_gdb_test "-var-set-format float_simple hexadecimal" \ "\\^done,format=\"hexadecimal\",value=\"\\\[3\\\]\"" \ "set format variable float_simple" # Check local variable is "invalid". mi_gdb_test "-var-update linteger" \ "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"invalid\",has_more=\"0\"\}\\\]" \ "linteger not anymore in scope due to binary changes" mi_gdb_test "-var-info-type linteger" \ "\\^done,type=\"\"" \ "no type for invalid variable linteger (1)" # Check global variable is still correct. mi_gdb_test "-var-update global_simple" \ "\\^done,changelist=\\\[\]" \ "global_simple still alive" mi_gdb_test "-var-info-type global_simple" \ "\\^done,type=\"simpleton\"" \ "type simpleton for valid variable global_simple" # # Load an other binary. # All variables must be invalidated. # mi_delete_breakpoints mi_gdb_load ${binfile2} # Check local variable are "invalid" mi_gdb_test "-var-update linteger" \ "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"invalid\",has_more=\"0\"\}\\\]" \ "linteger not valid anymore due to binary changes" mi_gdb_test "-var-info-type linteger" \ "\\^done,type=\"\"" \ "no type for invalid variable linteger (2)" # Check global variable are still correct. mi_gdb_test "-var-update global_simple" \ "\\^done,changelist=\\\[\{name=\"global_simple\",in_scope=\"invalid\",has_more=\"0\"\}\\\]" \ "global_simple not anymore in scope due to binary changes" mi_gdb_test "-var-info-type global_simple" \ "\\^done,type=\"\"" \ "no type for invalid variable global_simple" mi_gdb_exit