aboutsummaryrefslogtreecommitdiff
path: root/gdb/linux-thread-db.c
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2005-10-13 09:31:59 +0000
committerAndreas Schwab <schwab@linux-m68k.org>2005-10-13 09:31:59 +0000
commit16451949d7083391405bb46c06a2fadac01f5c42 (patch)
tree85c570c1c9b46020ef962d4e4f685a1266fc0be5 /gdb/linux-thread-db.c
parent4d443107ba8c5dccc370a701135e4bacd2adc9a4 (diff)
downloadfsf-binutils-gdb-16451949d7083391405bb46c06a2fadac01f5c42.zip
fsf-binutils-gdb-16451949d7083391405bb46c06a2fadac01f5c42.tar.gz
fsf-binutils-gdb-16451949d7083391405bb46c06a2fadac01f5c42.tar.bz2
* 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.
Diffstat (limited to 'gdb/linux-thread-db.c')
-rw-r--r--gdb/linux-thread-db.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 6bd5b42..3c71bea 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -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 *thread_agent, int event, CORE_ADDR *bp)
return err;
/* Set up the breakpoint. */
- (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
- (CORE_ADDR) notify.u.bptaddr,
- &current_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),
+ &current_target));
create_thread_event_breakpoint ((*bp));
return TD_OK;
@@ -1277,7 +1283,11 @@ thread_db_get_thread_local_address (ptid_t 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)