X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fparse.c;h=d5efe4ab3d8cb4c5107253097e5d75c206442568;hb=ae090bdbf8876d4f72f357cf78301b5e8ec13751;hp=5ae1cb96a97b392d8605bc06ca11a147400864ed;hpb=a70b814420059e1f2de2130d532ddd7b2b2500fc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/parse.c b/gdb/parse.c index 5ae1cb96a9..d5efe4ab3d 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1,6 +1,6 @@ /* Parse expressions for GDB. - Copyright (C) 1986-2019 Free Software Foundation, Inc. + Copyright (C) 1986-2020 Free Software Foundation, Inc. Modified from expread.y by the Department of Computer Science at the State University of New York at Buffalo, 1991. @@ -50,7 +50,7 @@ #include "objfiles.h" #include "user-regs.h" #include -#include "common/gdb_optional.h" +#include "gdbsupport/gdb_optional.h" /* Standard set of definitions for printing, dumping, prefixifying, * and evaluating expressions. */ @@ -74,8 +74,8 @@ show_expressiondebug (struct ui_file *file, int from_tty, } -/* Non-zero if an expression parser should set yydebug. */ -int parser_debug; +/* True if an expression parser should set yydebug. */ +bool parser_debug; static void show_parserdebug (struct ui_file *file, int from_tty, @@ -181,7 +181,7 @@ write_exp_elt_sym (struct expr_builder *ps, struct symbol *expelt) write_exp_elt (ps, &tmp); } -void +static void write_exp_elt_msym (struct expr_builder *ps, minimal_symbol *expelt) { union exp_element tmp; @@ -548,6 +548,7 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) struct block_symbol sym; struct bound_minimal_symbol msym; struct internalvar *isym = NULL; + std::string copy; /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) and $$digits (equivalent to $<-digits> if you could type that). */ @@ -588,7 +589,8 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) /* Any names starting with $ are probably debugger internal variables. */ - isym = lookup_only_internalvar (copy_name (str) + 1); + copy = copy_name (str); + isym = lookup_only_internalvar (copy.c_str () + 1); if (isym) { write_exp_elt_opcode (ps, OP_INTERNALVAR); @@ -600,7 +602,7 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) /* On some systems, such as HP-UX and hppa-linux, certain system routines have names beginning with $ or $$. Check for those, first. */ - sym = lookup_symbol (copy_name (str), NULL, VAR_DOMAIN, NULL); + sym = lookup_symbol (copy.c_str (), NULL, VAR_DOMAIN, NULL); if (sym.symbol) { write_exp_elt_opcode (ps, OP_VAR_VALUE); @@ -609,7 +611,7 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) write_exp_elt_opcode (ps, OP_VAR_VALUE); return; } - msym = lookup_bound_minimal_symbol (copy_name (str)); + msym = lookup_bound_minimal_symbol (copy.c_str ()); if (msym.minsym) { write_exp_msymbol (ps, msym); @@ -619,7 +621,7 @@ write_dollar_variable (struct parser_state *ps, struct stoken str) /* Any other names are assumed to be debugger internal variables. */ write_exp_elt_opcode (ps, OP_INTERNALVAR); - write_exp_elt_intern (ps, create_internalvar (copy_name (str) + 1)); + write_exp_elt_intern (ps, create_internalvar (copy.c_str () + 1)); write_exp_elt_opcode (ps, OP_INTERNALVAR); return; handle_last: @@ -706,33 +708,12 @@ find_template_name_end (const char *p) so they can share the storage that lexptr is parsing. When it is necessary to pass a name to a function that expects a null-terminated string, the substring is copied out - into a separate block of storage. - - N.B. A single buffer is reused on each call. */ + into a separate block of storage. */ -char * +std::string copy_name (struct stoken token) { - /* A temporary buffer for identifiers, so we can null-terminate them. - We allocate this with xrealloc. parse_exp_1 used to allocate with - alloca, using the size of the whole expression as a conservative - estimate of the space needed. However, macro expansion can - introduce names longer than the original expression; there's no - practical way to know beforehand how large that might be. */ - static char *namecopy; - static size_t namecopy_size; - - /* Make sure there's enough space for the token. */ - if (namecopy_size < token.length + 1) - { - namecopy_size = token.length + 1; - namecopy = (char *) xrealloc (namecopy, token.length + 1); - } - - memcpy (namecopy, token.ptr, token.length); - namecopy[token.length] = 0; - - return namecopy; + return std::string (token.ptr, token.length); } @@ -876,7 +857,6 @@ operator_length_standard (const struct expression *expr, int endpos, case UNOP_CHR: case UNOP_FLOAT: case UNOP_HIGH: - case UNOP_KIND: case UNOP_ODD: case UNOP_ORD: case UNOP_TRUNC: @@ -1118,7 +1098,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, struct symbol *func = block_linkage_function (block); if (func != NULL) - lang = language_def (SYMBOL_LANGUAGE (func)); + lang = language_def (func->language ()); if (lang == NULL || lang->la_language == language_unknown) lang = current_language; } @@ -1141,13 +1121,13 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc, { lang->la_parser (&ps); } - catch (const gdb_exception_RETURN_MASK_ALL &except) + catch (const gdb_exception &except) { /* If parsing for completion, allow this to succeed; but if no expression elements have been written, then there's nothing to do, so fail. */ if (! ps.parse_completion || ps.expout_ptr == 0) - throw_exception (except); + throw; } /* We have to operate on an "expression *", due to la_post_parser, @@ -1228,7 +1208,7 @@ parse_expression_for_completion (const char *string, exp = parse_exp_in_context (&string, 0, 0, 0, 0, &subexp, nullptr, &cstate); } - catch (const gdb_exception_RETURN_MASK_ERROR &except) + catch (const gdb_exception_error &except) { /* Nothing, EXP remains NULL. */ } @@ -1360,7 +1340,7 @@ operator_check_standard (struct expression *exp, int pos, return 1; /* Check objfile where is placed the code touching the variable. */ - objfile = lookup_objfile_from_block (block); + objfile = block_objfile (block); type = SYMBOL_TYPE (symbol); } @@ -1456,8 +1436,9 @@ increase_expout_size (struct expr_builder *ps, size_t lenelt) } } +void _initialize_parse (); void -_initialize_parse (void) +_initialize_parse () { add_setshow_zuinteger_cmd ("expression", class_maintenance, &expressiondebug,