* breakpoint.c (insert_catchpoint): New function.
[deliverable/binutils-gdb.git] / gdb / breakpoint.c
index 5579df3ba47d18a2767b32357206620a19cdd109..d8682256ceacb17eecc2ddb3ec537ae25d38247e 100644 (file)
@@ -80,10 +80,6 @@ static void clear_command (char *, int);
 
 static void catch_command (char *, int);
 
-static void handle_gnu_4_16_catch_command (char *, int, int);
-
-static struct symtabs_and_lines get_catch_sals (int);
-
 static void watch_command (char *, int);
 
 static int can_use_hardware_watchpoint (struct value *);
@@ -707,6 +703,35 @@ read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
 }
 \f
 
+/* A wrapper function for inserting catchpoints.  */
+int
+insert_catchpoint (struct ui_out *uo, void *args)
+{
+  struct breakpoint *b = (struct breakpoint *) args;
+  int val = -1;
+
+  switch (b->type)
+    {
+    case bp_catch_fork:
+      val = target_insert_fork_catchpoint (PIDGET (inferior_ptid));
+      break;
+    case bp_catch_vfork:
+      val = target_insert_vfork_catchpoint (PIDGET (inferior_ptid));
+      break;
+    case bp_catch_exec:
+      val = target_insert_exec_catchpoint (PIDGET (inferior_ptid));
+      break;
+    default:
+      warning ("Internal error, %s line %d.", __FILE__, __LINE__);
+      break;
+    }
+
+  if (val < 0)
+    throw_exception (RETURN_ERROR);
+
+  return 0;
+}
+
 /* insert_breakpoints is used when starting or continuing the program.
    remove_breakpoints is used when the program stops.
    Both return zero if successful,
@@ -1058,32 +1083,15 @@ insert_breakpoints (void)
             && !b->inserted
             && !b->duplicate)
       {
-       val = -1;
-       switch (b->type)
-         {
-         case bp_catch_fork:
-           val = target_insert_fork_catchpoint (PIDGET (inferior_ptid));
-           break;
-         case bp_catch_vfork:
-           val = target_insert_vfork_catchpoint (PIDGET (inferior_ptid));
-           break;
-         case bp_catch_exec:
-           val = target_insert_exec_catchpoint (PIDGET (inferior_ptid));
-           break;
-         default:
-           warning ("Internal error, %s line %d.", __FILE__, __LINE__);
-           break;
-         }
+       char prefix[64];
+
+       sprintf (prefix, "warning: inserting catchpoint %d: ", b->number);
+       val = catch_exceptions (uiout, insert_catchpoint, b, prefix,
+                               RETURN_MASK_ERROR);
        if (val < 0)
-         {
-           fprintf_unfiltered (tmp_error_stream, 
-                               "Cannot insert catchpoint %d.", b->number);
-         }
+         b->enable_state = bp_disabled;
        else
          b->inserted = 1;
-
-       if (val)
-         return_val = val;     /* remember failure */
       }
   }
   
@@ -1679,7 +1687,7 @@ breakpoint_inserted_here_p (CORE_ADDR pc)
 
 /* Return nonzero if FRAME is a dummy frame.  We can't use
    DEPRECATED_PC_IN_CALL_DUMMY because figuring out the saved SP would
-   take too much time, at least using get_saved_register on the 68k.
+   take too much time, at least using frame_register() on the 68k.
    This means that for this function to work right a port must use the
    bp_call_dummy breakpoint.  */
 
@@ -1688,9 +1696,6 @@ deprecated_frame_in_dummy (struct frame_info *frame)
 {
   struct breakpoint *b;
 
-  if (!CALL_DUMMY_P)
-    return 0;
-
   /* This function is used by two files: get_frame_type(), after first
      checking that !DEPRECATED_USE_GENERIC_DUMMY_FRAMES; and
      sparc-tdep.c, which doesn't yet use generic dummy frames anyway.  */
@@ -1704,7 +1709,7 @@ deprecated_frame_in_dummy (struct frame_info *frame)
        for signals.exp in the testsuite.  */
        && (get_frame_pc (frame)
            >= (b->address
-               - SIZEOF_CALL_DUMMY_WORDS / sizeof (LONGEST) * REGISTER_SIZE))
+               - DEPRECATED_SIZEOF_CALL_DUMMY_WORDS / sizeof (LONGEST) * DEPRECATED_REGISTER_SIZE))
        && get_frame_pc (frame) <= b->address)
       return 1;
   }
