2009-08-04 Hui Zhu <teawater@gmail.com>
authorMichael Snyder <msnyder@vmware.com>
Tue, 4 Aug 2009 18:19:52 +0000 (18:19 +0000)
committerMichael Snyder <msnyder@vmware.com>
Tue, 4 Aug 2009 18:19:52 +0000 (18:19 +0000)
    Michael Snyder  <msnyder@vmware.com>

* record.c (record_mem_entry): New field 'mem_entry_not_accessible'.
(record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'.
(record_wait): Set 'mem_entry_not_accessible' flag if target
memory not readable.  Don't try to change target memory if
'mem_entry_not_accessible' is set.

gdb/ChangeLog
gdb/record.c

index 42c5a2d103f3bb9fbd754dbfff004d144d888fb5..71d73c65ff38db4d84aedd17efac6a09a1a7cc01 100644 (file)
@@ -1,3 +1,12 @@
+2009-08-04  Hui Zhu  <teawater@gmail.com>
+           Michael Snyder  <msnyder@vmware.com>
+
+       * record.c (record_mem_entry): New field 'mem_entry_not_accessible'.
+       (record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'.
+       (record_wait): Set 'mem_entry_not_accessible' flag if target
+       memory not readable.  Don't try to change target memory if
+       'mem_entry_not_accessible' is set.
+
 2009-08-03  Richard Guenther  <rguenther@suse.de>
            Jan Kratochvil  <jan.kratochvil@redhat.com>
 
index 85e75a09ca281e373e4b8bda7fb2a8509d61b503..e5b8a37cc3baec247700930857a9ce6f8e2e4cae 100644 (file)
@@ -51,6 +51,9 @@ struct record_mem_entry
 {
   CORE_ADDR addr;
   int len;
+  /* Set this flag if target memory for this entry
+     can no longer be accessed.  */
+  int mem_entry_not_accessible;
   gdb_byte *val;
 };
 
@@ -275,6 +278,7 @@ record_arch_list_add_mem (CORE_ADDR addr, int len)
   rec->type = record_mem;
   rec->u.mem.addr = addr;
   rec->u.mem.len = len;
+  rec->u.mem.mem_entry_not_accessible = 0;
 
   if (target_read_memory (addr, rec->u.mem.val, len))
     {
@@ -727,32 +731,55 @@ record_wait (struct target_ops *ops,
          else if (record_list->type == record_mem)
            {
              /* mem */
-             gdb_byte *mem = alloca (record_list->u.mem.len);
-             if (record_debug > 1)
-               fprintf_unfiltered (gdb_stdlog,
-                                   "Process record: record_mem %s to "
-                                   "inferior addr = %s len = %d.\n",
-                                   host_address_to_string (record_list),
-                                   paddress (gdbarch, record_list->u.mem.addr),
-                                   record_list->u.mem.len);
-
-             if (target_read_memory
-                 (record_list->u.mem.addr, mem, record_list->u.mem.len))
-               error (_("Process record: error reading memory at "
-                        "addr = %s len = %d."),
-                      paddress (gdbarch, record_list->u.mem.addr),
-                      record_list->u.mem.len);
-
-             if (target_write_memory
-                 (record_list->u.mem.addr, record_list->u.mem.val,
-                  record_list->u.mem.len))
-               error (_
-                      ("Process record: error writing memory at "
-                       "addr = %s len = %d."),
-                      paddress (gdbarch, record_list->u.mem.addr),
-                      record_list->u.mem.len);
-
-             memcpy (record_list->u.mem.val, mem, record_list->u.mem.len);
+             /* Nothing to do if the entry is flagged not_accessible.  */
+             if (!record_list->u.mem.mem_entry_not_accessible)
+               {
+                 gdb_byte *mem = alloca (record_list->u.mem.len);
+                 if (record_debug > 1)
+                   fprintf_unfiltered (gdb_stdlog,
+                                       "Process record: record_mem %s to "
+                                       "inferior addr = %s len = %d.\n",
+                                       host_address_to_string (record_list),
+                                       paddress (gdbarch,
+                                                 record_list->u.mem.addr),
+                                       record_list->u.mem.len);
+
+                 if (target_read_memory (record_list->u.mem.addr, mem,
+                                         record_list->u.mem.len))
+                   {
+                     if (execution_direction != EXEC_REVERSE)
+                       error (_("Process record: error reading memory at "
+                                "addr = %s len = %d."),
+                              paddress (gdbarch, record_list->u.mem.addr),
+                              record_list->u.mem.len);
+                     else
+                       /* Read failed -- 
+                          flag entry as not_accessible.  */
+                       record_list->u.mem.mem_entry_not_accessible = 1;
+                   }
+                 else
+                   {
+                     if (target_write_memory (record_list->u.mem.addr,
+                                              record_list->u.mem.val,
+                                              record_list->u.mem.len))
+                       {
+                         if (execution_direction != EXEC_REVERSE)
+                           error (_("Process record: error writing memory at "
+                                    "addr = %s len = %d."),
+                                  paddress (gdbarch, record_list->u.mem.addr),
+                                  record_list->u.mem.len);
+                         else
+                           /* Write failed -- 
+                              flag entry as not_accessible.  */
+                           record_list->u.mem.mem_entry_not_accessible = 1;
+                       }
+                     else
+                       {
+                         memcpy (record_list->u.mem.val, mem,
+                                 record_list->u.mem.len);
+                       }
+                   }
+               }
            }
          else
            {