]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2008-10-04 Hui Zhu <teawater@gmail.com>
authorMichael Snyder <msnyder@vmware.com>
Mon, 6 Oct 2008 18:00:47 +0000 (18:00 +0000)
committerMichael Snyder <msnyder@vmware.com>
Mon, 6 Oct 2008 18:00:47 +0000 (18:00 +0000)
Change from "to_prepare_to_store" to "to_store_registers".
* record.c (record_beneath_to_prepare_to_store): Removed.
(record_beneath_to_store_registers): New function pointer.
Instead "record_beneath_to_prepare_to_store". Will point
to the low strata target "to_store_registers" function.
(record_prepare_to_store): Removed.
(record_store_registers): New function.
Instead "record_prepare_to_store". Record the change of
registers from GDB.
(init_record_ops): Change record_prepare_to_store to
record_store_registers.
* record.h (record_beneath_to_prepare_to_store): Removed.
(record_beneath_to_store_registers): New extern.
(record_regcache_raw_write_regnum): Remove.
* target.c (update_current_target): Change
record_beneath_to_prepare_to_store to
record_beneath_to_store_registers.

gdb/ChangeLog
gdb/record.c
gdb/record.h
gdb/target.c

index cf96a3a73ac9693851478b83564f87174a173231..c90d9e813a3797c15337c6d488078ae208bb26e8 100644 (file)
@@ -1,3 +1,22 @@
+2008-10-04  Hui Zhu  <teawater@gmail.com>
+
+       Change from "to_prepare_to_store" to "to_store_registers".
+       * record.c (record_beneath_to_prepare_to_store): Removed.
+       (record_beneath_to_store_registers): New function pointer.
+       Instead "record_beneath_to_prepare_to_store". Will point
+       to the low strata target "to_store_registers" function.
+       (record_prepare_to_store): Removed.
+       (record_store_registers): New function.
+       Instead "record_prepare_to_store". Record the change of
+       registers from GDB.
+       (init_record_ops): Change record_prepare_to_store to
+       record_store_registers.
+       * record.h (record_beneath_to_prepare_to_store): Removed.
+       (record_beneath_to_store_registers): New extern.
+       * target.c (update_current_target): Change
+       record_beneath_to_prepare_to_store to
+       record_beneath_to_store_registers.
+
 2008-10-05  Hui Zhu  <teawater@gmail.com>
 
        * infcmd.c (kill_if_already_running): If record target is used,
index f182ea134832300d9ef3fac4dc1b4c52d5c5b85a..6dd181916b9dec493f3d782e97770f6fe143ba58 100644 (file)
@@ -48,7 +48,6 @@ enum exec_direction_kind record_exec_direction = EXEC_FORWARD;
 static int record_get_sig = 0;
 static sigset_t record_maskall;
 static int record_not_record = 0;
-int record_regcache_raw_write_regnum = 0;
 int record_will_store_registers = 0;
 
 extern struct bp_location *bp_location_chain;
@@ -56,7 +55,7 @@ extern struct bp_location *bp_location_chain;
 /* The real beneath function pointers.  */
 void (*record_beneath_to_resume) (ptid_t, int, enum target_signal);
 ptid_t (*record_beneath_to_wait) (ptid_t, struct target_waitstatus *);
-void (*record_beneath_to_prepare_to_store) (struct regcache *);
+void (*record_beneath_to_store_registers) (struct regcache *, int regno);
 LONGEST (*record_beneath_to_xfer_partial) (struct target_ops * ops,
                                           enum target_object object,
                                           const char *annex,
@@ -805,23 +804,51 @@ record_registers_change (struct regcache *regcache, int regnum)
     }
 }
 
-/* XXX: I don't know how to do if GDB call function target_store_registers
-   without call function target_prepare_to_store.  */
-
 static void
