aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-02-05 07:11:01 -0700
committerTom Tromey <tom@tromey.com>2021-02-05 07:11:01 -0700
commit1b30f42106cfd50ef1c020db2ca31f2fbe51ef8a (patch)
treef22193895e3e5c0683504ccc7a525459fccee6da
parente37d88e5e5666304d94b705af4301867df9bdab0 (diff)
downloadgdb-1b30f42106cfd50ef1c020db2ca31f2fbe51ef8a.zip
gdb-1b30f42106cfd50ef1c020db2ca31f2fbe51ef8a.tar.gz
gdb-1b30f42106cfd50ef1c020db2ca31f2fbe51ef8a.tar.bz2
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.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/c-exp.y26
-rw-r--r--gdb/d-exp.y45
-rw-r--r--gdb/f-exp.y29
-rw-r--r--gdb/m2-exp.y30
-rw-r--r--gdb/p-exp.y31
-rw-r--r--gdb/parse.c26
-rw-r--r--gdb/parser-defs.h10
8 files changed, 78 insertions, 129 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 07fe6a0..553b5f0 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 71610e9..13b06f3 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -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);
}
;
diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index 35cd074..c432f22 100644
--- a/gdb/d-exp.y
+++ b/gdb/d-exp.y
@@ -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));
+
+ 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);
}
-
- /* 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);
}
| DOLLAR_VARIABLE
{ write_dollar_variable (pstate, $1); }
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index 3b0f23d..92a70b4 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -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);
}
;
diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index 717c6e6..68bae48 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -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);
}
;
diff --git a/gdb/p-exp.y b/gdb/p-exp.y
index 5a43e89..b025ac3 100644
--- a/gdb/p-exp.y
+++ b/gdb/p-exp.y
@@ -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);
}
;
diff --git a/gdb/parse.c b/gdb/parse.c
index 933960f..08fde89 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -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)
diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h
index 5ff5d52..466230e 100644
--- a/gdb/parser-defs.h
+++ b/gdb/parser-defs.h
@@ -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);