forked from Imagelibrary/binutils-gdb
This commit is the result of running the gdb/copyright.py script, which automated the update of the copyright year range for all source files managed by the GDB project to be updated to include year 2023.
106 lines
4.0 KiB
Plaintext
106 lines
4.0 KiB
Plaintext
# Copyright 1988-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 <http://www.gnu.org/licenses/>.
|
|
|
|
# Test that GDB saves and restores terminal settings correctly. Also check
|
|
# the output of the "info terminal" command.
|
|
|
|
if { [prepare_for_testing "failed to prepare" term term.c] } {
|
|
return -1
|
|
}
|
|
|
|
# Once before running the program.
|
|
gdb_test "info terminal" \
|
|
"No saved terminal information.*" \
|
|
"test info terminal pre-execution"
|
|
|
|
if {![runto break_here]} {
|
|
return 0
|
|
}
|
|
|
|
# Read the inferior's terminal settings, saved in the T global variable.
|
|
|
|
proc read_term_settings_from_inferior {} {
|
|
set termios(c_iflag) [get_hexadecimal_valueof "t.c_iflag" oops]
|
|
set termios(c_oflag) [get_hexadecimal_valueof "t.c_oflag" oops]
|
|
set termios(c_cflag) [get_hexadecimal_valueof "t.c_cflag" oops]
|
|
set termios(c_lflag) [get_hexadecimal_valueof "t.c_lflag" oops]
|
|
|
|
return [array get termios]
|
|
}
|
|
|
|
# Validate that gdb's notion of the inferior's terminal settings are consistent
|
|
# with the values read from the inferior.
|
|
|
|
proc compare_gdb_and_inferior_settings { t } {
|
|
global decimal
|
|
array set termios $t
|
|
|
|
gdb_test "info terminal" \
|
|
[multi_line "Inferior's terminal status .currently saved by GDB.:" \
|
|
"File descriptor flags = .*" \
|
|
"Process group = $decimal" \
|
|
"c_iflag = ${termios(c_iflag)}, c_oflag = ${termios(c_oflag)}," \
|
|
"c_cflag = ${termios(c_cflag)}, c_lflag = ${termios(c_lflag)}.*" ]
|
|
}
|
|
|
|
if {[target_info gdb_protocol] == ""} {
|
|
# Record the initial terminal settings. Verify that GDB's version of the
|
|
# inferior's terminal settings is right.
|
|
with_test_prefix "initial" {
|
|
array set termios1 [read_term_settings_from_inferior]
|
|
compare_gdb_and_inferior_settings [array get termios1]
|
|
}
|
|
|
|
# Continue until after the inferior removes ECHO from its terminal settings.
|
|
gdb_continue_to_breakpoint "continue until after tcsetattr"
|
|
|
|
# After the inferior has changed its terminal settings, check that GDB's
|
|
# saved version reflects the new settings correctly.
|
|
with_test_prefix "post tcsetattr" {
|
|
array set termios2 [read_term_settings_from_inferior]
|
|
compare_gdb_and_inferior_settings [array get termios2]
|
|
|
|
# Make sure that the current settings are different than the initial
|
|
# settings... otherwise this test is meaningless.
|
|
gdb_assert {${termios1(c_lflag)} != ${termios2(c_lflag)}}
|
|
}
|
|
|
|
# Continue again...
|
|
gdb_continue_to_breakpoint "continue again"
|
|
|
|
# ... and verify again, to validate that when resuming, GDB restored the
|
|
# inferior's terminal settings correctly.
|
|
with_test_prefix "after last resume" {
|
|
array set termios3 [read_term_settings_from_inferior]
|
|
compare_gdb_and_inferior_settings [array get termios3]
|
|
gdb_assert {${termios2(c_iflag)} == ${termios3(c_iflag)}}
|
|
gdb_assert {${termios2(c_oflag)} == ${termios3(c_oflag)}}
|
|
gdb_assert {${termios2(c_cflag)} == ${termios3(c_cflag)}}
|
|
gdb_assert {${termios2(c_lflag)} == ${termios3(c_lflag)}}
|
|
}
|
|
} else {
|
|
# While only native targets save terminal status, we still test
|
|
# that the command doesn't misbehave.
|
|
gdb_test "info terminal" "No saved terminal information\\." "info terminal at breakpoint"
|
|
}
|
|
|
|
delete_breakpoints
|
|
gdb_continue_to_end
|
|
|
|
# One last time after the program having exited.
|
|
gdb_test "info terminal" \
|
|
"No saved terminal information.*" \
|
|
"test info terminal post-execution"
|