From 644a1fe1ca256e8fa6a23276c25b0c7d3a687a0f Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Sun, 6 May 2001 01:35:57 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 6 ++++++ gdb/breakpoint.c | 26 +++++++++++++++++++++++--- gdb/breakpoint.h | 19 +++++++++---------- 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 + * 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 : 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 : 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; -- 2.7.4