From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by sourceware.org (Postfix) with ESMTPS id 8675E3858D35 for ; Tue, 7 May 2024 23:42:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8675E3858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8675E3858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715125369; cv=none; b=QLCn6Fisbf8XXszSs0KvEfrCchdUJJj4m1wtY1hRoTGXNDtuRxXObVFXa/zsLNbgL1AaE4sZDQs0pO84zzPs2bXyA/kRPci2HYMW8+ASIkcMsA8A7958p6afNXLAc84Jqbk6PibmcgbPXKnyfUZnIuZdvclAGlNXog+VwVpkB8s= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1715125369; c=relaxed/simple; bh=rlmPG/Hf3aB6VvnAsVh9mtJsBQ1GpJPlb0EZHtNIR5E=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=w0vkHLtHjKvNjoTg4tbuR+K+ijtTeSojZwhouG7jLJYfEw9hP2eUZ+79FzWwr0HppcWf1QvEncUaO2U9vD9hhXVqLNTq1+GMRDQW7jQJRrdBug0G6CYSzmEaT7Ka3ojgo9jniFSo0z61X0RPGCE1dIHazkXb4EvZOqd4EaexH3Y= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-34e28e32ea4so2755720f8f.2 for ; Tue, 07 May 2024 16:42:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715125364; x=1715730164; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9UjD5dtjNCLi3L8Z9JSjnlRwGwXQx5eQJQEoxBA+gyU=; b=QfwMJwAX5tPU2c9WKqLuTpIp3lOOxd0bIPPG5PkSmWxUJUzd3vn0/Co9efPBnOPkrI kAtLeY7s6XFkUPJL9/VxCqAHHk2otGP/D6p+eRKysv3V2oVeS48wXLRH/NHlhCBSD2vM sCHPGAABL026Sp1ofikRBU1LUo4TqSaQvDyv8CQ5V7pSzsY3+k3Z+MpvArfGLfMZ7exP xthjPNTPljgfzAth9kffn1CNrEnckzn1unF/Ks48fGcmpiHREjBSZbgR5ER3UtwRn1HF Aifa314cu1pybePFehNlVsRPpXdhzygAU2SooeMIBzyUC3By7tE9Z//y7WJjZwuAHD99 rXLA== X-Gm-Message-State: AOJu0YyYeO0dhPABT2l1lQJYkYYygX646Q5vVEToczAki//uqGzzvNBX VAzV0tChXdMFZ3Z3SnLTp+Eq5R+ImQ7GfSvHEGkCG/EYYjxifPjFs59sfuUA X-Google-Smtp-Source: AGHT+IEXbLDfxkXU5zaw+2+VxG54MRaVRANg6NsDyC5vJYX/edDJqNpmTRnOqv5krfyV75Gm9NnwHg== X-Received: by 2002:a5d:4b0d:0:b0:34d:8cef:595c with SMTP id ffacd0b85a97d-34fcaddd953mr768521f8f.2.1715125364004; Tue, 07 May 2024 16:42:44 -0700 (PDT) Received: from localhost ([2001:8a0:f908:4900:2dd1:1a0d:2b75:dc42]) by smtp.gmail.com with UTF8SMTPSA id n8-20020adffe08000000b0034df2d0bd71sm13868411wrr.12.2024.05.07.16.42.43 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 07 May 2024 16:42:43 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 03/34] Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT) Date: Wed, 8 May 2024 00:42:02 +0100 Message-ID: <20240507234233.371123-4-pedro@palves.net> X-Mailer: git-send-email 2.43.2 In-Reply-To: <20240507234233.371123-1-pedro@palves.net> References: <20240507234233.371123-1-pedro@palves.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: The goal of the next few patches is to eliminate thread_rec completely. This is the first patch in that effort. thread_rec(DONT_INVALIDATE_CONTEXT) is really just a thread lookup with no side effects, so this adds a find_thread function that lets you do that. Change-Id: Ie486badce00e234b10caa478b066c34537103e3f --- gdb/nat/windows-nat.c | 5 ++- gdb/nat/windows-nat.h | 7 ++-- gdb/windows-nat.c | 72 ++++++++++++++++++++---------------------- gdbserver/win32-low.cc | 30 +++++++++++------- gdbserver/win32-low.h | 1 + 5 files changed, 60 insertions(+), 55 deletions(-) diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index f9f6848861d..46fbc2bfecb 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -325,9 +325,8 @@ windows_process_info::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) if (named_thread_id == (DWORD) -1) named_thread_id = current_event.dwThreadId; - named_thread = thread_rec (ptid_t (current_event.dwProcessId, - named_thread_id, 0), - DONT_INVALIDATE_CONTEXT); + named_thread = find_thread (ptid_t (current_event.dwProcessId, + named_thread_id, 0)); if (named_thread != NULL) { int thread_name_len; diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 3783f39051d..9e8c87e81de 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -105,9 +105,6 @@ struct windows_thread_info /* Possible values to pass to 'thread_rec'. */ enum thread_disposition_type { - /* Do not invalidate the thread's context, and do not suspend the - thread. */ - DONT_INVALIDATE_CONTEXT, /* Invalidate the context, but do not suspend the thread. */ DONT_SUSPEND, /* Invalidate the context and suspend the thread. */ @@ -178,6 +175,10 @@ struct windows_process_info bool ignore_first_breakpoint = false; #endif + /* Find a thread record given a thread id. + + This function must be supplied by the embedding application. */ + virtual windows_thread_info *find_thread (ptid_t ptid) = 0; /* Find a thread record given a thread id. THREAD_DISPOSITION controls whether the thread is suspended, and whether the context diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 0102511dc8d..3a3dad5fb2e 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -90,6 +90,7 @@ struct windows_solib struct windows_per_inferior : public windows_process_info { + windows_thread_info *find_thread (ptid_t ptid) override; windows_thread_info *thread_rec (ptid_t ptid, thread_disposition_type disposition) override; int handle_output_debug_string (struct target_waitstatus *ourstatus) override; @@ -257,8 +258,7 @@ struct windows_nat_target final : public x86_nat_target bool stopped_by_sw_breakpoint () override { - windows_thread_info *th - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (inferior_ptid); return th->stopped_at_software_breakpoint; } @@ -515,34 +515,36 @@ windows_nat_target::wait_for_debug_event_main_thread (DEBUG_EVENT *event) /* See nat/windows-nat.h. */ windows_thread_info * -windows_per_inferior::thread_rec - (ptid_t ptid, thread_disposition_type disposition) +windows_per_inferior::find_thread (ptid_t ptid) { for (auto &th : thread_list) if (th->tid == ptid.lwp ()) - { - if (!th->suspended) - { - switch (disposition) - { - case DONT_INVALIDATE_CONTEXT: - /* Nothing. */ - break; - case INVALIDATE_CONTEXT: - if (ptid.lwp () != current_event.dwThreadId) - th->suspend (); - th->reload_context = true; - break; - case DONT_SUSPEND: - th->reload_context = true; - th->suspended = -1; - break; - } - } - return th.get (); - } + return th.get (); + return nullptr; +} - return NULL; +windows_thread_info * +windows_per_inferior::thread_rec + (ptid_t ptid, thread_disposition_type disposition) +{ + windows_thread_info *th = find_thread (ptid); + + if (th != nullptr && !th->suspended) + { + switch (disposition) + { + case INVALIDATE_CONTEXT: + if (ptid.lwp () != current_event.dwThreadId) + th->suspend (); + th->reload_context = true; + break; + case DONT_SUSPEND: + th->reload_context = true; + th->suspended = -1; + break; + } + } + return th; } /* Add a thread to the thread list. @@ -561,7 +563,7 @@ windows_nat_target::add_thread (ptid_t ptid, HANDLE h, void *tlb, gdb_assert (ptid.lwp () != 0); - if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) + if ((th = windows_process.find_thread (ptid))) return th; CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb; @@ -1149,7 +1151,7 @@ display_selectors (const char * args, int from_tty) } windows_thread_info *current_windows_thread - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + = windows_process.find_thread (inferior_ptid); if (!args) { @@ -1426,7 +1428,7 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig) ptid.pid (), (unsigned) ptid.lwp (), step, sig); /* Get context for currently selected thread. */ - th = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.find_thread (inferior_ptid); if (th) { #ifdef __x86_64__ @@ -3119,7 +3121,7 @@ windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) { windows_thread_info *th; - th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.find_thread (ptid); if (th == NULL) return false; @@ -3140,9 +3142,7 @@ windows_nat_target::get_ada_task_ptid (long lwp, ULONGEST thread) const char * windows_nat_target::thread_name (struct thread_info *thr) { - windows_thread_info *th - = windows_process.thread_rec (thr->ptid, - DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (thr->ptid); return th->thread_name (); } @@ -3282,8 +3282,7 @@ cygwin_set_dr7 (unsigned long val) static CORE_ADDR cygwin_get_dr (int i) { - windows_thread_info *th - = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (inferior_ptid); #ifdef __x86_64__ if (windows_process.wow64_process) @@ -3356,8 +3355,7 @@ windows_nat_target::thread_alive (ptid_t ptid) { gdb_assert (ptid.lwp () != 0); - windows_thread_info *th - = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (ptid); return WaitForSingleObject (th->h, 0) != WAIT_OBJECT_0; } diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index cc314df8dbd..5a57eedd18b 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -141,6 +141,17 @@ win32_require_context (windows_thread_info *th) /* See nat/windows-nat.h. */ +windows_thread_info * +gdbserver_windows_process::find_thread (ptid_t ptid) +{ + thread_info *thread = find_thread_ptid (ptid); + if (thread == nullptr) + return nullptr; + return (windows_thread_info *) thread_target_data (thread); +} + +/* See nat/windows-nat.h. */ + windows_thread_info * gdbserver_windows_process::thread_rec (ptid_t ptid, thread_disposition_type disposition) @@ -150,8 +161,7 @@ gdbserver_windows_process::thread_rec return NULL; windows_thread_info *th = (windows_thread_info *) thread_target_data (thread); - if (disposition != DONT_INVALIDATE_CONTEXT) - win32_require_context (th); + win32_require_context (th); return th; } @@ -162,7 +172,7 @@ child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb) windows_thread_info *th; ptid_t ptid = ptid_t (pid, tid, 0); - if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) + if ((th = windows_process.find_thread (ptid))) return th; CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb; @@ -822,7 +832,7 @@ win32_process_target::resume (thread_resume *resume_info, size_t n) /* Get context for the currently selected thread. */ ptid = debug_event_ptid (&windows_process.current_event); - th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.find_thread (ptid); if (th) { win32_prepare_to_resume (th); @@ -974,8 +984,7 @@ maybe_adjust_pc () child_fetch_inferior_registers (regcache, -1); windows_thread_info *th - = windows_process.thread_rec (current_thread_ptid (), - DONT_INVALIDATE_CONTEXT); + = windows_process.find_thread (current_thread_ptid ()); th->stopped_at_software_breakpoint = false; if (windows_process.current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT @@ -1375,8 +1384,7 @@ win32_process_target::supports_get_tib_address () int win32_process_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) { - windows_thread_info *th; - th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + windows_thread_info *th = windows_process.find_thread (ptid); if (th == NULL) return 0; if (addr != NULL) @@ -1397,8 +1405,7 @@ bool win32_process_target::stopped_by_sw_breakpoint () { windows_thread_info *th - = windows_process.thread_rec (current_thread_ptid (), - DONT_INVALIDATE_CONTEXT); + = windows_process.find_thread (current_thread_ptid ()); return th == nullptr ? false : th->stopped_at_software_breakpoint; } @@ -1424,8 +1431,7 @@ const char * win32_process_target::thread_name (ptid_t thread) { windows_thread_info *th - = windows_process.thread_rec (current_thread_ptid (), - DONT_INVALIDATE_CONTEXT); + = windows_process.find_thread (current_thread_ptid ()); return th->thread_name (); } diff --git a/gdbserver/win32-low.h b/gdbserver/win32-low.h index ff997df0a66..c725c182ac4 100644 --- a/gdbserver/win32-low.h +++ b/gdbserver/win32-low.h @@ -174,6 +174,7 @@ class win32_process_target : public process_stratum_target struct gdbserver_windows_process : public windows_nat::windows_process_info { + windows_nat::windows_thread_info *find_thread (ptid_t ptid) override; windows_nat::windows_thread_info *thread_rec (ptid_t ptid, windows_nat::thread_disposition_type disposition) override; -- 2.43.2