@@ -1816,6 +1821,11 @@ bpstat_copy (bpstat bs)
     {
       tmp = (bpstat) xmalloc (sizeof (*tmp));
       memcpy (tmp, bs, sizeof (*tmp));
+      if (bs->commands != NULL)
+       tmp->commands = copy_command_lines (bs->commands);
+      if (bs->old_val != NULL)
+       tmp->old_val = value_copy (bs->old_val);
+
       if (p == NULL)
        /* This is the first thing in the chain.  */
        retval = tmp;
@@ -2273,9 +2283,15 @@ print_bp_stop_message (bpstat bs)
       break;
 
     case print_it_normal:
-      /* Normal case, we handle everything in print_it_typical. */
-      return print_it_typical (bs);
+      /* Normal case.  Call the breakpoint's print_it method, or
+        print_it_typical.  */
+      if (bs->breakpoint_at != NULL && bs->breakpoint_at->ops != NULL
+         && bs->breakpoint_at->ops->print_it != NULL)
+       return bs->breakpoint_at->ops->print_it (bs->breakpoint_at);
+      else
+       return print_it_typical (bs);
       break;
+
     default:
       internal_error (__FILE__, __LINE__,
                      "print_bp_stop_message: unrecognized enum value");
@@ -2758,9 +2774,9 @@ bpstat_stop_status (CORE_ADDR *pc, int not_a_sw_breakpoint)
            /* We will stop here */
            if (b->disposition == disp_disable)
              b->enable_state = bp_disabled;
-           bs->commands = copy_command_lines (b->commands);
            if (b->silent)
              bs->print = 0;
+           bs->commands = b->commands;
            if (bs->commands &&
                (STREQ ("silent", bs->commands->line) ||
                 (xdb_commands && STREQ ("Q", bs->commands->line))))
@@ -2768,6 +2784,7 @@ bpstat_stop_status (CORE_ADDR *pc, int not_a_sw_breakpoint)
                bs->commands = bs->commands->next;
                bs->print = 0;
              }
+           bs->commands = copy_command_lines (bs->commands);
          }
       }
     /* Print nothing for this entry if we dont stop or if we dont print.  */
@@ -3266,143 +3283,147 @@ print_one_breakpoint (struct breakpoint *b,
       else
        strcat (wrap_indent, "                   ");
     }
