From a12cc160ab21c29ef00ab4e2377e01ae85b9de35 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 20 Jan 2009 15:33:14 +0000 Subject: [PATCH] PR gdb/9346 * infcmd.c (signal_command): Do not specify a resume PC. testsuite/ PR gdb/9346 * gdb.base/interrupt.c (sigint_handler): New. (main): Install a SIGINT handler if SIGNALS is defined. Exit on error. * gdb.base/interrupt.exp: Define SIGNALS unless gdb,nosignals. Test "signal SIGINT". --- gdb/ChangeLog | 5 ++++ gdb/infcmd.c | 6 +---- gdb/testsuite/ChangeLog | 9 +++++++ gdb/testsuite/gdb.base/interrupt.c | 18 ++++++++++++- gdb/testsuite/gdb.base/interrupt.exp | 38 ++++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 03c1159def..a474390340 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-01-20 Daniel Jacobowitz + + PR gdb/9346 + * infcmd.c (signal_command): Do not specify a resume PC. + 2009-01-19 Doug Evans * dummy-frame.c (dummy_frame): Replace regcache member with diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 2cd583cdb8..3696f79b76 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1145,11 +1145,7 @@ signal_command (char *signum_exp, int from_tty) } clear_proceed_status (); - /* "signal 0" should not get stuck if we are stopped at a breakpoint. - FIXME: Neither should "signal foo" but when I tried passing - (CORE_ADDR)-1 unconditionally I got a testsuite failure which I haven't - tried to track down yet. */ - proceed (oursig == TARGET_SIGNAL_0 ? (CORE_ADDR) -1 : stop_pc, oursig, 0); + proceed ((CORE_ADDR) -1, oursig, 0); } /* Proceed until we reach a different source line with pc greater than diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 052c500dc6..2eb1ee078f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2009-01-20 Daniel Jacobowitz + + PR gdb/9346 + * gdb.base/interrupt.c (sigint_handler): New. + (main): Install a SIGINT handler if SIGNALS is defined. Exit + on error. + * gdb.base/interrupt.exp: Define SIGNALS unless gdb,nosignals. + Test "signal SIGINT". + 2009-01-19 Doug Evans * gdb.base/break.exp: Update expected gdb output. diff --git a/gdb/testsuite/gdb.base/interrupt.c b/gdb/testsuite/gdb.base/interrupt.c index a895d4b7d8..80b906099e 100644 --- a/gdb/testsuite/gdb.base/interrupt.c +++ b/gdb/testsuite/gdb.base/interrupt.c @@ -2,6 +2,16 @@ #include #include #include + +#ifdef SIGNALS +#include + +static void +sigint_handler (int signo) +{ +} +#endif + int main () { @@ -10,6 +20,9 @@ main () #ifdef usestubs set_debug_traps(); breakpoint(); +#endif +#ifdef SIGNALS + signal (SIGINT, sigint_handler); #endif printf ("talk to me baby\n"); while (1) @@ -20,7 +33,10 @@ main () #ifdef EINTR if (errno != EINTR) #endif - perror (""); + { + perror (""); + return 1; + } } else if (nbytes == 0) { diff --git a/gdb/testsuite/gdb.base/interrupt.exp b/gdb/testsuite/gdb.base/interrupt.exp index 037902b721..beee0cf6b0 100644 --- a/gdb/testsuite/gdb.base/interrupt.exp +++ b/gdb/testsuite/gdb.base/interrupt.exp @@ -34,7 +34,13 @@ set bug_id 0 set testfile interrupt set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + +set options { debug } +if { ! [target_info exists gdb,nosignals] } { + lappend options "additional_flags=-DSIGNALS" +} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options] != "" } { untested interrupt.exp return -1 } @@ -165,7 +171,35 @@ if ![file exists $binfile] then { eof { fail "echo data (eof)" } } - setup_xfail "i*86-pc-linux*-gnu*" + if { ! [target_info exists gdb,nosignals] } { + # Wait until the program is in the read system call again. + sleep 2 + + # Stop the program for another test. + set msg "Send Control-C, second time" + send_gdb "\003" + gdb_test_multiple "" "$msg" { + -re "Program received signal SIGINT.*$gdb_prompt $" { + pass "$msg" + } + } + + # The "signal" command should deliver the correct signal and + # return to the loop. + set msg "signal SIGINT" + gdb_test_multiple "signal SIGINT" "$msg" { + -re "^signal SIGINT\r\nContinuing with signal SIGINT.\r\n(\r\n|)$" { pass "$msg" } + } + + # We should be back in the loop. + send_gdb "more data\n" + gdb_expect { + -re "^(\r\n|)more data\r\n(|more data\r\n)$" { pass "echo more data" } + timeout { fail "echo more data (timeout)" } + eof { fail "echo more data (eof)" } + } + } + send_gdb "\004" gdb_expect { -re "end of file.*Program exited normally.*$gdb_prompt $" { -- 2.34.1