From: Jim Blandy <jimb@redhat.com>
To: Andrew Cagney <ac131313@cygnus.com>
Cc: gdb@sources.redhat.com
Subject: Re: GDB support for thread-local storage
Date: Fri, 21 Jun 2002 16:08:00 -0000 [thread overview]
Message-ID: <nplm98qlgh.fsf@zwingli.cygnus.com> (raw)
In-Reply-To: <3D13A2D5.70801@cygnus.com>
Andrew Cagney <ac131313@cygnus.com> writes:
> > /* Get address of thread local variable. */
> > extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
> > struct link_map *__map, size_t __offset,
> > void **__address);
> > This takes a thread handle, an entry from the dynamic linker's link
> > map, and an offset, and sets *__address to point to the base of that
> > thread and module's thread-local storage, plus the offset. It returns
> > an error code if the space hasn't been allocated yet.
>
> What does GDB do if there isn't [yet] any allocated local storage?
Oh, sorry --- what does *GDB* do?
It depends. For the first cut, it returns an error:
(gdb) print i
Storage for the thread-local variable `i' has not been allocated in
this thread yet.
(gdb)
But there are ways we could do better than that.
It's tempting to suggest that referring to unallocated thread-local
storage should cause the storage to be allocated. This emulates the
way variable references in the actual program behave most closely.
However, this is a pretty heavy-duty operation. It involves calling a
function in the inferior, which will do a malloc, copy in the
initialization image, update thread structures, and so on. I don't
think simply trying to print a variable should cause that kind of
disturbance in the inferior.
Instead, I think trying to print an unallocated __thread variable
should cause an error, which suggests that the user try a command
`thread allocate VAR', which will do the right inferior-disturbing
magic to make VAR exist. That way, the user has control over the
process, and GDB doesn't munge her inferior in unexpected ways.
There is a middle ground. Initializing a thread-local storage block
is simply a memcpy of the initialization image. There are no relocs
to apply --- stuff like this:
__thread int i;
__thread int *pi = &i;
is forbidden. This means that there's an exact copy of all the bits
each variable *would* have, if it *were* allocated --- they're just
immutable, and at the wrong address.
So a really clever implementation could actually give you the value of
a thread-local variable like `i' even when it hasn't been allocated
yet. It would be a non-lazy value, not an lvalue, and have no
address, but at least `print i' would give you the right answer. We
could even set a bit on the value so that an attempt to assign to it
would give a helpful error message:
(gdb) set var i = 2
Storage for the thread-local variable `i' has not been allocated
in this thread yet. Type `thread allocate i' to allocate it.
(gdb)
Or something like that.
Anyway, that's why the gdbarch and target methods I proposed are
producing `struct value' objects, and not something more low-level ---
to leave open the option of handling unallocated values this way.
next prev parent reply other threads:[~2002-06-21 23:08 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-19 9:00 Jim Blandy
2002-06-19 10:08 ` Daniel Berlin
2002-06-19 12:20 ` Jim Blandy
2002-06-19 13:12 ` Daniel Berlin
2002-06-19 13:40 ` Jim Blandy
2002-06-20 18:35 ` Andrew Cagney
2002-06-20 18:48 ` Daniel Jacobowitz
2002-06-21 10:18 ` Andrew Cagney
2002-06-21 10:32 ` Daniel Jacobowitz
2002-06-21 13:08 ` Jim Blandy
2002-06-21 13:18 ` Daniel Jacobowitz
2002-06-21 13:54 ` Jim Blandy
2002-06-21 14:03 ` Daniel Jacobowitz
2002-06-21 14:46 ` Andrew Cagney
2002-06-21 14:55 ` Daniel Jacobowitz
2002-06-21 15:31 ` Andrew Cagney
2002-06-21 22:59 ` Daniel Jacobowitz
2002-06-22 8:22 ` Andrew Cagney
2002-06-24 7:53 ` Daniel Jacobowitz
2002-06-21 16:14 ` Jim Blandy
2002-06-21 22:57 ` Daniel Jacobowitz
2002-06-26 12:37 ` Jim Blandy
2002-06-21 13:20 ` Daniel Jacobowitz
2002-06-21 15:37 ` Jim Blandy
2002-06-21 23:00 ` Daniel Jacobowitz
2002-06-21 12:34 ` Jim Blandy
2002-06-21 12:49 ` Jim Blandy
2002-06-21 18:10 ` Jim Blandy
2002-06-21 20:24 ` Andrew Cagney
2002-06-21 21:09 ` Jim Blandy
2002-06-22 8:31 ` Andrew Cagney
2002-06-21 15:04 ` Andrew Cagney
2002-06-21 15:41 ` Jim Blandy
2002-06-21 15:59 ` Andrew Cagney
2002-06-21 16:08 ` Jim Blandy [this message]
2002-06-22 1:04 ` unsuscribe phi
[not found] <1024952640.13693.ezmlm@sources.redhat.com>
2002-06-25 1:48 ` GDB support for thread-local storage James Cownie
2002-06-25 8:05 ` Daniel Jacobowitz
2002-06-25 8:31 ` James Cownie
2002-06-25 8:42 ` Daniel Jacobowitz
2002-06-25 8:53 ` James Cownie
2002-06-25 8:56 ` Daniel Jacobowitz
2002-06-25 9:11 ` James Cownie
2002-06-25 9:29 ` Daniel Jacobowitz
2002-06-25 10:44 ` Andrew Cagney
2002-06-25 10:02 ` Daniel Jacobowitz
2002-06-26 12:45 ` Jim Blandy
2002-06-26 19:31 ` Andrew Cagney
2002-06-26 21:57 ` Jim Blandy
2002-06-27 8:13 ` Andrew Cagney
2002-08-19 9:05 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=nplm98qlgh.fsf@zwingli.cygnus.com \
--to=jimb@redhat.com \
--cc=ac131313@cygnus.com \
--cc=gdb@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox