gdb/gdb-cli-handle-pending-c-after-rl_callback_read_char.patch

70 lines
2.6 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 3f5ef7bf512c7565279832bad3d5c743e9d8ae4b Mon Sep 17 00:00:00 2001
From: Tom de Vries <tdevries@suse.de>
Date: Wed, 24 May 2023 10:53:02 +0200
Subject: [PATCH 1/4] [gdb/cli] Handle pending ^C after rl_callback_read_char
for readline 7
In commit faf01aee1d0 ("[gdb] Handle pending ^C after rl_callback_read_char")
we handled a problem (described in detail in that commit) for readline >= 8
using public readline functions rl_pending_signal and rl_check_signals.
For readline 7 (note that we require at least readline 7 so there's no need to
worry about readline 6), there was no fix though, because rl_check_signals was
not available.
Fix this by instead using the private readline function _rl_signal_handler.
There is precedent for using private readline variables and functions, but
it's something we want to get rid of (PR build/10723). Nevertheless, I think
we can allow this specific instance because it's not used when building
against readline >= 8.
[ In the meanwhile, a fix was committed in the devel branch of the readline
repo, contained in commit 8d0c439 ("rollup of changes since readline-8.2"),
first proposed here (
https://lists.gnu.org/archive/html/bug-readline/2022-10/msg00008.html ). ]
Tested on x86_64-linux, against system readline 7.0 on openSUSE Leap 15.4.
PR cli/27813
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=27813
---
gdb/event-top.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 9181e4bdcff..399582698c1 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -134,6 +134,9 @@ static struct async_signal_handler *async_sigterm_token;
character is processed. */
void (*after_char_processing_hook) (void);
+#if RL_VERSION_MAJOR == 7
+EXTERN_C void _rl_signal_handler (int);
+#endif
/* Wrapper function for calling into the readline library. This takes
care of a couple things:
@@ -200,8 +203,14 @@ gdb_rl_callback_read_char_wrapper_noexcept () noexcept
pending signal. I'm not sure if that's possible, but it seems
better to handle the scenario than to assert. */
rl_check_signals ();
+#elif RL_VERSION_MAJOR == 7
+ /* Unfortunately, rl_check_signals is not available. Use private
+ function _rl_signal_handler instead. */
+
+ while (rl_pending_signal () != 0)
+ _rl_signal_handler (rl_pending_signal ());
#else
- /* Unfortunately, rl_check_signals is not available. */
+#error "Readline major version >= 7 expected"
#endif
if (after_char_processing_hook)
(*after_char_processing_hook) ();
base-commit: 7f7fcd7031430953f41b284069d1ed0cf3c8734a
--
2.35.3