Prevent clear_command from directly modifying breakpoint list.
authorVladimir Prus <vladimir@codesourcery.com>
Thu, 15 Nov 2007 06:28:19 +0000 (06:28 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Thu, 15 Nov 2007 06:28:19 +0000 (06:28 +0000)
* Makefile.in (breakpoint_h): Update dependency.
* breakpoint.c (clear_command): Do not remove
breakpoints from breakpoint_chain.  Collect breakpoints
to delete in a vector.
* breakpoint.h (breakpoint_p): New typedef for pointer to
breakpoint.  Register vector of breakpoint_p.

ChangeLog
gdb/Makefile.in
gdb/breakpoint.c
gdb/breakpoint.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/ending-run.exp

index 69d95cbb0028459d660ae4b7118d5aba35036625..418d8b6438af61a04a375d18c4bcbb26e720f022 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-10-15  Vladimir Prus  <vladimir@codesourcery.com>
+
+       Prevent clear_command from directly modifying breakpoint list.
+       * Makefile.in (breakpoint_h): Update dependency.
+       * breakpoint.c (clear_command): Do not remove
+       breakpoints from breakpoint_chain.  Collect breakpoints
+       to delete in a vector.
+       * breakpoint.h (breakpoint_p): New typedef for pointer to
+       breakpoint.  Register vector of breakpoint_p.
+
 2007-10-15  Vladimir Prus  <vladimir@codesourcery.com>
 
        Remove 'run_cleanup'.
index 79efa0d8f82f177370c4e9de87aa7cd9ead67d68..3effc02fe79b01fdfebc92ab9eed71bf7f7187e6 100644 (file)
@@ -678,7 +678,7 @@ ax_h = ax.h $(doublest_h)
 bcache_h = bcache.h
 bfd_target_h = bfd-target.h
 block_h = block.h
-breakpoint_h = breakpoint.h $(frame_h) $(value_h) $(gdb_events_h)
+breakpoint_h = breakpoint.h $(frame_h) $(value_h) $(gdb_events_h) $(vec_h)
 bsd_kvm_h = bsd-kvm.h
 bsd_uthread_h = bsd-uthread.h
 buildsym_h = buildsym.h
index 5412e787b1f4c6a0f2180cecb6013738d0f9909c..3dae38fdf1af4d08e1e9db1f47473f92329cdd23 100644 (file)
@@ -6878,7 +6878,9 @@ tcatch_command (char *arg, int from_tty)
 static void
 clear_command (char *arg, int from_tty)
 {
-  struct breakpoint *b, *tmp, *prev, *found;
+  struct breakpoint *b;
+  VEC(breakpoint_p) *found = 0;
+  int ix;
   int default_match;
   struct symtabs_and_lines sals;
   struct symtab_and_line sal;
@@ -6945,11 +6947,10 @@ clear_command (char *arg, int from_tty)
          1              0             <can't happen> */
 
       sal = sals.sals[i];
-      prev = NULL;
 
-      /* Find all matching breakpoints, remove them from the
-        breakpoint chain, and add them to the 'found' chain.  */
-      ALL_BREAKPOINTS_SAFE (b, tmp)
+      /* Find all matching breakpoints and add them to
+        'found'.  */
+      ALL_BREAKPOINTS (b)
        {
          int match = 0;
          /* Are we going to delete b? */
@@ -6980,30 +6981,11 @@ clear_command (char *arg, int from_tty)
            }
 
          if (match)
-           {
-             /* Remove it from breakpoint_chain...  */
-             if (b == breakpoint_chain)
-               {
-                 /* b is at the head of the list */
-                 breakpoint_chain = b->next;
-               }
-             else
-               {
-                 prev->next = b->next;
-               }
-             /* And add it to 'found' chain.  */
-             b->next = found;
-             found = b;
-           }
-         else
-           {
-             /* Keep b, and keep a pointer to it.  */
-             prev = b;
-           }
+           VEC_safe_push(breakpoint_p, found, b);
        }
     }
   /* Now go thru the 'found' chain and delete them.  */
-  if (found == 0)
+  if (VEC_empty(breakpoint_p, found))
     {
       if (arg)
        error (_("No breakpoint at %s."), arg);
@@ -7011,23 +6993,22 @@ clear_command (char *arg, int from_tty)
        error (_("No breakpoint at this line."));
     }
 
