gdb/
authorVladimir Prus <vladimir@codesourcery.com>
Sat, 22 Sep 2007 19:06:59 +0000 (19:06 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Sat, 22 Sep 2007 19:06:59 +0000 (19:06 +0000)
* breakpoint.h (struct breakpoint): Move the cond
field to...
(struct bp_location): Here.
* breakpoint.c (condition_command, bpstat_stop_status)
(print_one_breakpoint, allocate_bp_location)
(solib_load_unload_1, create_fork_vfork_event_catchpoint)
(create_exec_event_catchpoint, create_breakpoints)
(break_command_1, watch_command_1, handle_gnu_v3_exceptions)
(create_ada_exception_breakpoint, set_breakpoint_sal)
(delete_breakpoint, breakpoint_re_set_one): Adjust.
* tui/tui-winsource.c (tui_update_breakpoint_info): Adjust.

gdb/ChangeLog
gdb/breakpoint.c
gdb/breakpoint.h
gdb/tui/tui-winsource.c

index b52ef21356fdae6b1bd518537f3ab778f697a723..c3dd35ed19982870dadd0606c51728399d94cc7d 100644 (file)
@@ -1,3 +1,18 @@
+2007-09-22  Vladimir Prus  <vladimir@codesourcery.com>
+
+       gdb/
+       * breakpoint.h (struct breakpoint): Move the cond 
+       field to...
+       (struct bp_location): Here.
+       * breakpoint.c (condition_command, bpstat_stop_status)
+       (print_one_breakpoint, allocate_bp_location)
+       (solib_load_unload_1, create_fork_vfork_event_catchpoint)
+       (create_exec_event_catchpoint, create_breakpoints)
+       (break_command_1, watch_command_1, handle_gnu_v3_exceptions)
+       (create_ada_exception_breakpoint, set_breakpoint_sal)
+       (delete_breakpoint, breakpoint_re_set_one): Adjust.
+       * tui/tui-winsource.c (tui_update_breakpoint_info): Adjust.
+       
 2007-09-22  Vladimir Prus  <vladimir@codesourcery.com>
 
        Associate bp_stat with bp_location, not breakpoint.
index 92bbb02ff78bb1257be6e8a871ac9397f0d262c1..333242a101b4fbef9830e30fb63122dbeda00449 100644 (file)
@@ -569,17 +569,17 @@ condition_command (char *arg, int from_tty)
   ALL_BREAKPOINTS (b)
     if (b->number == bnum)
     {
-      if (b->cond)
+      struct bp_location *loc = b->loc;
+      if (loc->cond)
        {
-         xfree (b->cond);
-         b->cond = 0;
+         xfree (loc->cond);
+         loc->cond = 0;
        }
       if (b->cond_string != NULL)
        xfree (b->cond_string);
 
       if (*p == 0)
        {
-         b->cond = 0;
          b->cond_string = NULL;
          if (from_tty)
            printf_filtered (_("Breakpoint %d now unconditional.\n"), bnum);
@@ -592,7 +592,8 @@ condition_command (char *arg, int from_tty)
          b->cond_string = savestring (arg, strlen (arg));
          if (!b->pending)
            {
-             b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0);
+             b->loc->cond = parse_exp_1 (&arg, 
+                                         block_for_pc (b->loc->address), 0);
              if (*arg)
                error (_("Junk at end of expression"));
            }
@@ -2923,19 +2924,19 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid, int stopped_by_watchpoint)
       {
        int value_is_zero = 0;
 
-       if (b->cond)
+       if (b->loc->cond)
          {
            /* Need to select the frame, with all that implies
               so that the conditions will have the right context.  */
            select_frame (get_current_frame ());
            value_is_zero
-             = catch_errors (breakpoint_cond_eval, (b->cond),
+             = catch_errors (breakpoint_cond_eval, (b->loc->cond),
                              "Error in testing breakpoint condition:\n",
                              RETURN_MASK_ALL);
            /* FIXME-someday, should give breakpoint # */
            free_all_values ();
          }
-       if (b->cond && value_is_zero)
+       if (b->loc->cond && value_is_zero)
          {
            bs->stop = 0;
            /* Don't consider this a hit.  */
@@ -3606,14 +3607,14 @@ print_one_breakpoint (struct breakpoint *b,
       ui_out_text (uiout, "\n");
     }
   
-  if (b->cond && !ada_exception_catchpoint_p (b))
+  if (b->loc->cond && !ada_exception_catchpoint_p (b))
     {
       /* We do not print the condition for Ada exception catchpoints
          because the condition is an internal implementation detail
          that we do not want to expose to the user.  */
       annotate_field (7);
       ui_out_text (uiout, "\tstop only if ");
-      print_expression (b->cond, stb->stream);
+      print_expression (b->loc->cond, stb->stream);
       ui_out_field_stream (uiout, "cond", stb);
       ui_out_text (uiout, "\n");
     }
@@ -4085,6 +4086,7 @@ allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type)
   memset (loc, 0, sizeof (*loc));
 
   loc->owner = bpt;
+  loc->cond = NULL;
 
   switch (bp_type)
     {
@@ -4604,7 +4606,6 @@ solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
   b = set_raw_breakpoint (sals.sals[0], bp_kind);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = NULL;
   b->cond_string = (cond_string == NULL) ? 
     NULL : savestring (cond_string, strlen (cond_string));
   b->thread = thread;
@@ -4661,7 +4662,6 @@ create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
   b = set_raw_breakpoint (sal, bp_kind);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = NULL;
   b->cond_string = (cond_string == NULL) ? 
     NULL : savestring (cond_string, strlen (cond_string));
   b->thread = thread;
@@ -4700,7 +4700,6 @@ create_exec_event_catchpoint (int tempflag, char *cond_string)
   b = set_raw_breakpoint (sal, bp_catch_exec);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = NULL;
   b->cond_string = (cond_string == NULL) ?
     NULL : savestring (cond_string, strlen (cond_string));
   b->thread = thread;
@@ -5033,7 +5032,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
        b = set_raw_breakpoint (sal, type);
        set_breakpoint_count (breakpoint_count + 1);
        b->number = breakpoint_count;
-       b->cond = cond[i];
+       b->loc->cond = cond[i];
        b->thread = thread;
        if (addr_string[i])
          b->addr_string = addr_string[i];
@@ -5056,7 +5055,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
              {
                arg = pending_bp->cond_string;
                b->cond_string = savestring (arg, strlen (arg));
-               b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0);
+               b->loc->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0);
                if (*arg)
                  error (_("Junk at end of pending breakpoint condition expression"));
              }
@@ -5399,7 +5398,7 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
                              : bp_breakpoint);
       set_breakpoint_count (breakpoint_count + 1);
       b->number = breakpoint_count;
-      b->cond = *cond;
+      b->loc->cond = *cond;
       b->thread = thread;
       b->addr_string = *addr_string;
       b->cond_string = *cond_string;
@@ -5792,7 +5791,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
   b->exp_valid_block = exp_valid_block;
   b->exp_string = savestring (exp_start, exp_end - exp_start);
   b->val = val;
-  b->cond = cond;
+  b->loc->cond = cond;
   if (cond_start)
     b->cond_string = savestring (cond_start, cond_end - cond_start);
   else
@@ -6352,7 +6351,6 @@ create_exception_catchpoint (int tempflag, char *cond_string,
   b = set_raw_breakpoint (*sal, bptype);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = NULL;
   b->cond_string = (cond_string == NULL) ? 
     NULL : savestring (cond_string, strlen (cond_string));
   b->thread = thread;
@@ -6432,7 +6430,6 @@ handle_gnu_v3_exceptions (int tempflag, char *cond_string,
   b = set_raw_breakpoint (sals.sals[0], bp_breakpoint);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = NULL;
   b->cond_string = (cond_string == NULL) ? 
     NULL : savestring (cond_string, strlen (cond_string));
   b->thread = -1;
@@ -6519,7 +6516,7 @@ create_ada_exception_breakpoint (struct symtab_and_line sal,
   b->disposition = tempflag ? disp_del : disp_donttouch;
   b->number = breakpoint_count;
   b->ignore_count = 0;
-  b->cond = cond;
+  b->loc->cond = cond;
   b->addr_string = addr_string;
   b->language = language_ada;
   b->cond_string = cond_string;
@@ -6701,7 +6698,6 @@ set_breakpoint_sal (struct symtab_and_line sal)
   b = set_raw_breakpoint (sal, bp_breakpoint);
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
-  b->cond = 0;
   b->thread = -1;
   return b;
 }
@@ -7021,8 +7017,6 @@ delete_breakpoint (struct breakpoint *bpt)
     }
 
   free_command_lines (&bpt->commands);
-  if (bpt->cond)
-    xfree (bpt->cond);
   if (bpt->cond_string != NULL)
     xfree (bpt->cond_string);
   if (bpt->addr_string != NULL)
@@ -7062,6 +7056,8 @@ delete_breakpoint (struct breakpoint *bpt)
      bp, we mark it as deleted before freeing its storage. */
   bpt->type = bp_none;
 
+  if (bpt->loc->cond)
+    xfree (bpt->loc->cond);
   xfree (bpt->loc);
   xfree (bpt);
 }
@@ -7215,14 +7211,14 @@ breakpoint_re_set_one (void *bint)
          if (b->cond_string != NULL)
            {
              s = b->cond_string;
-             if (b->cond)
+             if (b->loc->cond)
                {
-                 xfree (b->cond);
+                 xfree (b->loc->cond);
                  /* Avoid re-freeing b->exp if an error during the call
                     to parse_exp_1.  */
-                 b->cond = NULL;
+                 b->loc->cond = NULL;
                }
-             b->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0);
+             b->loc->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc), 0);
            }
 
          /* We need to re-set the breakpoint if the address changes... */
