summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--gdb/Makefile.in2
-rw-r--r--gdb/breakpoint.c47
-rw-r--r--gdb/breakpoint.h4
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/ending-run.exp6
6 files changed, 37 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 69d95cbb002..418d8b6438a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
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'.
* defs.h (do_run_cleanups, make_run_cleanup): Remove
declarations.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 79efa0d8f82..3effc02fe79 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -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
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 5412e787b1f..3dae38fdf1a 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -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');
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index 08a10abe9a0..19b880ca985 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -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);
/* The following stuff is an abstract data type "bpstat" ("breakpoint
status"). This provides the ability to determine whether we have
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index dbc601162a3..7a75cb920c7 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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.
diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp
index 3a35e08783e..82e4efe3324 100644
--- a/gdb/testsuite/gdb.base/ending-run.exp
+++ b/gdb/testsuite/gdb.base/ending-run.exp
@@ -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"