Fix gdb.python/py-thrhandle.exp failures for -m32 multilib
authorKevin Buettner <kevinb@redhat.com>
Fri, 26 Jul 2019 01:27:20 +0000 (18:27 -0700)
committerKevin Buettner <kevinb@redhat.com>
Sat, 27 Jul 2019 20:52:45 +0000 (13:52 -0700)
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
gdb/linux-thread-db.c

index bca9b72..be242e5 100644 (file)
@@ -1,5 +1,11 @@
 2019-07-27  Kevin Buettner  <kevinb@redhat.com>
 
+       * 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  <kevinb@redhat.com>
+
        * infrun.c (fill_in_stop_func): Use find_pc_partial_function
        instead of find_function_entry_range_from_pc.
 
index 950be9c..1d32e91 100644 (file)
@@ -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);