aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2022-04-04 21:12:03 +0100
committerPedro Alves <pedro@palves.net>2022-12-12 19:04:15 +0000
commit925d3dc8a1b2eecab82bbcaffbf9b4c86883b17f (patch)
treed889ebc2d7fb0210bfe8781370caa8e88b3af8f0
parentf072ced7478ccaec859f92d382e06fe41d84423f (diff)
downloadgdb-925d3dc8a1b2eecab82bbcaffbf9b4c86883b17f.zip
gdb-925d3dc8a1b2eecab82bbcaffbf9b4c86883b17f.tar.gz
gdb-925d3dc8a1b2eecab82bbcaffbf9b4c86883b17f.tar.bz2
all-stop/synchronous RSP support thread-exit events
Currently, GDB does not understand the THREAD_EXITED stop reply in remote all-stop mode. There's no good reason for this, it just happened that THREAD_EXITED was only ever reported in non-stop mode so far. This patch teaches GDB to parse that event in all-stop RSP too. There is no need to add a qSupported feature for this, because the server won't send a THREAD_EXITED event unless GDB explicitly asks for it, with QThreadEvents, or with the GDB_THREAD_OPTION_EXIT QThreadOptions option added in the next patch. Change-Id: Ide5d12391adf432779fe4c79526801c4a5630966
-rw-r--r--gdb/remote.c5
-rw-r--r--gdbserver/server.cc1
2 files changed, 4 insertions, 2 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index 9de8ed8..f7ab852 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -8172,7 +8172,8 @@ remote_target::process_stop_reply (struct stop_reply *stop_reply,
&& status->kind () != TARGET_WAITKIND_NO_RESUMED)
{
/* Expedited registers. */
- if (!stop_reply->regcache.empty ())
+ if (status->kind () != TARGET_WAITKIND_THREAD_EXITED
+ && !stop_reply->regcache.empty ())
{
struct regcache *regcache
= get_thread_arch_regcache (this, ptid, stop_reply->arch);
@@ -8358,7 +8359,7 @@ remote_target::wait_as (ptid_t ptid, target_waitstatus *status,
again. Keep waiting for events. */
rs->waiting_for_stop_reply = 1;
break;
- case 'N': case 'T': case 'S': case 'X': case 'W':
+ case 'N': case 'T': case 'S': case 'X': case 'W': case 'w':
{
/* There is a stop reply to handle. */
rs->waiting_for_stop_reply = 0;
diff --git a/gdbserver/server.cc b/gdbserver/server.cc
index 07a3319..5099db1 100644
--- a/gdbserver/server.cc
+++ b/gdbserver/server.cc
@@ -3061,6 +3061,7 @@ resume (struct thread_resume *actions, size_t num_actions)
if (cs.last_status.kind () != TARGET_WAITKIND_EXITED
&& cs.last_status.kind () != TARGET_WAITKIND_SIGNALLED
+ && cs.last_status.kind () != TARGET_WAITKIND_THREAD_EXITED
&& cs.last_status.kind () != TARGET_WAITKIND_NO_RESUMED)
current_thread->last_status = cs.last_status;