From e1d67cd7575338e248d249995e319d4406bfc03b Mon Sep 17 00:00:00 2001 From: drow Date: Tue, 20 Jan 2009 15:33:09 +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 | 21 +++++++++++++++++++- gdb/testsuite/gdb.base/interrupt.exp | 38 ++++++++++++++++++++++++++++++++++-- 5 files changed, 71 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 120697b77e..80b906099e 100644 --- a/gdb/testsuite/gdb.base/interrupt.c +++ b/gdb/testsuite/gdb.base/interrupt.c @@ -1,5 +1,17 @@ #include #include +#include +#include + +#ifdef SIGNALS +#include + +static void +sigint_handler (int signo) +{ +} +#endif + int main () { @@ -9,6 +21,9 @@ main () set_debug_traps(); breakpoint(); #endif +#ifdef SIGNALS + signal (SIGINT, sigint_handler); +#endif printf ("talk to me baby\n"); while (1) { @@ -18,7 +33,10 @@ main () #ifdef EINTR if (errno != EINTR) #endif - perror (""); + { + perror (""); + return 1; + } } else if (nbytes == 0) { @@ -28,6 +46,7 @@ main () else write (1, &x, 1); } + return 0; } int 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.11.0