* valops.c (value_assign): Flush frame cache after stores to memory
authorDaniel Jacobowitz <drow@false.org>
Thu, 30 Jan 2003 16:44:20 +0000 (16:44 +0000)
committerDaniel Jacobowitz <drow@false.org>
Thu, 30 Jan 2003 16:44:20 +0000 (16:44 +0000)
also.

gdb/ChangeLog
gdb/valops.c

index fc965ae22e0e58cc3c2166bbbff3e7c30691429c..84de0ea404e2f4f157db8846c9aa7dd84ffefe9b 100644 (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.
index c4876346ae4d8346aa604872285a4b6b9f96baf9..2304274c2bb31abdd7e97c9cc74cc680d2abb2e2 100644 (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)