-  switch (b->type)
-    {
-    case bp_none:
-      internal_error (__FILE__, __LINE__,
-                     "print_one_breakpoint: bp_none encountered\n");
-      break;
 
-    case bp_watchpoint:
-    case bp_hardware_watchpoint:
-    case bp_read_watchpoint:
-    case bp_access_watchpoint:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      print_expression (b->exp, stb->stream);
-      ui_out_field_stream (uiout, "what", stb);
-      break;
-      
-    case bp_catch_load:
-    case bp_catch_unload:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      if (b->dll_pathname == NULL)
-       {
-         ui_out_field_string (uiout, "what", "<any library>");
-         ui_out_spaces (uiout, 1);
-       }
-      else
-       {
-         ui_out_text (uiout, "library \"");
-         ui_out_field_string (uiout, "what", b->dll_pathname);
-         ui_out_text (uiout, "\" ");
-       }
-      break;
-      
-    case bp_catch_fork:
-    case bp_catch_vfork:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      if (b->forked_inferior_pid != 0)
-       {
-         ui_out_text (uiout, "process ");
-         ui_out_field_int (uiout, "what", b->forked_inferior_pid);
-         ui_out_spaces (uiout, 1);
-       }
-      
-    case bp_catch_exec:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      if (b->exec_pathname != NULL)
-       {
-         ui_out_text (uiout, "program \"");
-         ui_out_field_string (uiout, "what", b->exec_pathname);
-         ui_out_text (uiout, "\" ");
-       }
-      break;
+  if (b->ops != NULL && b->ops->print_one != NULL)
+    b->ops->print_one (b, last_addr);
+  else
+    switch (b->type)
+      {
+      case bp_none:
+       internal_error (__FILE__, __LINE__,
+                       "print_one_breakpoint: bp_none encountered\n");
+       break;
 
-    case bp_catch_catch:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      ui_out_field_string (uiout, "what", "exception catch");
-      ui_out_spaces (uiout, 1);
-      break;
+      case bp_watchpoint:
+      case bp_hardware_watchpoint:
+      case bp_read_watchpoint:
+      case bp_access_watchpoint:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       print_expression (b->exp, stb->stream);
+       ui_out_field_stream (uiout, "what", stb);
+       break;
+
+      case bp_catch_load:
+      case bp_catch_unload:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       if (b->dll_pathname == NULL)
+         {
+           ui_out_field_string (uiout, "what", "<any library>");
+           ui_out_spaces (uiout, 1);
+         }
+       else
+         {
+           ui_out_text (uiout, "library \"");
+           ui_out_field_string (uiout, "what", b->dll_pathname);
+           ui_out_text (uiout, "\" ");
+         }
+       break;
+
+      case bp_catch_fork:
+      case bp_catch_vfork:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       if (b->forked_inferior_pid != 0)
+         {
+           ui_out_text (uiout, "process ");
+           ui_out_field_int (uiout, "what", b->forked_inferior_pid);
+           ui_out_spaces (uiout, 1);
+         }
+
+      case bp_catch_exec:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       if (b->exec_pathname != NULL)
+         {
+           ui_out_text (uiout, "program \"");
+           ui_out_field_string (uiout, "what", b->exec_pathname);
+           ui_out_text (uiout, "\" ");
+         }
+       break;
+
+      case bp_catch_catch:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       ui_out_field_string (uiout, "what", "exception catch");
+       ui_out_spaces (uiout, 1);
+       break;
+
+      case bp_catch_throw:
+       /* Field 4, the address, is omitted (which makes the columns
+          not line up too nicely with the headers, but the effect
+          is relatively readable).  */
+       if (addressprint)
+         ui_out_field_skip (uiout, "addr");
+       annotate_field (5);
+       ui_out_field_string (uiout, "what", "exception throw");
+       ui_out_spaces (uiout, 1);
+       break;
+
+      case bp_breakpoint:
+      case bp_hardware_breakpoint:
+      case bp_until:
+      case bp_finish:
+      case bp_longjmp:
+      case bp_longjmp_resume:
+      case bp_step_resume:
+      case bp_through_sigtramp:
+      case bp_watchpoint_scope:
+      case bp_call_dummy:
+      case bp_shlib_event:
+      case bp_thread_event:
+      case bp_overlay_event:
+       if (addressprint)
+         {
+           annotate_field (4);
+           ui_out_field_core_addr (uiout, "addr", b->address);
+         }
+       annotate_field (5);
+       *last_addr = b->address;
+       if (b->source_file)
+         {
+           sym = find_pc_sect_function (b->address, b->section);
+           if (sym)
+             {
+               ui_out_text (uiout, "in ");
+               ui_out_field_string (uiout, "func",
+                                    SYMBOL_PRINT_NAME (sym));
+               ui_out_wrap_hint (uiout, wrap_indent);
+               ui_out_text (uiout, " at ");
+             }
+           ui_out_field_string (uiout, "file", b->source_file);
+           ui_out_text (uiout, ":");
+           ui_out_field_int (uiout, "line", b->line_number);
+         }
+       else
+         {
+           print_address_symbolic (b->address, stb->stream, demangle, "");
+           ui_out_field_stream (uiout, "at", stb);
+         }
+       break;
+      }
 
-    case bp_catch_throw:
-      /* Field 4, the address, is omitted (which makes the columns
-        not line up too nicely with the headers, but the effect
-        is relatively readable).  */
-      if (addressprint)
-       ui_out_field_skip (uiout, "addr");
-      annotate_field (5);
-      ui_out_field_string (uiout, "what", "exception throw");
-      ui_out_spaces (uiout, 1);
-      break;
-      
-    case bp_breakpoint:
-    case bp_hardware_breakpoint:
-    case bp_until:
-    case bp_finish:
-    case bp_longjmp:
-    case bp_longjmp_resume:
-    case bp_step_resume:
-    case bp_through_sigtramp:
-    case bp_watchpoint_scope:
-    case bp_call_dummy:
-    case bp_shlib_event:
-    case bp_thread_event:
-    case bp_overlay_event:
-      if (addressprint)
-       {
-         annotate_field (4);
-         ui_out_field_core_addr (uiout, "addr", b->address);
-       }
-      annotate_field (5);
-      *last_addr = b->address;
-      if (b->source_file)
-       {
-         sym = find_pc_sect_function (b->address, b->section);
-         if (sym)
-           {
-             ui_out_text (uiout, "in ");
-             ui_out_field_string (uiout, "func",
-                                  SYMBOL_PRINT_NAME (sym));
-             ui_out_wrap_hint (uiout, wrap_indent);
-             ui_out_text (uiout, " at ");
-           }
-         ui_out_field_string (uiout, "file", b->source_file);
-         ui_out_text (uiout, ":");
-         ui_out_field_int (uiout, "line", b->line_number);
-       }
-      else
-       {
-         print_address_symbolic (b->address, stb->stream, demangle, "");
-         ui_out_field_stream (uiout, "at", stb);
-       }
-      break;
-    }
-  
   if (b->thread != -1)
     {
       /* FIXME: This seems to be redundant and lost here; see the
@@ -3419,7 +3440,7 @@ print_one_breakpoint (struct breakpoint *b,
       ui_out_text (uiout, "\tstop only in stack frame at ");
       /* FIXME: cagney/2002-12-01: Shouldn't be poeking around inside
          the frame ID.  */
-      ui_out_field_core_addr (uiout, "frame", b->frame_id.base);
+      ui_out_field_core_addr (uiout, "frame", b->frame_id.stack_addr);
       ui_out_text (uiout, "\n");
     }
   
