* [RFC/RFA] TLS support part 2
@ 2002-10-02 6:39 Elena Zannoni
2002-10-02 7:57 ` Daniel Jacobowitz
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-10-02 6:39 UTC (permalink / raw)
To: gdb-patches
Here is the thread/target related part of the TLS support.
A new thread layer op has been added, to fetch the address of the variable.
Elena
2002-10-02 Elena Zannoni <ezannoni@redhat.com>
Jim Blandy <jimb@redhat.com>
* gdb_thread_db.h (enum): Add TD_NOTALLOC.
* target.c (update_current_target): Add
to_get_thread_local_address.
* target.h (to_get_thread_local_address): Export.
(target_get_thread_local_address): Define.
(target_get_thread_local_address_p): Define.
* thread-db.c: Include solib-svr4.h.
(td_thr_tls_get_addr_p): Define.
(thread_db_load): Get a pointer to td_thr_tls_get_addr.
(thread_db_get_thread_local_address): New function.
(init_thread_db_ops): Initialize to_get_thread_local_address.
Index: gdb_thread_db.h
===================================================================
RCS file: /cvs/src/src/gdb/gdb_thread_db.h,v
retrieving revision 1.3
diff -u -p -r1.3 gdb_thread_db.h
--- gdb_thread_db.h 6 Mar 2001 08:21:07 -0000 1.3
+++ gdb_thread_db.h 2 Oct 2002 13:36:40 -0000
@@ -63,7 +63,8 @@ typedef enum
TD_NOTSD, /* No thread-specific data available. */
TD_MALLOC, /* Out of memory. */
TD_PARTIALREG, /* Not entire register set was read or written. */
- TD_NOXREGS /* X register set not available for given thread. */
+ TD_NOXREGS, /* X register set not available for given thread. */
+ TD_NOTALLOC /* TLS memory not yet allocated. */
} td_err_e;
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.40
diff -u -p -r1.40 target.c
--- target.c 26 Aug 2002 19:18:33 -0000 1.40
+++ target.c 2 Oct 2002 13:36:12 -0000
@@ -666,6 +666,7 @@ update_current_target (void)
INHERIT (to_async_mask_value, t);
INHERIT (to_find_memory_regions, t);
INHERIT (to_make_corefile_notes, t);
+ INHERIT (to_get_thread_local_address, t);
INHERIT (to_magic, t);
#undef INHERIT
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.26
diff -u -p -r1.26 target.h
--- target.h 26 Aug 2002 19:18:33 -0000 1.26
+++ target.h 2 Oct 2002 13:37:08 -0000
@@ -328,6 +328,16 @@ struct target_ops
void *),
void *);
char * (*to_make_corefile_notes) (bfd *, int *);
+
+ /* Return the thread-local address at OFFSET in the
+ thread-local storage for the thread PTID and the shared library
+ or executable file given by OBJFILE. If that block of
+ thread-local storage hasn't been allocated yet, this function
+ may return an error. */
+ CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
+ struct objfile *objfile,
+ CORE_ADDR offset);
+
int to_magic;
/* Need sub-structure for target machine related rather than comm related?
*/
@@ -1038,6 +1048,12 @@ extern void (*target_new_objfile_hook) (
#define target_make_corefile_notes(BFD, SIZE_P) \
(current_target.to_make_corefile_notes) (BFD, SIZE_P)
+
+/* Thread-local values. */
+#define target_get_thread_local_address \
+ (current_target.to_get_thread_local_address)
+#define target_get_thread_local_address_p() \
+ (target_get_thread_local_address != NULL)
/* Hook to call target-dependent code after reading in a new symbol table. */
Index: thread-db.c
===================================================================
RCS file: /cvs/src/src/gdb/thread-db.c,v
retrieving revision 1.22
diff -u -p -r1.22 thread-db.c
--- thread-db.c 23 Mar 2002 17:38:13 -0000 1.22
+++ thread-db.c 2 Oct 2002 13:36:04 -0000
@@ -32,6 +32,7 @@
#include "objfiles.h"
#include "target.h"
#include "regcache.h"
+#include "solib-svr4.h"
#ifndef LIBTHREAD_DB_SO
#define LIBTHREAD_DB_SO "libthread_db.so.1"
@@ -108,6 +109,11 @@ static td_err_e (*td_thr_setgregs_p) (co
prgregset_t gregs);
static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, int event);
+static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
+ void *map_address,
+ size_t offset,
+ void **address);
+
/* Location of the thread creation event breakpoint. The code at this
location in the child process will be called by the pthread library
whenever a new thread is created. By setting a special breakpoint
@@ -348,6 +354,7 @@ thread_db_load (void)
td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
+ td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
return 1;
}
@@ -1003,6 +1010,97 @@ thread_db_pid_to_str (ptid_t ptid)
return normal_pid_to_str (ptid);
}
+/* Get the address of the thread local variable in OBJFILE which is
+ stored at OFFSET within the thread local storage for thread PTID. */
+
+static CORE_ADDR
+thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
+ CORE_ADDR offset)
+{
+ if (is_thread (ptid))
+ {
+ int objfile_is_library = (objfile->flags & OBJF_SHARED);
+ td_err_e err;
+ td_thrhandle_t th;
+ void *address;
+ CORE_ADDR lm;
+
+ /* glibc doesn't provide the needed interface. */
+ if (! td_thr_tls_get_addr_p)
+ error ("Cannot find thread-local variables in this thread library.");
+
+ /* Get the address of the link map for this objfile. */
+ lm = svr4_fetch_objfile_link_map (objfile);
+
+ /* Whoops, we couldn't find one. Bail out. */
+ if (!lm)
+ {
+ if (objfile_is_library)
+ error ("Cannot find shared library `%s' link_map in dynamic"
+ " linker's module list", objfile->name);
+ else
+ error ("Cannot find executable file `%s' link_map in dynamic"
+ " linker's module list", objfile->name);
+ }
+
+ /* Get info about the thread. */
+ err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
+ if (err != TD_OK)
+ error ("Cannot find thread %ld: %s",
+ (long) GET_THREAD (ptid), thread_db_err_str (err));
+
+ /* Finally, get the address of the variable. */
+ err = td_thr_tls_get_addr_p (&th, (void *) lm, offset, &address);
+
+#ifdef THREAD_DB_HAS_TD_NOTALLOC
+ /* The memory hasn't been allocated, yet. */
+ if (err == TD_NOTALLOC)
+ {
+ /* Now, if libthread_db provided the initialization image's
+ address, we *could* try to build a non-lvalue value from
+ the initialization image. */
+ if (objfile_is_library)
+ error ("The inferior has not yet allocated storage for"
+ " thread-local variables in\n"
+ "the shared library `%s'\n"
+ "for the thread %ld",
+ objfile->name, (long) GET_THREAD (ptid));
+ else
+ error ("The inferior has not yet allocated storage for"
+ " thread-local variables in\n"
+ "the executable `%s'\n"
+ "for the thread %ld",
+ objfile->name, (long) GET_THREAD (ptid));
+ }
+#endif
+
+ /* Something else went wrong. */
+ if (err != TD_OK)
+ {
+ if (objfile_is_library)
+ error ("Cannot find thread-local storage for thread %ld, "
+ "shared library %s:\n%s",
+ (long) GET_THREAD (ptid),
+ objfile->name,
+ thread_db_err_str (err));
+ else
+ error ("Cannot find thread-local storage for thread %ld, "
+ "executable file %s:\n%s",
+ (long) GET_THREAD (ptid),
+ objfile->name,
+ thread_db_err_str (err));
+ }
+
+ /* Cast assuming host == target. Joy. */
+ return (CORE_ADDR) address;
+ }
+
+ if (target_beneath->to_get_thread_local_address)
+ return target_beneath->to_get_thread_local_address (ptid, objfile, offset);
+
+ error ("Cannot find thread-local values on this target.");
+}
+
static void
init_thread_db_ops (void)
{
@@ -1025,6 +1123,8 @@ init_thread_db_ops (void)
thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
thread_db_ops.to_stratum = thread_stratum;
thread_db_ops.to_has_thread_control = tc_schedlock;
+ thread_db_ops.to_get_thread_local_address
+ = thread_db_get_thread_local_address;
thread_db_ops.to_magic = OPS_MAGIC;
}
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFC/RFA] TLS support part 2
2002-10-02 6:39 [RFC/RFA] TLS support part 2 Elena Zannoni
@ 2002-10-02 7:57 ` Daniel Jacobowitz
2002-10-02 8:29 ` Elena Zannoni
2002-10-21 12:31 ` Elena Zannoni
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Daniel Jacobowitz @ 2002-10-02 7:57 UTC (permalink / raw)
To: gdb-patches
On Wed, Oct 02, 2002 at 09:36:57AM -0400, Elena Zannoni wrote:
>
> Here is the thread/target related part of the TLS support.
>
> A new thread layer op has been added, to fetch the address of the variable.
OK, I see how it works now. This is workable for gdbserver; I'll just
have to figure out how to ask for the link map address in some portable
way. This will take some thinking; the best way to do it involves
noticeable protocol changes...
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFC/RFA] TLS support part 2
2002-10-02 7:57 ` Daniel Jacobowitz
@ 2002-10-02 8:29 ` Elena Zannoni
0 siblings, 0 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-10-02 8:29 UTC (permalink / raw)
To: Daniel Jacobowitz; +Cc: gdb-patches
Daniel Jacobowitz writes:
> On Wed, Oct 02, 2002 at 09:36:57AM -0400, Elena Zannoni wrote:
> >
> > Here is the thread/target related part of the TLS support.
> >
> > A new thread layer op has been added, to fetch the address of the variable.
>
> OK, I see how it works now. This is workable for gdbserver; I'll just
> have to figure out how to ask for the link map address in some portable
> way. This will take some thinking; the best way to do it involves
> noticeable protocol changes...
>
Yeah, that's the part that gave me the most hard time. I am not sure
that it really belongs in solib-svr4.c, but it is the "best" place I
could think of putting it in.
Elena
> --
> Daniel Jacobowitz
> MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFC/RFA] TLS support part 2
2002-10-02 6:39 [RFC/RFA] TLS support part 2 Elena Zannoni
2002-10-02 7:57 ` Daniel Jacobowitz
@ 2002-10-21 12:31 ` Elena Zannoni
2002-11-07 7:01 ` Elena Zannoni
2002-11-11 18:41 ` Elena Zannoni
3 siblings, 0 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-10-21 12:31 UTC (permalink / raw)
To: msnyder; +Cc: gdb-patches
Elena Zannoni writes:
>
> Here is the thread/target related part of the TLS support.
>
> A new thread layer op has been added, to fetch the address of the variable.
>
> Elena
>
Michael, any comments on this? Can I check it in?
Thanks
Elena
>
> 2002-10-02 Elena Zannoni <ezannoni@redhat.com>
> Jim Blandy <jimb@redhat.com>
>
> * gdb_thread_db.h (enum): Add TD_NOTALLOC.
> * target.c (update_current_target): Add
> to_get_thread_local_address.
> * target.h (to_get_thread_local_address): Export.
> (target_get_thread_local_address): Define.
> (target_get_thread_local_address_p): Define.
> * thread-db.c: Include solib-svr4.h.
> (td_thr_tls_get_addr_p): Define.
> (thread_db_load): Get a pointer to td_thr_tls_get_addr.
> (thread_db_get_thread_local_address): New function.
> (init_thread_db_ops): Initialize to_get_thread_local_address.
>
> Index: gdb_thread_db.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdb_thread_db.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 gdb_thread_db.h
> --- gdb_thread_db.h 6 Mar 2001 08:21:07 -0000 1.3
> +++ gdb_thread_db.h 2 Oct 2002 13:36:40 -0000
> @@ -63,7 +63,8 @@ typedef enum
> TD_NOTSD, /* No thread-specific data available. */
> TD_MALLOC, /* Out of memory. */
> TD_PARTIALREG, /* Not entire register set was read or written. */
> - TD_NOXREGS /* X register set not available for given thread. */
> + TD_NOXREGS, /* X register set not available for given thread. */
> + TD_NOTALLOC /* TLS memory not yet allocated. */
> } td_err_e;
>
> Index: target.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/target.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 target.c
> --- target.c 26 Aug 2002 19:18:33 -0000 1.40
> +++ target.c 2 Oct 2002 13:36:12 -0000
> @@ -666,6 +666,7 @@ update_current_target (void)
> INHERIT (to_async_mask_value, t);
> INHERIT (to_find_memory_regions, t);
> INHERIT (to_make_corefile_notes, t);
> + INHERIT (to_get_thread_local_address, t);
> INHERIT (to_magic, t);
>
> #undef INHERIT
>
> Index: target.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/target.h,v
> retrieving revision 1.26
> diff -u -p -r1.26 target.h
> --- target.h 26 Aug 2002 19:18:33 -0000 1.26
> +++ target.h 2 Oct 2002 13:37:08 -0000
> @@ -328,6 +328,16 @@ struct target_ops
> void *),
> void *);
> char * (*to_make_corefile_notes) (bfd *, int *);
> +
> + /* Return the thread-local address at OFFSET in the
> + thread-local storage for the thread PTID and the shared library
> + or executable file given by OBJFILE. If that block of
> + thread-local storage hasn't been allocated yet, this function
> + may return an error. */
> + CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
> + struct objfile *objfile,
> + CORE_ADDR offset);
> +
> int to_magic;
> /* Need sub-structure for target machine related rather than comm related?
> */
> @@ -1038,6 +1048,12 @@ extern void (*target_new_objfile_hook) (
>
> #define target_make_corefile_notes(BFD, SIZE_P) \
> (current_target.to_make_corefile_notes) (BFD, SIZE_P)
> +
> +/* Thread-local values. */
> +#define target_get_thread_local_address \
> + (current_target.to_get_thread_local_address)
> +#define target_get_thread_local_address_p() \
> + (target_get_thread_local_address != NULL)
>
> /* Hook to call target-dependent code after reading in a new symbol table. */
>
>
> Index: thread-db.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/thread-db.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 thread-db.c
> --- thread-db.c 23 Mar 2002 17:38:13 -0000 1.22
> +++ thread-db.c 2 Oct 2002 13:36:04 -0000
> @@ -32,6 +32,7 @@
> #include "objfiles.h"
> #include "target.h"
> #include "regcache.h"
> +#include "solib-svr4.h"
>
> #ifndef LIBTHREAD_DB_SO
> #define LIBTHREAD_DB_SO "libthread_db.so.1"
> @@ -108,6 +109,11 @@ static td_err_e (*td_thr_setgregs_p) (co
> prgregset_t gregs);
> static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, int event);
>
> +static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
> + void *map_address,
> + size_t offset,
> + void **address);
> +
> /* Location of the thread creation event breakpoint. The code at this
> location in the child process will be called by the pthread library
> whenever a new thread is created. By setting a special breakpoint
> @@ -348,6 +354,7 @@ thread_db_load (void)
> td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
> td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
> td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
> + td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
>
> return 1;
> }
> @@ -1003,6 +1010,97 @@ thread_db_pid_to_str (ptid_t ptid)
> return normal_pid_to_str (ptid);
> }
>
> +/* Get the address of the thread local variable in OBJFILE which is
> + stored at OFFSET within the thread local storage for thread PTID. */
> +
> +static CORE_ADDR
> +thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
> + CORE_ADDR offset)
> +{
> + if (is_thread (ptid))
> + {
> + int objfile_is_library = (objfile->flags & OBJF_SHARED);
> + td_err_e err;
> + td_thrhandle_t th;
> + void *address;
> + CORE_ADDR lm;
> +
> + /* glibc doesn't provide the needed interface. */
> + if (! td_thr_tls_get_addr_p)
> + error ("Cannot find thread-local variables in this thread library.");
> +
> + /* Get the address of the link map for this objfile. */
> + lm = svr4_fetch_objfile_link_map (objfile);
> +
> + /* Whoops, we couldn't find one. Bail out. */
> + if (!lm)
> + {
> + if (objfile_is_library)
> + error ("Cannot find shared library `%s' link_map in dynamic"
> + " linker's module list", objfile->name);
> + else
> + error ("Cannot find executable file `%s' link_map in dynamic"
> + " linker's module list", objfile->name);
> + }
> +
> + /* Get info about the thread. */
> + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
> + if (err != TD_OK)
> + error ("Cannot find thread %ld: %s",
> + (long) GET_THREAD (ptid), thread_db_err_str (err));
> +
> + /* Finally, get the address of the variable. */
> + err = td_thr_tls_get_addr_p (&th, (void *) lm, offset, &address);
> +
> +#ifdef THREAD_DB_HAS_TD_NOTALLOC
> + /* The memory hasn't been allocated, yet. */
> + if (err == TD_NOTALLOC)
> + {
> + /* Now, if libthread_db provided the initialization image's
> + address, we *could* try to build a non-lvalue value from
> + the initialization image. */
> + if (objfile_is_library)
> + error ("The inferior has not yet allocated storage for"
> + " thread-local variables in\n"
> + "the shared library `%s'\n"
> + "for the thread %ld",
> + objfile->name, (long) GET_THREAD (ptid));
> + else
> + error ("The inferior has not yet allocated storage for"
> + " thread-local variables in\n"
> + "the executable `%s'\n"
> + "for the thread %ld",
> + objfile->name, (long) GET_THREAD (ptid));
> + }
> +#endif
> +
> + /* Something else went wrong. */
> + if (err != TD_OK)
> + {
> + if (objfile_is_library)
> + error ("Cannot find thread-local storage for thread %ld, "
> + "shared library %s:\n%s",
> + (long) GET_THREAD (ptid),
> + objfile->name,
> + thread_db_err_str (err));
> + else
> + error ("Cannot find thread-local storage for thread %ld, "
> + "executable file %s:\n%s",
> + (long) GET_THREAD (ptid),
> + objfile->name,
> + thread_db_err_str (err));
> + }
> +
> + /* Cast assuming host == target. Joy. */
> + return (CORE_ADDR) address;
> + }
> +
> + if (target_beneath->to_get_thread_local_address)
> + return target_beneath->to_get_thread_local_address (ptid, objfile, offset);
> +
> + error ("Cannot find thread-local values on this target.");
> +}
> +
> static void
> init_thread_db_ops (void)
> {
> @@ -1025,6 +1123,8 @@ init_thread_db_ops (void)
> thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
> thread_db_ops.to_stratum = thread_stratum;
> thread_db_ops.to_has_thread_control = tc_schedlock;
> + thread_db_ops.to_get_thread_local_address
> + = thread_db_get_thread_local_address;
> thread_db_ops.to_magic = OPS_MAGIC;
> }
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFC/RFA] TLS support part 2
2002-10-02 6:39 [RFC/RFA] TLS support part 2 Elena Zannoni
2002-10-02 7:57 ` Daniel Jacobowitz
2002-10-21 12:31 ` Elena Zannoni
@ 2002-11-07 7:01 ` Elena Zannoni
2002-11-08 12:06 ` Mark Kettenis
2002-11-11 18:41 ` Elena Zannoni
3 siblings, 1 reply; 8+ messages in thread
From: Elena Zannoni @ 2002-11-07 7:01 UTC (permalink / raw)
To: msnyder; +Cc: gdb-patches, kettenis
re-ping.......
Elena Zannoni writes:
>
> Here is the thread/target related part of the TLS support.
>
> A new thread layer op has been added, to fetch the address of the variable.
>
> Elena
>
>
> 2002-10-02 Elena Zannoni <ezannoni@redhat.com>
> Jim Blandy <jimb@redhat.com>
>
> * gdb_thread_db.h (enum): Add TD_NOTALLOC.
> * target.c (update_current_target): Add
> to_get_thread_local_address.
> * target.h (to_get_thread_local_address): Export.
> (target_get_thread_local_address): Define.
> (target_get_thread_local_address_p): Define.
> * thread-db.c: Include solib-svr4.h.
> (td_thr_tls_get_addr_p): Define.
> (thread_db_load): Get a pointer to td_thr_tls_get_addr.
> (thread_db_get_thread_local_address): New function.
> (init_thread_db_ops): Initialize to_get_thread_local_address.
>
> Index: gdb_thread_db.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdb_thread_db.h,v
> retrieving revision 1.3
> diff -u -p -r1.3 gdb_thread_db.h
> --- gdb_thread_db.h 6 Mar 2001 08:21:07 -0000 1.3
> +++ gdb_thread_db.h 2 Oct 2002 13:36:40 -0000
> @@ -63,7 +63,8 @@ typedef enum
> TD_NOTSD, /* No thread-specific data available. */
> TD_MALLOC, /* Out of memory. */
> TD_PARTIALREG, /* Not entire register set was read or written. */
> - TD_NOXREGS /* X register set not available for given thread. */
> + TD_NOXREGS, /* X register set not available for given thread. */
> + TD_NOTALLOC /* TLS memory not yet allocated. */
> } td_err_e;
>
> Index: target.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/target.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 target.c
> --- target.c 26 Aug 2002 19:18:33 -0000 1.40
> +++ target.c 2 Oct 2002 13:36:12 -0000
> @@ -666,6 +666,7 @@ update_current_target (void)
> INHERIT (to_async_mask_value, t);
> INHERIT (to_find_memory_regions, t);
> INHERIT (to_make_corefile_notes, t);
> + INHERIT (to_get_thread_local_address, t);
> INHERIT (to_magic, t);
>
> #undef INHERIT
>
> Index: target.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/target.h,v
> retrieving revision 1.26
> diff -u -p -r1.26 target.h
> --- target.h 26 Aug 2002 19:18:33 -0000 1.26
> +++ target.h 2 Oct 2002 13:37:08 -0000
> @@ -328,6 +328,16 @@ struct target_ops
> void *),
> void *);
> char * (*to_make_corefile_notes) (bfd *, int *);
> +
> + /* Return the thread-local address at OFFSET in the
> + thread-local storage for the thread PTID and the shared library
> + or executable file given by OBJFILE. If that block of
> + thread-local storage hasn't been allocated yet, this function
> + may return an error. */
> + CORE_ADDR (*to_get_thread_local_address) (ptid_t ptid,
> + struct objfile *objfile,
> + CORE_ADDR offset);
> +
> int to_magic;
> /* Need sub-structure for target machine related rather than comm related?
> */
> @@ -1038,6 +1048,12 @@ extern void (*target_new_objfile_hook) (
>
> #define target_make_corefile_notes(BFD, SIZE_P) \
> (current_target.to_make_corefile_notes) (BFD, SIZE_P)
> +
> +/* Thread-local values. */
> +#define target_get_thread_local_address \
> + (current_target.to_get_thread_local_address)
> +#define target_get_thread_local_address_p() \
> + (target_get_thread_local_address != NULL)
>
> /* Hook to call target-dependent code after reading in a new symbol table. */
>
>
> Index: thread-db.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/thread-db.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 thread-db.c
> --- thread-db.c 23 Mar 2002 17:38:13 -0000 1.22
> +++ thread-db.c 2 Oct 2002 13:36:04 -0000
> @@ -32,6 +32,7 @@
> #include "objfiles.h"
> #include "target.h"
> #include "regcache.h"
> +#include "solib-svr4.h"
>
> #ifndef LIBTHREAD_DB_SO
> #define LIBTHREAD_DB_SO "libthread_db.so.1"
> @@ -108,6 +109,11 @@ static td_err_e (*td_thr_setgregs_p) (co
> prgregset_t gregs);
> static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, int event);
>
> +static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
> + void *map_address,
> + size_t offset,
> + void **address);
> +
> /* Location of the thread creation event breakpoint. The code at this
> location in the child process will be called by the pthread library
> whenever a new thread is created. By setting a special breakpoint
> @@ -348,6 +354,7 @@ thread_db_load (void)
> td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
> td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
> td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
> + td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
>
> return 1;
> }
> @@ -1003,6 +1010,97 @@ thread_db_pid_to_str (ptid_t ptid)
> return normal_pid_to_str (ptid);
> }
>
> +/* Get the address of the thread local variable in OBJFILE which is
> + stored at OFFSET within the thread local storage for thread PTID. */
> +
> +static CORE_ADDR
> +thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
> + CORE_ADDR offset)
> +{
> + if (is_thread (ptid))
> + {
> + int objfile_is_library = (objfile->flags & OBJF_SHARED);
> + td_err_e err;
> + td_thrhandle_t th;
> + void *address;
> + CORE_ADDR lm;
> +
> + /* glibc doesn't provide the needed interface. */
> + if (! td_thr_tls_get_addr_p)
> + error ("Cannot find thread-local variables in this thread library.");
> +
> + /* Get the address of the link map for this objfile. */
> + lm = svr4_fetch_objfile_link_map (objfile);
> +
> + /* Whoops, we couldn't find one. Bail out. */
> + if (!lm)
> + {
> + if (objfile_is_library)
> + error ("Cannot find shared library `%s' link_map in dynamic"
> + " linker's module list", objfile->name);
> + else
> + error ("Cannot find executable file `%s' link_map in dynamic"
> + " linker's module list", objfile->name);
> + }
> +
> + /* Get info about the thread. */
> + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
> + if (err != TD_OK)
> + error ("Cannot find thread %ld: %s",
> + (long) GET_THREAD (ptid), thread_db_err_str (err));
> +
> + /* Finally, get the address of the variable. */
> + err = td_thr_tls_get_addr_p (&th, (void *) lm, offset, &address);
> +
> +#ifdef THREAD_DB_HAS_TD_NOTALLOC
> + /* The memory hasn't been allocated, yet. */
> + if (err == TD_NOTALLOC)
> + {
> + /* Now, if libthread_db provided the initialization image's
> + address, we *could* try to build a non-lvalue value from
> + the initialization image. */
> + if (objfile_is_library)
> + error ("The inferior has not yet allocated storage for"
> + " thread-local variables in\n"
> + "the shared library `%s'\n"
> + "for the thread %ld",
> + objfile->name, (long) GET_THREAD (ptid));
> + else
> + error ("The inferior has not yet allocated storage for"
> + " thread-local variables in\n"
> + "the executable `%s'\n"
> + "for the thread %ld",
> + objfile->name, (long) GET_THREAD (ptid));
> + }
> +#endif
> +
> + /* Something else went wrong. */
> + if (err != TD_OK)
> + {
> + if (objfile_is_library)
> + error ("Cannot find thread-local storage for thread %ld, "
> + "shared library %s:\n%s",
> + (long) GET_THREAD (ptid),
> + objfile->name,
> + thread_db_err_str (err));
> + else
> + error ("Cannot find thread-local storage for thread %ld, "
> + "executable file %s:\n%s",
> + (long) GET_THREAD (ptid),
> + objfile->name,
> + thread_db_err_str (err));
> + }
> +
> + /* Cast assuming host == target. Joy. */
> + return (CORE_ADDR) address;
> + }
> +
> + if (target_beneath->to_get_thread_local_address)
> + return target_beneath->to_get_thread_local_address (ptid, objfile, offset);
> +
> + error ("Cannot find thread-local values on this target.");
> +}
> +
> static void
> init_thread_db_ops (void)
> {
> @@ -1025,6 +1123,8 @@ init_thread_db_ops (void)
> thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
> thread_db_ops.to_stratum = thread_stratum;
> thread_db_ops.to_has_thread_control = tc_schedlock;
> + thread_db_ops.to_get_thread_local_address
> + = thread_db_get_thread_local_address;
> thread_db_ops.to_magic = OPS_MAGIC;
> }
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFC/RFA] TLS support part 2
2002-10-02 6:39 [RFC/RFA] TLS support part 2 Elena Zannoni
` (2 preceding siblings ...)
2002-11-07 7:01 ` Elena Zannoni
@ 2002-11-11 18:41 ` Elena Zannoni
3 siblings, 0 replies; 8+ messages in thread
From: Elena Zannoni @ 2002-11-11 18:41 UTC (permalink / raw)
To: gdb-patches
Elena Zannoni writes:
>
> Here is the thread/target related part of the TLS support.
>
> A new thread layer op has been added, to fetch the address of the variable.
>
> Elena
>
>
> 2002-10-02 Elena Zannoni <ezannoni@redhat.com>
> Jim Blandy <jimb@redhat.com>
>
> * gdb_thread_db.h (enum): Add TD_NOTALLOC.
> * target.c (update_current_target): Add
> to_get_thread_local_address.
> * target.h (to_get_thread_local_address): Export.
> (target_get_thread_local_address): Define.
> (target_get_thread_local_address_p): Define.
> * thread-db.c: Include solib-svr4.h.
> (td_thr_tls_get_addr_p): Define.
> (thread_db_load): Get a pointer to td_thr_tls_get_addr.
> (thread_db_get_thread_local_address): New function.
> (init_thread_db_ops): Initialize to_get_thread_local_address.
>
Committed.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2002-11-12 2:41 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-02 6:39 [RFC/RFA] TLS support part 2 Elena Zannoni
2002-10-02 7:57 ` Daniel Jacobowitz
2002-10-02 8:29 ` Elena Zannoni
2002-10-21 12:31 ` Elena Zannoni
2002-11-07 7:01 ` Elena Zannoni
2002-11-08 12:06 ` Mark Kettenis
2002-11-08 12:20 ` Elena Zannoni
2002-11-11 18:41 ` Elena Zannoni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox