- gdb-suppress-sigttou-when-handling-errors.patch: Suppress SIGTTOU when handling errors - Enable ada tests on ppc64le and riscv64 - Enable multitarget build on riscv64 - Add ia64 and riscv64 to target_list - Enable -Werror on riscv64 and aarch64 - Don't remove %{buildroot} OBS-URL: https://build.opensuse.org/request/show/707836 OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=207
174 lines
4.4 KiB
Diff
174 lines
4.4 KiB
Diff
From 766f883622ef008230250aa5aecef9fb9b29f233 Mon Sep 17 00:00:00 2001
|
|
From: Alan Hayward <alan.hayward@arm.com>
|
|
Date: Tue, 28 May 2019 10:07:54 +0100
|
|
Subject: [PATCH] Suppress SIGTTOU when handling errors
|
|
|
|
Calls to error () can cause SIGTTOU to send gdb to the background.
|
|
|
|
For example, on an Arm build:
|
|
(gdb) b main
|
|
Breakpoint 1 at 0x10774: file /build/gdb/testsuite/../../../src/binutils-gdb/gdb/testsuite/gdb.base/watchpoint.c, line 174.
|
|
(gdb) r
|
|
Starting program: /build/gdb/testsuite/outputs/gdb.base/watchpoint/watchpoint
|
|
|
|
[1]+ Stopped ../gdb ./outputs/gdb.base/watchpoint/watchpoint
|
|
localhost$ fg
|
|
../gdb ./outputs/gdb.base/watchpoint/watchpoint
|
|
Cannot parse expression `.L1199 4@r4'.
|
|
warning: Probes-based dynamic linker interface failed.
|
|
Reverting to original interface.
|
|
|
|
The SIGTTOU is raised whilst inside a syscall during the call to tcdrain.
|
|
Fix is to use scoped_ignore_sigttou to ensure SIGTTOU is blocked.
|
|
|
|
In addition fix include comments - job_control is not included via terminal.h
|
|
|
|
gdb/ChangeLog:
|
|
|
|
* event-top.c: Remove include comment.
|
|
* inflow.c (class scoped_ignore_sigttou): Move from here...
|
|
* inflow.h (class scoped_ignore_sigttou): ...to here.
|
|
* ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
|
|
* top.c: Remove include comment.
|
|
---
|
|
gdb/ChangeLog | 8 ++++++++
|
|
gdb/event-top.c | 2 +-
|
|
gdb/inflow.c | 29 -----------------------------
|
|
gdb/inflow.h | 31 +++++++++++++++++++++++++++++++
|
|
gdb/ser-unix.c | 4 ++++
|
|
gdb/top.c | 2 +-
|
|
6 files changed, 45 insertions(+), 31 deletions(-)
|
|
|
|
diff --git a/gdb/event-top.c b/gdb/event-top.c
|
|
index 3ccf136ff12..93b7d2d28bc 100644
|
|
--- a/gdb/event-top.c
|
|
+++ b/gdb/event-top.c
|
|
@@ -24,7 +24,7 @@
|
|
#include "inferior.h"
|
|
#include "infrun.h"
|
|
#include "target.h"
|
|
-#include "terminal.h" /* for job_control */
|
|
+#include "terminal.h"
|
|
#include "event-loop.h"
|
|
#include "event-top.h"
|
|
#include "interps.h"
|
|
diff --git a/gdb/inflow.c b/gdb/inflow.c
|
|
index 339b55c0bc6..eba7a931f46 100644
|
|
--- a/gdb/inflow.c
|
|
+++ b/gdb/inflow.c
|
|
@@ -106,35 +106,6 @@ static serial_ttystate initial_gdb_ttystate;
|
|
|
|
static struct terminal_info *get_inflow_inferior_data (struct inferior *);
|
|
|
|
-/* RAII class used to ignore SIGTTOU in a scope. */
|
|
-
|
|
-class scoped_ignore_sigttou
|
|
-{
|
|
-public:
|
|
- scoped_ignore_sigttou ()
|
|
- {
|
|
-#ifdef SIGTTOU
|
|
- if (job_control)
|
|
- m_osigttou = signal (SIGTTOU, SIG_IGN);
|
|
-#endif
|
|
- }
|
|
-
|
|
- ~scoped_ignore_sigttou ()
|
|
- {
|
|
-#ifdef SIGTTOU
|
|
- if (job_control)
|
|
- signal (SIGTTOU, m_osigttou);
|
|
-#endif
|
|
- }
|
|
-
|
|
- DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
|
-
|
|
-private:
|
|
-#ifdef SIGTTOU
|
|
- sighandler_t m_osigttou = NULL;
|
|
-#endif
|
|
-};
|
|
-
|
|
/* While the inferior is running, we want SIGINT and SIGQUIT to go to the
|
|
inferior only. If we have job control, that takes care of it. If not,
|
|
we save our handlers in these two variables and set SIGINT and SIGQUIT
|
|
diff --git a/gdb/inflow.h b/gdb/inflow.h
|
|
index c32aa144331..5dd5c37bd2b 100644
|
|
--- a/gdb/inflow.h
|
|
+++ b/gdb/inflow.h
|
|
@@ -21,5 +21,36 @@
|
|
#define INFLOW_H
|
|
|
|
#include <unistd.h>
|
|
+#include <signal.h>
|
|
+#include "common/job-control.h"
|
|
+
|
|
+/* RAII class used to ignore SIGTTOU in a scope. */
|
|
+
|
|
+class scoped_ignore_sigttou
|
|
+{
|
|
+public:
|
|
+ scoped_ignore_sigttou ()
|
|
+ {
|
|
+#ifdef SIGTTOU
|
|
+ if (job_control)
|
|
+ m_osigttou = signal (SIGTTOU, SIG_IGN);
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ ~scoped_ignore_sigttou ()
|
|
+ {
|
|
+#ifdef SIGTTOU
|
|
+ if (job_control)
|
|
+ signal (SIGTTOU, m_osigttou);
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
|
+
|
|
+private:
|
|
+#ifdef SIGTTOU
|
|
+ sighandler_t m_osigttou = NULL;
|
|
+#endif
|
|
+};
|
|
|
|
#endif /* inflow.h */
|
|
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
|
|
index 5a9965bf744..3492619f2d6 100644
|
|
--- a/gdb/ser-unix.c
|
|
+++ b/gdb/ser-unix.c
|
|
@@ -32,6 +32,7 @@
|
|
#include "gdbcmd.h"
|
|
#include "common/filestuff.h"
|
|
#include <termios.h>
|
|
+#include "inflow.h"
|
|
|
|
struct hardwire_ttystate
|
|
{
|
|
@@ -164,6 +165,9 @@ hardwire_print_tty_state (struct serial *scb,
|
|
static int
|
|
hardwire_drain_output (struct serial *scb)
|
|
{
|
|
+ /* Ignore SIGTTOU which may occur during the drain. */
|
|
+ scoped_ignore_sigttou ignore_sigttou;
|
|
+
|
|
return tcdrain (scb->fd);
|
|
}
|
|
|
|
diff --git a/gdb/top.c b/gdb/top.c
|
|
index bacd684dbaa..1e17ebee87c 100644
|
|
--- a/gdb/top.c
|
|
+++ b/gdb/top.c
|
|
@@ -34,7 +34,7 @@
|
|
#include "expression.h"
|
|
#include "value.h"
|
|
#include "language.h"
|
|
-#include "terminal.h" /* For job_control. */
|
|
+#include "terminal.h"
|
|
#include "common/job-control.h"
|
|
#include "annotate.h"
|
|
#include "completer.h"
|
|
--
|
|
2.21.0
|
|
|