@@ -3852,6 +3873,7 @@ set_raw_breakpoint (struct symtab_and_line sal, enum bptype bptype)
   b->triggered_dll_pathname = NULL;
   b->forked_inferior_pid = 0;
   b->exec_pathname = NULL;
+  b->ops = NULL;
 
   /* Add this breakpoint to the end of the chain
      so that a list of breakpoints will come out in order
@@ -4414,103 +4436,107 @@ mention (struct breakpoint *b)
     create_breakpoint_hook (b);
   breakpoint_create_event (b->number);
 
-  switch (b->type)
-    {
-    case bp_none:
-      printf_filtered ("(apparently deleted?) Eventpoint %d: ", b->number);
-      break;
-    case bp_watchpoint:
-      ui_out_text (uiout, "Watchpoint ");
-      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
-      ui_out_field_int (uiout, "number", b->number);
-      ui_out_text (uiout, ": ");
-      print_expression (b->exp, stb->stream);
-      ui_out_field_stream (uiout, "exp", stb);
-      do_cleanups (ui_out_chain);
-      break;
-    case bp_hardware_watchpoint:
-      ui_out_text (uiout, "Hardware watchpoint ");
-      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
-      ui_out_field_int (uiout, "number", b->number);
-      ui_out_text (uiout, ": ");
-      print_expression (b->exp, stb->stream);
-      ui_out_field_stream (uiout, "exp", stb);
-      do_cleanups (ui_out_chain);
-      break;
-    case bp_read_watchpoint:
-      ui_out_text (uiout, "Hardware read watchpoint ");
-      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-rwpt");
-      ui_out_field_int (uiout, "number", b->number);
-      ui_out_text (uiout, ": ");
-      print_expression (b->exp, stb->stream);
-      ui_out_field_stream (uiout, "exp", stb);
-      do_cleanups (ui_out_chain);
-      break;
-    case bp_access_watchpoint:
-      ui_out_text (uiout, "Hardware access (read/write) watchpoint ");
-      ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-awpt");
-      ui_out_field_int (uiout, "number", b->number);
-      ui_out_text (uiout, ": ");
-      print_expression (b->exp, stb->stream);
-      ui_out_field_stream (uiout, "exp", stb);
-      do_cleanups (ui_out_chain);
-      break;
-    case bp_breakpoint:
-      if (ui_out_is_mi_like_p (uiout))
-       {
-         say_where = 0;
-         break;
-       }
-      printf_filtered ("Breakpoint %d", b->number);
-      say_where = 1;
-      break;
-    case bp_hardware_breakpoint:
-      if (ui_out_is_mi_like_p (uiout))
-       {
-         say_where = 0;
-         break;
-       }
-      printf_filtered ("Hardware assisted breakpoint %d", b->number);
-      say_where = 1;
-      break;
-    case bp_catch_load:
-    case bp_catch_unload:
-      printf_filtered ("Catchpoint %d (%s %s)",
-                      b->number,
-                      (b->type == bp_catch_load) ? "load" : "unload",
-                      (b->dll_pathname != NULL) ? 
-                      b->dll_pathname : "<any library>");
-      break;
-    case bp_catch_fork:
-    case bp_catch_vfork:
-      printf_filtered ("Catchpoint %d (%s)",
-                      b->number,
-                      (b->type == bp_catch_fork) ? "fork" : "vfork");
-      break;
-    case bp_catch_exec:
-      printf_filtered ("Catchpoint %d (exec)",
-                      b->number);
-      break;
-    case bp_catch_catch:
-    case bp_catch_throw:
-      printf_filtered ("Catchpoint %d (%s)",
-                      b->number,
-                      (b->type == bp_catch_catch) ? "catch" : "throw");
-      break;
+  if (b->ops != NULL && b->ops->print_mention != NULL)
+    b->ops->print_mention (b);
+  else
+    switch (b->type)
+      {
+      case bp_none:
+       printf_filtered ("(apparently deleted?) Eventpoint %d: ", b->number);
+       break;
+      case bp_watchpoint:
+       ui_out_text (uiout, "Watchpoint ");
+       ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
+       ui_out_field_int (uiout, "number", b->number);
+       ui_out_text (uiout, ": ");
+       print_expression (b->exp, stb->stream);
+       ui_out_field_stream (uiout, "exp", stb);
+       do_cleanups (ui_out_chain);
+       break;
+      case bp_hardware_watchpoint:
+       ui_out_text (uiout, "Hardware watchpoint ");
+       ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
+       ui_out_field_int (uiout, "number", b->number);
+       ui_out_text (uiout, ": ");
+       print_expression (b->exp, stb->stream);
+       ui_out_field_stream (uiout, "exp", stb);
+       do_cleanups (ui_out_chain);
+       break;
+      case bp_read_watchpoint:
+       ui_out_text (uiout, "Hardware read watchpoint ");
+       ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-rwpt");
+       ui_out_field_int (uiout, "number", b->number);
+       ui_out_text (uiout, ": ");
+       print_expression (b->exp, stb->stream);
+       ui_out_field_stream (uiout, "exp", stb);
+       do_cleanups (ui_out_chain);
+       break;
+      case bp_access_watchpoint:
+       ui_out_text (uiout, "Hardware access (read/write) watchpoint ");
+       ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-awpt");
+       ui_out_field_int (uiout, "number", b->number);
+       ui_out_text (uiout, ": ");
+       print_expression (b->exp, stb->stream);
+       ui_out_field_stream (uiout, "exp", stb);
+       do_cleanups (ui_out_chain);
+       break;
+      case bp_breakpoint:
+       if (ui_out_is_mi_like_p (uiout))
+         {
+           say_where = 0;
+           break;
+         }
+       printf_filtered ("Breakpoint %d", b->number);
+       say_where = 1;
+       break;
+      case bp_hardware_breakpoint:
+       if (ui_out_is_mi_like_p (uiout))
+         {
+           say_where = 0;
+           break;
+         }
+       printf_filtered ("Hardware assisted breakpoint %d", b->number);
+       say_where = 1;
+       break;
+      case bp_catch_load:
+      case bp_catch_unload:
+       printf_filtered ("Catchpoint %d (%s %s)",
+                        b->number,
+                        (b->type == bp_catch_load) ? "load" : "unload",
+                        (b->dll_pathname != NULL) ? 
+                        b->dll_pathname : "<any library>");
+       break;
+      case bp_catch_fork:
+      case bp_catch_vfork:
+       printf_filtered ("Catchpoint %d (%s)",
+                        b->number,
+                        (b->type == bp_catch_fork) ? "fork" : "vfork");
+       break;
+      case bp_catch_exec:
+       printf_filtered ("Catchpoint %d (exec)",
+                        b->number);
+       break;
+      case bp_catch_catch:
+      case bp_catch_throw:
+       printf_filtered ("Catchpoint %d (%s)",
+                        b->number,
+                        (b->type == bp_catch_catch) ? "catch" : "throw");
+       break;
+
+      case bp_until:
+      case bp_finish:
+      case bp_longjmp:
+      case bp_longjmp_resume:
+      case bp_step_resume:
+      case bp_through_sigtramp:
+      case bp_call_dummy:
+      case bp_watchpoint_scope:
+      case bp_shlib_event:
+      case bp_thread_event:
+      case bp_overlay_event:
+       break;
+      }
 
-    case bp_until:
-    case bp_finish:
-    case bp_longjmp:
-    case bp_longjmp_resume:
-    case bp_step_resume:
-    case bp_through_sigtramp:
-    case bp_call_dummy:
-    case bp_watchpoint_scope:
-    case bp_shlib_event:
-    case bp_thread_event:
-    case bp_overlay_event:
-      break;
-    }
   if (say_where)
     {
       if (addressprint || b->source_file == NULL)
@@ -4593,7 +4619,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
    addresses found. ADDR_STRING contains a vector of (canonical)
    address strings. ARG points to the end of the SAL. */
 
