* findvar.c, value.h (symbol_read_needs_frame): New function.
* c-exp.y, m2-exp.y: Call it instead of having our own switch on the symbol's class. * valops.c (value_of_variable): Use symbol_read_needs_frame to decide whether we care about finding a frame.
This commit is contained in:
parent
1aa6938eb3
commit
443abae18c
5 changed files with 54 additions and 55 deletions
|
@ -1,3 +1,11 @@
|
|||
Fri Oct 8 14:56:21 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* findvar.c, value.h (symbol_read_needs_frame): New function.
|
||||
* c-exp.y, m2-exp.y: Call it instead of having our own switch on
|
||||
the symbol's class.
|
||||
* valops.c (value_of_variable): Use symbol_read_needs_frame to
|
||||
decide whether we care about finding a frame.
|
||||
|
||||
Fri Oct 8 02:34:21 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* blockframe.c (get_frame_block): Do not adjust pc if the frame
|
||||
|
|
31
gdb/c-exp.y
31
gdb/c-exp.y
|
@ -659,41 +659,14 @@ variable: name_not_typename
|
|||
|
||||
if (sym)
|
||||
{
|
||||
switch (SYMBOL_CLASS (sym))
|
||||
if (symbol_read_needs_frame (sym))
|
||||
{
|
||||
case LOC_REGISTER:
|
||||
case LOC_ARG:
|
||||
case LOC_REF_ARG:
|
||||
case LOC_REGPARM:
|
||||
case LOC_REGPARM_ADDR:
|
||||
case LOC_LOCAL:
|
||||
case LOC_LOCAL_ARG:
|
||||
case LOC_BASEREG:
|
||||
case LOC_BASEREG_ARG:
|
||||
if (innermost_block == 0 ||
|
||||
contained_in (block_found,
|
||||
innermost_block))
|
||||
innermost_block = block_found;
|
||||
case LOC_UNDEF:
|
||||
case LOC_CONST:
|
||||
case LOC_STATIC:
|
||||
case LOC_TYPEDEF:
|
||||
case LOC_LABEL:
|
||||
case LOC_BLOCK:
|
||||
case LOC_CONST_BYTES:
|
||||
case LOC_OPTIMIZED_OUT:
|
||||
|
||||
/* In this case the expression can
|
||||
be evaluated regardless of what
|
||||
frame we are in, so there is no
|
||||
need to check for the
|
||||
innermost_block. These cases are
|
||||
listed so that gcc -Wall will
|
||||
report types that may not have
|
||||
been considered. */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
write_exp_elt_opcode (OP_VAR_VALUE);
|
||||
/* We want to use the selected frame, not
|
||||
another more inner frame which happens to
|
||||
|
|
|
@ -467,7 +467,7 @@ read_register (regno)
|
|||
void
|
||||
write_register (regno, val)
|
||||
int regno;
|
||||
long val;
|
||||
LONGEST val;
|
||||
{
|
||||
PTR buf;
|
||||
int size;
|
||||
|
@ -518,6 +518,45 @@ supply_register (regno, val)
|
|||
#endif
|
||||
}
|
||||
|
||||
/* Will calling read_var_value or locate_var_value on SYM end
|
||||
up caring what frame it is being evaluated relative to? SYM must
|
||||
be non-NULL. */
|
||||
int
|
||||
symbol_read_needs_frame (sym)
|
||||
struct symbol *sym;
|
||||
{
|
||||
switch (SYMBOL_CLASS (sym))
|
||||
{
|
||||
/* All cases listed explicitly so that gcc -Wall will detect it if
|
||||
we failed to consider one. */
|
||||
case LOC_REGISTER:
|
||||
case LOC_ARG:
|
||||
case LOC_REF_ARG:
|
||||
case LOC_REGPARM:
|
||||
case LOC_REGPARM_ADDR:
|
||||
case LOC_LOCAL:
|
||||
case LOC_LOCAL_ARG:
|
||||
case LOC_BASEREG:
|
||||
case LOC_BASEREG_ARG:
|
||||
return 1;
|
||||
|
||||
case LOC_UNDEF:
|
||||
case LOC_CONST:
|
||||
case LOC_STATIC:
|
||||
case LOC_TYPEDEF:
|
||||
|
||||
case LOC_LABEL:
|
||||
/* Getting the address of a label can be done independently of the block,
|
||||
even if some *uses* of that address wouldn't work so well without
|
||||
the right frame. */
|
||||
|
||||
case LOC_BLOCK:
|
||||
case LOC_CONST_BYTES:
|
||||
case LOC_OPTIMIZED_OUT:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Given a struct symbol for a variable,
|
||||
and a stack frame id, read the value of the variable
|
||||
and return a (pointer to a) struct value containing the value.
|
||||
|
|
27
gdb/m2-exp.y
27
gdb/m2-exp.y
|
@ -599,35 +599,14 @@ variable: NAME
|
|||
NULL);
|
||||
if (sym)
|
||||
{
|
||||
switch (sym->class)
|
||||
if (symbol_read_needs_frame (sym))
|
||||
{
|
||||
case LOC_REGISTER:
|
||||
case LOC_ARG:
|
||||
case LOC_LOCAL:
|
||||
case LOC_REF_ARG:
|
||||
case LOC_REGPARM:
|
||||
case LOC_REGPARM_ADDR:
|
||||
case LOC_LOCAL_ARG:
|
||||
case LOC_BASEREG:
|
||||
case LOC_BASEREG_ARG:
|
||||
if (innermost_block == 0 ||
|
||||
contained_in (block_found,
|
||||
contained_in (block_found,
|
||||
innermost_block))
|
||||
innermost_block = block_found;
|
||||
break;
|
||||
|
||||
case LOC_UNDEF:
|
||||
case LOC_CONST:
|
||||
case LOC_STATIC:
|
||||
case LOC_TYPEDEF:
|
||||
case LOC_LABEL: /* maybe should go above? */
|
||||
case LOC_BLOCK:
|
||||
case LOC_CONST_BYTES:
|
||||
case LOC_OPTIMIZED_OUT:
|
||||
/* These are listed so gcc -Wall will reveal
|
||||
un-handled cases. */
|
||||
break;
|
||||
}
|
||||
|
||||
write_exp_elt_opcode (OP_VAR_VALUE);
|
||||
/* We want to use the selected frame, not
|
||||
another more inner frame which happens to
|
||||
|
|
|
@ -511,7 +511,7 @@ value_of_variable (var, b)
|
|||
else
|
||||
{
|
||||
fr = block_innermost_frame (b);
|
||||
if (fr == NULL)
|
||||
if (fr == NULL && symbol_read_needs_frame (var))
|
||||
{
|
||||
if (BLOCK_FUNCTION (b) != NULL
|
||||
&& SYMBOL_NAME (BLOCK_FUNCTION (b)) != NULL)
|
||||
|
|
Loading…
Add table
Reference in a new issue