* valops.c (value_assign): Flush frame cache after stores to memory

also.
This commit is contained in:
Daniel Jacobowitz 2003-01-30 16:44:20 +00:00
parent 96ee522758
commit cb74169061
2 changed files with 43 additions and 26 deletions

View File

@ -1,3 +1,8 @@
2003-01-30 Daniel Jacobowitz <drow@mvista.com>
* valops.c (value_assign): Flush frame cache after stores to memory
also.
2003-01-30 Andrew Cagney <ac131313@redhat.com>
* Makefile.in (mon960-rom.o): Delete rule.

View File

@ -515,6 +515,7 @@ value_assign (struct value *toval, struct value *fromval)
struct value *val;
char *raw_buffer = (char*) alloca (MAX_REGISTER_RAW_SIZE);
int use_buffer = 0;
struct frame_id old_frame;
if (!toval->modifiable)
error ("Left operand of assignment is not a modifiable lvalue.");
@ -544,6 +545,11 @@ value_assign (struct value *toval, struct value *fromval)
}
}
/* Since modifying a register can trash the frame chain, and modifying memory
can trash the frame cache, we save the old frame and then restore the new
frame afterwards. */
old_frame = get_frame_id (deprecated_selected_frame);
switch (VALUE_LVAL (toval))
{
case lval_internalvar:
@ -612,7 +618,6 @@ value_assign (struct value *toval, struct value *fromval)
case lval_reg_frame_relative:
case lval_register:
{
struct frame_id old_frame;
/* value is stored in a series of registers in the frame
specified by the structure. Copy that value out, modify
it, and copy it back in. */
@ -625,11 +630,6 @@ value_assign (struct value *toval, struct value *fromval)
int regno;
struct frame_info *frame;
/* Since modifying a register can trash the frame chain, we
save the old frame and then restore the new frame
afterwards. */
old_frame = get_frame_id (deprecated_selected_frame);
/* Figure out which frame this is in currently. */
if (VALUE_LVAL (toval) == lval_register)
{
@ -731,26 +731,6 @@ value_assign (struct value *toval, struct value *fromval)
register_changed_hook (-1);
target_changed_event ();
/* Assigning to the stack pointer, frame pointer, and other
(architecture and calling convention specific) registers
may cause the frame cache to be out of date. We just do
this on all assignments to registers for simplicity; I
doubt the slowdown matters. */
reinit_frame_cache ();
/* Having destoroyed the frame cache, restore the selected
frame. */
/* FIXME: cagney/2002-11-02: There has to be a better way of
doing this. Instead of constantly saving/restoring the
frame. Why not create a get_selected_frame() function
that, having saved the selected frame's ID can
automatically re-find the previously selected frame
automatically. */
{
struct frame_info *fi = frame_find_by_id (old_frame);
if (fi != NULL)
select_frame (fi);
}
}
break;
@ -759,6 +739,38 @@ value_assign (struct value *toval, struct value *fromval)
error ("Left operand of assignment is not an lvalue.");
}
/* Assigning to the stack pointer, frame pointer, and other
(architecture and calling convention specific) registers may
cause the frame cache to be out of date. Assigning to memory
also can. We just do this on all assignments to registers or
memory, for simplicity's sake; I doubt the slowdown matters. */
switch (VALUE_LVAL (toval))
{
case lval_memory:
case lval_register:
case lval_reg_frame_relative:
reinit_frame_cache ();
/* Having destoroyed the frame cache, restore the selected frame. */
/* FIXME: cagney/2002-11-02: There has to be a better way of
doing this. Instead of constantly saving/restoring the
frame. Why not create a get_selected_frame() function that,
having saved the selected frame's ID can automatically
re-find the previously selected frame automatically. */
{
struct frame_info *fi = frame_find_by_id (old_frame);
if (fi != NULL)
select_frame (fi);
}
break;
default:
break;
}
/* If the field does not entirely fill a LONGEST, then zero the sign bits.
If the field is signed, and is negative, then sign extend. */
if ((VALUE_BITSIZE (toval) > 0)