X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fparse.c;h=11712896c5632652d4aa25000f2301442c484309;hb=9f1b45b0da430a7a7abf9e54acbe6f2ef9d3a763;hp=8e558e3228d6251dcd28e5da03d01de06acae813;hpb=2f68a89553836f68b8676beda9287c93e489bc6e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/parse.c b/gdb/parse.c index 8e558e3228..11712896c5 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -1,7 +1,6 @@ /* Parse expressions for GDB. - Copyright (C) 1986, 1989-2001, 2004-2005, 2007-2012 Free Software - Foundation, Inc. + Copyright (C) 1986-2014 Free Software Foundation, Inc. Modified from expread.y by the Department of Computer Science at the State University of New York at Buffalo, 1991. @@ -33,7 +32,7 @@ #include "defs.h" #include #include "arch-utils.h" -#include "gdb_string.h" +#include #include "symtab.h" #include "gdbtypes.h" #include "frame.h" @@ -76,8 +75,8 @@ CORE_ADDR expression_context_pc; const struct block *innermost_block; int arglist_len; static struct type_stack type_stack; -char *lexptr; -char *prev_lexptr; +const char *lexptr; +const char *prev_lexptr; int paren_depth; int comma_terminates; @@ -121,9 +120,12 @@ static void free_funcalls (void *ignore); static int prefixify_subexp (struct expression *, struct expression *, int, int); -static struct expression *parse_exp_in_context (char **, CORE_ADDR, +static struct expression *parse_exp_in_context (const char **, CORE_ADDR, const struct block *, int, int, int *); +static struct expression *parse_exp_in_context_1 (const char **, CORE_ADDR, + const struct block *, int, + int, int *); void _initialize_parse (void); @@ -494,13 +496,14 @@ write_exp_bitstring (struct stoken str) the expression. */ void -write_exp_msymbol (struct minimal_symbol *msymbol) +write_exp_msymbol (struct bound_minimal_symbol bound_msym) { - struct objfile *objfile = msymbol_objfile (msymbol); + struct minimal_symbol *msymbol = bound_msym.minsym; + struct objfile *objfile = bound_msym.objfile; struct gdbarch *gdbarch = get_objfile_arch (objfile); CORE_ADDR addr = SYMBOL_VALUE_ADDRESS (msymbol); - struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol); + struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol); enum minimal_symbol_type type = MSYMBOL_TYPE (msymbol); CORE_ADDR pc; @@ -509,13 +512,14 @@ write_exp_msymbol (struct minimal_symbol *msymbol) pc = gdbarch_convert_from_func_ptr_addr (gdbarch, addr, ¤t_target); if (pc != addr) { - struct minimal_symbol *ifunc_msym = lookup_minimal_symbol_by_pc (pc); + struct bound_minimal_symbol ifunc_msym = lookup_minimal_symbol_by_pc (pc); /* In this case, assume we have a code symbol instead of a data symbol. */ - if (ifunc_msym != NULL && MSYMBOL_TYPE (ifunc_msym) == mst_text_gnu_ifunc - && SYMBOL_VALUE_ADDRESS (ifunc_msym) == pc) + if (ifunc_msym.minsym != NULL + && MSYMBOL_TYPE (ifunc_msym.minsym) == mst_text_gnu_ifunc + && SYMBOL_VALUE_ADDRESS (ifunc_msym.minsym) == pc) { /* A function descriptor has been resolved but PC is still in the STT_GNU_IFUNC resolver body (such as because inferior does not @@ -637,7 +641,7 @@ void write_dollar_variable (struct stoken str) { struct symbol *sym = NULL; - struct minimal_symbol *msym = NULL; + struct bound_minimal_symbol msym; struct internalvar *isym = NULL; /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) @@ -692,7 +696,7 @@ write_dollar_variable (struct stoken str) have names beginning with $ or $$. Check for those, first. */ sym = lookup_symbol (copy_name (str), (struct block *) NULL, - VAR_DOMAIN, (int *) NULL); + VAR_DOMAIN, NULL); if (sym) { write_exp_elt_opcode (OP_VAR_VALUE); @@ -701,8 +705,8 @@ write_dollar_variable (struct stoken str) write_exp_elt_opcode (OP_VAR_VALUE); return; } - msym = lookup_minimal_symbol (copy_name (str), NULL, NULL); - if (msym) + msym = lookup_bound_minimal_symbol (copy_name (str)); + if (msym.minsym) { write_exp_msymbol (msym); return; @@ -729,8 +733,8 @@ handle_register: } -char * -find_template_name_end (char *p) +const char * +find_template_name_end (const char *p) { int depth = 1; int just_seen_right = 0; @@ -969,6 +973,7 @@ operator_length_standard (const struct expression *expr, int endpos, case UNOP_TRUNC: case OP_TYPEOF: case OP_DECLTYPE: + case OP_TYPEID: oplen = 1; args = 1; break; @@ -1126,12 +1131,21 @@ prefixify_subexp (struct expression *inexpr, If COMMA is nonzero, stop if a comma is reached. */ struct expression * -parse_exp_1 (char **stringptr, CORE_ADDR pc, const struct block *block, +parse_exp_1 (const char **stringptr, CORE_ADDR pc, const struct block *block, int comma) { return parse_exp_in_context (stringptr, pc, block, comma, 0, NULL); } +static struct expression * +parse_exp_in_context (const char **stringptr, CORE_ADDR pc, + const struct block *block, + int comma, int void_context_p, int *out_subexp) +{ + return parse_exp_in_context_1 (stringptr, pc, block, comma, + void_context_p, out_subexp); +} + /* As for parse_exp_1, except that if VOID_CONTEXT_P, then no value is expected from the expression. OUT_SUBEXP is set when attempting to complete a field name; in this @@ -1140,11 +1154,12 @@ parse_exp_1 (char **stringptr, CORE_ADDR pc, const struct block *block, is left untouched. */ static struct expression * -parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, - int comma, int void_context_p, int *out_subexp) +parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, + const struct block *block, + int comma, int void_context_p, int *out_subexp) { volatile struct gdb_exception except; - struct cleanup *old_chain; + struct cleanup *old_chain, *inner_chain; const struct language_defn *lang = NULL; int subexp; @@ -1214,7 +1229,13 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, else lang = current_language; + /* get_current_arch may reset CURRENT_LANGUAGE via select_frame. + While we need CURRENT_LANGUAGE to be set to LANG (for lookup_symbol + and others called from *.y) ensure CURRENT_LANGUAGE gets restored + to the value matching SELECTED_FRAME as set by get_current_arch. */ initialize_expout (10, lang, get_current_arch ()); + inner_chain = make_cleanup_restore_current_language (); + set_language (lang->la_language); TRY_CATCH (except, RETURN_MASK_ALL) { @@ -1230,8 +1251,6 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, } } - discard_cleanups (old_chain); - reallocate_expout (); /* Convert expression from postfix form as generated by yacc @@ -1250,6 +1269,9 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, if (expressiondebug) dump_prefix_expression (expout, gdb_stdlog); + do_cleanups (inner_chain); + discard_cleanups (old_chain); + *stringptr = lexptr; return expout; } @@ -1258,7 +1280,7 @@ parse_exp_in_context (char **stringptr, CORE_ADDR pc, const struct block *block, to use up all of the contents of STRING. */ struct expression * -parse_expression (char *string) +parse_expression (const char *string) { struct expression *exp; @@ -1277,7 +1299,7 @@ parse_expression (char *string) *NAME must be freed by the caller. */ struct type * -parse_expression_for_completion (char *string, char **name, +parse_expression_for_completion (const char *string, char **name, enum type_code *code) { struct expression *exp = NULL;