aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-04-28 08:38:38 -0600
committerTom Tromey <tromey@adacore.com>2023-05-23 13:57:54 -0600
commit87b647cfb13a47effebe185b7dcc733b45f51789 (patch)
tree86106e0e6997b679bcf4eebc0c4b3a3509a2c4ab
parente360af5af8e0ecb3eb62cf3970e9d1df0289c781 (diff)
downloadbinutils-87b647cfb13a47effebe185b7dcc733b45f51789.zip
binutils-87b647cfb13a47effebe185b7dcc733b45f51789.tar.gz
binutils-87b647cfb13a47effebe185b7dcc733b45f51789.tar.bz2
Add PARSER_LEAVE_BLOCK_ALONE flag
This adds a PARSER_LEAVE_BLOCK_ALONE flag, and changes the parse API to respect it. This flag lets callers avoid any change to the passed-in block and expression PC, letting them specify the context exactly. In particular, now nullptr can be used to indicate that the parse should not examine any local variables.
-rw-r--r--gdb/expression.h6
-rw-r--r--gdb/parse.c37
2 files changed, 27 insertions, 16 deletions
diff --git a/gdb/expression.h b/gdb/expression.h
index c485b15..d185877 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -301,6 +301,12 @@ enum parser_flag
it parses. For yacc-based parsers, this translates to setting
yydebug. */
PARSER_DEBUG = (1 << 2),
+
+ /* Normally the expression-parsing functions like parse_exp_1 will
+ attempt to find a context block if one is not passed in. If set,
+ this flag suppresses this search and uses a null context for the
+ parse. */
+ PARSER_LEAVE_BLOCK_ALONE = (1 << 3),
};
DEF_ENUM_FLAGS_TYPE (enum parser_flag, parser_flags);
diff --git a/gdb/parse.c b/gdb/parse.c
index bbe5cf1..221733a 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -344,26 +344,31 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
if (tracker == nullptr)
tracker = &local_tracker;
- /* If no context specified, try using the current frame, if any. */
- if (!expression_context_block)
- expression_context_block = get_selected_block (&expression_context_pc);
- else if (pc == 0)
- expression_context_pc = expression_context_block->entry_pc ();
- else
- expression_context_pc = pc;
+ if ((flags & PARSER_LEAVE_BLOCK_ALONE) == 0)
+ {
+ /* If no context specified, try using the current frame, if any. */
+ if (!expression_context_block)
+ expression_context_block
+ = get_selected_block (&expression_context_pc);
+ else if (pc == 0)
+ expression_context_pc = expression_context_block->entry_pc ();
+ else
+ expression_context_pc = pc;
- /* Fall back to using the current source static context, if any. */
+ /* Fall back to using the current source static context, if any. */
- if (!expression_context_block)
- {
- struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+ if (!expression_context_block)
+ {
+ struct symtab_and_line cursal
+ = get_current_source_symtab_and_line ();
- if (cursal.symtab)
- expression_context_block
- = cursal.symtab->compunit ()->blockvector ()->static_block ();
+ if (cursal.symtab)
+ expression_context_block
+ = cursal.symtab->compunit ()->blockvector ()->static_block ();
- if (expression_context_block)
- expression_context_pc = expression_context_block->entry_pc ();
+ if (expression_context_block)
+ expression_context_pc = expression_context_block->entry_pc ();
+ }
}
if (language_mode == language_mode_auto && block != NULL)