@@ -7314,14 +7310,14 @@ breakpoint_re_set_one (void *bint)
       if (b->cond_string != NULL)
        {
          s = b->cond_string;
-         if (b->cond)
+         if (b->loc->cond)
            {
-             xfree (b->cond);
+             xfree (b->loc->cond);
              /* Avoid re-freeing b->exp if an error during the call
                 to parse_exp_1.  */
-             b->cond = NULL;
+             b->loc->cond = NULL;
            }
-         b->cond = parse_exp_1 (&s, (struct block *) 0, 0);
+         b->loc->cond = parse_exp_1 (&s, (struct block *) 0, 0);
        }
       if (breakpoint_enabled (b))
        mention (b);
index 7679cb04cd307303e66f56e74a73b5632be1cba6..dc36ac75ed8d8f2b3ffb6acc0efb57c7b2b86356 100644 (file)
@@ -243,6 +243,13 @@ struct bp_location
      than reference counting.  */
   struct breakpoint *owner;
 
+  /* Conditional.  Break only if this expression's value is nonzero.  
+     Unlike string form of condition, which is associated with breakpoint,
+     this is associated with location, since if breakpoint has several
+     locations,  the evaluation of expression can be different for
+     different locations.  */
+  struct expression *cond;
+  
   /* Nonzero if this breakpoint is now inserted.  */
   char inserted;
 
@@ -341,8 +348,6 @@ struct breakpoint
     /* Stack depth (address of frame).  If nonzero, break only if fp
        equals this.  */
     struct frame_id frame_id;
-    /* Conditional.  Break only if this expression's value is nonzero.  */
-    struct expression *cond;
 
     /* String we used to set the breakpoint (malloc'd).  */
     char *addr_string;
index ce8bedf0cd592a4586e9cba521bc33c224d0f6a7..2b640e3a67163afc26890f56ed53631d851a5f16 100644 (file)
@@ -449,7 +449,7 @@ tui_update_breakpoint_info (struct tui_win_info *win,
                 mode |= TUI_BP_ENABLED;
               if (bp->hit_count)
                 mode |= TUI_BP_HIT;
-              if (bp->cond)
+              if (bp->loc->cond)
                 mode |= TUI_BP_CONDITIONAL;
               if (bp->type == bp_hardware_breakpoint)
                 mode |= TUI_BP_HARDWARE;