Skip gdb.server/ tests if lack of XML support
[deliverable/binutils-gdb.git] / gdb / gdbserver / mem-break.c
index 419db9eb6316806c7a4bfb3d1ee71cacc1f91007..5c73326ebb547a5c93bbae09ca4011c1a0ecd182 100644 (file)
@@ -1509,13 +1509,33 @@ uninsert_all_breakpoints (void)
       uninsert_raw_breakpoint (bp);
 }
 
+void
+uninsert_reinsert_breakpoints (void)
+{
+  struct process_info *proc = current_process ();
+  struct breakpoint *bp;
+
+  for (bp = proc->breakpoints; bp != NULL; bp = bp->next)
+    {
+    if (bp->type == reinsert_breakpoint)
+      {
+       gdb_assert (bp->raw->inserted > 0);
+
+       /* Only uninsert the raw breakpoint if it only belongs to a
+          reinsert breakpoint.  */
+       if (bp->raw->refcount == 1)
+         uninsert_raw_breakpoint (bp->raw);
+      }
+    }
+}
+
 static void
 reinsert_raw_breakpoint (struct raw_breakpoint *bp)
 {
   int err;
 
   if (bp->inserted)
-    error ("Breakpoint already inserted at reinsert time.");
+    return;
 
   err = the_target->insert_point (bp->raw_type, bp->pc, bp->kind, bp);
   if (err == 0)
@@ -1553,6 +1573,28 @@ reinsert_breakpoints_at (CORE_ADDR pc)
     }
 }
 
+int
+has_reinsert_breakpoints (struct process_info *proc)
+{
+  struct breakpoint *bp, **bp_link;
+
+  bp = proc->breakpoints;
+  bp_link = &proc->breakpoints;
+
+  while (bp)
+    {
+      if (bp->type == reinsert_breakpoint)
+       return 1;
+      else
+       {
+         bp_link = &bp->next;
+         bp = *bp_link;
+       }
+    }
+
+  return 0;
+}
+
 void
 reinsert_all_breakpoints (void)
 {
@@ -1566,6 +1608,24 @@ reinsert_all_breakpoints (void)
       reinsert_raw_breakpoint (bp);
 }
 
+void
+reinsert_reinsert_breakpoints (void)
+{
+  struct process_info *proc = current_process ();
+  struct breakpoint *bp;
+
+  for (bp = proc->breakpoints; bp != NULL; bp = bp->next)
+    {
+      if (bp->type == reinsert_breakpoint)
+       {
+         gdb_assert (bp->raw->inserted > 0);
+
+         if (bp->raw->refcount == 1)
+           reinsert_raw_breakpoint (bp->raw);
+       }
+    }
+}
+
 void
 check_breakpoints (CORE_ADDR stop_pc)
 {
@@ -1718,7 +1778,12 @@ delete_disabled_breakpoints (void)
     {
       next = bp->next;
       if (bp->raw->inserted < 0)
-       delete_breakpoint_1 (proc, bp);
+       {
+         /* If reinsert_breakpoints become disabled, that means the
+            manipulations (insertion and removal) of them are wrong.  */
+         gdb_assert (bp->type != reinsert_breakpoint);
+         delete_breakpoint_1 (proc, bp);
+       }
     }
 }
 
This page took 0.024919 seconds and 4 git commands to generate.