* ax-gdb.c (gen_var_ref): Unconditionally call via computed ops,

if possible.
	* dwarf2read.c (read_func_scope): Remove old FIXME.
	* eval.c (evaluate_subexp_standard): Check SYMBOL_COMPUTED_OPS,
	not LOC_COMPUTED.
	* findvar.c (symbol_read_needs_frame, default_read_var_value):
	Unconditionally call via computed ops, if possible.
	* printcmd.c (address_info): Unconditionally call via computed ops,
	if possible.
	* stack.c (read_frame_arg): Unconditionally call via computed ops,
	if possible.
	* symtab.c (register_symbol_computed_impl): Sanity check 'ops'.
	* tracepoint.c (scope_info): Unconditionally call via computed ops,
	if possible.
This commit is contained in:
Tom Tromey 2013-03-20 18:35:22 +00:00
parent f1e6e0721c
commit 24d6c2a0bb
9 changed files with 148 additions and 129 deletions

View file

@ -1,3 +1,20 @@
2013-03-20 Tom Tromey <tromey@redhat.com>
* ax-gdb.c (gen_var_ref): Unconditionally call via computed ops,
if possible.
* dwarf2read.c (read_func_scope): Remove old FIXME.
* eval.c (evaluate_subexp_standard): Check SYMBOL_COMPUTED_OPS,
not LOC_COMPUTED.
* findvar.c (symbol_read_needs_frame, default_read_var_value):
Unconditionally call via computed ops, if possible.
* printcmd.c (address_info): Unconditionally call via computed ops,
if possible.
* stack.c (read_frame_arg): Unconditionally call via computed ops,
if possible.
* symtab.c (register_symbol_computed_impl): Sanity check 'ops'.
* tracepoint.c (scope_info): Unconditionally call via computed ops,
if possible.
2013-03-20 Jan Kratochvil <jan.kratochvil@redhat.com> 2013-03-20 Jan Kratochvil <jan.kratochvil@redhat.com>
Tom Tromey <tromey@redhat.com> Tom Tromey <tromey@redhat.com>

View file

