mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
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.
This commit is contained in:
277
gdb/parse.c
277
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user