Extract symbol-writing function from parsers

I noticed that several parsers shared the same code to write a symbol
reference to an expression.  This patch factors this code out into a
new function.

Regression tested on x86-64 Fedora 32.

gdb/ChangeLog
2021-02-05  Tom Tromey  <tom@tromey.com>

	* parser-defs.h (write_exp_symbol_reference): Declare.
	* parse.c (write_exp_symbol_reference): New function.
	* p-exp.y (variable): Use write_exp_symbol_reference.
	* m2-exp.y (variable): Use write_exp_symbol_reference.
	* f-exp.y (variable): Use write_exp_symbol_reference.
	* d-exp.y (PrimaryExpression): Use write_exp_symbol_reference.
	* c-exp.y (variable): Use write_exp_symbol_reference.
This commit is contained in:
Tom Tromey 2021-02-05 07:11:01 -07:00
parent e37d88e5e5
commit 1b30f42106
8 changed files with 77 additions and 128 deletions

View file

@ -1,3 +1,13 @@
2021-02-05 Tom Tromey <tom@tromey.com>
* parser-defs.h (write_exp_symbol_reference): Declare.
* parse.c (write_exp_symbol_reference): New function.
* p-exp.y (variable): Use write_exp_symbol_reference.
* m2-exp.y (variable): Use write_exp_symbol_reference.
* f-exp.y (variable): Use write_exp_symbol_reference.
* d-exp.y (PrimaryExpression): Use write_exp_symbol_reference.
* c-exp.y (variable): Use write_exp_symbol_reference.
2021-02-05 Tom de Vries <tdevries@suse.de>
PR exp/27265

View file

@ -1104,30 +1104,12 @@ variable: qualified_name
| COLONCOLON name_not_typename
{
std::string name = copy_name ($2.stoken);
struct symbol *sym;
struct bound_minimal_symbol msymbol;
sym
struct block_symbol sym
= lookup_symbol (name.c_str (),
(const struct block *) NULL,
VAR_DOMAIN, NULL).symbol;
if (sym)
{
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, NULL);
write_exp_elt_sym (pstate, sym);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
break;
}
msymbol = lookup_bound_minimal_symbol (name.c_str ());
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."),
name.c_str ());
VAR_DOMAIN, NULL);
write_exp_symbol_reference (pstate, name.c_str (),
sym);
}
;

View file

@ -464,7 +464,6 @@ PrimaryExpression:
been resolved, it's not likely to be found. */
if (type->code () == TYPE_CODE_MODULE)
{
struct bound_minimal_symbol msymbol;
struct block_symbol sym;
const char *type_name = TYPE_SAFE_NAME (type);
int type_name_len = strlen (type_name);
@ -477,35 +476,23 @@ PrimaryExpression:
lookup_symbol (name.c_str (),
(const struct block *) NULL,
VAR_DOMAIN, NULL);
if (sym.symbol)
{
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, sym.block);
write_exp_elt_sym (pstate, sym.symbol);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
break;
}
msymbol = lookup_bound_minimal_symbol (name.c_str ());
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."),
name.c_str ());
write_exp_symbol_reference (pstate,
name.c_str (),
sym);
}
else
{
/* Check if the qualified name resolves as a member
of an aggregate or an enum type. */
if (!type_aggregate_p (type))
error (_("`%s' is not defined as an aggregate type."),
TYPE_SAFE_NAME (type));
/* Check if the qualified name resolves as a member
of an aggregate or an enum type. */
if (!type_aggregate_p (type))
error (_("`%s' is not defined as an aggregate type."),
TYPE_SAFE_NAME (type));
write_exp_elt_opcode (pstate, OP_SCOPE);
write_exp_elt_type (pstate, type);
write_exp_string (pstate, $3);
write_exp_elt_opcode (pstate, OP_SCOPE);
write_exp_elt_opcode (pstate, OP_SCOPE);
write_exp_elt_type (pstate, type);
write_exp_string (pstate, $3);
write_exp_elt_opcode (pstate, OP_SCOPE);
}
}
| DOLLAR_VARIABLE
{ write_dollar_variable (pstate, $1); }

View file

