OSDN Git Service

* breakpoint.c (check_duplicates): Use the breakpoint's type, not
authorjimb <jimb>
Sun, 6 May 2001 01:35:57 +0000 (01:35 +0000)
committerjimb <jimb>
Sun, 6 May 2001 01:35:57 +0000 (01:35 +0000)
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
gdb/breakpoint.c
gdb/breakpoint.h

index aa78b27..42cfedd 100644 (file)
@@ -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.
 
index 5caa1ec..272fac0 100644 (file)
@@ -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)
index cd9d1b7..1ef4a79 100644 (file)
@@ -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;