| # Copyright 2016-2021 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's (or gdbserver's) own signal handling does not |
| # interfere with the signal actions (dispositions, etc.) and mask |
| # their spawned children inherit. |
| # |
| # - If gdb inherits some signal set to SIG_IGN, so should the |
| # inferior, even if gdb itself chooses not to ignore the signal. |
| # |
| # - If gdb inherits some signal set to SIG_DFL, so should the inferior |
| # even if gdb itself ignores that signal. |
| # |
| # This requires special support in gdb/gdbserver because the exec |
| # family of functions does not reset the signal disposition of signals |
| # that are set to SIG_IGN, nor signal masks and flags. |
| |
| standard_testfile |
| |
| if {![is_remote host] && ![is_remote target]} { |
| set gdb_txt [standard_output_file gdb.txt] |
| set standalone_txt [standard_output_file standalone.txt] |
| set purely_local 1 |
| } else { |
| set gdb_txt gdb.txt |
| set standalone_txt standalone.txt |
| set purely_local 0 |
| } |
| |
| remote_file host delete $gdb_txt |
| remote_file host delete $standalone_txt |
| remote_file target delete $gdb_txt |
| remote_file target delete $standalone_txt |
| |
| set options [list debug "additional_flags=-DOUTPUT_TXT=\"$gdb_txt\""] |
| if {[build_executable $testfile.exp $testfile $srcfile $options]} { |
| untested "failed to compile" |
| return -1 |
| } |
| |
| set options [list debug "additional_flags=-DOUTPUT_TXT=\"$standalone_txt\""] |
| if {[build_executable $testfile.exp $testfile-standalone $srcfile $options]} { |
| untested "failed to compile" |
| return -1 |
| } |
| |
| # Run the program directly, and dump its initial signal actions and |
| # mask in "standalone.txt". |
| |
| # Use remote_spawn instead of remote_exec, like how we spawn gdb. |
| # This is in order to take the same code code paths in dejagnu |
| # compared to when running the program through gdb. E.g., because |
| # local_exec uses -ignore SIGHUP, while remote_spawn does not, if we |
| # used remote_exec, the test program would start with SIGHUP ignored |
| # when run standalone, but not when run through gdb. |
| set res [remote_spawn target "$binfile-standalone"] |
| if { $res < 0 || $res == "" } { |
| untested "spawning $binfile-standalone failed" |
| return 1 |
| } else { |
| pass "collect standalone signals state" |
| } |
| remote_close target |
| |
| # Now run the program through gdb, and dump its initial signal actions |
| # and mask in "gdb.txt". |
| |
| clean_restart $binfile |
| |
| if { ! [ runto_main ] } then { |
| return -1 |
| } |
| |
| gdb_continue_to_end "collect signals state under gdb" |
| |
| if {!$purely_local} { |
| # Copy file from target to host through build. |
| remote_download host [remote_upload target gdb.txt] gdb.txt |
| remote_download host [remote_upload target standalone.txt] standalone.txt |
| } |
| |
| # Diff the .txt files. They should be identical. |
| gdb_test "shell diff -s $standalone_txt $gdb_txt" \ |
| "Files .* are identical.*" \ |
| "signals states are identical" |