@ -540,32 +540,9 @@ exp : STRING_LITERAL
variable: name_not_typename
{ struct block_symbol sym = $1.sym;
if (sym.symbol)
{
if (symbol_read_needs_frame (sym.symbol))
pstate->block_tracker->update (sym);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, sym.block);
write_exp_elt_sym (pstate, sym.symbol);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
break;
}
else
{
struct bound_minimal_symbol msymbol;
std::string arg = copy_name ($1.stoken);
msymbol =
lookup_bound_minimal_symbol (arg.c_str ());
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."),
arg.c_str ());
}
std::string name = copy_name ($1.stoken);
write_exp_symbol_reference (pstate, name.c_str (),
sym);
}
;

View file

@ -561,37 +561,15 @@ variable: NAME
{ struct block_symbol sym;
struct field_of_this_result is_a_field_of_this;
std::string name = copy_name ($1);
sym
= lookup_symbol (copy_name ($1).c_str (),
= lookup_symbol (name.c_str (),
pstate->expression_context_block,
VAR_DOMAIN,
&is_a_field_of_this);
if (sym.symbol)
{
if (symbol_read_needs_frame (sym.symbol))
pstate->block_tracker->update (sym);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, sym.block);
write_exp_elt_sym (pstate, sym.symbol);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
}
else
{
struct bound_minimal_symbol msymbol;
std::string arg = copy_name ($1);
msymbol =
lookup_bound_minimal_symbol (arg.c_str ());
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"symbol-file\" command."));
else
error (_("No symbol \"%s\" in current context."),
arg.c_str ());
}
write_exp_symbol_reference (pstate, name.c_str (),
sym);
}
;

View file

@ -691,33 +691,12 @@ variable: qualified_name
| COLONCOLON name
{
std::string name = copy_name ($2);
struct symbol *sym;
struct bound_minimal_symbol msymbol;
sym =
lookup_symbol (name.c_str (),
(const struct block *) NULL,
VAR_DOMAIN, NULL).symbol;
if (sym)
{
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, NULL);
write_exp_elt_sym (pstate, sym);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
break;
}
msymbol
= lookup_bound_minimal_symbol (name.c_str ());
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols ()
&& !have_partial_symbols ())
error (_("No symbol table is loaded. "
"Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."),
name.c_str ());
struct block_symbol sym
= lookup_symbol (name.c_str (), nullptr,
VAR_DOMAIN, nullptr);
write_exp_symbol_reference (pstate, name.c_str (),
sym);
}
;

View file

@ -650,6 +650,32 @@ handle_register:
return;
}
/* See parser-defs.h. */
void
write_exp_symbol_reference (struct parser_state *pstate, const char *name,
struct block_symbol sym)
{
if (sym.symbol != nullptr)
{
if (symbol_read_needs_frame (sym.symbol))
pstate->block_tracker->update (sym);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
write_exp_elt_block (pstate, NULL);
write_exp_elt_sym (pstate, sym.symbol);
write_exp_elt_opcode (pstate, OP_VAR_VALUE);
}
else
{
struct bound_minimal_symbol msymbol = lookup_bound_minimal_symbol (name);
if (msymbol.minsym != NULL)
write_exp_msymbol (pstate, msymbol);
else if (!have_full_symbols () && !have_partial_symbols ())
error (_("No symbol table is loaded. Use the \"file\" command."));
else
error (_("No symbol \"%s\" in current context."), name);
}
}
const char *
find_template_name_end (const char *p)

View file

@ -334,6 +334,16 @@ extern void write_exp_msymbol (struct expr_builder *,
extern void write_dollar_variable (struct parser_state *, struct stoken str);
/* Write a reference to a symbol to the expression being built in PS.
NAME is the name of the symbol to write; SYM is the symbol. If SYM
is nullptr (meaning the 'symbol' member), a minimal symbol will be
searched for and used if available. Throws an exception if SYM is
nullptr and no minimal symbol can be found. */
extern void write_exp_symbol_reference (struct parser_state *ps,
const char *name,
struct block_symbol sym);
extern const char *find_template_name_end (const char *);
extern std::string copy_name (struct stoken);