* 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.
This commit is contained in:
Jim Blandy
2001-05-06 01:35:57 +00:00
parent 9f60f21b6d
commit 644a1fe1ca
3 changed files with 38 additions and 13 deletions

View File

@ -1,5 +1,11 @@
2001-05-05 Jim Blandy <jimb@redhat.com> 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 * breakpoint.c (check_duplicates): Take a breakpoint object as an
argument, rather than an address and section. All callers changed. argument, rather than an address and section. All callers changed.

View File

@ -1144,7 +1144,17 @@ update_breakpoints_after_exec (void)
??rehrauer: Let's hope that merely clearing out this catchpoint's ??rehrauer: Let's hope that merely clearing out this catchpoint's
target address field, if any, is sufficient to have it be reset 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) || if ((b->type == bp_catch_exec) ||
(b->type == bp_catch_vfork) || (b->type == bp_catch_vfork) ||
(b->type == bp_catch_fork)) (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 /* If this breakpoint has survived the above battery of checks, then
it must have a symbolic address. Be sure that it gets reevaluated 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; b->address = (CORE_ADDR) NULL;
} }
} }
@ -3734,7 +3750,11 @@ check_duplicates (struct breakpoint *bpt)
CORE_ADDR address = bpt->address; CORE_ADDR address = bpt->address;
asection *section = bpt->section; 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; return;
ALL_BREAKPOINTS (b) ALL_BREAKPOINTS (b)

View File

@ -193,16 +193,17 @@ struct breakpoint
/* Number assigned to distinguish breakpoints. */ /* Number assigned to distinguish breakpoints. */
int number; 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; CORE_ADDR address;
/* Line number of this address. Only matters if address is /* Line number of this address. */
non-NULL. */
int line_number; int line_number;
/* Source file name of this address. Only matters if address is /* Source file name of this address. */
non-NULL. */
char *source_file; char *source_file;
@ -217,11 +218,10 @@ struct breakpoint
control of the target insert_breakpoint and remove_breakpoint routines. control of the target insert_breakpoint and remove_breakpoint routines.
No other code should assume anything about the value(s) here. */ No other code should assume anything about the value(s) here. */
char shadow_contents[BREAKPOINT_MAX]; char shadow_contents[BREAKPOINT_MAX];
/* Nonzero if this breakpoint is now inserted. Only matters if address /* Nonzero if this breakpoint is now inserted. */
is non-NULL. */
char inserted; char inserted;
/* Nonzero if this is not the first breakpoint in the list /* 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; char duplicate;
/* Chain of command lines to execute when this breakpoint is hit. */ /* Chain of command lines to execute when this breakpoint is hit. */
struct command_line *commands; struct command_line *commands;
@ -231,8 +231,7 @@ struct breakpoint
/* Conditional. Break only if this expression's value is nonzero. */ /* Conditional. Break only if this expression's value is nonzero. */
struct expression *cond; struct expression *cond;
/* String we used to set the breakpoint (malloc'd). Only matters if /* String we used to set the breakpoint (malloc'd). */
address is non-NULL. */
char *addr_string; char *addr_string;
/* Language we used to set the breakpoint. */ /* Language we used to set the breakpoint. */
enum language language; enum language language;