-  if (found->next)
+  if (VEC_length(breakpoint_p, found) > 1)
     from_tty = 1;              /* Always report if deleted more than one */
   if (from_tty)
     {
-      if (!found->next)
+      if (VEC_length(breakpoint_p, found) == 1)
        printf_unfiltered (_("Deleted breakpoint "));
       else
        printf_unfiltered (_("Deleted breakpoints "));
     }
   breakpoints_changed ();
-  while (found)
+
+  for (ix = 0; VEC_iterate(breakpoint_p, found, ix, b); ix++)
     {
       if (from_tty)
-       printf_unfiltered ("%d ", found->number);
-      tmp = found->next;
-      delete_breakpoint (found);
-      found = tmp;
+       printf_unfiltered ("%d ", b->number);
+      delete_breakpoint (b);
     }
   if (from_tty)
     putchar_unfiltered ('\n');
index 08a10abe9a0753a77759b175e83a70e3fa79fac6..19b880ca9857a4a2ec6326ce081a8ff43b73f81e 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "frame.h"
 #include "value.h"
+#include "vec.h"
 
 #include "gdb-events.h"
 
@@ -457,6 +458,9 @@ struct breakpoint
        the condition in.  */
     int condition_not_parsed;
   };
+
+typedef struct breakpoint *breakpoint_p;
+DEF_VEC_P(breakpoint_p);
 \f
 /* The following stuff is an abstract data type "bpstat" ("breakpoint
    status").  This provides the ability to determine whether we have
index dbc601162a38603a705a9cea77616d1b1211402a..7a75cb920c74d0db7a653a9a4545a8e2d1c0ac1d 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-15  Vladimir Prus  <vladimir@codesourcery.com>
+
+       * gdb.base/ending-run.exp: Expect the list of cleared
+       breakpoint to come in natural order, not the reversed one.
+       
 2007-11-07  Vladimir Prus  <vladimir@codesourcery.com>
 
        * gdb.mi/mi-var-child.c (do_child_deletion): New.
index 3a35e08783e6cd95cf5a485c7a4e0f066e3cbcc1..82e4efe33244c170a0ed73c3f5b923e00c7630f1 100644 (file)
@@ -69,7 +69,7 @@ gdb_test "b ending-run.c:31" ".*Breakpoint 3.*ending-run.c, line 31.*"
 gdb_run_cmd
 gdb_test "" ".*Breakpoint.*1.*callee.*13.*" "run"
 
-gdb_test "cle" ".*Deleted breakpoints 2 1.*" "clear worked"
+gdb_test "cle" ".*Deleted breakpoints 1 2.*" "clear worked"
 send_gdb "i b\n"
 gdb_expect {
     -re ".* breakpoint .* breakpoint .*$gdb_prompt $" { 
@@ -95,7 +95,7 @@ gdb_expect {
     -re ".*address (0x\[0-9a-fA-F]*).*$gdb_prompt $" {
         set line_eight $expect_out(1,string)
         gdb_test "b 13" ".*Breakpoint.*6.*"
-        gdb_test "cle *$line_eight" ".*Deleted breakpoints 6 4.*" "Clear 2 by address"
+        gdb_test "cle *$line_eight" ".*Deleted breakpoints 4 6.*" "Clear 2 by address"
     }
     -re ".*$gdb_prompt $" {
         fail "need to fix test for new compile outcome"
@@ -109,7 +109,7 @@ gdb_expect {
         gdb_test "b ending-run.c:14" ".*Breakpoint 7.*ending-run.c, line 14.*"
         gdb_test "b *$line_nine" ".*Note.*also.*Breakpoint 8.*" "Breakpoint 7 at *ending-run.c:14"
         gdb_test "c" ".*Breakpoint.*7.*callee.*14.*"
-        gdb_test "cle" ".*Deleted breakpoints 8 7.*" "Clear 2 by default"
+        gdb_test "cle" ".*Deleted breakpoints 7 8.*" "Clear 2 by default"
     }
     -re ".*$gdb_prompt $" {
         fail "need to fix test for new compile outcome"