aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/breakpoint.c26
-rw-r--r--gdb/breakpoint.h19
3 files changed, 38 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index aa78b27..42cfedd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2001-05-05 Jim Blandy <jimb@redhat.com>
+ * breakpoint.c (check_duplicates): Use the breakpoint's type, not
+ its address, to decide whether it's a watchpoint or not. Zero
+ is a valid code address.
+ (update_breakpoints_after_exec): Admonishing comments.
+ * breakpoint.h (struct breakpoint): Doc fixes.
+
* breakpoint.c (check_duplicates): Take a breakpoint object as an
argument, rather than an address and section. All callers changed.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 5caa1ec..272fac0 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1144,7 +1144,17 @@ update_breakpoints_after_exec (void)
??rehrauer: Let's hope that merely clearing out this catchpoint's
target address field, if any, is sufficient to have it be reset
- automagically. Certainly on HP-UX that's true. */
+ automagically. Certainly on HP-UX that's true.
+
+ Jim Blandy <jimb@redhat.com>: Actually, zero is a perfectly
+ valid code address on some platforms (like the mn10200 and
+ mn10300 simulators). We shouldn't assign any special
+ interpretation to a breakpoint with a zero address. And in
+ fact, GDB doesn't --- I can't see what that comment above is
+ talking about. As far as I can tell, setting the address of a
+ bp_catch_exec/bp_catch_vfork/bp_catch_fork breakpoint to zero
+ is meaningless, since those are implemented with HP-UX kernel
+ hackery, not by storing breakpoint instructions somewhere. */
if ((b->type == bp_catch_exec) ||
(b->type == bp_catch_vfork) ||
(b->type == bp_catch_fork))
@@ -1195,7 +1205,13 @@ update_breakpoints_after_exec (void)
/* If this breakpoint has survived the above battery of checks, then
it must have a symbolic address. Be sure that it gets reevaluated
- to a target address, rather than reusing the old evaluation. */
+ to a target address, rather than reusing the old evaluation.
+
+ Jim Blandy <jimb@redhat.com>: As explained above in the comment
+ for bp_catch_exec and friends, I'm pretty sure this is entirely
+ unnecessary. A call to breakpoint_re_set_one always recomputes
+ the breakpoint's address from scratch, or deletes it if it can't.
+ So I think this assignment could be deleted without effect. */
b->address = (CORE_ADDR) NULL;
}
}
@@ -3734,7 +3750,11 @@ check_duplicates (struct breakpoint *bpt)
CORE_ADDR address = bpt->address;
asection *section = bpt->section;
- if (address == 0) /* Watchpoints are uninteresting */
+ /* Watchpoints are uninteresting. */
+ if (bpt->type == bp_watchpoint
+ || bpt->type == bp_hardware_watchpoint
+ || bpt->type == bp_read_watchpoint
+ || bpt->type == bp_access_watchpoint)
return;
ALL_BREAKPOINTS (b)
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index cd9d1b7..1ef4a79 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -193,16 +193,17 @@ struct breakpoint
/* Number assigned to distinguish breakpoints. */
int number;
- /* Address to break at, or NULL if not a breakpoint. */
+ /* Address to break at.
+ Note that zero is a perfectly valid code address on some
+ platforms (for example, the mn10200 and mn10300 simulators).
+ NULL is not a special value for this field. */
CORE_ADDR address;
- /* Line number of this address. Only matters if address is
- non-NULL. */
+ /* Line number of this address. */
int line_number;
- /* Source file name of this address. Only matters if address is
- non-NULL. */
+ /* Source file name of this address. */
char *source_file;
@@ -217,11 +218,10 @@ struct breakpoint
control of the target insert_breakpoint and remove_breakpoint routines.
No other code should assume anything about the value(s) here. */
char shadow_contents[BREAKPOINT_MAX];
- /* Nonzero if this breakpoint is now inserted. Only matters if address
- is non-NULL. */
+ /* Nonzero if this breakpoint is now inserted. */
char inserted;
/* Nonzero if this is not the first breakpoint in the list
- for the given address. Only matters if address is non-NULL. */
+ for the given address. */
char duplicate;
/* Chain of command lines to execute when this breakpoint is hit. */
struct command_line *commands;
@@ -231,8 +231,7 @@ struct breakpoint
/* Conditional. Break only if this expression's value is nonzero. */
struct expression *cond;
- /* String we used to set the breakpoint (malloc'd). Only matters if
- address is non-NULL. */
+ /* String we used to set the breakpoint (malloc'd). */
char *addr_string;
/* Language we used to set the breakpoint. */
enum language language;