Files
MSYS2-packages/gdb/0006-Move-thread_local_segv_handler-definition.patch
2020-04-19 22:18:04 +03:00

104 lines
2.9 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
From de63ee3bb106cfc54a7155ebc3ba7b656209e8ad Mon Sep 17 00:00:00 2001
From: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon, 6 Jan 2020 18:11:38 +0000
Subject: [PATCH 6/6] Move thread_local_segv_handler definition
Move thread_local_segv_handler definition, to work around a problem on
Cygwin/x86_64 with referencing thread_local variables from a different
TU.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64697
---
gdb/cp-support.c | 17 +++++++++++++++++
gdb/event-top.c | 19 +------------------
gdb/event-top.h | 8 +++-----
3 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/gdb/cp-support.c b/gdb/cp-support.c
index c1d62f1711e..e69012b25d0 100644
--- a/gdb/cp-support.c
+++ b/gdb/cp-support.c
@@ -1485,6 +1485,23 @@ static thread_local SIGJMP_BUF *gdb_demangle_jmp_buf;
static std::atomic<bool> gdb_demangle_attempt_core_dump;
+/* The SIGSEGV handler for this thread, or NULL if there is none. GDB
+ always installs a global SIGSEGV handler, and then lets threads
+ indicate their interest in handling the signal by setting this
+ thread-local variable. */
+
+thread_local void (*thread_local_segv_handler) (int);
+
+void
+handle_sigsegv (int sig)
+{
+ install_handle_sigsegv ();
+
+ if (thread_local_segv_handler == nullptr)
+ abort (); /* ARI: abort */
+ thread_local_segv_handler (sig);
+}
+
/* Signal handler for gdb_demangle. */
static void
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 8ac6965f388..9e501ea7152 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -847,15 +847,8 @@ gdb_readline_no_editing_callback (gdb_client_data client_data)
ui->input_handler (gdb::unique_xmalloc_ptr<char> (result));
}
-
-/* See event-top.h. */
-
-thread_local void (*thread_local_segv_handler) (int);
-
-static void handle_sigsegv (int sig);
-
/* Install the SIGSEGV handler. */
-static void
+void
install_handle_sigsegv ()
{
#if defined (HAVE_SIGACTION)
@@ -875,16 +868,6 @@ install_handle_sigsegv ()
/* Handler for SIGSEGV. */
-static void
-handle_sigsegv (int sig)
-{
- install_handle_sigsegv ();
-
- if (thread_local_segv_handler == nullptr)
- abort ();
- thread_local_segv_handler (sig);
-}
-
/* The serial event associated with the QUIT flag. set_quit_flag sets
diff --git a/gdb/event-top.h b/gdb/event-top.h
index f858626dd53..f0c9a4f8b0f 100644
--- a/gdb/event-top.h
+++ b/gdb/event-top.h
@@ -70,10 +70,8 @@ extern void gdb_rl_callback_handler_install (const char *prompt);
currently installed. */
extern void gdb_rl_callback_handler_reinstall (void);
-/* The SIGSEGV handler for this thread, or NULL if there is none. GDB
- always installs a global SIGSEGV handler, and then lets threads
- indicate their interest in handling the signal by setting this
- thread-local variable. */
-extern thread_local void (*thread_local_segv_handler) (int);
+void handle_sigsegv (int sig);
+
+void install_handle_sigsegv ();
#endif
--
2.21.0