From patchwork Thu Apr 4 16:58:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Buettner X-Patchwork-Id: 32162 Received: (qmail 105506 invoked by alias); 4 Apr 2019 16:59:57 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 105401 invoked by uid 89); 4 Apr 2019 16:59:56 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 04 Apr 2019 16:59:54 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E23E580082 for ; Thu, 4 Apr 2019 16:59:52 +0000 (UTC) Received: from f29-efi-1.lan (ovpn-116-219.phx2.redhat.com [10.3.116.219]) by smtp.corp.redhat.com (Postfix) with ESMTP id B370860BF7; Thu, 4 Apr 2019 16:59:52 +0000 (UTC) From: Kevin Buettner To: gdb-patches@sourceware.org Cc: Kevin Buettner Subject: [PATCH v4 1/6] Introduce target_ops method thread_info_to_thread_handle Date: Thu, 4 Apr 2019 09:58:49 -0700 Message-Id: <20190404165854.17343-2-kevinb@redhat.com> In-Reply-To: <20190404165854.17343-1-kevinb@redhat.com> References: <20190404165854.17343-1-kevinb@redhat.com> MIME-Version: 1.0 X-IsSubscribed: yes This patch adds a thread_info_to_thread_handle method to the target_ops struct. It also implements this functionality for remote targets and linux native threads. gdb/ChangeLog: * gdbthread.h (thread_to_thread_handle): Declare. * thread.c (gdbtypes.h): Include. (thread_to_thread_handle): New function. * target.h (struct target_ops): Add thread_info_to_thread_handle. (target_thread_info_to_thread_handle): Declare. * target.c (target_thread_info_to_thread_handle): New function. * target-debug.h (target_debug_print_gdb_byte_vector): Define. * target-delegates.c: Regenerate. * linux-thread-db.c (class thread_db_target): Add method thread_info_to_thread_handle. (thread_db_target::thread_info_to_thread_handle): Define. * remote.c (class remote_target): Add new method thread_info_to_thread_handle. (remote_target::thread_info_to_thread_handle): Define. --- gdb/linux-thread-db.c | 19 +++++++++++++++++++ gdb/remote.c | 10 ++++++++++ gdb/target-debug.h | 2 ++ gdb/target-delegates.c | 28 ++++++++++++++++++++++++++++ gdb/target.c | 8 ++++++++ gdb/target.h | 9 +++++++++ 6 files changed, 76 insertions(+) diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index a735807f58..37b67d9147 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -105,6 +105,7 @@ public: thread_info *thread_handle_to_thread_info (const gdb_byte *thread_handle, int handle_len, inferior *inf) override; + gdb::byte_vector thread_info_to_thread_handle (struct thread_info *) override; }; static char *libthread_db_search_path; @@ -1695,6 +1696,24 @@ thread_db_target::thread_handle_to_thread_info (const gdb_byte *thread_handle, return NULL; } +/* Return the thread handle associated the thread_info pointer TP. */ + +gdb::byte_vector +thread_db_target::thread_info_to_thread_handle (struct thread_info *tp) +{ + thread_db_thread_info *priv = get_thread_db_thread_info (tp); + + if (priv == NULL) + return gdb::byte_vector (); + + int handle_size = sizeof (priv->tid); + gdb::byte_vector rv (handle_size); + + memcpy (rv.data (), &priv->tid, handle_size); + + return rv; +} + /* Get the address of the thread local variable in load module LM which is stored at OFFSET within the thread local storage for thread PTID. */ diff --git a/gdb/remote.c b/gdb/remote.c index 657a4a25ca..cda456f9d1 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -485,6 +485,9 @@ public: int handle_len, inferior *inf) override; + gdb::byte_vector thread_info_to_thread_handle (struct thread_info *tp) + override; + void stop (ptid_t) override; void interrupt () override; @@ -14003,6 +14006,13 @@ remote_target::thread_handle_to_thread_info (const gdb_byte *thread_handle, return NULL; } +gdb::byte_vector +remote_target::thread_info_to_thread_handle (struct thread_info *tp) +{ + remote_thread_info *priv = get_remote_thread_info (tp); + return priv->thread_handle; +} + bool remote_target::can_async_p () { diff --git a/gdb/target-debug.h b/gdb/target-debug.h index bef8a7f330..aa2adcec3d 100644 --- a/gdb/target-debug.h +++ b/gdb/target-debug.h @@ -186,6 +186,8 @@ target_debug_do_print (host_address_to_string (X)) #define target_debug_print_std_string(X) \ target_debug_do_print ((X).c_str ()) +#define target_debug_print_gdb_byte_vector(X) \ + target_debug_do_print (host_address_to_string (X.data ())) static void target_debug_print_struct_target_waitstatus_p (struct target_waitstatus *status) diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index 3654f02e63..cfc0ce06e9 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -70,6 +70,7 @@ struct dummy_target : public target_ops const char *extra_thread_info (thread_info *arg0) override; const char *thread_name (thread_info *arg0) override; thread_info *thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, inferior *arg2) override; + gdb::byte_vector thread_info_to_thread_handle (struct thread_info *arg0) override; void stop (ptid_t arg0) override; void interrupt () override; void pass_ctrlc () override; @@ -237,6 +238,7 @@ struct debug_target : public target_ops const char *extra_thread_info (thread_info *arg0) override; const char *thread_name (thread_info *arg0) override; thread_info *thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, inferior *arg2) override; + gdb::byte_vector thread_info_to_thread_handle (struct thread_info *arg0) override; void stop (ptid_t arg0) override; void interrupt () override; void pass_ctrlc () override; @@ -1854,6 +1856,32 @@ debug_target::thread_handle_to_thread_info (const gdb_byte *arg0, int arg1, infe return result; } +gdb::byte_vector +target_ops::thread_info_to_thread_handle (struct thread_info *arg0) +{ + return this->beneath ()->thread_info_to_thread_handle (arg0); +} + +gdb::byte_vector +dummy_target::thread_info_to_thread_handle (struct thread_info *arg0) +{ + return gdb::byte_vector (); +} + +gdb::byte_vector +debug_target::thread_info_to_thread_handle (struct thread_info *arg0) +{ + gdb::byte_vector result; + fprintf_unfiltered (gdb_stdlog, "-> %s->thread_info_to_thread_handle (...)\n", this->beneath ()->shortname ()); + result = this->beneath ()->thread_info_to_thread_handle (arg0); + fprintf_unfiltered (gdb_stdlog, "<- %s->thread_info_to_thread_handle (", this->beneath ()->shortname ()); + target_debug_print_struct_thread_info_p (arg0); + fputs_unfiltered (") = ", gdb_stdlog); + target_debug_print_gdb_byte_vector (result); + fputs_unfiltered ("\n", gdb_stdlog); + return result; +} + void target_ops::stop (ptid_t arg0) { diff --git a/gdb/target.c b/gdb/target.c index 6c05b6b83e..6097993272 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2098,6 +2098,14 @@ target_thread_handle_to_thread_info (const gdb_byte *thread_handle, handle_len, inf); } +/* See target.h. */ + +gdb::byte_vector +target_thread_info_to_thread_handle (struct thread_info *tip) +{ + return current_top_target ()->thread_info_to_thread_handle (tip); +} + void target_resume (ptid_t ptid, int step, enum gdb_signal signal) { diff --git a/gdb/target.h b/gdb/target.h index 4f7a43e1a8..9078a42001 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -659,6 +659,9 @@ struct target_ops int, inferior *inf) TARGET_DEFAULT_RETURN (NULL); + /* See target_thread_info_to_thread_handle. */ + virtual gdb::byte_vector thread_info_to_thread_handle (struct thread_info *) + TARGET_DEFAULT_RETURN (gdb::byte_vector ()); virtual void stop (ptid_t) TARGET_DEFAULT_IGNORE (); virtual void interrupt () @@ -1851,6 +1854,12 @@ extern const char *target_thread_name (struct thread_info *); extern struct thread_info *target_thread_handle_to_thread_info (const gdb_byte *thread_handle, int handle_len, struct inferior *inf); +/* Given a thread, return the thread handle, a target-specific sequence of + bytes which serves as a thread identifier within the program being + debugged. */ +extern gdb::byte_vector target_thread_info_to_thread_handle + (struct thread_info *); + /* Attempts to find the pathname of the executable file that was run to create a specified process.