aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2010-09-24 18:35:28 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2010-09-24 18:35:28 +0000
commit1736ad1102dd931b269a5b900f05846442a0566a (patch)
treee3131e752934a3c0b54286a6c79537917ea697d7 /gdb/testsuite
parent4b5246aacb9c434034c9b0dc83bef1239aa55451 (diff)
downloadgdb-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/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.base/siginfo-infcall.c79
-rw-r--r--gdb/testsuite/gdb.base/siginfo-infcall.exp47
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
+ }
+}