Broken cast in linux-thread-db
Andreas Schwab
schwab@suse.de
Wed Oct 12 15:59:00 GMT 2005
Daniel Jacobowitz <drow@false.org> writes:
> Well presumably it honors POINTERS_EXTEND_UNSIGNED.
No.
http://gcc.gnu.org/onlinedocs/gcc/Arrays-and-pointers-implementation.html#Arrays-and-pointers-implementation
>> If notify.u.bptaddr has the high bit set it will be sign extended, but the
>> breakpoint address when the thread event breakpoint is hit will be zero
>> extended, so they don't match and the breakpoint is not recognized.
>
> Then this will break thread debugging on MIPS, where the breakpoint
> address will be sign extended.
Note that CORE_ADDR is always unsigned, even on MIPS.
> We'll only be in linux-thread-db.c if we have enough symbols to load
> shared libraries; maybe bfd_get_sign_extend_vma (exec_bfd) and assert
> that exec_bfd is provided?
Like this?
2005-10-12 Andreas Schwab <schwab@suse.de>
* Makefile.in (linux-thread-db.o): Depend on $(gdbcore_h).
* linux-thread-db.c (enable_thread_event): Extend pointer value as
specified by target.
(thread_db_get_thread_local_address): Likewise.
Index: gdb/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.755
diff -u -a -p -u -p -a -r1.755 gdb/Makefile.in
--- gdb/Makefile.in 28 Sep 2005 02:55:41 -0000 1.755
+++ gdb/Makefile.in 12 Oct 2005 15:11:48 -0000
@@ -2182,7 +2182,7 @@ linux-nat.o: linux-nat.c $(defs_h) $(inf
linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \
$(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \
$(gdbthread_h) $(inferior_h) $(symfile_h) $(objfiles_h) $(target_h) \
- $(regcache_h) $(solib_svr4_h)
+ $(regcache_h) $(solib_svr4_h) $(gdbcore_h)
lynx-nat.o: lynx-nat.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \
$(gdbcore_h) $(regcache_h)
m2-exp.o: m2-exp.c $(defs_h) $(gdb_string_h) $(expression_h) $(language_h) \
--- gdb/linux-thread-db.c 12 Sep 2005 11:04:57 +0200 1.10
+++ gdb/linux-thread-db.c 12 Okt 2005 15:11:31 +0200
@@ -36,6 +36,7 @@
#include "target.h"
#include "regcache.h"
#include "solib-svr4.h"
+#include "gdbcore.h"
#ifdef HAVE_GNU_LIBC_VERSION_H
#include <gnu/libc-version.h>
@@ -505,9 +506,14 @@ enable_thread_event (td_thragent_t *thre
return err;
/* Set up the breakpoint. */
- (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
- (CORE_ADDR) notify.u.bptaddr,
- ¤t_target);
+ gdb_assert (exec_bfd);
+ (*bp) = (gdbarch_convert_from_func_ptr_addr
+ (current_gdbarch,
+ /* Do proper sign extension for the target. */
+ (bfd_get_sign_extend_vma (exec_bfd) > 0
+ ? (CORE_ADDR) (intptr_t) notify.u.bptaddr
+ : (CORE_ADDR) (uintptr_t) notify.u.bptaddr),
+ ¤t_target));
create_thread_event_breakpoint ((*bp));
return TD_OK;
@@ -1277,7 +1283,11 @@ thread_db_get_thread_local_address (ptid
(("%s")), thread_db_err_str (err));
/* Cast assuming host == target. Joy. */
- return (CORE_ADDR) address;
+ /* Do proper sign extension for the target. */
+ gdb_assert (exec_bfd);
+ return (bfd_get_sign_extend_vma (exec_bfd) > 0
+ ? (CORE_ADDR) (intptr_t) address
+ : (CORE_ADDR) (uintptr_t) address);
}
if (target_beneath->to_get_thread_local_address)
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, MaxfeldstraÃe 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
More information about the Gdb-patches
mailing list