-record_prepare_to_store (struct regcache *regcache)
+record_store_registers (struct regcache *regcache, int regno)
 {
   if (!record_not_record)
     {
       if (RECORD_IS_REPLAY)
        {
+         int n;
          struct cleanup *old_cleanups;
+
          /* Let user choice if he want to write register or not.  */
-         if (!nquery (_("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward.  Change register %s?"),
-                      gdbarch_register_name (get_regcache_arch
-                                             (regcache),
-                                             record_regcache_raw_write_regnum)))
+         if (regno < 0)
+           {
+             n =
+               nquery (_
+                       ("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward. Change all register?"));
+           }
+         else
+           {
+             n =
+               nquery (_
+                       ("Becuse GDB is in replay mode, changing the value of a register will destroy the record from this point forward. Change register %s?"),
+                       gdbarch_register_name (get_regcache_arch (regcache),
+                                              regno));
+           }
+
+         if (!n)
            {
+             /* Invalidate the value of regcache that set in function
+                "regcache_raw_write". */
+             if (regno < 0)
+               {
+                 int i;
+                 for (i = 0;
+                      i < gdbarch_num_regs (get_regcache_arch (regcache));
+                      i++)
+                   {
+                     regcache_invalidate (regcache, i);
+                   }
+               }
+             else
+               {
+                 regcache_invalidate (regcache, regno);
+               }
+
              error (_("Record: record cancel the operation."));
            }
 
@@ -829,9 +856,9 @@ record_prepare_to_store (struct regcache *regcache)
          record_list_release_next ();
        }
 
-      record_registers_change (regcache, record_regcache_raw_write_regnum);
+      record_registers_change (regcache, regno);
     }
-  record_beneath_to_prepare_to_store (regcache);
+  record_beneath_to_store_registers (regcache, regno);
 }
 
 /* record_xfer_partial -- behavior is conditional on RECORD_IS_REPLAY.
@@ -966,7 +993,7 @@ init_record_ops (void)
   record_ops.to_mourn_inferior = record_mourn_inferior;
   record_ops.to_kill = record_kill;
   record_ops.to_create_inferior = find_default_create_inferior;        /* Make record suppport command "run".  */
-  record_ops.to_prepare_to_store = record_prepare_to_store;
+  record_ops.to_store_registers = record_store_registers;
   record_ops.to_xfer_partial = record_xfer_partial;
   record_ops.to_insert_breakpoint = record_insert_breakpoint;
   record_ops.to_remove_breakpoint = record_remove_breakpoint;
index c5b04dfe716c822386a0994b09c42d70078645bb..7e31ef1a668bc33e01ed7816c456b23e9148948c 100644 (file)
@@ -77,7 +77,6 @@ extern struct regcache *record_regcache;
 
 extern struct target_ops record_ops;
 extern int record_resume_step;
-extern int record_regcache_raw_write_regnum;
 extern enum exec_direction_kind record_exec_direction;
 
 extern int record_arch_list_add_reg (int num);
@@ -88,7 +87,7 @@ extern void record_not_record_set (void);
 
 extern void (*record_beneath_to_resume) (ptid_t, int, enum target_signal);
 extern ptid_t (*record_beneath_to_wait) (ptid_t, struct target_waitstatus *);
-extern void (*record_beneath_to_prepare_to_store) (struct regcache *);
+extern void (*record_beneath_to_store_registers) (struct regcache *, int regno);
 extern LONGEST (*record_beneath_to_xfer_partial) (struct target_ops * ops,
                                                  enum target_object object,
                                                  const char *annex,
index 879d317c90298ae546080bccb7954bfe90b2c497..f23d2a81691f8f147f220ba2bcd0994a4d5d0fa5 100644 (file)
@@ -380,7 +380,7 @@ update_current_target (void)
        current_target.FIELD = (TARGET)->FIELD
 
   record_beneath_to_resume = NULL;
-  record_beneath_to_prepare_to_store = NULL;
+  record_beneath_to_store_registers = NULL;
   record_beneath_to_xfer_partial = NULL;
   record_beneath_to_insert_breakpoint = NULL;
   record_beneath_to_remove_breakpoint = NULL;
@@ -485,9 +485,9 @@ update_current_target (void)
              {
                record_beneath_to_wait = t->to_wait;
              }
-           if (!record_beneath_to_prepare_to_store)
+           if (!record_beneath_to_store_registers)
              {
-               record_beneath_to_prepare_to_store = t->to_prepare_to_store;
+               record_beneath_to_store_registers = t->to_store_registers;
              }
            if (!record_beneath_to_xfer_partial)
              {