X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fexpression.h;h=f1128c442483a742c1fdcee6772e6018df75adee;hb=8948cc6971fb82feffc49e2d21747111466ad642;hp=3b70ef3f410687b1d692dcb2d64eb037465ce2ea;hpb=270140bd2556ce2b0b9c32ecb31e1dcb3fc1887a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/expression.h b/gdb/expression.h index 3b70ef3f41..f1128c4424 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -1,7 +1,6 @@ /* Definitions for expressions stored in reversed prefix form, for GDB. - Copyright (C) 1986, 1989, 1992, 1994, 2000, 2003, 2005, 2007-2012 - Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -21,10 +20,25 @@ #if !defined (EXPRESSION_H) #define EXPRESSION_H 1 +#include "gdbtypes.h" -#include "symtab.h" /* Needed for "struct block" type. */ -#include "doublest.h" /* Needed for DOUBLEST. */ +/* 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); /* Definitions for saved C expressions. */ @@ -41,7 +55,7 @@ and skip that many. Strings, like numbers, are indicated by the preceding opcode. */ -enum exp_opcode +enum exp_opcode : uint8_t { #define OP(name) name , @@ -54,6 +68,7 @@ enum exp_opcode /* Language specific operators. */ #include "ada-operator.def" +#include "fortran-operator.def" #undef OP @@ -65,9 +80,9 @@ union exp_element { enum exp_opcode opcode; struct symbol *symbol; + struct minimal_symbol *msymbol; LONGEST longconst; - DOUBLEST doubleconst; - gdb_byte decfloatconst[16]; + gdb_byte floatconst[16]; /* Really sizeof (union exp_element) characters (or less for the last element of a string). */ char string; @@ -86,6 +101,8 @@ struct expression union exp_element elts[1]; }; +typedef gdb::unique_xmalloc_ptr expression_up; + /* Macros for converting between number of expression elements and bytes to store that many expression elements. */ @@ -96,21 +113,20 @@ struct expression /* From parse.c */ -extern struct expression *parse_expression (char *); +class innermost_block_tracker; +extern expression_up parse_expression (const char *, + innermost_block_tracker * = nullptr); -extern struct type *parse_field_expression (char *, char **); +extern expression_up parse_expression_with_language (const char *string, + enum language lang); -extern struct expression *parse_exp_1 (char **, CORE_ADDR pc, - const struct block *, int); +extern struct type *parse_expression_for_completion + (const char *, gdb::unique_xmalloc_ptr *, enum type_code *); -/* For use by parsers; set if we want to parse an expression and - attempt to complete a field name. */ -extern int in_parse_field; - -/* The innermost context required by the stack and register variables - we've encountered so far. To use this, set it to NULL, then call - parse_, then look at it. */ -extern const struct block *innermost_block; +class innermost_block_tracker; +extern expression_up parse_exp_1 (const char **, CORE_ADDR pc, + const struct block *, int, + innermost_block_tracker * = nullptr); /* From eval.c */ @@ -119,7 +135,9 @@ extern const struct block *innermost_block; enum noside { EVAL_NORMAL, - EVAL_SKIP, /* Only effect is to increment pos. */ + EVAL_SKIP, /* Only effect is to increment pos. + Return type information where + possible. */ EVAL_AVOID_SIDE_EFFECTS /* Don't modify any variables or call any functions. The value returned will have the correct @@ -128,7 +146,10 @@ enum noside type (inaccuracy: anything that is listed as being in a register in the function in which it was - declared will be lval_register). */ + declared will be lval_register). + Ideally this would not even read + target memory, but currently it + does in many situations. */ }; extern struct value *evaluate_subexp_standard @@ -138,12 +159,36 @@ extern struct value *evaluate_subexp_standard extern void print_expression (struct expression *, struct ui_file *); -extern char *op_name (struct expression *exp, enum exp_opcode opcode); +extern const char *op_name (struct expression *exp, enum exp_opcode opcode); -extern char *op_string (enum exp_opcode); +extern const char *op_string (enum exp_opcode); extern void dump_raw_expression (struct expression *, - struct ui_file *, char *); + struct ui_file *, const char *); extern void dump_prefix_expression (struct expression *, struct ui_file *); +/* In an OP_RANGE expression, either bound could be empty, indicating + that its value is by default that of the corresponding bound of the + array or string. Also, the upper end of the range can be exclusive + or inclusive. So we have six sorts of subrange. This enumeration + type is to identify this. */ + +enum range_type +{ + /* Neither the low nor the high bound was given -- so this refers to + the entire available range. */ + BOTH_BOUND_DEFAULT, + /* The low bound was not given and the high bound is inclusive. */ + LOW_BOUND_DEFAULT, + /* The high bound was not given and the low bound in inclusive. */ + HIGH_BOUND_DEFAULT, + /* Both bounds were given and both are inclusive. */ + NONE_BOUND_DEFAULT, + /* The low bound was not given and the high bound is exclusive. */ + NONE_BOUND_DEFAULT_EXCLUSIVE, + /* Both bounds were given. The low bound is inclusive and the high + bound is exclusive. */ + LOW_BOUND_DEFAULT_EXCLUSIVE, +}; + #endif /* !defined (EXPRESSION_H) */