diff options
author | Daniel Jacobowitz <drow@false.org> | 2003-01-30 16:44:20 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2003-01-30 16:44:20 +0000 |
commit | cb74169061af918b87c545123b77e1d313d42c16 (patch) | |
tree | 15265e5cee8e1efd19b15c8e5354e0c2052ef858 | |
parent | 96ee5227589c40edf4189ffbef4bbe8c62b27f1e (diff) | |
download | gdb-cb74169061af918b87c545123b77e1d313d42c16.zip gdb-cb74169061af918b87c545123b77e1d313d42c16.tar.gz gdb-cb74169061af918b87c545123b77e1d313d42c16.tar.bz2 |
* valops.c (value_assign): Flush frame cache after stores to memory
also.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/valops.c | 64 |
2 files changed, 43 insertions, 26 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fc965ae..84de0ea 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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. diff --git a/gdb/valops.c b/gdb/valops.c index c487634..2304274 100644 --- a/gdb/valops.c +++ b/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) |