diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-09-24 18:35:28 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-09-24 18:35:28 +0000 |
commit | 1736ad1102dd931b269a5b900f05846442a0566a (patch) | |
tree | e3131e752934a3c0b54286a6c79537917ea697d7 /gdb/testsuite | |
parent | 4b5246aacb9c434034c9b0dc83bef1239aa55451 (diff) | |
download | gdb-1736ad1102dd931b269a5b900f05846442a0566a.zip gdb-1736ad1102dd931b269a5b900f05846442a0566a.tar.gz gdb-1736ad1102dd931b269a5b900f05846442a0566a.tar.bz2 |
gdb/
Fix lost siginfo_t for inferior calls.
* infrun.c
(struct inferior_thread_state) <siginfo_gdbarch, siginfo_data>: New.
(save_inferior_thread_state): New variables regcache, gdbarch and
siginfo_data. Initialize SIGINFO_DATA if gdbarch_get_siginfo_type_p.
Move INF_STATE allocation later, pre-clear it. Initialize REGISTERS
using REGCACHE.
(restore_inferior_thread_state): New variables regcache and gdbarch.
Restore SIGINFO_DATA for matching GDBARCH. Restore REGISTERS using
REGCACHE. Free also SIGINFO_DATA.
gdb/testsuite/
Fix lost siginfo_t for inferior calls.
* gdb.base/siginfo-infcall.exp: New file.
* gdb.base/siginfo-infcall.c: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/siginfo-infcall.c | 79 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/siginfo-infcall.exp | 47 |
3 files changed, 132 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d2ec668..3ae8411 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-09-24 Jan Kratochvil <jan.kratochvil@redhat.com> + + Fix lost siginfo_t for inferior calls. + * gdb.base/siginfo-infcall.exp: New file. + * gdb.base/siginfo-infcall.c: New file. + 2010-09-22 Joel Brobecker <brobecker@adacore.com> * gdb.dwarf2/dw2-const.S: Minor (space) reformatting. diff --git a/gdb/testsuite/gdb.base/siginfo-infcall.c b/gdb/testsuite/gdb.base/siginfo-infcall.c new file mode 100644 index 0000000..4215725 --- /dev/null +++ b/gdb/testsuite/gdb.base/siginfo-infcall.c @@ -0,0 +1,79 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2010 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/>. */ + +#include <signal.h> +#include <assert.h> +#include <string.h> +#include <unistd.h> + +#ifndef SA_SIGINFO +# error "SA_SIGINFO is required for this test" +#endif + +static int +callme (void) +{ + return 42; +} + +static int +pass (void) +{ + return 1; +} + +static int +fail (void) +{ + return 1; +} + +static void +handler (int sig, siginfo_t *siginfo, void *context) +{ + assert (sig == SIGUSR1); + assert (siginfo->si_signo == SIGUSR1); + if (siginfo->si_pid == getpid ()) + pass (); + else + fail (); +} + +int +main (void) +{ + struct sigaction sa; + int i; + + callme (); + + memset (&sa, 0, sizeof (sa)); + sa.sa_sigaction = handler; + sa.sa_flags = SA_SIGINFO; + + i = sigemptyset (&sa.sa_mask); + assert (i == 0); + + i = sigaction (SIGUSR1, &sa, NULL); + assert (i == 0); + + i = raise (SIGUSR1); + assert (i == 0); + + sleep (600); + return 0; +} diff --git a/gdb/testsuite/gdb.base/siginfo-infcall.exp b/gdb/testsuite/gdb.base/siginfo-infcall.exp new file mode 100644 index 0000000..a229345 --- /dev/null +++ b/gdb/testsuite/gdb.base/siginfo-infcall.exp @@ -0,0 +1,47 @@ +# Copyright 2010 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/>. + +if [target_info exists gdb,nosignals] { + verbose "Skipping siginfo-infcall.exp because of nosignals." + continue +} + +set testfile siginfo-infcall +set srcfile ${testfile}.c +set executable ${testfile} +if { [prepare_for_testing ${testfile}.exp $executable] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_breakpoint "pass" +gdb_breakpoint "fail" + +gdb_test "continue" "Program received signal SIGUSR1, .*" "continue to SIGUSR1" + +gdb_test "p callme ()" " = 42" + +set test "continue to the handler" +gdb_test_multiple "continue" $test { + -re "Breakpoint \[0-9\]+,\[^\r\n\]* pass .*\r\n$gdb_prompt $" { + pass $test + } + -re "Breakpoint \[0-9\]+,\[^\r\n\]* fail .*\r\n$gdb_prompt $" { + fail $test + } +} |