2001-07-07 Ben Elliston <bje@redhat.com>
[deliverable/binutils-gdb.git] / gdb / breakpoint.c
index be5450be6fe36a4c6227eff95ef3dd6d126d4e7b..ed152bede86684be38d33c3f41e3e7cb314dc886 100644 (file)
@@ -1889,7 +1889,7 @@ print_it_typical (bpstat bs)
 #ifdef UI_OUT
       annotate_breakpoint (bs->breakpoint_at->number);
       ui_out_text (uiout, "\nBreakpoint ");
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string (uiout, "reason", "breakpoint-hit");
       ui_out_field_int (uiout, "bkptno", bs->breakpoint_at->number);
       ui_out_text (uiout, ", ");
@@ -2034,7 +2034,7 @@ print_it_typical (bpstat bs)
        {
          annotate_watchpoint (bs->breakpoint_at->number);
 #ifdef UI_OUT
-         if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+         if (ui_out_is_mi_like_p (uiout))
            ui_out_field_string (uiout, "reason", "watchpoint-trigger");
          mention (bs->breakpoint_at);
          ui_out_tuple_begin (uiout, "value");
@@ -2064,7 +2064,7 @@ print_it_typical (bpstat bs)
 
     case bp_read_watchpoint:
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string (uiout, "reason", "read-watchpoint-trigger");
       mention (bs->breakpoint_at);
       ui_out_tuple_begin (uiout, "value");
@@ -2088,7 +2088,7 @@ print_it_typical (bpstat bs)
       if (bs->old_val != NULL)     
        {
          annotate_watchpoint (bs->breakpoint_at->number);
-         if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+         if (ui_out_is_mi_like_p (uiout))
            ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
          mention (bs->breakpoint_at);
          ui_out_tuple_begin (uiout, "value");
@@ -2102,7 +2102,7 @@ print_it_typical (bpstat bs)
       else 
        {
          mention (bs->breakpoint_at);
-         if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+         if (ui_out_is_mi_like_p (uiout))
            ui_out_field_string (uiout, "reason", "access-watchpoint-trigger");
          ui_out_tuple_begin (uiout, "value");
          ui_out_text (uiout, "\nValue = ");
@@ -2139,7 +2139,7 @@ print_it_typical (bpstat bs)
 
     case bp_finish:
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string (uiout, "reason", "function-finished");
 #endif
       return PRINT_UNKNOWN;
@@ -2147,7 +2147,7 @@ print_it_typical (bpstat bs)
 
     case bp_until:
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string (uiout, "reason", "location-reached");
 #endif
       return PRINT_UNKNOWN;
@@ -2354,7 +2354,7 @@ watchpoint_check (PTR p)
         will be deleted already. So we have no choice but print the
         information here. */
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        ui_out_field_string (uiout, "reason", "watchpoint-scope");
       ui_out_text (uiout, "\nWatchpoint ");
       ui_out_field_int (uiout, "wpnum", bs->breakpoint_at->number);
@@ -2409,7 +2409,12 @@ bpstat_stop_status (CORE_ADDR *pc, int not_a_breakpoint)
   "Error evaluating expression for watchpoint %d\n";
   char message[sizeof (message1) + 30 /* slop */ ];
 
-  /* Get the address where the breakpoint would have been.  */
+  /* Get the address where the breakpoint would have been.  
+     The "not_a_breakpoint" argument is meant to distinguish 
+     between a breakpoint trap event and a trace/singlestep
+     trap event.  For a trace/singlestep trap event, we would
+     not want to subtract DECR_PC_AFTER_BREAK from the PC. */
+
   bp_addr = *pc - (not_a_breakpoint && !SOFTWARE_SINGLE_STEP_P () ? 
                    0 : DECR_PC_AFTER_BREAK);
 
@@ -3476,7 +3481,7 @@ print_one_breakpoint (struct breakpoint *b,
 #ifdef UI_OUT
   /* Output the count also if it is zero, but only if this is
      mi. FIXME: Should have a better test for this. */
-  if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+  if (ui_out_is_mi_like_p (uiout))
     if (show_breakpoint_hit_counts && b->hit_count == 0)
       ui_out_field_int (uiout, "times", b->hit_count);
 #endif
@@ -3547,22 +3552,109 @@ gdb_breakpoint_query (/* output object, */ int bnum)
                       NULL, RETURN_MASK_ALL);
 }
 
-/* Print information on breakpoint number BNUM, or -1 if all.
-   If WATCHPOINTS is zero, process only breakpoints; if WATCHPOINTS
-   is nonzero, process only watchpoints.  */
+/* Return non-zero if B is user settable (breakpoints, watchpoints,
+   catchpoints, et.al.). */
+
+static int
+user_settable_breakpoint (const struct breakpoint *b)
+{
+  return (b->type == bp_breakpoint
+         || b->type == bp_catch_load
+         || b->type == bp_catch_unload
+         || b->type == bp_catch_fork
+         || b->type == bp_catch_vfork
+         || b->type == bp_catch_exec
+         || b->type == bp_catch_catch
+         || b->type == bp_catch_throw
+         || b->type == bp_hardware_breakpoint
+         || b->type == bp_watchpoint
+         || b->type == bp_read_watchpoint
+         || b->type == bp_access_watchpoint
+         || b->type == bp_hardware_watchpoint);
+}
+       
+/* Print information on user settable breakpoint (watchpoint, etc)
+   number BNUM.  If BNUM is -1 print all user settable breakpoints.
+   If ALLFLAG is non-zero, include non- user settable breakpoints. */
 
 static void
 breakpoint_1 (int bnum, int allflag)
 {
   register struct breakpoint *b;
   CORE_ADDR last_addr = (CORE_ADDR) -1;
-  int found_a_breakpoint = 0;
+  int nr_printable_breakpoints;
   
+  /* Compute the number of rows in the table. */
+  nr_printable_breakpoints = 0;
+  ALL_BREAKPOINTS (b)
+    if (bnum == -1
+       || bnum == b->number)
+      {
+       if (allflag || user_settable_breakpoint (b))
+         nr_printable_breakpoints++;
+      }
+
 #ifdef UI_OUT
   if (addressprint)
-    ui_out_table_begin (uiout, 6, "BreakpointTable");
+    ui_out_table_begin (uiout, 6, nr_printable_breakpoints, "BreakpointTable");
   else
-    ui_out_table_begin (uiout, 5, "BreakpointTable");
+    ui_out_table_begin (uiout, 5, nr_printable_breakpoints, "BreakpointTable");
+#endif /* UI_OUT */
+
+#ifdef UI_OUT
+  if (nr_printable_breakpoints > 0)
+    annotate_breakpoints_headers ();
+  if (nr_printable_breakpoints > 0)
+    annotate_field (0);
+  ui_out_table_header (uiout, 3, ui_left, "number", "Num");            /* 1 */
+  if (nr_printable_breakpoints > 0)
+    annotate_field (1);
+  ui_out_table_header (uiout, 14, ui_left, "type", "Type");            /* 2 */
+  if (nr_printable_breakpoints > 0)
+    annotate_field (2);
+  ui_out_table_header (uiout, 4, ui_left, "disp", "Disp");             /* 3 */
+  if (nr_printable_breakpoints > 0)
+    annotate_field (3);
+  ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");   /* 4 */
+  if (addressprint)
+       {
+         if (nr_printable_breakpoints > 0)
+           annotate_field (4);
+         if (TARGET_ADDR_BIT <= 32)
+           ui_out_table_header (uiout, 10, ui_left, "addr", "Address");/* 5 */
+         else
+           ui_out_table_header (uiout, 18, ui_left, "addr", "Address");/* 5 */
+       }
+  if (nr_printable_breakpoints > 0)
+    annotate_field (5);
+  ui_out_table_header (uiout, 40, ui_noalign, "what", "What"); /* 6 */
+  ui_out_table_body (uiout);
+  if (nr_printable_breakpoints > 0)
+    annotate_breakpoints_table ();
+#else
+  if (nr_printable_breakpoints > 0)
+    {
+      annotate_breakpoints_headers ();
+      annotate_field (0);
+      printf_filtered ("Num ");
+      annotate_field (1);
+      printf_filtered ("Type           ");
+      annotate_field (2);
+      printf_filtered ("Disp ");
+      annotate_field (3);
+      printf_filtered ("Enb ");
+      if (addressprint)
+       {
+         annotate_field (4);
+         if (TARGET_ADDR_BIT <= 32)
+           printf_filtered ("Address    ");
+         else
+           printf_filtered ("Address            ");
+       }
+      annotate_field (5);
+      printf_filtered ("What\n");
+      annotate_breakpoints_table ();
+    }
 #endif /* UI_OUT */
 
   ALL_BREAKPOINTS (b)
@@ -3571,72 +3663,16 @@ breakpoint_1 (int bnum, int allflag)
       {
        /* We only print out user settable breakpoints unless the
           allflag is set. */
-       if (!allflag
-           && b->type != bp_breakpoint
-           && b->type != bp_catch_load
-           && b->type != bp_catch_unload
-           && b->type != bp_catch_fork
-           && b->type != bp_catch_vfork
-           && b->type != bp_catch_exec
-           && b->type != bp_catch_catch
-           && b->type != bp_catch_throw
-           && b->type != bp_hardware_breakpoint
-           && b->type != bp_watchpoint
-           && b->type != bp_read_watchpoint
-           && b->type != bp_access_watchpoint
-           && b->type != bp_hardware_watchpoint)
-         continue;
-       
-       if (!found_a_breakpoint++)
-         {
-           annotate_breakpoints_headers ();
-#ifdef UI_OUT
-           annotate_field (0);
-           ui_out_table_header (uiout, 3, ui_left, "Num");     /* 1 */
-           annotate_field (1);
-           ui_out_table_header (uiout, 14, ui_left, "Type");   /* 2 */
-           annotate_field (2);
-           ui_out_table_header (uiout, 4, ui_left, "Disp");    /* 3 */
-           annotate_field (3);
-           ui_out_table_header (uiout, 3, ui_left, "Enb");     /* 4 */
-           if (addressprint)
-             {
-               annotate_field (4);
-               if (TARGET_ADDR_BIT <= 32)
-                 ui_out_table_header (uiout, 10, ui_left, "Address");  /* 5 */
-               else
-                 ui_out_table_header (uiout, 18, ui_left, "Address");  /* 5 */
-             }
-           annotate_field (5);
-           ui_out_table_header (uiout, 40, ui_noalign, "What");        /* 6 */
-           ui_out_table_body (uiout);
-#else
-           annotate_field (0);
-           printf_filtered ("Num ");
-           annotate_field (1);
-           printf_filtered ("Type           ");
-           annotate_field (2);
-           printf_filtered ("Disp ");
-           annotate_field (3);
-           printf_filtered ("Enb ");
-           if (addressprint)
-             {
-               annotate_field (4);
-               if (TARGET_ADDR_BIT <= 32)
-                 printf_filtered ("Address    ");
-               else
-                 printf_filtered ("Address            ");
-             }
-           annotate_field (5);
-           printf_filtered ("What\n");
-#endif /* UI_OUT */
-           annotate_breakpoints_table ();
-         }
-       
-       print_one_breakpoint (b, &last_addr);
+       if (allflag || user_settable_breakpoint (b))
+         print_one_breakpoint (b, &last_addr);
       }
   
-  if (!found_a_breakpoint)
+
+#ifdef UI_OUT
+  ui_out_table_end (uiout);
+#endif /* UI_OUT */
+
+  if (nr_printable_breakpoints == 0)
     {
 #ifdef UI_OUT
       if (bnum == -1)
@@ -3659,9 +3695,6 @@ breakpoint_1 (int bnum, int allflag)
        set_next_address (last_addr);
     }
 
-#ifdef UI_OUT
-  ui_out_table_end (uiout);
-#endif /* UI_OUT */
   /* FIXME? Should this be moved up so that it is only called when
      there have been breakpoints? */
   annotate_breakpoints_table_end ();
@@ -4476,7 +4509,7 @@ mention (struct breakpoint *b)
 #endif
     case bp_breakpoint:
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        {
          say_where = 0;
          break;
@@ -4487,7 +4520,7 @@ mention (struct breakpoint *b)
       break;
     case bp_hardware_breakpoint:
 #ifdef UI_OUT
-      if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+      if (ui_out_is_mi_like_p (uiout))
        {
          say_where = 0;
          break;
@@ -4550,7 +4583,7 @@ mention (struct breakpoint *b)
   do_cleanups (old_chain);
 #endif
 #ifdef UI_OUT
-  if (interpreter_p && strncmp (interpreter_p, "mi", 2) == 0)
+  if (ui_out_is_mi_like_p (uiout))
     return;
 #endif
   printf_filtered ("\n");
This page took 0.028862 seconds and 4 git commands to generate.