mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
* valops.c (value_assign): Flush frame cache after stores to memory
also.
This commit is contained in:
parent
96ee522758
commit
cb74169061
@ -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.
|
||||
|
64
gdb/valops.c
64
gdb/valops.c
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user