From 6bdfee81576aae55666a9245cfc0a316a6849957 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 25 Jul 2019 18:27:20 -0700 Subject: [PATCH] Fix gdb.python/py-thrhandle.exp failures for -m32 multilib This patch fixes the following failures when testing with "target_board unix/-m32" using a x86_64-pc-linux-gnu native GDB. FAIL: gdb.python/py-thrhandle.exp: print thread for bogus handle thrs[3] FAIL: gdb.python/py-thrhandle.exp: print thread for bogus handle thrs[4] FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[0] FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[1] FAIL: gdb.python/py-thrhandle.exp: print thread id for thrs[2] FAIL: gdb.python/py-thrhandle.exp: thread 0: fetch thread handle from thread FAIL: gdb.python/py-thrhandle.exp: thread 0: verify that handles are the same FAIL: gdb.python/py-thrhandle.exp: thread 1: fetch thread handle from thread FAIL: gdb.python/py-thrhandle.exp: thread 1: verify that handles are the same FAIL: gdb.python/py-thrhandle.exp: thread 2: fetch thread handle from thread FAIL: gdb.python/py-thrhandle.exp: thread 2: verify that handles are the same I've written it so that it might work for other 64-bit host / 32-bit target combos too. gdb/ChangeLog: * linux-thread-db.c (thread_db_target::thread_handle_to_thread_info): Add case for debugging 32-bit target on 64-bit host. Revise comment. --- gdb/ChangeLog | 6 ++++++ gdb/linux-thread-db.c | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bca9b72e0fb..be242e51a51 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2019-07-27 Kevin Buettner + + * linux-thread-db.c (thread_db_target::thread_handle_to_thread_info): + Add case for debugging 32-bit target on 64-bit host. Revise + comment. + 2019-07-27 Kevin Buettner * infrun.c (fill_in_stop_func): Use find_pc_partial_function diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 950be9ca5a9..1d32e9195c0 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1672,16 +1672,21 @@ thread_db_target::thread_handle_to_thread_info (const gdb_byte *thread_handle, { thread_t handle_tid; - /* Thread handle sizes must match in order to proceed. We don't use an - assert here because the resulting internal error will cause GDB to - exit. This isn't necessarily an internal error due to the possibility - of garbage being passed as the thread handle via the python interface. */ - if (handle_len != sizeof (handle_tid)) + /* When debugging a 32-bit target from a 64-bit host, handle_len + will be 4 and sizeof (handle_tid) will be 8. This requires + a different cast than the more straightforward case where + the sizes are the same. + + Use "--target_board unix/-m32" from a native x86_64 linux build + to test the 32/64-bit case. */ + if (handle_len == 4 && sizeof (handle_tid) == 8) + handle_tid = (thread_t) * (const uint32_t *) thread_handle; + else if (handle_len == sizeof (handle_tid)) + handle_tid = * (const thread_t *) thread_handle; + else error (_("Thread handle size mismatch: %d vs %zu (from libthread_db)"), handle_len, sizeof (handle_tid)); - handle_tid = * (const thread_t *) thread_handle; - for (thread_info *tp : inf->non_exited_threads ()) { thread_db_thread_info *priv = get_thread_db_thread_info (tp); -- 2.30.2