From: Pedro Alves <palves@redhat.com>
To: Pierre-Marie de Rodat <derodat@adacore.com>,
GDB Patches <gdb-patches@sourceware.org>
Subject: Re: [PATCH] Add proper handling for non-local references in nested subprograms
Date: Tue, 10 Mar 2015 15:26:00 -0000 [thread overview]
Message-ID: <54FF0D05.70907@redhat.com> (raw)
In-Reply-To: <54F47563.4050103@adacore.com>
Hi Pierre-Marie,
I would have helped this reader to include an example of "non-local references
in nested subprograms" in the mail body :-) Given the reference to
"subprograms" in the subject, I assumed this was an Ada-specific
patch. I happened to skim the patch anyway, until I saw at the end
that this also handles C nested functions. Nice! :-)
On 03/02/2015 02:36 PM, Pierre-Marie de Rodat wrote:
> GDB's current behavior when dealing with non-local references in the
> context of nested subprograms is approximative:
>
> - code using valops.c:value_of_variable read the first available stack
> frame that holds the corresponding variable (whereas there can be
> multiple candidates for this);
>
> - code directly relying on read_var_value will instead read non-local
> variables in frames where they are not even defined.
>
> This change adds necessary information to symbols (the block they belong
> to) and to blocks (the static link property, if any) so that GDB can
> make the proper decisions when dealing with non-local variables.
>
> Regtested on x86_64-linux with both GCC 4.9.2 and a patched GCC (see
> <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53927>).
>
> PS: I'm aware that this patches increases the size of two critical data
> structures (namely struct block and struct symbol) and I'm completely
> open to suggestions. :-)
Right, that's a problem. We've been moving in the opposite direction...
The block knows which symbols it has inside. When we look up symbols,
we always know which block we're searching the symbols in... If
you need to know which block a symbol look up found a symbol in,
there's the "block_found" for that. That's obviously an ugly hack, but
it's there and so you can use it. If someone is motivated to clean this
up, it'd be better to make the symbol lookup functions return a
structure that included both symbol and block (and maybe more), in
the spirit of struct bound_minimal_symbol:
/* Several lookup functions return both a minimal symbol and the
objfile in which it is found. This structure is used in these
cases. */
struct bound_minimal_symbol
{
/* The minimal symbol that was found, or NULL if no minimal symbol
was found. */
struct minimal_symbol *minsym;
/* If MINSYM is not NULL, then this is the objfile in which the
symbol is defined. */
struct objfile *objfile;
};
For the block->static_link case, maybe put the static link chain
in a separate hash indexed by block?
>
> Since I'm not sure of how this issue should be solved, I'm
> nevertheless posting this patch here so this matter can be discussed. In
> the context of this feature, I think we need a backlink from all symbols
> to the corresponding embedding block but on the other hand only a few
> blocks have static link: maybe we could turn this static_link field into
> a objfile-based hashtable lookup. Thoughts?
Ah, yeah, something like that. :-)
Thanks,
Pedro Alves
next prev parent reply other threads:[~2015-03-10 15:26 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-02 14:36 Pierre-Marie de Rodat
2015-03-10 15:26 ` Pedro Alves [this message]
2015-03-20 12:24 ` [PATCH] Add proper handling for non-local references in nested functions Pierre-Marie de Rodat
2015-05-29 12:28 ` Pedro Alves
2015-06-09 21:46 ` Pierre-Marie de Rodat
2015-07-22 9:16 ` Pierre-Marie de Rodat
2015-07-22 14:26 ` Doug Evans
2015-07-22 15:14 ` Pierre-Marie de Rodat
2015-07-26 17:28 ` Doug Evans
2015-07-22 17:58 ` Kevin Buettner
2015-07-23 1:36 ` Kevin Buettner
2015-07-23 10:44 ` Pierre-Marie de Rodat
2015-07-23 13:44 ` Kevin Buettner
2015-07-23 16:14 ` Pierre-Marie de Rodat
2015-07-23 17:22 ` Kevin Buettner
2015-07-23 17:33 ` Pierre-Marie de Rodat
2015-07-23 17:51 ` Kevin Buettner
2015-07-23 18:06 ` Kevin Buettner
2015-07-23 18:23 ` Kevin Buettner
2015-07-24 10:38 ` Pierre-Marie de Rodat
2015-07-26 17:39 ` Doug Evans
2015-07-24 9:26 ` Pierre-Marie de Rodat
2015-07-26 20:35 ` Doug Evans
2015-07-31 10:53 ` Pierre-Marie de Rodat
2015-08-10 8:34 ` Pierre-Marie de Rodat
2015-08-13 15:03 ` Doug Evans
2015-08-14 6:31 ` Pierre-Marie de Rodat
2015-08-15 5:12 ` Doug Evans
2015-08-15 6:21 ` Doug Evans
2015-08-17 13:27 ` Pierre-Marie de Rodat
2015-08-17 13:33 ` Pierre-Marie de Rodat
2015-08-22 17:30 ` Doug Evans
2015-08-25 12:14 ` Pierre-Marie de Rodat
2015-09-02 23:50 ` Joel Brobecker
2015-09-03 7:31 ` Pierre-Marie de Rodat
2015-09-03 12:40 ` Joel Brobecker
2015-09-03 14:03 ` Pierre-Marie de Rodat
2015-09-16 16:16 ` Doug Evans
2015-09-20 18:20 ` pushed: " Joel Brobecker
2015-08-15 5:13 ` Doug Evans
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=54FF0D05.70907@redhat.com \
--to=palves@redhat.com \
--cc=derodat@adacore.com \
--cc=gdb-patches@sourceware.org \
/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