diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2014-03-27 19:10:40 -0300 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2014-03-27 19:10:40 -0300 |
commit | 410a0ff2df3fa8d260c1c6d76172c65285968cea (patch) | |
tree | 1da3b4674bc592c603a1b9e3f8e1761e807a81f8 /gdb/parse.c | |
parent | 342587c49476ad7472419a3028267f2ddb03f4d8 (diff) | |
download | gdb-410a0ff2df3fa8d260c1c6d76172c65285968cea.zip gdb-410a0ff2df3fa8d260c1c6d76172c65285968cea.tar.gz gdb-410a0ff2df3fa8d260c1c6d76172c65285968cea.tar.bz2 |
Remove `expout*' globals from parser-defs.h
This commit removes the "expout*" globals from our parser code, turning
them into a structure that is passed when an expression needs to be
evaluated. This is the initial step to make our parser less
"globalized".
This is mostly a mechanical patch, which creates a structure containing
the "expout*" globals and then modify all the functions that handle them
in order to take the structure as argument. It is big, and has been
reviewed at least 4 times, so I think everything is covered.
Below you can see the message links from the discussions:
- First attempt:
<https://sourceware.org/ml/gdb-patches/2012-01/msg00522.html>
Message-ID: <m3k44s7qej.fsf@gmail.com>
- Second attempt:
<https://sourceware.org/ml/gdb-patches/2012-06/msg00054.html>
Message-Id: <1338665528-5932-1-git-send-email-sergiodj@redhat.com>
- Third attempt:
<https://sourceware.org/ml/gdb-patches/2014-01/msg00949.html>
Message-Id: <1390629467-27139-1-git-send-email-sergiodj@redhat.com>
- Fourth (last) attempt:
<https://sourceware.org/ml/gdb-patches/2014-03/msg00546.html>
Message-Id: <1395463432-29750-1-git-send-email-sergiodj@redhat.com>
gdb/
2014-03-27 Sergio Durigan Junior <sergiodj@redhat.com>
Remove some globals from our parser.
* language.c (unk_lang_parser): Add "struct parser_state"
argument.
* language.h (struct language_defn) <la_parser>: Likewise.
* parse.c (expout, expout_size, expout_ptr): Remove variables.
(initialize_expout): Add "struct parser_state" argument.
Rewrite function to use the parser state.
(reallocate_expout, write_exp_elt, write_exp_elt_opcode,
write_exp_elt_sym, write_exp_elt_block, write_exp_elt_objfile,
write_exp_elt_longcst, write_exp_elt_dblcst,
write_exp_elt_decfloatcst, write_exp_elt_type,
write_exp_elt_intern, write_exp_string, write_exp_string_vector,
write_exp_bitstring, write_exp_msymbol, mark_struct_expression,
write_dollar_variable): Likewise.
(parse_exp_in_context_1): Use parser state.
(insert_type_address_space): Add "struct parser_state" argument.
Use parser state.
(increase_expout_size): New function.
* parser-defs.h: Forward declare "struct language_defn" and
"struct parser_state".
(expout, expout_size, expout_ptr): Remove extern declarations.
(parse_gdbarch, parse_language): Rewrite macro declarations to
accept the parser state.
(struct parser_state): New struct.
(initialize_expout, reallocate_expout, write_exp_elt_opcode,
write_exp_elt_sym, write_exp_elt_longcst, write_exp_elt_dblcst,
write_exp_elt_decfloatcst, write_exp_elt_type,
write_exp_elt_intern, write_exp_string, write_exp_string_vector,
write_exp_bitstring, write_exp_elt_block, write_exp_elt_objfile,
write_exp_msymbol, write_dollar_variable,
mark_struct_expression, insert_type_address_space): Add "struct
parser_state" argument.
(increase_expout_size): New function.
* utils.c (do_clear_parser_state): New function.
(make_cleanup_clear_parser_state): Likewise.
* utils.h (make_cleanup_clear_parser_state): New function
prototype.
* aarch64-linux-tdep.c (aarch64_stap_parse_special_token):
Update calls to write_exp* in order to pass the parser state.
* arm-linux-tdep.c (arm_stap_parse_special_token): Likewise.
* i386-tdep.c (i386_stap_parse_special_token_triplet): Likewise.
(i386_stap_parse_special_token_three_arg_disp): Likewise.
* ppc-linux-tdep.c (ppc_stap_parse_special_token): Likewise.
* stap-probe.c (stap_parse_register_operand): Likewise.
(stap_parse_single_operand): Likewise.
(stap_parse_argument_1): Likewise.
(stap_parse_argument): Use parser state.
* stap-probe.h: Include "parser-defs.h".
(struct stap_parse_info) <pstate>: New field.
* c-exp.y (parse_type): Rewrite to use parser state.
(yyparse): Redefine to c_parse_internal.
(pstate): New global variable.
(parse_number): Add "struct parser_state" argument.
(write_destructor_name): Likewise.
(type_exp): Update calls to write_exp* and similars in order to
use parser state.
(exp1, exp, variable, qualified_name, space_identifier,
typename, typebase): Likewise.
(write_destructor_name, parse_number, lex_one_token,
classify_name, classify_inner_name, c_parse): Add "struct
parser_state" argument. Update function to use parser state.
* c-lang.h: Forward declare "struct parser_state".
(c_parse): Add "struct parser_state" argument.
* ada-exp.y (parse_type): Rewrite macro to use parser state.
(yyparse): Redefine macro to ada_parse_internal.
(pstate): New variable.
(write_int, write_object_renaming, write_var_or_type,
write_name_assoc, write_exp_op_with_string, write_ambiguous_var,
type_int, type_long, type_long_long, type_float, type_double,
type_long_double, type_char, type_boolean, type_system_address):
Add "struct parser_state" argument.
(exp1, primary, simple_exp, relation, and_exp, and_then_exp,
or_exp, or_else_exp, xor_exp, type_prefix, opt_type_prefix,
var_or_type, aggregate, aggregate_component_list,
positional_list, others, component_group,
component_associations): Update calls to write_exp* and similar
functions in order to use parser state.
(ada_parse, write_var_from_sym, write_int,
write_exp_op_with_string, write_object_renaming,
find_primitive_type, write_selectors, write_ambiguous_var,
write_var_or_type, write_name_assoc, type_int, type_long,
type_long_long, type_float, type_double, type_long_double,
type_char, type_boolean, type_system_address): Add "struct
parser_state" argument. Adjust function to use parser state.
* ada-lang.c (parse): Likewise.
* ada-lang.h: Forward declare "struct parser_state".
(ada_parse): Add "struct parser_state" argument.
* ada-lex.l (processInt, processReal): Likewise. Adjust all
calls to both functions.
* f-exp.y (parse_type, parse_f_type): Rewrite macros to use
parser state.
(yyparse): Redefine macro to f_parse_internal.
(pstate): New variable.
(parse_number): Add "struct parser_state" argument.
(type_exp, exp, subrange, typebase): Update calls to write_exp*
and similars in order to use parser state.
(parse_number): Adjust code to use parser state.
(yylex): Likewise.
(f_parse): New function.
* f-lang.h: Forward declare "struct parser_state".
(f_parse): Add "struct parser_state" argument.
* jv-exp.y (parse_type, parse_java_type): Rewrite macros to use
parser state.
(yyparse): Redefine macro for java_parse_internal.
(pstate): New variable.
(push_expression_name, push_expression_name, insert_exp): Add
"struct parser_state" argument.
(type_exp, StringLiteral, Literal, PrimitiveType, IntegralType,
FloatingPointType, exp1, PrimaryNoNewArray, FieldAccess,
FuncStart, MethodInvocation, ArrayAccess, PostfixExpression,
PostIncrementExpression, PostDecrementExpression,
UnaryExpression, PreIncrementExpression, PreDecrementExpression,
UnaryExpressionNotPlusMinus, CastExpression,
MultiplicativeExpression, AdditiveExpression, ShiftExpression,
RelationalExpression, EqualityExpression, AndExpression,
ExclusiveOrExpression, InclusiveOrExpression,
ConditionalAndExpression, ConditionalOrExpression,
ConditionalExpression, Assignment, LeftHandSide): Update
calls to write_exp* and similars in order to use parser state.
(parse_number): Ajust code to use parser state.
(yylex): Likewise.
(java_parse): New function.
(push_variable): Add "struct parser_state" argument. Adjust
code to user parser state.
(push_fieldnames, push_qualified_expression_name,
push_expression_name, insert_exp): Likewise.
* jv-lang.h: Forward declare "struct parser_state".
(java_parse): Add "struct parser_state" argument.
* m2-exp.y (parse_type, parse_m2_type): Rewrite macros to use
parser state.
(yyparse): Redefine macro to m2_parse_internal.
(pstate): New variable.
(type_exp, exp, fblock, variable, type): Update calls to
write_exp* and similars to use parser state.
(yylex): Likewise.
(m2_parse): New function.
* m2-lang.h: Forward declare "struct parser_state".
(m2_parse): Add "struct parser_state" argument.
* objc-lang.c (end_msglist): Add "struct parser_state" argument.
* objc-lang.h: Forward declare "struct parser_state".
(end_msglist): Add "struct parser_state" argument.
* p-exp.y (parse_type): Rewrite macro to use parser state.
(yyparse): Redefine macro to pascal_parse_internal.
(pstate): New variable.
(parse_number): Add "struct parser_state" argument.
(type_exp, exp1, exp, qualified_name, variable): Update calls to
write_exp* and similars in order to use parser state.
(parse_number, yylex): Adjust code to use parser state.
(pascal_parse): New function.
* p-lang.h: Forward declare "struct parser_state".
(pascal_parse): Add "struct parser_state" argument.
* go-exp.y (parse_type): Rewrite macro to use parser state.
(yyparse): Redefine macro to go_parse_internal.
(pstate): New variable.
(parse_number): Add "struct parser_state" argument.
(type_exp, exp1, exp, variable, type): Update calls to
write_exp* and similars in order to use parser state.
(parse_number, lex_one_token, classify_name, yylex): Adjust code
to use parser state.
(go_parse): Likewise.
* go-lang.h: Forward declare "struct parser_state".
(go_parse): Add "struct parser_state" argument.
Diffstat (limited to 'gdb/parse.c')
-rw-r--r-- | gdb/parse.c | 277 |
1 files changed, 137 insertions, 140 deletions
diff --git a/gdb/parse.c b/gdb/parse.c index c6e25a9..b0da2ef 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -67,9 +67,6 @@ const struct exp_descriptor exp_descriptor_standard = }; /* Global variables declared in parser-defs.h (and commented there). */ -struct expression *expout; -int expout_size; -int expout_ptr; const struct block *expression_context_block; CORE_ADDR expression_context_pc; const struct block *innermost_block; @@ -185,118 +182,121 @@ free_funcalls (void *ignore) } } -/* This page contains the functions for adding data to the struct expression - being constructed. */ /* See definition in parser-defs.h. */ void -initialize_expout (int initial_size, const struct language_defn *lang, +initialize_expout (struct parser_state *ps, size_t initial_size, + const struct language_defn *lang, struct gdbarch *gdbarch) { - expout_size = initial_size; - expout_ptr = 0; - expout = xmalloc (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size)); - expout->language_defn = lang; - expout->gdbarch = gdbarch; + ps->expout_size = initial_size; + ps->expout_ptr = 0; + ps->expout = xmalloc (sizeof (struct expression) + + EXP_ELEM_TO_BYTES (ps->expout_size)); + ps->expout->language_defn = lang; + ps->expout->gdbarch = gdbarch; } /* See definition in parser-defs.h. */ void -reallocate_expout (void) +reallocate_expout (struct parser_state *ps) { /* Record the actual number of expression elements, and then reallocate the expression memory so that we free up any excess elements. */ - expout->nelts = expout_ptr; - expout = xrealloc ((char *) expout, - sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_ptr)); + ps->expout->nelts = ps->expout_ptr; + ps->expout = (struct expression *) + xrealloc (ps->expout, + sizeof (struct expression) + + EXP_ELEM_TO_BYTES (ps->expout_ptr)); } +/* This page contains the functions for adding data to the struct expression + being constructed. */ + /* Add one element to the end of the expression. */ /* To avoid a bug in the Sun 4 compiler, we pass things that can fit into a register through here. */ static void -write_exp_elt (const union exp_element *expelt) +write_exp_elt (struct parser_state *ps, const union exp_element *expelt) { - if (expout_ptr >= expout_size) + if (ps->expout_ptr >= ps->expout_size) { - expout_size *= 2; - expout = (struct expression *) - xrealloc ((char *) expout, sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size)); + ps->expout_size *= 2; + ps->expout = (struct expression *) + xrealloc (ps->expout, sizeof (struct expression) + + EXP_ELEM_TO_BYTES (ps->expout_size)); } - expout->elts[expout_ptr++] = *expelt; + ps->expout->elts[ps->expout_ptr++] = *expelt; } void -write_exp_elt_opcode (enum exp_opcode expelt) +write_exp_elt_opcode (struct parser_state *ps, enum exp_opcode expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.opcode = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_sym (struct symbol *expelt) +write_exp_elt_sym (struct parser_state *ps, struct symbol *expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.symbol = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_block (const struct block *b) +write_exp_elt_block (struct parser_state *ps, const struct block *b) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.block = b; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_objfile (struct objfile *objfile) +write_exp_elt_objfile (struct parser_state *ps, struct objfile *objfile) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.objfile = objfile; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_longcst (LONGEST expelt) +write_exp_elt_longcst (struct parser_state *ps, LONGEST expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.longconst = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_dblcst (DOUBLEST expelt) +write_exp_elt_dblcst (struct parser_state *ps, DOUBLEST expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.doubleconst = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_decfloatcst (gdb_byte expelt[16]) +write_exp_elt_decfloatcst (struct parser_state *ps, gdb_byte expelt[16]) { union exp_element tmp; int index; @@ -304,27 +304,27 @@ write_exp_elt_decfloatcst (gdb_byte expelt[16]) for (index = 0; index < 16; index++) tmp.decfloatconst[index] = expelt[index]; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_type (struct type *expelt) +write_exp_elt_type (struct parser_state *ps, struct type *expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.type = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } void -write_exp_elt_intern (struct internalvar *expelt) +write_exp_elt_intern (struct parser_state *ps, struct internalvar *expelt) { union exp_element tmp; memset (&tmp, 0, sizeof (union exp_element)); tmp.internalvar = expelt; - write_exp_elt (&tmp); + write_exp_elt (ps, &tmp); } /* Add a string constant to the end of the expression. @@ -349,10 +349,10 @@ write_exp_elt_intern (struct internalvar *expelt) void -write_exp_string (struct stoken str) +write_exp_string (struct parser_state *ps, struct stoken str) { int len = str.length; - int lenelt; + size_t lenelt; char *strdata; /* Compute the number of expression elements required to hold the string @@ -362,28 +362,19 @@ write_exp_string (struct stoken str) lenelt = 2 + BYTES_TO_EXP_ELEM (len + 1); - /* Ensure that we have enough available expression elements to store - everything. */ - - if ((expout_ptr + lenelt) >= expout_size) - { - expout_size = max (expout_size * 2, expout_ptr + lenelt + 10); - expout = (struct expression *) - xrealloc ((char *) expout, (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size))); - } + increase_expout_size (ps, lenelt); /* Write the leading length expression element (which advances the current expression element index), then write the string constant followed by a terminating null byte, and then write the trailing length expression element. */ - write_exp_elt_longcst ((LONGEST) len); - strdata = (char *) &expout->elts[expout_ptr]; + write_exp_elt_longcst (ps, (LONGEST) len); + strdata = (char *) &ps->expout->elts[ps->expout_ptr]; memcpy (strdata, str.ptr, len); *(strdata + len) = '\0'; - expout_ptr += lenelt - 2; - write_exp_elt_longcst ((LONGEST) len); + ps->expout_ptr += lenelt - 2; + write_exp_elt_longcst (ps, (LONGEST) len); } /* Add a vector of string constants to the end of the expression. @@ -400,9 +391,11 @@ write_exp_string (struct stoken str) long constant, followed by the contents of the string. */ void -write_exp_string_vector (int type, struct stoken_vector *vec) +write_exp_string_vector (struct parser_state *ps, int type, + struct stoken_vector *vec) { - int i, n_slots, len; + int i, len; + size_t n_slots; /* Compute the size. We compute the size in number of slots to avoid issues with string padding. */ @@ -421,28 +414,22 @@ write_exp_string_vector (int type, struct stoken_vector *vec) len = EXP_ELEM_TO_BYTES (n_slots) - 1; n_slots += 4; - if ((expout_ptr + n_slots) >= expout_size) - { - expout_size = max (expout_size * 2, expout_ptr + n_slots + 10); - expout = (struct expression *) - xrealloc ((char *) expout, (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size))); - } + increase_expout_size (ps, n_slots); - write_exp_elt_opcode (OP_STRING); - write_exp_elt_longcst (len); - write_exp_elt_longcst (type); + write_exp_elt_opcode (ps, OP_STRING); + write_exp_elt_longcst (ps, len); + write_exp_elt_longcst (ps, type); for (i = 0; i < vec->len; ++i) { - write_exp_elt_longcst (vec->tokens[i].length); - memcpy (&expout->elts[expout_ptr], vec->tokens[i].ptr, + write_exp_elt_longcst (ps, vec->tokens[i].length); + memcpy (&ps->expout->elts[ps->expout_ptr], vec->tokens[i].ptr, vec->tokens[i].length); - expout_ptr += BYTES_TO_EXP_ELEM (vec->tokens[i].length); + ps->expout_ptr += BYTES_TO_EXP_ELEM (vec->tokens[i].length); } - write_exp_elt_longcst (len); - write_exp_elt_opcode (OP_STRING); + write_exp_elt_longcst (ps, len); + write_exp_elt_opcode (ps, OP_STRING); } /* Add a bitstring constant to the end of the expression. @@ -457,11 +444,11 @@ write_exp_string_vector (int type, struct stoken_vector *vec) either end of the bitstring. */ void -write_exp_bitstring (struct stoken str) +write_exp_bitstring (struct parser_state *ps, struct stoken str) { int bits = str.length; /* length in bits */ int len = (bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT; - int lenelt; + size_t lenelt; char *strdata; /* Compute the number of expression elements required to hold the bitstring, @@ -470,33 +457,25 @@ write_exp_bitstring (struct stoken str) lenelt = 2 + BYTES_TO_EXP_ELEM (len); - /* Ensure that we have enough available expression elements to store - everything. */ - - if ((expout_ptr + lenelt) >= expout_size) - { - expout_size = max (expout_size * 2, expout_ptr + lenelt + 10); - expout = (struct expression *) - xrealloc ((char *) expout, (sizeof (struct expression) - + EXP_ELEM_TO_BYTES (expout_size))); - } + increase_expout_size (ps, lenelt); /* Write the leading length expression element (which advances the current expression element index), then write the bitstring constant, and then write the trailing length expression element. */ - write_exp_elt_longcst ((LONGEST) bits); - strdata = (char *) &expout->elts[expout_ptr]; + write_exp_elt_longcst (ps, (LONGEST) bits); + strdata = (char *) &ps->expout->elts[ps->expout_ptr]; memcpy (strdata, str.ptr, len); - expout_ptr += lenelt - 2; - write_exp_elt_longcst ((LONGEST) bits); + ps->expout_ptr += lenelt - 2; + write_exp_elt_longcst (ps, (LONGEST) bits); } /* Add the appropriate elements for a minimal symbol to the end of the expression. */ void -write_exp_msymbol (struct bound_minimal_symbol bound_msym) +write_exp_msymbol (struct parser_state *ps, + struct bound_minimal_symbol bound_msym) { struct minimal_symbol *msymbol = bound_msym.minsym; struct objfile *objfile = bound_msym.objfile; @@ -536,62 +515,62 @@ write_exp_msymbol (struct bound_minimal_symbol bound_msym) if (overlay_debugging) addr = symbol_overlayed_address (addr, section); - write_exp_elt_opcode (OP_LONG); + write_exp_elt_opcode (ps, OP_LONG); /* Let's make the type big enough to hold a 64-bit address. */ - write_exp_elt_type (objfile_type (objfile)->builtin_core_addr); - write_exp_elt_longcst ((LONGEST) addr); - write_exp_elt_opcode (OP_LONG); + write_exp_elt_type (ps, objfile_type (objfile)->builtin_core_addr); + write_exp_elt_longcst (ps, (LONGEST) addr); + write_exp_elt_opcode (ps, OP_LONG); if (section && section->the_bfd_section->flags & SEC_THREAD_LOCAL) { - write_exp_elt_opcode (UNOP_MEMVAL_TLS); - write_exp_elt_objfile (objfile); - write_exp_elt_type (objfile_type (objfile)->nodebug_tls_symbol); - write_exp_elt_opcode (UNOP_MEMVAL_TLS); + write_exp_elt_opcode (ps, UNOP_MEMVAL_TLS); + write_exp_elt_objfile (ps, objfile); + write_exp_elt_type (ps, objfile_type (objfile)->nodebug_tls_symbol); + write_exp_elt_opcode (ps, UNOP_MEMVAL_TLS); return; } - write_exp_elt_opcode (UNOP_MEMVAL); + write_exp_elt_opcode (ps, UNOP_MEMVAL); switch (type) { case mst_text: case mst_file_text: case mst_solib_trampoline: - write_exp_elt_type (objfile_type (objfile)->nodebug_text_symbol); + write_exp_elt_type (ps, objfile_type (objfile)->nodebug_text_symbol); break; case mst_text_gnu_ifunc: - write_exp_elt_type (objfile_type (objfile) - ->nodebug_text_gnu_ifunc_symbol); + write_exp_elt_type (ps, objfile_type (objfile) + ->nodebug_text_gnu_ifunc_symbol); break; case mst_data: case mst_file_data: case mst_bss: case mst_file_bss: - write_exp_elt_type (objfile_type (objfile)->nodebug_data_symbol); + write_exp_elt_type (ps, objfile_type (objfile)->nodebug_data_symbol); break; case mst_slot_got_plt: - write_exp_elt_type (objfile_type (objfile)->nodebug_got_plt_symbol); + write_exp_elt_type (ps, objfile_type (objfile)->nodebug_got_plt_symbol); break; default: - write_exp_elt_type (objfile_type (objfile)->nodebug_unknown_symbol); + write_exp_elt_type (ps, objfile_type (objfile)->nodebug_unknown_symbol); break; } - write_exp_elt_opcode (UNOP_MEMVAL); + write_exp_elt_opcode (ps, UNOP_MEMVAL); } /* Mark the current index as the starting location of a structure expression. This is used when completing on field names. */ void -mark_struct_expression (void) +mark_struct_expression (struct parser_state *ps) { gdb_assert (parse_completion && expout_tag_completion_type == TYPE_CODE_UNDEF); - expout_last_struct = expout_ptr; + expout_last_struct = ps->expout_ptr; } /* Indicate that the current parser invocation is completing a tag. @@ -638,7 +617,7 @@ mark_completion_tag (enum type_code tag, const char *ptr, int length) value in the value history, I.e. $$1 */ void -write_dollar_variable (struct stoken str) +write_dollar_variable (struct parser_state *ps, struct stoken str) { struct symbol *sym = NULL; struct bound_minimal_symbol msym; @@ -676,7 +655,7 @@ write_dollar_variable (struct stoken str) /* Handle tokens that refer to machine registers: $ followed by a register name. */ - i = user_reg_map_name_to_regnum (parse_gdbarch, + i = user_reg_map_name_to_regnum (parse_gdbarch (ps), str.ptr + 1, str.length - 1); if (i >= 0) goto handle_register; @@ -686,9 +665,9 @@ write_dollar_variable (struct stoken str) isym = lookup_only_internalvar (copy_name (str) + 1); if (isym) { - write_exp_elt_opcode (OP_INTERNALVAR); - write_exp_elt_intern (isym); - write_exp_elt_opcode (OP_INTERNALVAR); + write_exp_elt_opcode (ps, OP_INTERNALVAR); + write_exp_elt_intern (ps, isym); + write_exp_elt_opcode (ps, OP_INTERNALVAR); return; } @@ -699,36 +678,36 @@ write_dollar_variable (struct stoken str) VAR_DOMAIN, NULL); if (sym) { - write_exp_elt_opcode (OP_VAR_VALUE); - write_exp_elt_block (block_found); /* set by lookup_symbol */ - write_exp_elt_sym (sym); - write_exp_elt_opcode (OP_VAR_VALUE); + write_exp_elt_opcode (ps, OP_VAR_VALUE); + write_exp_elt_block (ps, block_found); /* set by lookup_symbol */ + write_exp_elt_sym (ps, sym); + write_exp_elt_opcode (ps, OP_VAR_VALUE); return; } msym = lookup_bound_minimal_symbol (copy_name (str)); if (msym.minsym) { - write_exp_msymbol (msym); + write_exp_msymbol (ps, msym); return; } /* Any other names are assumed to be debugger internal variables. */ - write_exp_elt_opcode (OP_INTERNALVAR); - write_exp_elt_intern (create_internalvar (copy_name (str) + 1)); - write_exp_elt_opcode (OP_INTERNALVAR); + write_exp_elt_opcode (ps, OP_INTERNALVAR); + write_exp_elt_intern (ps, create_internalvar (copy_name (str) + 1)); + write_exp_elt_opcode (ps, OP_INTERNALVAR); return; handle_last: - write_exp_elt_opcode (OP_LAST); - write_exp_elt_longcst ((LONGEST) i); - write_exp_elt_opcode (OP_LAST); + write_exp_elt_opcode (ps, OP_LAST); + write_exp_elt_longcst (ps, (LONGEST) i); + write_exp_elt_opcode (ps, OP_LAST); return; handle_register: - write_exp_elt_opcode (OP_REGISTER); + write_exp_elt_opcode (ps, OP_REGISTER); str.length--; str.ptr++; - write_exp_string (str); - write_exp_elt_opcode (OP_REGISTER); + write_exp_string (ps, str); + write_exp_elt_opcode (ps, OP_REGISTER); return; } @@ -1161,6 +1140,7 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, volatile struct gdb_exception except; struct cleanup *old_chain, *inner_chain; const struct language_defn *lang = NULL; + struct parser_state ps; int subexp; lexptr = *stringptr; @@ -1233,47 +1213,48 @@ parse_exp_in_context_1 (const char **stringptr, CORE_ADDR pc, 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 ()); + + initialize_expout (&ps, 10, lang, get_current_arch ()); inner_chain = make_cleanup_restore_current_language (); set_language (lang->la_language); TRY_CATCH (except, RETURN_MASK_ALL) { - if (lang->la_parser ()) + if (lang->la_parser (&ps)) lang->la_error (NULL); } if (except.reason < 0) { if (! parse_completion) { - xfree (expout); + xfree (ps.expout); throw_exception (except); } } - reallocate_expout (); + reallocate_expout (&ps); /* Convert expression from postfix form as generated by yacc parser, to a prefix form. */ if (expressiondebug) - dump_raw_expression (expout, gdb_stdlog, + dump_raw_expression (ps.expout, gdb_stdlog, "before conversion to prefix form"); - subexp = prefixify_expression (expout); + subexp = prefixify_expression (ps.expout); if (out_subexp) *out_subexp = subexp; - lang->la_post_parser (&expout, void_context_p); + lang->la_post_parser (&ps.expout, void_context_p); if (expressiondebug) - dump_prefix_expression (expout, gdb_stdlog); + dump_prefix_expression (ps.expout, gdb_stdlog); do_cleanups (inner_chain); discard_cleanups (old_chain); *stringptr = lexptr; - return expout; + return ps.expout; } /* Parse STRING as an expression, and complain if this fails @@ -1512,7 +1493,7 @@ push_type_int (int n) item. */ void -insert_type_address_space (char *string) +insert_type_address_space (struct parser_state *pstate, char *string) { union type_stack_elt element; int slot; @@ -1527,7 +1508,8 @@ insert_type_address_space (char *string) element.piece = tp_space_identifier; insert_into_type_stack (slot, element); - element.int_val = address_space_name_to_int (parse_gdbarch, string); + element.int_val = address_space_name_to_int (parse_gdbarch (pstate), + string); insert_into_type_stack (slot, element); } @@ -1909,6 +1891,21 @@ exp_uses_objfile (struct expression *exp, struct objfile *objfile) return exp_iterate (exp, exp_uses_objfile_iter, objfile); } +/* See definition in parser-defs.h. */ + +void +increase_expout_size (struct parser_state *ps, size_t lenelt) +{ + if ((ps->expout_ptr + lenelt) >= ps->expout_size) + { + ps->expout_size = max (ps->expout_size * 2, + ps->expout_ptr + lenelt + 10); + ps->expout = (struct expression *) + xrealloc (ps->expout, (sizeof (struct expression) + + EXP_ELEM_TO_BYTES (ps->expout_size))); + } +} + void _initialize_parse (void) { |