-void
+static void
 parse_breakpoint_sals (char **address,
                       struct symtabs_and_lines *sals,
                       char ***addr_string)
@@ -4660,7 +4686,7 @@ parse_breakpoint_sals (char **address,
 /* Convert each SAL into a real PC.  Verify that the PC can be
    inserted as a breakpoint.  If it can't throw an error. */
 
-void
+static void
 breakpoint_sals_to_pc (struct symtabs_and_lines *sals,
                       char *address)
 {    
@@ -5450,7 +5476,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
 
 #if !defined(TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT)
 #define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(BYTE_SIZE) \
-    ((BYTE_SIZE) <= (REGISTER_SIZE))
+    ((BYTE_SIZE) <= (DEPRECATED_REGISTER_SIZE))
 #endif
 
 #if !defined(TARGET_REGION_OK_FOR_HW_WATCHPOINT)
@@ -5700,187 +5726,6 @@ enable_catch_breakpoint (void)
 }
 #endif /* 0 */
 
-struct sal_chain
-{
-  struct sal_chain *next;
-  struct symtab_and_line sal;
-};
-
-#if 0
-/* Not really used -- invocation in handle_gnu_4_16_catch_command
-   had been commented out in the v.4.16 sources, and stays
-   disabled there now because "catch NAME" syntax isn't allowed.
-   pai/1997-07-11 */
-/* This isn't used; I don't know what it was for.  */
-/* For each catch clause identified in ARGS, run FUNCTION
-   with that clause as an argument.  */
-static struct symtabs_and_lines
-map_catch_names (char *args, int (*function) ())
-{
-  register char *p = args;
-  register char *p1;
-  struct symtabs_and_lines sals;
-#if 0
-  struct sal_chain *sal_chain = 0;
-#endif
-
-  if (p == 0)
-    error_no_arg ("one or more catch names");
-
-  sals.nelts = 0;
-  sals.sals = NULL;
-
-  while (*p)
-    {
-      p1 = p;
-      /* Don't swallow conditional part.  */
-      if (p1[0] == 'i' && p1[1] == 'f'
-         && (p1[2] == ' ' || p1[2] == '\t'))
-       break;
-
-      if (isalpha (*p1))
-       {
-         p1++;
-         while (isalnum (*p1) || *p1 == '_' || *p1 == '$')
-           p1++;
-       }
-
-      if (*p1 && *p1 != ' ' && *p1 != '\t')
-       error ("Arguments must be catch names.");
-
-      *p1 = 0;
-#if 0
-      if (function (p))
-       {
-         struct sal_chain *next = (struct sal_chain *)
-         alloca (sizeof (struct sal_chain));
-         next->next = sal_chain;
-         next->sal = get_catch_sal (p);
-         sal_chain = next;
-         goto win;
-       }
-#endif
-      printf_unfiltered ("No catch clause for exception %s.\n", p);
-#if 0
-    win:
-#endif
-      p = p1;
-      while (*p == ' ' || *p == '\t')
-       p++;
-    }
-}
-#endif
-
-/* This shares a lot of code with `print_frame_label_vars' from stack.c.  */
-
-static struct symtabs_and_lines
-get_catch_sals (int this_level_only)
-{
-  register struct blockvector *bl;
-  register struct block *block;
-  int index, have_default = 0;
-  CORE_ADDR pc;
-  struct symtabs_and_lines sals;
-  struct sal_chain *sal_chain = 0;
-  char *blocks_searched;
-
-  /* Not sure whether an error message is always the correct response,
-     but it's better than a core dump.  */
-  if (deprecated_selected_frame == NULL)
-    error ("No selected frame.");
-  block = get_frame_block (deprecated_selected_frame, 0);
-  pc = get_frame_pc (deprecated_selected_frame);
-
-  sals.nelts = 0;
-  sals.sals = NULL;
-
-  if (block == 0)
-    error ("No symbol table info available.\n");
-
-  bl = blockvector_for_pc (BLOCK_END (block) - 4, &index);
-  blocks_searched = (char *) alloca (BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
-  memset (blocks_searched, 0, BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
-
-  while (block != 0)
-    {
-      CORE_ADDR end = BLOCK_END (block) - 4;
-      int last_index;
-
-      if (bl != blockvector_for_pc (end, &index))
-       error ("blockvector blotch");
-      if (BLOCKVECTOR_BLOCK (bl, index) != block)
-       error ("blockvector botch");
-      last_index = BLOCKVECTOR_NBLOCKS (bl);
-      index += 1;
-
-      /* Don't print out blocks that have gone by.  */
-      while (index < last_index
-            && BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < pc)
-       index++;
-
-      while (index < last_index
-            && BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < end)
-       {
-         if (blocks_searched[index] == 0)
-           {
-             struct block *b = BLOCKVECTOR_BLOCK (bl, index);
-             register int i;
-             register struct symbol *sym;
-
-             ALL_BLOCK_SYMBOLS (b, i, sym)
-               {
-                 if (STREQ (SYMBOL_NAME (sym), "default"))
-                   {
-                     if (have_default)
-                       continue;
-                     have_default = 1;
-                   }
-                 if (SYMBOL_CLASS (sym) == LOC_LABEL)
-                   {
-                     struct sal_chain *next = (struct sal_chain *)
-                     alloca (sizeof (struct sal_chain));
-                     next->next = sal_chain;
-                     next->sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 
-                                               0);
-                     sal_chain = next;
-                   }
-               }
-             blocks_searched[index] = 1;
-           }
-         index++;
-       }
-      if (have_default)
-       break;
-      if (sal_chain && this_level_only)
-       break;
-
-      /* After handling the function's top-level block, stop.
-         Don't continue to its superblock, the block of
-         per-file symbols.  */
-      if (BLOCK_FUNCTION (block))
-       break;
-      block = BLOCK_SUPERBLOCK (block);
-    }
-
-  if (sal_chain)
-    {
-      struct sal_chain *tmp_chain;
-
-      /* Count the number of entries.  */
-      for (index = 0, tmp_chain = sal_chain; tmp_chain;
-          tmp_chain = tmp_chain->next)
-       index++;
-
-      sals.nelts = index;
-      sals.sals = (struct symtab_and_line *)
-       xmalloc (index * sizeof (struct symtab_and_line));
-      for (index = 0; sal_chain; sal_chain = sal_chain->next, index++)
-       sals.sals[index] = sal_chain->sal;
-    }
-
-  return sals;
-}
-
 static void
 ep_skip_leading_whitespace (char **s)
 {
@@ -6186,6 +6031,90 @@ create_exception_catchpoint (int tempflag, char *cond_string,
   mention (b);
 }
 
+static enum print_stop_action
+print_exception_catchpoint (struct breakpoint *b)
+{
+  annotate_catchpoint (b->number);
+
+  if (strstr (b->addr_string, "throw") != NULL)
+    printf_filtered ("\nCatchpoint %d (exception thrown)\n",
+                    b->number);
+  else
+    printf_filtered ("\nCatchpoint %d (exception caught)\n",
+                    b->number);
+
+  return PRINT_SRC_AND_LOC;
+}
+
+static void
+print_one_exception_catchpoint (struct breakpoint *b, CORE_ADDR *last_addr)
+{
+  if (addressprint)
+    {
+      annotate_field (4);
+      ui_out_field_core_addr (uiout, "addr", b->address);
+    }
+  annotate_field (5);
+  *last_addr = b->address;
+  if (strstr (b->addr_string, "throw") != NULL)
+    ui_out_field_string (uiout, "what", "exception throw");
+  else
+    ui_out_field_string (uiout, "what", "exception catch");
+}
+
+static void
+print_mention_exception_catchpoint (struct breakpoint *b)
+{
+  if (strstr (b->addr_string, "throw") != NULL)
+    printf_filtered ("Catchpoint %d (throw)", b->number);
+  else
+    printf_filtered ("Catchpoint %d (catch)", b->number);
+}
+
+static struct breakpoint_ops gnu_v3_exception_catchpoint_ops = {
+  print_exception_catchpoint,
+  print_one_exception_catchpoint,
+  print_mention_exception_catchpoint
+};
+
+static int
+handle_gnu_v3_exceptions (int tempflag, char *cond_string,
+                         enum exception_event_kind ex_event, int from_tty)
+{
+  char *trigger_func_name, *nameptr;
+  struct symtabs_and_lines sals;
+  struct breakpoint *b;
+
+  if (ex_event == EX_EVENT_CATCH)
+    trigger_func_name = xstrdup ("__cxa_begin_catch");
+  else
+    trigger_func_name = xstrdup ("__cxa_throw");
+
+  nameptr = trigger_func_name;
+  sals = decode_line_1 (&nameptr, 1, NULL, 0, NULL);
+  if (sals.nelts == 0)
+    {
+      xfree (trigger_func_name);
+      return 0;
+    }
+
+  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;
+  b->addr_string = trigger_func_name;
+  b->enable_state = bp_enabled;
+  b->disposition = tempflag ? disp_del : disp_donttouch;
+  b->ops = &gnu_v3_exception_catchpoint_ops;
+
+  xfree (sals.sals);
+  mention (b);
+  return 1;
+}
+
 /* Deal with "catch catch" and "catch throw" commands */
 
 static void
@@ -6206,6 +6135,9 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
       (ex_event != EX_EVENT_CATCH))
     error ("Unsupported or unknown exception event; cannot catch it");
 
+  if (handle_gnu_v3_exceptions (tempflag, cond_string, ex_event, from_tty))
+    return;
+
   /* See if we can find a callback routine */
   sal = target_enable_exception_callback (ex_event, 1);
 
@@ -6218,23 +6150,8 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
       else
        return;         /* something went wrong with setting up callbacks */
     }
-  else
-    {
-      /* No callbacks from runtime system for exceptions.
-         Try GNU C++ exception breakpoints using labels in debug info. */
-      if (ex_event == EX_EVENT_CATCH)
-       {
-         handle_gnu_4_16_catch_command (arg, tempflag, from_tty);
-       }
-      else if (ex_event == EX_EVENT_THROW)
-       {
-         /* Set a breakpoint on __raise_exception () */
 
-         warning ("Unsupported with this platform/compiler combination.");
-         warning ("Perhaps you can achieve the effect you want by setting");
-         warning ("a breakpoint on __raise_exception().");
-       }
-    }
+  warning ("Unsupported with this platform/compiler combination.");
 }
 
 /* Cover routine to allow wrapping target_enable_exception_catchpoints
@@ -6254,111 +6171,6 @@ cover_target_enable_exception_callback (void *arg)
     return 1;                  /*is valid */
 }
 