@ -662,6 +662,12 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
value->type = check_typedef (SYMBOL_TYPE (var)); value->type = check_typedef (SYMBOL_TYPE (var));
value->optimized_out = 0; value->optimized_out = 0;
if (SYMBOL_COMPUTED_OPS (var) != NULL)
{
SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, gdbarch, ax, value);
return;
}
/* I'm imitating the code in read_var_value. */ /* I'm imitating the code in read_var_value. */
switch (SYMBOL_CLASS (var)) switch (SYMBOL_CLASS (var))
{ {
@ -750,13 +756,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
break; break;
case LOC_COMPUTED: case LOC_COMPUTED:
/* FIXME: cagney/2004-01-26: It should be possible to gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
unconditionally call the SYMBOL_COMPUTED_OPS method when available.
Unfortunately DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, gdbarch, ax, value);
break;
case LOC_OPTIMIZED_OUT: case LOC_OPTIMIZED_OUT:
/* Flag this, but don't say anything; leave it up to callers to /* Flag this, but don't say anything; leave it up to callers to

View file

@ -9522,15 +9522,6 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
it. */ it. */
attr = dwarf2_attr (die, DW_AT_frame_base, cu); attr = dwarf2_attr (die, DW_AT_frame_base, cu);
if (attr) if (attr)
/* FIXME: cagney/2004-01-26: The DW_AT_frame_base's location
expression is being recorded directly in the function's symbol
and not in a separate frame-base object. I guess this hack is
to avoid adding some sort of frame-base adjunct/annex to the
function's symbol :-(. The problem with doing this is that it
results in a function symbol with a location expression that
has nothing to do with the location of the function, ouch! The
relationship should be: a function's symbol has-a frame base; a
frame-base has-a location expression. */
dwarf2_symbol_mark_computed (attr, new->name, cu, 1); dwarf2_symbol_mark_computed (attr, new->name, cu, 1);
cu->list_in_scope = &local_symbols; cu->list_in_scope = &local_symbols;

View file

@ -792,7 +792,7 @@ evaluate_subexp_standard (struct type *expect_type,
if (noside == EVAL_AVOID_SIDE_EFFECTS) if (noside == EVAL_AVOID_SIDE_EFFECTS)
return value_zero (SYMBOL_TYPE (sym), not_lval); return value_zero (SYMBOL_TYPE (sym), not_lval);
if (SYMBOL_CLASS (sym) != LOC_COMPUTED if (SYMBOL_COMPUTED_OPS (sym) == NULL
|| SYMBOL_COMPUTED_OPS (sym)->read_variable_at_entry == NULL) || SYMBOL_COMPUTED_OPS (sym)->read_variable_at_entry == NULL)
error (_("Symbol \"%s\" does not have any specific entry value"), error (_("Symbol \"%s\" does not have any specific entry value"),
SYMBOL_PRINT_NAME (sym)); SYMBOL_PRINT_NAME (sym));

View file

@ -367,17 +367,15 @@ address_to_signed_pointer (struct gdbarch *gdbarch, struct type *type,
int int
symbol_read_needs_frame (struct symbol *sym) symbol_read_needs_frame (struct symbol *sym)
{ {
if (SYMBOL_COMPUTED_OPS (sym) != NULL)
return SYMBOL_COMPUTED_OPS (sym)->read_needs_frame (sym);
switch (SYMBOL_CLASS (sym)) switch (SYMBOL_CLASS (sym))
{ {
/* All cases listed explicitly so that gcc -Wall will detect it if /* All cases listed explicitly so that gcc -Wall will detect it if
we failed to consider one. */ we failed to consider one. */
case LOC_COMPUTED: case LOC_COMPUTED:
/* FIXME: cagney/2004-01-26: It should be possible to gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
unconditionally call the SYMBOL_COMPUTED_OPS method when available.
Unfortunately DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
return SYMBOL_COMPUTED_OPS (sym)->read_needs_frame (sym);
case LOC_REGISTER: case LOC_REGISTER:
case LOC_ARG: case LOC_ARG:
@ -456,6 +454,9 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
if (symbol_read_needs_frame (var)) if (symbol_read_needs_frame (var))
gdb_assert (frame); gdb_assert (frame);
if (SYMBOL_COMPUTED_OPS (var) != NULL)
return SYMBOL_COMPUTED_OPS (var)->read_variable (var, frame);
switch (SYMBOL_CLASS (var)) switch (SYMBOL_CLASS (var))
{ {
case LOC_CONST: case LOC_CONST:
@ -578,12 +579,7 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
break; break;
case LOC_COMPUTED: case LOC_COMPUTED:
/* FIXME: cagney/2004-01-26: It should be possible to gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
unconditionally call the SYMBOL_COMPUTED_OPS method when available.
Unfortunately DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
return SYMBOL_COMPUTED_OPS (var)->read_variable (var, frame);
case LOC_UNRESOLVED: case LOC_UNRESOLVED:
{ {

View file

@ -1251,6 +1251,14 @@ address_info (char *exp, int from_tty)
section = SYMBOL_OBJ_SECTION (sym); section = SYMBOL_OBJ_SECTION (sym);
gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile); gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
if (SYMBOL_COMPUTED_OPS (sym) != NULL)
{
SYMBOL_COMPUTED_OPS (sym)->describe_location (sym, context_pc,
gdb_stdout);
printf_filtered (".\n");
return;
}
switch (SYMBOL_CLASS (sym)) switch (SYMBOL_CLASS (sym))
{ {
case LOC_CONST: case LOC_CONST:
@ -1273,14 +1281,7 @@ address_info (char *exp, int from_tty)
break; break;
case LOC_COMPUTED: case LOC_COMPUTED:
/* FIXME: cagney/2004-01-26: It should be possible to gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
unconditionally call the SYMBOL_COMPUTED_OPS method when available.
Unfortunately DWARF 2 stores the frame-base (instead of the
function) location in a function's symbol. Oops! For the
moment enable this when/where applicable. */
SYMBOL_COMPUTED_OPS (sym)->describe_location (sym, context_pc,
gdb_stdout);
break;
case LOC_REGISTER: case LOC_REGISTER:
/* GDBARCH is the architecture associated with the objfile the symbol /* GDBARCH is the architecture associated with the objfile the symbol

View file

@ -323,7 +323,8 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame,
} }
} }
if (SYMBOL_CLASS (sym) == LOC_COMPUTED if (SYMBOL_COMPUTED_OPS (sym) != NULL
&& SYMBOL_COMPUTED_OPS (sym)->read_variable_at_entry != NULL
&& print_entry_values != print_entry_values_no && print_entry_values != print_entry_values_no
&& (print_entry_values != print_entry_values_if_needed && (print_entry_values != print_entry_values_if_needed
|| !val || value_optimized_out (val))) || !val || value_optimized_out (val)))

View file

@ -5053,6 +5053,13 @@ register_symbol_computed_impl (enum address_class aclass,
symbol_impl[result].aclass = aclass; symbol_impl[result].aclass = aclass;
symbol_impl[result].ops_computed = ops; symbol_impl[result].ops_computed = ops;
/* Sanity check OPS. */
gdb_assert (ops != NULL);
gdb_assert (ops->tracepoint_var_ref != NULL);
gdb_assert (ops->describe_location != NULL);
gdb_assert (ops->read_needs_frame != NULL);
gdb_assert (ops->read_variable != NULL);
return result; return result;
} }

View file

@ -2678,101 +2678,107 @@ scope_info (char *args, int from_tty)
gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile); gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
printf_filtered ("Symbol %s is ", symname); printf_filtered ("Symbol %s is ", symname);
switch (SYMBOL_CLASS (sym))
{
default:
case LOC_UNDEF: /* Messed up symbol? */
printf_filtered ("a bogus symbol, class %d.\n",
SYMBOL_CLASS (sym));
count--; /* Don't count this one. */
continue;
case LOC_CONST:
printf_filtered ("a constant with value %s (%s)",
plongest (SYMBOL_VALUE (sym)),
hex_string (SYMBOL_VALUE (sym)));
break;
case LOC_CONST_BYTES:
printf_filtered ("constant bytes: ");
if (SYMBOL_TYPE (sym))
for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
fprintf_filtered (gdb_stdout, " %02x",
(unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
break;
case LOC_STATIC:
printf_filtered ("in static storage at address ");
printf_filtered ("%s", paddress (gdbarch,
SYMBOL_VALUE_ADDRESS (sym)));
break;
case LOC_REGISTER:
/* GDBARCH is the architecture associated with the objfile
the symbol is defined in; the target architecture may be
different, and may provide additional registers. However,
we do not know the target architecture at this point.
We assume the objfile architecture will contain all the
standard registers that occur in debug info in that
objfile. */
regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
gdbarch);
if (SYMBOL_IS_ARGUMENT (sym)) if (SYMBOL_COMPUTED_OPS (sym) != NULL)
printf_filtered ("an argument in register $%s", SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
gdbarch_register_name (gdbarch, regno)); BLOCK_START (block),
else gdb_stdout);
printf_filtered ("a local variable in register $%s", else
gdbarch_register_name (gdbarch, regno)); {
break; switch (SYMBOL_CLASS (sym))
case LOC_ARG:
printf_filtered ("an argument at stack/frame offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_LOCAL:
printf_filtered ("a local variable at frame offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_REF_ARG:
printf_filtered ("a reference argument at offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_REGPARM_ADDR:
/* Note comment at LOC_REGISTER. */
regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
gdbarch);
printf_filtered ("the address of an argument, in register $%s",
gdbarch_register_name (gdbarch, regno));
break;
case LOC_TYPEDEF:
printf_filtered ("a typedef.\n");
continue;
case LOC_LABEL:
printf_filtered ("a label at address ");
printf_filtered ("%s", paddress (gdbarch,
SYMBOL_VALUE_ADDRESS (sym)));
break;
case LOC_BLOCK:
printf_filtered ("a function at address ");
printf_filtered ("%s",
paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
break;
case LOC_UNRESOLVED:
msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
NULL, NULL);
if (msym == NULL)
printf_filtered ("Unresolved Static");
else
{ {
printf_filtered ("static storage at address "); default:
case LOC_UNDEF: /* Messed up symbol? */
printf_filtered ("a bogus symbol, class %d.\n",
SYMBOL_CLASS (sym));
count--; /* Don't count this one. */
continue;
case LOC_CONST:
printf_filtered ("a constant with value %s (%s)",
plongest (SYMBOL_VALUE (sym)),
hex_string (SYMBOL_VALUE (sym)));
break;
case LOC_CONST_BYTES:
printf_filtered ("constant bytes: ");
if (SYMBOL_TYPE (sym))
for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
fprintf_filtered (gdb_stdout, " %02x",
(unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
break;
case LOC_STATIC:
printf_filtered ("in static storage at address ");
printf_filtered ("%s", paddress (gdbarch,
SYMBOL_VALUE_ADDRESS (sym)));
break;
case LOC_REGISTER:
/* GDBARCH is the architecture associated with the objfile
the symbol is defined in; the target architecture may be
different, and may provide additional registers. However,
we do not know the target architecture at this point.
We assume the objfile architecture will contain all the
standard registers that occur in debug info in that
objfile. */
regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
gdbarch);
if (SYMBOL_IS_ARGUMENT (sym))
printf_filtered ("an argument in register $%s",
gdbarch_register_name (gdbarch, regno));
else
printf_filtered ("a local variable in register $%s",
gdbarch_register_name (gdbarch, regno));
break;
case LOC_ARG:
printf_filtered ("an argument at stack/frame offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_LOCAL:
printf_filtered ("a local variable at frame offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_REF_ARG:
printf_filtered ("a reference argument at offset %s",
plongest (SYMBOL_VALUE (sym)));
break;
case LOC_REGPARM_ADDR:
/* Note comment at LOC_REGISTER. */
regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
gdbarch);
printf_filtered ("the address of an argument, in register $%s",
gdbarch_register_name (gdbarch, regno));
break;
case LOC_TYPEDEF:
printf_filtered ("a typedef.\n");
continue;
case LOC_LABEL:
printf_filtered ("a label at address ");
printf_filtered ("%s", paddress (gdbarch,
SYMBOL_VALUE_ADDRESS (sym)));
break;
case LOC_BLOCK:
printf_filtered ("a function at address ");
printf_filtered ("%s", printf_filtered ("%s",
paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym))); paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
break;
case LOC_UNRESOLVED:
msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
NULL, NULL);
if (msym == NULL)
printf_filtered ("Unresolved Static");
else
{
printf_filtered ("static storage at address ");
printf_filtered ("%s",
paddress (gdbarch,
SYMBOL_VALUE_ADDRESS (msym)));
}
break;
case LOC_OPTIMIZED_OUT:
printf_filtered ("optimized out.\n");
continue;
case LOC_COMPUTED:
gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
} }
break;
case LOC_OPTIMIZED_OUT:
printf_filtered ("optimized out.\n");
continue;
case LOC_COMPUTED:
SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
BLOCK_START (block),
gdb_stdout);
break;
} }
if (SYMBOL_TYPE (sym)) if (SYMBOL_TYPE (sym))
printf_filtered (", length %d.\n", printf_filtered (", length %d.\n",