]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2008-11-05 Hui Zhu <teawater@gmail.com>
authorHui Zhu <teawater@gmail.com>
Wed, 5 Nov 2008 02:52:05 +0000 (02:52 +0000)
committerHui Zhu <teawater@gmail.com>
Wed, 5 Nov 2008 02:52:05 +0000 (02:52 +0000)
* record.c (record_wait): Check breakpint before forward
execute in replay mode.
Check breakpoint use function "breakpoint_inserted_here_p"
in replay mode.

gdb/ChangeLog
gdb/record.c

index 060a27b7649187d5cc8370bd9b102383f5899e88..1a94d2c92968001a86b4b12697101114c2eda6cc 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-05  Hui Zhu  <teawater@gmail.com>
+
+       * record.c (record_wait): Check breakpint before forward
+       execute in replay mode.
+       Check breakpoint use function "breakpoint_inserted_here_p"
+       in replay mode.
+
 2008-10-24  Michael Snyder  <msnyder@vmware.com>
 
        * infrun.c (handle_inferior_event): Handle dynamic symbol
index abe0931b9e00085ac9ae9d9a1d7e38edf4cc3fa6..191cb3e53951ae78bcb10184439628727d8f2f0c 100644 (file)
@@ -497,6 +497,25 @@ record_wait (ptid_t ptid, struct target_waitstatus *status)
       int continue_flag = 1;
       int first_record_end = 1;
       struct cleanup *old_cleanups = make_cleanup (record_wait_cleanups, 0);
+      CORE_ADDR tmp_pc;
+
+      status->kind = TARGET_WAITKIND_STOPPED;
+
+      /* Check breakpoint when forward execute.  */
+      if (execution_direction == EXEC_FORWARD)
+       {
+         tmp_pc = regcache_read_pc (regcache);
+         if (breakpoint_inserted_here_p (tmp_pc))
+           {
+             if (record_debug)
+               {
+                 fprintf_unfiltered (gdb_stdlog,
+                                     "Process record: break at 0x%s.\n",
+                                     paddr_nz (tmp_pc));
+               }
+             goto replay_out;
+           }
+       }
 
       record_get_sig = 0;
       act.sa_handler = record_sig_handler;
@@ -521,7 +540,6 @@ record_wait (ptid_t ptid, struct target_waitstatus *status)
 
       /* Loop over the record_list, looking for the next place to
         stop.  */
-      status->kind = TARGET_WAITKIND_STOPPED;
       do
        {
          /* Check for beginning and end of log.  */
@@ -588,10 +606,6 @@ record_wait (ptid_t ptid, struct target_waitstatus *status)
            }
          else
            {
-             CORE_ADDR tmp_pc;
-             struct bp_location *bl;
-             struct breakpoint *b;
-
              if (record_debug > 1)
                {
                  fprintf_unfiltered (gdb_stdlog,
@@ -632,35 +646,16 @@ record_wait (ptid_t ptid, struct target_waitstatus *status)
                    }
 
                  /* check breakpoint */
-                 tmp_pc = read_pc ();
-                 for (bl = bp_location_chain; bl; bl = bl->global_next)
+                 tmp_pc = regcache_read_pc (regcache);
+                 if (breakpoint_inserted_here_p (tmp_pc))
                    {
-                     b = bl->owner;
-                     gdb_assert (b);
-                     if (b->enable_state != bp_enabled
-                         && b->enable_state != bp_permanent)
-                       continue;
-
-                     if (b->type == bp_watchpoint || b->type == bp_catch_fork
-                         || b->type == bp_catch_vfork
-                         || b->type == bp_catch_exec
-                         || b->type == bp_hardware_watchpoint
-                         || b->type == bp_read_watchpoint
-                         || b->type == bp_access_watchpoint)
+                     if (record_debug)
                        {
-                         continue;
-                       }
-                     if (bl->address == tmp_pc)
-                       {
-                         if (record_debug)
-                           {
-                             fprintf_unfiltered (gdb_stdlog,
-                                                 "Process record: break at 0x%s.\n",
-                                                 paddr_nz (tmp_pc));
-                           }
-                         continue_flag = 0;
-                         break;
+                         fprintf_unfiltered (gdb_stdlog,
+                                             "Process record: break at 0x%s.\n",
+                                             paddr_nz (tmp_pc));
                        }
+                     continue_flag = 0;
                    }
                }
              if (execution_direction == EXEC_REVERSE)
@@ -691,6 +686,7 @@ next:
          perror_with_name (_("Process record: sigaction"));
        }
 
+replay_out:
       if (record_get_sig)
        {
          status->value.sig = TARGET_SIGNAL_INT;