* 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:
Jim Kingdon 1993-10-08 20:33:22 +00:00
parent 1aa6938eb3
commit 443abae18c
5 changed files with 54 additions and 55 deletions

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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)