diff options
author | Tom Tromey <tom@tromey.com> | 2019-03-23 10:11:51 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-03-23 10:59:10 -0600 |
commit | 7ad417dd217849c164e3c8a250c62a98eb0b8cd4 (patch) | |
tree | 7c5a868ea6aa91f34146092c15dd550986086218 /gdb/parser-defs.h | |
parent | b366c208ee07924cc3cafc1bd4d70548bc91075b (diff) | |
download | gdb-7ad417dd217849c164e3c8a250c62a98eb0b8cd4.zip gdb-7ad417dd217849c164e3c8a250c62a98eb0b8cd4.tar.gz gdb-7ad417dd217849c164e3c8a250c62a98eb0b8cd4.tar.bz2 |
Have parser reset the innermost block tracker
I ran across a comment in symfile.c today:
/* Clear globals which might have pointed into a removed objfile.
FIXME: It's not clear which of these are supposed to persist
between expressions and which ought to be reset each time. */
It seems to me that this can be clarified: the parser entry points
ought to reset the innermost block tracker (and the expression context
block), and these should not be considered valid for code to use at
arbitrary times -- only immediately after an expression has been
parsed.
This patch implements this idea. This could be further improved by
removing the parser globals and changing the parser functions to
return this information, but I have not done this.
Tested by the buildbot.
gdb/ChangeLog
2019-03-23 Tom Tromey <tom@tromey.com>
* varobj.c (varobj_create): Update.
* symfile.c (clear_symtab_users): Don't reset innermost_block.
* printcmd.c (display_command, do_one_display): Don't reset
innermost_block.
* parser-defs.h (enum innermost_block_tracker_type): Move to
expression.h.
(innermost_block): Update comment.
* parse.c (parse_exp_1): Add tracker_types parameter.
(parse_exp_in_context): Rename from parse_exp_in_context_1. Add
tracker_types parameter. Reset innermost_block.
(parse_exp_in_context): Remove.
(parse_expression_for_completion): Update.
* objfiles.c (~objfile): Don't reset expression_context_block or
innermost_block.
* expression.h (enum innermost_block_tracker_type): Move from
parser-defs.h.
(parse_exp_1): Add tracker_types parameter.
* breakpoint.c (set_breakpoint_condition, watch_command_1): Don't
reset innermost_block.
Diffstat (limited to 'gdb/parser-defs.h')
-rw-r--r-- | gdb/parser-defs.h | 23 |
1 files changed, 3 insertions, 20 deletions
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index a607eea..26e0a83 100644 --- a/gdb/parser-defs.h +++ b/gdb/parser-defs.h @@ -75,24 +75,6 @@ extern const struct block *expression_context_block; then look up the macro definitions active at that point. */ extern CORE_ADDR expression_context_pc; -/* While parsing expressions we need to track the innermost lexical block - that we encounter. In some situations we need to track the innermost - block just for symbols, and in other situations we want to track the - innermost block for symbols and registers. These flags are used by the - innermost block tracker to control which blocks we consider for the - innermost block. These flags can be combined together as needed. */ - -enum innermost_block_tracker_type -{ - /* Track the innermost block for symbols within an expression. */ - INNERMOST_BLOCK_FOR_SYMBOLS = (1 << 0), - - /* Track the innermost block for registers within an expression. */ - INNERMOST_BLOCK_FOR_REGISTERS = (1 << 1) -}; -DEF_ENUM_FLAGS_TYPE (enum innermost_block_tracker_type, - innermost_block_tracker_types); - /* When parsing expressions we track the innermost block that was referenced. */ @@ -146,8 +128,9 @@ private: }; /* The innermost context required by the stack and register variables - we've encountered so far. This should be cleared before parsing an - expression, and queried once the parse is complete. */ + we've encountered so far. This is cleared by the expression + parsing functions before parsing an expression, and can queried + once the parse is complete. */ extern innermost_block_tracker innermost_block; /* Number of arguments seen so far in innermost function call. */ |