diff options
author | Tom Tromey <tromey@adacore.com> | 2019-08-13 11:39:58 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2019-08-19 10:32:03 -0600 |
commit | f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee (patch) | |
tree | b59e02ba87703ec277f2f63dbc1e6b617d3b6b92 /gdb/block.h | |
parent | d806ea2d0ef362fcddd2c1659f537b68aa114203 (diff) | |
download | fsf-binutils-gdb-f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee.zip fsf-binutils-gdb-f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee.tar.gz fsf-binutils-gdb-f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee.tar.bz2 |
Fix Fortran regression with variables in nested functions
Sergio pointed out that commit commit aa3b6533 ("Allow nested function
displays") regressed a few gdb.fortran tests. I was able to reproduce
these failures with gcc head.
The bug is that some spots calling contained_in will in fact do the
wrong thing if nested functions are considered as contained. In the
particular case of the Fortran regression, it was the call in
block_innermost_frame, being called from get_hosting_frame -- in this
case, the caller is specifically trying to avoid the nested case.
This patch fixes the problem by adding an "allow_nested" parameter to
contained_in, essentially reverting the change for most callers.
gdb/ChangeLog
2019-08-19 Tom Tromey <tromey@adacore.com>
* printcmd.c (do_one_display, info_display_command): Update.
* block.h (contained_in): Return bool. Add allow_nested
parameter.
* block.c (contained_in): Return bool. Add allow_nested
parameter.
Diffstat (limited to 'gdb/block.h')
-rw-r--r-- | gdb/block.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/gdb/block.h b/gdb/block.h index 9291deb..4c02e01 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -219,7 +219,15 @@ extern struct symbol *block_containing_function (const struct block *); extern int block_inlined_p (const struct block *block); -extern int contained_in (const struct block *, const struct block *); +/* Return true if block A is lexically nested within block B, or if a + and b have the same pc range. Return false otherwise. If + ALLOW_NESTED is true, then block A is considered to be in block B + if A is in a nested function in B's function. If ALLOW_NESTED is + false (the default), then blocks in nested functions are not + considered to be contained. */ + +extern bool contained_in (const struct block *a, const struct block *b, + bool allow_nested = false); extern const struct blockvector *blockvector_for_pc (CORE_ADDR, const struct block **); |