From 00f515dab69c7c12fc558402a9a701e28a787523 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Sat, 19 Dec 2009 00:29:11 +0000 Subject: [PATCH] gdb/ * gdb_proc_service.h (psaddr_t): Fix type. * linux-thread-db.c (thread_db_info.td_thr_tls_get_addr_p): Fix signature to match glibc. (thread_db_get_thread_local_address): Use psaddr_t for type of address to match parameter of td_thr_tls_get_addr_p. Cast through psaddr_t instead of (void*) to match parameter of td_thr_tls_get_addr_p. gdbserver/ * gdb_proc_service.h (psaddr_t): Fix type. * thread-db.c (thread_db_info.td_thr_tls_get_addr_p): Fix signature to match glibc. --- gdb/ChangeLog | 10 ++++++++++ gdb/gdb_proc_service.h | 2 +- gdb/gdbserver/ChangeLog | 6 ++++++ gdb/gdbserver/gdb_proc_service.h | 2 +- gdb/gdbserver/thread-db.c | 4 ++-- gdb/linux-thread-db.c | 11 +++++++---- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 16759d3e640..16d3f66a04b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2009-12-18 Doug Evans + + * gdb_proc_service.h (psaddr_t): Fix type. + * linux-thread-db.c (thread_db_info.td_thr_tls_get_addr_p): Fix + signature to match glibc. + (thread_db_get_thread_local_address): Use psaddr_t for type of + address to match parameter of td_thr_tls_get_addr_p. + Cast through psaddr_t instead of (void*) to match parameter of + td_thr_tls_get_addr_p. + 2009-12-17 Stan Shebs * breakpoint.c (bpstat_check_location): Check for tracepoints. diff --git a/gdb/gdb_proc_service.h b/gdb/gdb_proc_service.h index de62c9db897..721f91c5620 100644 --- a/gdb/gdb_proc_service.h +++ b/gdb/gdb_proc_service.h @@ -47,7 +47,7 @@ typedef unsigned int lwpid_t; #endif #ifndef HAVE_PSADDR_T -typedef unsigned long psaddr_t; +typedef void *psaddr_t; #endif #ifndef HAVE_PRGREGSET_T diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 5a5c86067f2..a0a8dd60e43 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2009-12-18 Doug Evans + + * gdb_proc_service.h (psaddr_t): Fix type. + * thread-db.c (thread_db_info.td_thr_tls_get_addr_p): Fix + signature to match glibc. + 2009-12-16 Doug Evans * linux-low.c (linux_read_memory): Fix argument to read. diff --git a/gdb/gdbserver/gdb_proc_service.h b/gdb/gdbserver/gdb_proc_service.h index 4d153e6a189..ab02e9eb286 100644 --- a/gdb/gdbserver/gdb_proc_service.h +++ b/gdb/gdbserver/gdb_proc_service.h @@ -54,7 +54,7 @@ typedef unsigned int lwpid_t; #endif #ifndef HAVE_PSADDR_T -typedef unsigned long psaddr_t; +typedef void *psaddr_t; #endif #ifndef HAVE_PRGREGSET_T diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index ba6c668c49b..f27308263f4 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -71,8 +71,8 @@ struct thread_db sigset_t *ti_sigmask_p, unsigned int ti_user_flags); td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th, - void *map_address, - size_t offset, void **address); + psaddr_t map_address, + size_t offset, psaddr_t *address); const char ** (*td_symbol_list_p) (void); }; diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index c48b87006ef..77ffa565abd 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -153,8 +153,8 @@ struct thread_db_info int event); td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th, - void *map_address, - size_t offset, void **address); + psaddr_t map_address, + size_t offset, psaddr_t *address); }; /* List of known processes using thread_db, and the required @@ -1530,7 +1530,7 @@ thread_db_get_thread_local_address (struct target_ops *ops, if (thread_info != NULL && thread_info->private != NULL) { td_err_e err; - void *address; + psaddr_t address; struct thread_db_info *info; info = get_thread_db_info (GET_PID (ptid)); @@ -1544,8 +1544,11 @@ thread_db_get_thread_local_address (struct target_ops *ops, gdb_assert (lm != 0); /* Finally, get the address of the variable. */ + /* Note the cast through uintptr_t: this interface only works if + a target address fits in a psaddr_t, which is a host pointer. + So a 32-bit debugger can not access 64-bit TLS through this. */ err = info->td_thr_tls_get_addr_p (&thread_info->private->th, - (void *)(size_t) lm, + (psaddr_t)(uintptr_t) lm, offset, &address); #ifdef THREAD_DB_HAS_TD_NOTALLOC -- 2.30.2