aboutsummaryrefslogtreecommitdiff
path: root/gdb/expression.h
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2023-04-28 08:01:54 -0600
committerTom Tromey <tromey@adacore.com>2023-05-23 13:57:53 -0600
commit562db568441ed0f7e258b843916c34572170cc6d (patch)
tree911c015433a041e3d121c62de69c8097842821f6 /gdb/expression.h
parent98d630e910c73d163a071753bfc3b9c106cd3715 (diff)
downloadbinutils-562db568441ed0f7e258b843916c34572170cc6d.zip
binutils-562db568441ed0f7e258b843916c34572170cc6d.tar.gz
binutils-562db568441ed0f7e258b843916c34572170cc6d.tar.bz2
Move innermost_block_tracker to expression.h
I think parser-defs.h should hold declarations that can be used by parser implementations, whereas expression.h should hold declarations that are used by code that wants to call a parser. Following this logic, this patch moves innermost_block_tracker to expression.h.
Diffstat (limited to 'gdb/expression.h')
-rw-r--r--gdb/expression.h46
1 files changed, 44 insertions, 2 deletions
diff --git a/gdb/expression.h b/gdb/expression.h
index e6e4bec..8d351b3 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -21,6 +21,7 @@
#define EXPRESSION_H 1
#include "gdbtypes.h"
+#include "symtab.h"
/* While parsing expressions we need to track the innermost lexical block
that we encounter. In some situations we need to track the innermost
@@ -239,9 +240,51 @@ struct expression
typedef std::unique_ptr<expression> expression_up;
+/* When parsing expressions we track the innermost block that was
+ referenced. */
+
+class innermost_block_tracker
+{
+public:
+ innermost_block_tracker (innermost_block_tracker_types types
+ = INNERMOST_BLOCK_FOR_SYMBOLS)
+ : m_types (types),
+ m_innermost_block (NULL)
+ { /* Nothing. */ }
+
+ /* Update the stored innermost block if the new block B is more inner
+ than the currently stored block, or if no block is stored yet. The
+ type T tells us whether the block B was for a symbol or for a
+ register. The stored innermost block is only updated if the type T is
+ a type we are interested in, the types we are interested in are held
+ in M_TYPES and set during RESET. */
+ void update (const struct block *b, innermost_block_tracker_types t);
+
+ /* Overload of main UPDATE method which extracts the block from BS. */
+ void update (const struct block_symbol &bs)
+ {
+ update (bs.block, INNERMOST_BLOCK_FOR_SYMBOLS);
+ }
+
+ /* Return the stored innermost block. Can be nullptr if no symbols or
+ registers were found during an expression parse, and so no innermost
+ block was defined. */
+ const struct block *block () const
+ {
+ return m_innermost_block;
+ }
+
+private:
+ /* The type of innermost block being looked for. */
+ innermost_block_tracker_types m_types;
+
+ /* The currently stored innermost block found while parsing an
+ expression. */
+ const struct block *m_innermost_block;
+};
+
/* From parse.c */
-class innermost_block_tracker;
extern expression_up parse_expression (const char *,
innermost_block_tracker * = nullptr,
bool void_context_p = false);
@@ -270,7 +313,6 @@ struct expr_completion_base
extern expression_up parse_expression_for_completion
(const char *, std::unique_ptr<expr_completion_base> *completer);
-class innermost_block_tracker;
extern expression_up parse_exp_1 (const char **, CORE_ADDR pc,
const struct block *, int,
innermost_block_tracker * = nullptr);