* value.h (address_of_variable): Add prototype.
(locate_var_value): Remove prototype. * findvar.c (read_var_value): Do not attempt to default frame to selected frame. (locate_var_value): Remove function. * valops.c (value_of_variable): Retrieve selected frame for symbols that require a frame when called with NULL block. * valops.c (address_of_variable): New function. * eval.c (evaluate_subexp_for_address): Call address_of_variable instead of calling locate_var_value. (evaluate_subexp_with_coercion): Likewise.
This commit is contained in:
parent
cc2420d5bb
commit
61212c0fb1
5 changed files with 81 additions and 90 deletions
|
@ -1,3 +1,19 @@
|
|||
2009-01-15 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* value.h (address_of_variable): Add prototype.
|
||||
(locate_var_value): Remove prototype.
|
||||
|
||||
* findvar.c (read_var_value): Do not attempt to default frame
|
||||
to selected frame.
|
||||
(locate_var_value): Remove function.
|
||||
* valops.c (value_of_variable): Retrieve selected frame for
|
||||
symbols that require a frame when called with NULL block.
|
||||
* valops.c (address_of_variable): New function.
|
||||
|
||||
* eval.c (evaluate_subexp_for_address): Call address_of_variable
|
||||
instead of calling locate_var_value.
|
||||
(evaluate_subexp_with_coercion): Likewise.
|
||||
|
||||
2009-01-14 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* NEWS: Document "define" for prefixed commands.
|
||||
|
|
17
gdb/eval.c
17
gdb/eval.c
|
@ -2560,13 +2560,8 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
|
|||
return
|
||||
value_zero (type, not_lval);
|
||||
}
|
||||
else if (symbol_read_needs_frame (var))
|
||||
return
|
||||
locate_var_value
|
||||
(var,
|
||||
block_innermost_frame (exp->elts[pc + 1].block));
|
||||
else
|
||||
return locate_var_value (var, NULL);
|
||||
return address_of_variable (var, exp->elts[pc + 1].block);
|
||||
|
||||
case OP_SCOPE:
|
||||
tem = longest_to_int (exp->elts[pc + 2].longconst);
|
||||
|
@ -2620,6 +2615,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
|
|||
int pc;
|
||||
struct value *val;
|
||||
struct symbol *var;
|
||||
struct type *type;
|
||||
|
||||
pc = (*pos);
|
||||
op = exp->elts[pc].opcode;
|
||||
|
@ -2628,14 +2624,13 @@ evaluate_subexp_with_coercion (struct expression *exp,
|
|||
{
|
||||
case OP_VAR_VALUE:
|
||||
var = exp->elts[pc + 2].symbol;
|
||||
if (TYPE_CODE (check_typedef (SYMBOL_TYPE (var))) == TYPE_CODE_ARRAY
|
||||
type = check_typedef (SYMBOL_TYPE (var));
|
||||
if (TYPE_CODE (type) == TYPE_CODE_ARRAY
|
||||
&& CAST_IS_CONVERSION)
|
||||
{
|
||||
(*pos) += 4;
|
||||
val =
|
||||
locate_var_value
|
||||
(var, block_innermost_frame (exp->elts[pc + 1].block));
|
||||
return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (check_typedef (SYMBOL_TYPE (var)))),
|
||||
val = address_of_variable (var, exp->elts[pc + 1].block);
|
||||
return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
|
||||
val);
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
|
|
|
@ -382,8 +382,7 @@ symbol_read_needs_frame (struct symbol *sym)
|
|||
/* 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.
|
||||
If the variable cannot be found, return a zero pointer.
|
||||
If FRAME is NULL, use the selected frame. */
|
||||
If the variable cannot be found, return a zero pointer. */
|
||||
|
||||
struct value *
|
||||
read_var_value (struct symbol *var, struct frame_info *frame)
|
||||
|
@ -405,10 +404,8 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
|
||||
len = TYPE_LENGTH (type);
|
||||
|
||||
/* FIXME drow/2003-09-06: this call to the selected frame should be
|
||||
pushed upwards to the callers. */
|
||||
if (frame == NULL)
|
||||
frame = deprecated_safe_get_selected_frame ();
|
||||
if (symbol_read_needs_frame (var))
|
||||
gdb_assert (frame);
|
||||
|
||||
switch (SYMBOL_CLASS (var))
|
||||
{
|
||||
|
@ -450,8 +447,6 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
break;
|
||||
|
||||
case LOC_ARG:
|
||||
if (frame == NULL)
|
||||
return 0;
|
||||
addr = get_frame_args_address (frame);
|
||||
if (!addr)
|
||||
return 0;
|
||||
|
@ -462,8 +457,6 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
{
|
||||
struct value *ref;
|
||||
CORE_ADDR argref;
|
||||
if (frame == NULL)
|
||||
return 0;
|
||||
argref = get_frame_args_address (frame);
|
||||
if (!argref)
|
||||
return 0;
|
||||
|
@ -474,8 +467,6 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
}
|
||||
|
||||
case LOC_LOCAL:
|
||||
if (frame == NULL)
|
||||
return 0;
|
||||
addr = get_frame_locals_address (frame);
|
||||
addr += SYMBOL_VALUE (var);
|
||||
break;
|
||||
|
@ -498,9 +489,6 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
int regno = SYMBOL_VALUE (var);
|
||||
struct value *regval;
|
||||
|
||||
if (frame == NULL)
|
||||
return 0;
|
||||
|
||||
if (SYMBOL_CLASS (var) == LOC_REGPARM_ADDR)
|
||||
{
|
||||
regval = value_from_register (lookup_pointer_type (type),
|
||||
|
@ -530,8 +518,6 @@ read_var_value (struct symbol *var, struct frame_info *frame)
|
|||
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. */
|
||||
if (frame == 0 && SYMBOL_OPS (var)->read_needs_frame (var))
|
||||
return 0;
|
||||
return SYMBOL_OPS (var)->read_variable (var, frame);
|
||||
|
||||
case LOC_UNRESOLVED:
|
||||
|
@ -657,58 +643,3 @@ address_from_register (struct type *type, int regnum, struct frame_info *frame)
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Given a struct symbol for a variable or function,
|
||||
and a stack frame id,
|
||||
return a (pointer to a) struct value containing the properly typed
|
||||
address. */
|
||||
|
||||
struct value *
|
||||
locate_var_value (struct symbol *var, struct frame_info *frame)
|
||||
{
|
||||
struct gdbarch *gdbarch;
|
||||
CORE_ADDR addr = 0;
|
||||
struct type *type = SYMBOL_TYPE (var);
|
||||
struct value *lazy_value;
|
||||
|
||||
/* Evaluate it first; if the result is a memory address, we're fine.
|
||||
Lazy evaluation pays off here. */
|
||||
|
||||
lazy_value = read_var_value (var, frame);
|
||||
if (lazy_value == 0)
|
||||
error (_("Address of \"%s\" is unknown."), SYMBOL_PRINT_NAME (var));
|
||||
|
||||
if ((VALUE_LVAL (lazy_value) == lval_memory && value_lazy (lazy_value))
|
||||
|| TYPE_CODE (type) == TYPE_CODE_FUNC)
|
||||
{
|
||||
struct value *val;
|
||||
|
||||
addr = VALUE_ADDRESS (lazy_value);
|
||||
val = value_from_pointer (lookup_pointer_type (type), addr);
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Not a memory address; check what the problem was. */
|
||||
switch (VALUE_LVAL (lazy_value))
|
||||
{
|
||||
case lval_register:
|
||||
gdb_assert (frame);
|
||||
gdbarch = get_frame_arch (frame);
|
||||
gdb_assert (gdbarch_register_name
|
||||
(gdbarch, VALUE_REGNUM (lazy_value)) != NULL
|
||||
&& *gdbarch_register_name
|
||||
(gdbarch, VALUE_REGNUM (lazy_value)) != '\0');
|
||||
error (_("Address requested for identifier "
|
||||
"\"%s\" which is in register $%s"),
|
||||
SYMBOL_PRINT_NAME (var),
|
||||
gdbarch_register_name (gdbarch, VALUE_REGNUM (lazy_value)));
|
||||
break;
|
||||
|
||||
default:
|
||||
error (_("Can't take address of \"%s\" which isn't an lvalue."),
|
||||
SYMBOL_PRINT_NAME (var));
|
||||
break;
|
||||
}
|
||||
return 0; /* For lint -- never reached */
|
||||
}
|
||||
|
|
58
gdb/valops.c
58
gdb/valops.c
|
@ -988,11 +988,13 @@ struct value *
|
|||
value_of_variable (struct symbol *var, struct block *b)
|
||||
{
|
||||
struct value *val;
|
||||
struct frame_info *frame = NULL;
|
||||
struct frame_info *frame;
|
||||
|
||||
if (!b)
|
||||
frame = NULL; /* Use selected frame. */
|
||||
else if (symbol_read_needs_frame (var))
|
||||
if (!symbol_read_needs_frame (var))
|
||||
frame = NULL;
|
||||
else if (!b)
|
||||
frame = get_selected_frame (_("No frame selected."));
|
||||
else
|
||||
{
|
||||
frame = block_innermost_frame (b);
|
||||
if (!frame)
|
||||
|
@ -1013,6 +1015,54 @@ value_of_variable (struct symbol *var, struct block *b)
|
|||
return val;
|
||||
}
|
||||
|
||||
struct value *
|
||||
address_of_variable (struct symbol *var, struct block *b)
|
||||
{
|
||||
struct type *type = SYMBOL_TYPE (var);
|
||||
struct value *val;
|
||||
|
||||
/* Evaluate it first; if the result is a memory address, we're fine.
|
||||
Lazy evaluation pays off here. */
|
||||
|
||||
val = value_of_variable (var, b);
|
||||
|
||||
if ((VALUE_LVAL (val) == lval_memory && value_lazy (val))
|
||||
|| TYPE_CODE (type) == TYPE_CODE_FUNC)
|
||||
{
|
||||
CORE_ADDR addr = VALUE_ADDRESS (val);
|
||||
return value_from_pointer (lookup_pointer_type (type), addr);
|
||||
}
|
||||
|
||||
/* Not a memory address; check what the problem was. */
|
||||
switch (VALUE_LVAL (val))
|
||||
{
|
||||
case lval_register:
|
||||
{
|
||||
struct frame_info *frame;
|
||||
const char *regname;
|
||||
|
||||
frame = frame_find_by_id (VALUE_FRAME_ID (val));
|
||||
gdb_assert (frame);
|
||||
|
||||
regname = gdbarch_register_name (get_frame_arch (frame),
|
||||
VALUE_REGNUM (val));
|
||||
gdb_assert (regname && *regname);
|
||||
|
||||
error (_("Address requested for identifier "
|
||||
"\"%s\" which is in register $%s"),
|
||||
SYMBOL_PRINT_NAME (var), regname);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
error (_("Can't take address of \"%s\" which isn't an lvalue."),
|
||||
SYMBOL_PRINT_NAME (var));
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Return one if VAL does not live in target memory, but should in order
|
||||
to operate on it. Otherwise return zero. */
|
||||
|
||||
|
|
|
@ -310,6 +310,8 @@ extern CORE_ADDR address_from_register (struct type *type, int regnum,
|
|||
|
||||
extern struct value *value_of_variable (struct symbol *var, struct block *b);
|
||||
|
||||
extern struct value *address_of_variable (struct symbol *var, struct block *b);
|
||||
|
||||
extern struct value *value_of_register (int regnum, struct frame_info *frame);
|
||||
|
||||
struct value *value_of_register_lazy (struct frame_info *frame, int regnum);
|
||||
|
@ -319,9 +321,6 @@ extern int symbol_read_needs_frame (struct symbol *);
|
|||
extern struct value *read_var_value (struct symbol *var,
|
||||
struct frame_info *frame);
|
||||
|
||||
extern struct value *locate_var_value (struct symbol *var,
|
||||
struct frame_info *frame);
|
||||
|
||||
extern struct value *allocate_value (struct type *type);
|
||||
extern struct value *allocate_value_lazy (struct type *type);
|
||||
extern void allocate_value_contents (struct value *value);
|
||||
|
|
Loading…
Reference in a new issue