From 3d6c62048d8408fbfb6c66830e0c650e36259637 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 7 Feb 2019 19:16:04 -0700 Subject: Introduce target_ops method thread_info_to_thread_handle 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/ChangeLog | 19 +++++++++++++++++++ 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 +++++++++ 7 files changed, 95 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9910952..ea89249 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +2019-04-08 Kevin Buettner + + * 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. + 2019-04-08 Pedro Alves * common/common-exceptions.c (throw_exception): Don't create diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index b3e1a24..a67f9b9 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; @@ -1692,6 +1693,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 767c694..9bbf458 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; @@ -13998,6 +14001,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 bef8a7f..aa2adce 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 3654f02..cfc0ce0 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 3ab5671..f492102 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2097,6 +2097,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 4f7a43e..9078a42 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. -- cgit v1.1