aboutsummaryrefslogtreecommitdiff
path: root/gdb/block.h
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2019-08-13 11:39:58 -0600
committerTom Tromey <tromey@adacore.com>2019-08-19 10:32:03 -0600
commitf21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee (patch)
treeb59e02ba87703ec277f2f63dbc1e6b617d3b6b92 /gdb/block.h
parentd806ea2d0ef362fcddd2c1659f537b68aa114203 (diff)
downloadbinutils-f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee.zip
binutils-f21c2bd7b7ef2a9c47e5713cabaa784bcf5c2bee.tar.gz
binutils-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.h10
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 **);