-
-
-/* This is the original v.4.16 and earlier version of the
-   catch_command_1() function.  Now that other flavours of "catch"
-   have been introduced, and since exception handling can be handled
-   in other ways (through target ops) also, this is used only for the
-   GNU C++ exception handling system.
-   Note: Only the "catch" flavour of GDB 4.16 is handled here.  The
-   "catch NAME" is now no longer allowed in catch_command_1().  Also,
-   there was no code in GDB 4.16 for "catch throw". 
-
-   Called from catch_exception_command_1 () */
-
-
-static void
-handle_gnu_4_16_catch_command (char *arg, int tempflag, int from_tty)
-{
-  /* First, translate ARG into something we can deal with in terms
-     of breakpoints.  */
-
-  struct symtabs_and_lines sals;
-  struct symtab_and_line sal;
-  register struct expression *cond = 0;
-  register struct breakpoint *b;
-  char *save_arg;
-  int i;
-
-  init_sal (&sal);             /* initialize to zeroes */
-
-  /* If no arg given, or if first arg is 'if ', all active catch clauses
-     are breakpointed. */
-
-  if (!arg || (arg[0] == 'i' && arg[1] == 'f'
-              && (arg[2] == ' ' || arg[2] == '\t')))
-    {
-      /* Grab all active catch clauses.  */
-      sals = get_catch_sals (0);
-    }
-  else
-    {
-      /* Grab selected catch clauses.  */
-      error ("catch NAME not implemented");
-
-#if 0
-      /* Not sure why this code has been disabled. I'm leaving
-         it disabled.  We can never come here now anyway
-         since we don't allow the "catch NAME" syntax.
-         pai/1997-07-11 */
-
-      /* This isn't used; I don't know what it was for.  */
-      sals = map_catch_names (arg, catch_breakpoint);
-#endif
-    }
-
-  if (!sals.nelts)
-    return;
-
-  save_arg = arg;
-  for (i = 0; i < sals.nelts; i++)
-    {
-      resolve_sal_pc (&sals.sals[i]);
-
-      while (arg && *arg)
-       {
-         if (arg[0] == 'i' && arg[1] == 'f'
-             && (arg[2] == ' ' || arg[2] == '\t'))
-           cond = parse_exp_1 ((arg += 2, &arg),
-                               block_for_pc (sals.sals[i].pc), 0);
-         else
-           error ("Junk at end of arguments.");
-       }
-      arg = save_arg;
-    }
-
-  for (i = 0; i < sals.nelts; i++)
-    {
-      sal = sals.sals[i];
-
-      if (from_tty)
-       describe_other_breakpoints (sal.pc, sal.section);
-
-      /* Important -- this is an ordinary breakpoint.  For platforms
-        with callback support for exceptions,
-        create_exception_catchpoint() will create special bp types
-        (bp_catch_catch and bp_catch_throw), and there is code in
-        insert_breakpoints() and elsewhere that depends on that. */
-      b = set_raw_breakpoint (sal, bp_breakpoint);
-      set_breakpoint_count (breakpoint_count + 1);
-      b->number = breakpoint_count;
-
-      b->cond = cond;
-      b->enable_state = bp_enabled;
-      b->disposition = tempflag ? disp_del : disp_donttouch;
-
-      mention (b);
-    }
-
-  if (sals.nelts > 1)
-    {
-      warning ("Multiple breakpoints were set.");
-      warning ("Use the \"delete\" command to delete unwanted breakpoints.");
-    }
-  xfree (sals.sals);
-}
-
 static void
 catch_command_1 (char *arg, int tempflag, int from_tty)
 {
This page took 0.057161 seconds and 4 git commands to generate.