*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / breakpoint.c
index a89b35fbaaca6468841b8656c081e5bc896f36c2..783b797494b6a0403c665e8cd13266ad84a306d7 100644 (file)
@@ -38,7 +38,7 @@
 #include "target.h"
 #include "language.h"
 #include "gdb_string.h"
-#include "demangle.h"
+#include "gdb-demangle.h"
 #include "filenames.h"
 #include "annotate.h"
 #include "symfile.h"
@@ -65,6 +65,9 @@
 #include "parser-defs.h"
 #include "cli/cli-utils.h"
 #include "continuations.h"
+#include "stack.h"
+#include "skip.h"
+#include "record.h"
 
 /* readline include files */
 #include "readline/readline.h"
@@ -108,17 +111,21 @@ static void mention (struct breakpoint *);
 
 static struct breakpoint *set_raw_breakpoint_without_location (struct gdbarch *,
                                                               enum bptype,
-                                                              struct breakpoint_ops *);
+                                                              const struct breakpoint_ops *);
+static struct bp_location *add_location_to_breakpoint (struct breakpoint *,
+                                                      const struct symtab_and_line *);
+
 /* This function is used in gdbtk sources and thus can not be made
    static.  */
 struct breakpoint *set_raw_breakpoint (struct gdbarch *gdbarch,
                                       struct symtab_and_line,
-                                      enum bptype, struct breakpoint_ops *);
+                                      enum bptype,
+                                      const struct breakpoint_ops *);
 
 static struct breakpoint *
   momentary_breakpoint_from_master (struct breakpoint *orig,
                                    enum bptype type,
-                                   struct breakpoint_ops *ops);
+                                   const struct breakpoint_ops *ops);
 
 static void breakpoint_adjustment_warning (CORE_ADDR, CORE_ADDR, int, int);
 
@@ -175,7 +182,11 @@ static void maintenance_info_breakpoints (char *, int);
 
 static int hw_breakpoint_used_count (void);
 
-static int hw_watchpoint_used_count (enum bptype, int *);
+static int hw_watchpoint_use_count (struct breakpoint *);
+
+static int hw_watchpoint_used_count_others (struct breakpoint *except,
+                                           enum bptype type,
+                                           int *other_type_used);
 
 static void hbreak_command (char *, int);
 
@@ -213,8 +224,6 @@ static void update_global_location_list_nothrow (int);
 
 static int is_hardware_watchpoint (const struct breakpoint *bpt);
 
-static int is_watchpoint (const struct breakpoint *bpt);
-
 static void insert_breakpoint_locations (void);
 
 static int syscall_catchpoint_p (struct breakpoint *b);
@@ -236,10 +245,25 @@ static int is_masked_watchpoint (const struct breakpoint *b);
 #define is_marker_spec(s)                                              \
   (s != NULL && strncmp (s, "-m", 2) == 0 && ((s)[2] == ' ' || (s)[2] == '\t'))
 
-/* Forward declarations.  */
+/* The abstract base class all breakpoint_ops structures inherit
+   from.  */
+static struct breakpoint_ops base_breakpoint_ops;
+
+/* The breakpoint_ops structure to be inherited by all breakpoint_ops
+   that are implemented on top of software or hardware breakpoints
+   (user breakpoints, internal and momentary breakpoints, etc.).  */
+static struct breakpoint_ops bkpt_base_breakpoint_ops;
+
+/* Internal breakpoints class type.  */
 static struct breakpoint_ops internal_breakpoint_ops;
+
+/* Momentary breakpoints class type.  */
 static struct breakpoint_ops momentary_breakpoint_ops;
 
+/* The breakpoint_ops structure to be used in regular user created
+   breakpoints.  */
+struct breakpoint_ops bkpt_breakpoint_ops;
+
 /* A reference-counted struct command_line.  This lets multiple
    breakpoints share a single command list.  */
 struct counted_command_line
@@ -354,8 +378,9 @@ show_always_inserted_mode (struct ui_file *file, int from_tty,
 int
 breakpoints_always_inserted_mode (void)
 {
-  return (always_inserted_mode == always_inserted_on
-         || (always_inserted_mode == always_inserted_auto && non_stop));
+  return ((always_inserted_mode == always_inserted_on
+          || (always_inserted_mode == always_inserted_auto && non_stop))
+         && !RECORD_IS_USED);
 }
 
 void _initialize_breakpoint (void);
@@ -554,19 +579,6 @@ make_cleanup_decref_counted_command_line (struct counted_command_line **cmdp)
   return make_cleanup (do_cleanup_counted_command_line, cmdp);
 }
 
-/* Default address, symtab and line to put a breakpoint at
-   for "break" command with no arg.
-   If default_breakpoint_valid is zero, the other three are
-   not valid, and "break" with no arg is an error.
-
-   This set by print_stack_frame, which calls set_default_breakpoint.  */
-
-int default_breakpoint_valid;
-CORE_ADDR default_breakpoint_address;
-struct symtab *default_breakpoint_symtab;
-int default_breakpoint_line;
-struct program_space *default_breakpoint_pspace;
-
 \f
 /* Return the breakpoint with the specified number, or NULL
    if the number does not refer to an existing breakpoint.  */
@@ -589,17 +601,26 @@ void
 set_breakpoint_condition (struct breakpoint *b, char *exp,
                          int from_tty)
 {
-  struct bp_location *loc = b->loc;
+  xfree (b->cond_string);
+  b->cond_string = NULL;
 
-  for (; loc; loc = loc->next)
+  if (is_watchpoint (b))
+    {
+      struct watchpoint *w = (struct watchpoint *) b;
+
+      xfree (w->cond_exp);
+      w->cond_exp = NULL;
+    }
+  else
     {
-      xfree (loc->cond);
-      loc->cond = NULL;
+      struct bp_location *loc;
+
+      for (loc = b->loc; loc; loc = loc->next)
+       {
+         xfree (loc->cond);
+         loc->cond = NULL;
+       }
     }
-  xfree (b->cond_string);
-  b->cond_string = NULL;
-  xfree (b->cond_exp);
-  b->cond_exp = NULL;
 
   if (*exp == 0)
     {
@@ -617,15 +638,19 @@ set_breakpoint_condition (struct breakpoint *b, char *exp,
 
       if (is_watchpoint (b))
        {
+         struct watchpoint *w = (struct watchpoint *) b;
+
          innermost_block = NULL;
          arg = exp;
-         b->cond_exp = parse_exp_1 (&arg, 0, 0);
+         w->cond_exp = parse_exp_1 (&arg, 0, 0);
          if (*arg)
            error (_("Junk at end of expression"));
-         b->cond_exp_valid_block = innermost_block;
+         w->cond_exp_valid_block = innermost_block;
        }
       else
        {
+         struct bp_location *loc;
+
          for (loc = b->loc; loc; loc = loc->next)
            {
              arg = exp;
@@ -708,14 +733,20 @@ check_no_tracepoint_commands (struct command_line *commands)
 
 /* Encapsulate tests for different types of tracepoints.  */
 
+static int
+is_tracepoint_type (enum bptype type)
+{
+  return (type == bp_tracepoint
+         || type == bp_fast_tracepoint
+         || type == bp_static_tracepoint);
+}
+
 int
 is_tracepoint (const struct breakpoint *b)
 {
-  return (b->type == bp_tracepoint
-         || b->type == bp_fast_tracepoint
-         || b->type == bp_static_tracepoint);
+  return is_tracepoint_type (b->type);
 }
-  
+
 /* A helper function that validates that COMMANDS are valid for a
    breakpoint.  This function will throw an exception if a problem is
    found.  */
@@ -1018,7 +1049,9 @@ bp_location_has_shadow (struct bp_location *bl)
      bl->address + bp_location_shadow_len_after_address_max <= memaddr  */
 
 void
-breakpoint_restore_shadows (gdb_byte *buf, ULONGEST memaddr, LONGEST len)
+breakpoint_xfer_memory (gdb_byte *readbuf, gdb_byte *writebuf,
+                       const gdb_byte *writebuf_org,
+                       ULONGEST memaddr, LONGEST len)
 {
   /* Left boundary, right boundary and median element of our binary
      search.  */
@@ -1130,8 +1163,32 @@ breakpoint_restore_shadows (gdb_byte *buf, ULONGEST memaddr, LONGEST len)
        bp_size -= (bp_addr + bp_size) - (memaddr + len);
       }
 
-    memcpy (buf + bp_addr - memaddr,
-           bl->target_info.shadow_contents + bptoffset, bp_size);
+    if (readbuf != NULL)
+      {
+       /* Update the read buffer with this inserted breakpoint's
+          shadow.  */
+       memcpy (readbuf + bp_addr - memaddr,
+               bl->target_info.shadow_contents + bptoffset, bp_size);
+      }
+    else
+      {
+       struct gdbarch *gdbarch = bl->gdbarch;
+       const unsigned char *bp;
+       CORE_ADDR placed_address = bl->target_info.placed_address;
+       unsigned placed_size = bl->target_info.placed_size;
+
+       /* Update the shadow with what we want to write to memory.  */
+       memcpy (bl->target_info.shadow_contents + bptoffset,
+               writebuf_org + bp_addr - memaddr, bp_size);
+
+       /* Determine appropriate breakpoint contents and size for this
+          address.  */
+       bp = gdbarch_breakpoint_from_pc (gdbarch, &placed_address, &placed_size);
+
+       /* Update the final write buffer with this inserted
+          breakpoint's INSN.  */
+       memcpy (writebuf + bp_addr - memaddr, bp + bptoffset, bp_size);
+      }
   }
 }
 \f
@@ -1149,25 +1206,24 @@ is_hardware_watchpoint (const struct breakpoint *bpt)
 /* Return true if BPT is of any watchpoint kind, hardware or
    software.  */
 
-static int
+int
 is_watchpoint (const struct breakpoint *bpt)
 {
   return (is_hardware_watchpoint (bpt)
          || bpt->type == bp_watchpoint);
 }
 
-/* Assuming that B is a watchpoint: returns true if the current thread
-   and its running state are safe to evaluate or update watchpoint B.
-   Watchpoints on local expressions need to be evaluated in the
-   context of the thread that was current when the watchpoint was
-   created, and, that thread needs to be stopped to be able to select
-   the correct frame context.  Watchpoints on global expressions can
-   be evaluated on any thread, and in any state.  It is presently left
-   to the target allowing memory accesses when threads are
-   running.  */
+/* Returns true if the current thread and its running state are safe
+   to evaluate or update watchpoint B.  Watchpoints on local
+   expressions need to be evaluated in the context of the thread that
+   was current when the watchpoint was created, and, that thread needs
+   to be stopped to be able to select the correct frame context.
+   Watchpoints on global expressions can be evaluated on any thread,
+   and in any state.  It is presently left to the target allowing
+   memory accesses when threads are running.  */
 
 static int
-watchpoint_in_thread_scope (struct breakpoint *b)
+watchpoint_in_thread_scope (struct watchpoint *b)
 {
   return (ptid_equal (b->watchpoint_thread, null_ptid)
          || (ptid_equal (inferior_ptid, b->watchpoint_thread)
@@ -1178,9 +1234,9 @@ watchpoint_in_thread_scope (struct breakpoint *b)
    associated bp_watchpoint_scope breakpoint.  */
 
 static void
-watchpoint_del_at_next_stop (struct breakpoint *b)
+watchpoint_del_at_next_stop (struct watchpoint *w)
 {
-  gdb_assert (is_watchpoint (b));
+  struct breakpoint *b = &w->base;
 
   if (b->related_breakpoint != b)
     {
@@ -1246,21 +1302,19 @@ watchpoint_del_at_next_stop (struct breakpoint *b)
    watchpoint removal from inferior.  */
 
 static void
-update_watchpoint (struct breakpoint *b, int reparse)
+update_watchpoint (struct watchpoint *b, int reparse)
 {
   int within_current_scope;
   struct frame_id saved_frame_id;
   int frame_saved;
 
-  gdb_assert (is_watchpoint (b));
-
   /* If this is a local watchpoint, we only want to check if the
      watchpoint frame is in scope if the current thread is the thread
      that was used to create the watchpoint.  */
   if (!watchpoint_in_thread_scope (b))
     return;
 
-  if (b->disposition == disp_del_at_next_stop)
+  if (b->base.disposition == disp_del_at_next_stop)
     return;
  
   frame_saved = 0;
@@ -1297,7 +1351,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
   /* We don't free locations.  They are stored in the bp_location array
      and update_global_location_list will eventually delete them and
      remove breakpoints if needed.  */
-  b->loc = NULL;
+  b->base.loc = NULL;
 
   if (within_current_scope && reparse)
     {
@@ -1321,7 +1375,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
       /* Note that unlike with breakpoints, the watchpoint's condition
         expression is stored in the breakpoint object, not in the
         locations (re)created below.  */
-      if (b->cond_string != NULL)
+      if (b->base.cond_string != NULL)
        {
          if (b->cond_exp != NULL)
            {
@@ -1329,7 +1383,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
              b->cond_exp = NULL;
            }
 
-         s = b->cond_string;
+         s = b->base.cond_string;
          b->cond_exp = parse_exp_1 (&s, b->cond_exp_valid_block, 0);
        }
     }
@@ -1359,7 +1413,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
         happens, the code that reports it updates b->val directly.
         We don't keep track of the memory value for masked
         watchpoints.  */
-      if (!b->val_valid && !is_masked_watchpoint (b))
+      if (!b->val_valid && !is_masked_watchpoint (&b->base))
        {
          b->val = v;
          b->val_valid = 1;
@@ -1394,13 +1448,13 @@ update_watchpoint (struct breakpoint *b, int reparse)
                  addr = value_address (v);
                  len = TYPE_LENGTH (value_type (v));
                  type = hw_write;
-                 if (b->type == bp_read_watchpoint)
+                 if (b->base.type == bp_read_watchpoint)
                    type = hw_read;
-                 else if (b->type == bp_access_watchpoint)
+                 else if (b->base.type == bp_access_watchpoint)
                    type = hw_access;
-                 
-                 loc = allocate_bp_location (b);
-                 for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
+
+                 loc = allocate_bp_location (&b->base);
+                 for (tmp = &(b->base.loc); *tmp != NULL; tmp = &((*tmp)->next))
                    ;
                  *tmp = loc;
                  loc->gdbarch = get_type_arch (value_type (v));
@@ -1428,6 +1482,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
          if (reg_cnt)
            {
              int i, target_resources_ok, other_type_used;
+             enum bptype type;
 
              /* Use an exact watchpoint when there's only one memory region to be
                 watched, and only one debug register is needed to watch it.  */
@@ -1436,19 +1491,32 @@ update_watchpoint (struct breakpoint *b, int reparse)
              /* We need to determine how many resources are already
                 used for all other hardware watchpoints plus this one
                 to see if we still have enough resources to also fit
-                this watchpoint in as well.  To guarantee the
-                hw_watchpoint_used_count call below counts this
-                watchpoint, make sure that it is marked as a hardware
-                watchpoint.  */
-             if (b->type == bp_watchpoint)
-               b->type = bp_hardware_watchpoint;
-
-             i = hw_watchpoint_used_count (b->type, &other_type_used);
-             target_resources_ok = target_can_use_hardware_watchpoint
-                   (b->type, i, other_type_used);
+                this watchpoint in as well.  */
+
+             /* If this is a software watchpoint, we try to turn it
+                to a hardware one -- count resources as if B was of
+                hardware watchpoint type.  */
+             type = b->base.type;
+             if (type == bp_watchpoint)
+               type = bp_hardware_watchpoint;
+
+             /* This watchpoint may or may not have been placed on
+                the list yet at this point (it won't be in the list
+                if we're trying to create it for the first time,
+                through watch_command), so always account for it
+                manually.  */
+
+             /* Count resources used by all watchpoints except B.  */
+             i = hw_watchpoint_used_count_others (&b->base, type, &other_type_used);
+
+             /* Add in the resources needed for B.  */
+             i += hw_watchpoint_use_count (&b->base);
+
+             target_resources_ok
+               = target_can_use_hardware_watchpoint (type, i, other_type_used);
              if (target_resources_ok <= 0)
                {
-                 int sw_mode = b->ops->works_in_software_mode (b);
+                 int sw_mode = b->base.ops->works_in_software_mode (&b->base);
 
                  if (target_resources_ok == 0 && !sw_mode)
                    error (_("Target does not support this type of "
@@ -1456,19 +1524,28 @@ update_watchpoint (struct breakpoint *b, int reparse)
                  else if (target_resources_ok < 0 && !sw_mode)
                    error (_("There are not enough available hardware "
                             "resources for this watchpoint."));
-                 else
-                   b->type = bp_watchpoint;
+
+                 /* Downgrade to software watchpoint.  */
+                 b->base.type = bp_watchpoint;
+               }
+             else
+               {
+                 /* If this was a software watchpoint, we've just
+                    found we have enough resources to turn it to a
+                    hardware watchpoint.  Otherwise, this is a
+                    nop.  */
+                 b->base.type = type;
                }
            }
-         else if (!b->ops->works_in_software_mode (b))
+         else if (!b->base.ops->works_in_software_mode (&b->base))
            error (_("Expression cannot be implemented with "
                     "read/access watchpoint."));
          else
-           b->type = bp_watchpoint;
+           b->base.type = bp_watchpoint;
 
-         loc_type = (b->type == bp_watchpoint? bp_loc_other
+         loc_type = (b->base.type == bp_watchpoint? bp_loc_other
                      : bp_loc_hardware_watchpoint);
-         for (bl = b->loc; bl; bl = bl->next)
+         for (bl = b->base.loc; bl; bl = bl->next)
            bl->loc_type = loc_type;
        }
 
@@ -1483,13 +1560,14 @@ update_watchpoint (struct breakpoint *b, int reparse)
         above left it without any location set up.  But,
         bpstat_stop_status requires a location to be able to report
         stops, so make sure there's at least a dummy one.  */
-      if (b->type == bp_watchpoint && b->loc == NULL)
+      if (b->base.type == bp_watchpoint && b->base.loc == NULL)
        {
-         b->loc = allocate_bp_location (b);
-         b->loc->pspace = frame_pspace;
-         b->loc->address = -1;
-         b->loc->length = -1;
-         b->loc->watchpoint_type = -1;
+         struct breakpoint *base = &b->base;
+         base->loc = allocate_bp_location (base);
+         base->loc->pspace = frame_pspace;
+         base->loc->address = -1;
+         base->loc->length = -1;
+         base->loc->watchpoint_type = -1;
        }
     }
   else if (!within_current_scope)
@@ -1497,7 +1575,7 @@ update_watchpoint (struct breakpoint *b, int reparse)
       printf_filtered (_("\
 Watchpoint %d deleted because the program has left the block\n\
 in which its expression is valid.\n"),
-                      b->number);
+                      b->base.number);
       watchpoint_del_at_next_stop (b);
     }
 
@@ -1508,7 +1586,10 @@ in which its expression is valid.\n"),
 
 
 /* Returns 1 iff breakpoint location should be
-   inserted in the inferior.  */
+   inserted in the inferior.  We don't differentiate the type of BL's owner
+   (breakpoint vs. tracepoint), although insert_location in tracepoint's
+   breakpoint_ops is not defined, because in insert_bp_location,
+   tracepoint's insert_location will not be called.  */
 static int
 should_be_inserted (struct bp_location *bl)
 {
@@ -1521,6 +1602,9 @@ should_be_inserted (struct bp_location *bl)
   if (!bl->enabled || bl->shlib_disabled || bl->duplicate)
     return 0;
 
+  if (user_breakpoint_p (bl->owner) && bl->pspace->executing_startup)
+    return 0;
+
   /* This is set for example, when we're attached to the parent of a
      vfork, and have detached from the child.  The child is running
      free, and we expect it to do an exec or exit, at which point the
@@ -1532,17 +1616,29 @@ should_be_inserted (struct bp_location *bl)
   if (bl->pspace->breakpoints_not_allowed)
     return 0;
 
-  /* Tracepoints are inserted by the target at a time of its choosing,
-     not by us.  */
-  if (is_tracepoint (bl->owner))
-    return 0;
-
   return 1;
 }
 
+/* Same as should_be_inserted but does the check assuming
+   that the location is not duplicated.  */
+
+static int
+unduplicated_should_be_inserted (struct bp_location *bl)
+{
+  int result;
+  const int save_duplicate = bl->duplicate;
+
+  bl->duplicate = 0;
+  result = should_be_inserted (bl);
+  bl->duplicate = save_duplicate;
+  return result;
+}
+
 /* Insert a low-level "breakpoint" of some type.  BL is the breakpoint
    location.  Any error messages are printed to TMP_ERROR_STREAM; and
    DISABLED_BREAKS, and HW_BREAKPOINT_ERROR are used to report problems.
+   Returns 0 for success, 1 if the bp_location type is not supported or
+   -1 for failure.
 
    NOTE drow/2003-09-09: This routine could be broken down to an
    object-style method for each breakpoint or catchpoint type.  */
@@ -1856,7 +1952,11 @@ insert_breakpoints (void)
 
   ALL_BREAKPOINTS (bpt)
     if (is_hardware_watchpoint (bpt))
-      update_watchpoint (bpt, 0 /* don't reparse.  */);
+      {
+       struct watchpoint *w = (struct watchpoint *) bpt;
+
+       update_watchpoint (w, 0 /* don't reparse.  */);
+      }
 
   update_global_location_list (1);
 
@@ -1867,17 +1967,14 @@ insert_breakpoints (void)
     insert_breakpoint_locations ();
 }
 
-/* insert_breakpoints is used when starting or continuing the program.
-   remove_breakpoints is used when the program stops.
-   Both return zero if successful,
-   or an `errno' value if could not write the inferior.  */
+/* Used when starting or continuing the program.  */
 
 static void
 insert_breakpoint_locations (void)
 {
   struct breakpoint *bpt;
   struct bp_location *bl, **blp_tmp;
-  int error = 0;
+  int error_flag = 0;
   int val = 0;
   int disabled_breaks = 0;
   int hw_breakpoint_error = 0;
@@ -1916,7 +2013,7 @@ insert_breakpoint_locations (void)
       val = insert_bp_location (bl, tmp_error_stream, &disabled_breaks,
                                    &hw_breakpoint_error);
       if (val)
-       error = val;
+       error_flag = val;
     }
 
   /* If we failed to insert all locations of a watchpoint, remove
@@ -1951,11 +2048,11 @@ insert_breakpoint_locations (void)
          fprintf_unfiltered (tmp_error_stream,
                              "Could not insert hardware watchpoint %d.\n", 
                              bpt->number);
-         error = -1;
+         error_flag = -1;
        }
     }
 
-  if (error)
+  if (error_flag)
     {
       /* If a hardware breakpoint or watchpoint was inserted, add a
          message about possibly exhausted resources.  */
@@ -1972,6 +2069,10 @@ You may have requested too many hardware breakpoints/watchpoints.\n");
   do_cleanups (cleanups);
 }
 
+/* Used when the program stops.
+   Returns zero if successful, or non-zero if there was a problem
+   removing a breakpoint location.  */
+
 int
 remove_breakpoints (void)
 {
@@ -1980,7 +2081,7 @@ remove_breakpoints (void)
 
   ALL_BP_LOCATIONS (bl, blp_tmp)
   {
-    if (bl->inserted)
+    if (bl->inserted && !is_tracepoint (bl->owner))
       val |= remove_breakpoint (bl, mark_uninserted);
   }
   return val;
@@ -2076,7 +2177,7 @@ set_breakpoint_number (int internal, struct breakpoint *b)
 static struct breakpoint *
 create_internal_breakpoint (struct gdbarch *gdbarch,
                            CORE_ADDR address, enum bptype type,
-                           struct breakpoint_ops *ops)
+                           const struct breakpoint_ops *ops)
 {
   struct symtab_and_line sal;
   struct breakpoint *b;
@@ -2747,19 +2848,22 @@ breakpoint_init_inferior (enum inf_context context)
       case bp_hardware_watchpoint:
       case bp_read_watchpoint:
       case bp_access_watchpoint:
+       {
+         struct watchpoint *w = (struct watchpoint *) b;
 
-       /* Likewise for watchpoints on local expressions.  */
-       if (b->exp_valid_block != NULL)
-         delete_breakpoint (b);
-       else if (context == inf_starting) 
-         {
-           /* Reset val field to force reread of starting value in
-              insert_breakpoints.  */
-           if (b->val)
-             value_free (b->val);
-           b->val = NULL;
-           b->val_valid = 0;
+         /* Likewise for watchpoints on local expressions.  */
+         if (w->exp_valid_block != NULL)
+           delete_breakpoint (b);
+         else if (context == inf_starting)
+           {
+             /* Reset val field to force reread of starting value in
+                insert_breakpoints.  */
+             if (w->val)
+               value_free (w->val);
+             w->val = NULL;
+             w->val_valid = 0;
          }
+       }
        break;
       default:
        break;
@@ -3130,15 +3234,25 @@ bpstat_num (bpstat *bsp, int *num)
   return 1;
 }
 
-/* Modify BS so that the actions will not be performed.  */
+/* See breakpoint.h.  */
 
 void
-bpstat_clear_actions (bpstat bs)
+bpstat_clear_actions (void)
 {
-  for (; bs != NULL; bs = bs->next)
+  struct thread_info *tp;
+  bpstat bs;
+
+  if (ptid_equal (inferior_ptid, null_ptid))
+    return;
+
+  tp = find_thread_ptid (inferior_ptid);
+  if (tp == NULL)
+    return;
+
+  for (bs = tp->control.stop_bpstat; bs != NULL; bs = bs->next)
     {
       decref_counted_command_line (&bs->commands);
-      bs->commands_left = NULL;
+
       if (bs->old_val != NULL)
        {
          value_free (bs->old_val);
@@ -3175,6 +3289,16 @@ cleanup_executing_breakpoints (void *ignore)
   executing_breakpoint_commands = 0;
 }
 
+/* Return non-zero iff CMD as the first line of a command sequence is `silent'
+   or its equivalent.  */
+
+static int
+command_line_is_silent (struct command_line *cmd)
+{
+  return cmd && (strcmp ("silent", cmd->line) == 0
+                || (xdb_commands && strcmp ("Q", cmd->line) == 0));
+}
+
 /* Execute all the commands associated with all the breakpoints at
    this location.  Any of these commands could cause the process to
    proceed beyond this point, etc.  We look out for such changes by
@@ -3223,10 +3347,13 @@ bpstat_do_actions_1 (bpstat *bsp)
          the tree when we're done.  */
       ccmd = bs->commands;
       bs->commands = NULL;
-      this_cmd_tree_chain
-       = make_cleanup_decref_counted_command_line (&ccmd);
-      cmd = bs->commands_left;
-      bs->commands_left = NULL;
+      this_cmd_tree_chain = make_cleanup_decref_counted_command_line (&ccmd);
+      cmd = ccmd ? ccmd->commands : NULL;
+      if (command_line_is_silent (cmd))
+       {
+         /* The action has been already done by bpstat_stop_status.  */
+         cmd = cmd->next;
+       }
 
       while (cmd != NULL)
        {
@@ -3273,6 +3400,8 @@ bpstat_do_actions_1 (bpstat *bsp)
 void
 bpstat_do_actions (void)
 {
+  struct cleanup *cleanup_if_error = make_bpstat_clear_actions_cleanup ();
+
   /* Do any commands attached to breakpoint we are stopped at.  */
   while (!ptid_equal (inferior_ptid, null_ptid)
         && target_has_execution
@@ -3284,6 +3413,8 @@ bpstat_do_actions (void)
        indicate the inferior was not resumed.  */
     if (!bpstat_do_actions_1 (&inferior_thread ()->control.stop_bpstat))
       break;
+
+  discard_cleanups (cleanup_if_error);
 }
 
 /* Print out the (old or new) value associated with a watchpoint.  */
@@ -3346,7 +3477,8 @@ print_bp_stop_message (bpstat bs)
 
 /* Print a message indicating what happened.  This is called from
    normal_stop().  The input to this routine is the head of the bpstat
-   list - a list of the eventpoints that caused this stop.  This
+   list - a list of the eventpoints that caused this stop.  KIND is
+   the target_waitkind for the stopping event.  This
    routine calls the generic print routine for printing a message
    about reasons for stopping.  This will print (for example) the
    "Breakpoint n," part of the output.  The return value of this
@@ -3365,7 +3497,7 @@ print_bp_stop_message (bpstat bs)
    further info to be printed.  */
 
 enum print_stop_action
-bpstat_print (bpstat bs)
+bpstat_print (bpstat bs, int kind)
 {
   int val;
 
@@ -3382,6 +3514,18 @@ bpstat_print (bpstat bs)
        return val;
     }
 
+  /* If we had hit a shared library event breakpoint,
+     print_bp_stop_message would print out this message.  If we hit an
+     OS-level shared library event, do the same thing.  */
+  if (kind == TARGET_WAITKIND_LOADED)
+    {
+      ui_out_text (current_uiout, _("Stopped due to shared library event\n"));
+      if (ui_out_is_mi_like_p (current_uiout))
+       ui_out_field_string (current_uiout, "reason",
+                            async_reason_lookup (EXEC_ASYNC_SOLIB_EVENT));
+      return PRINT_NOTHING;
+    }
+
   /* We reached the end of the chain, or we got a null BS to start
      with and nothing was printed.  */
   return PRINT_UNKNOWN;
@@ -3418,7 +3562,6 @@ bpstat_alloc (struct bp_location *bl, bpstat **bs_link_pointer)
   incref_bp_location (bl);
   /* If the condition is false, etc., don't do the commands.  */
   bs->commands = NULL;
-  bs->commands_left = NULL;
   bs->old_val = NULL;
   bs->print_it = print_it_normal;
   return bs;
@@ -3440,7 +3583,11 @@ watchpoints_triggered (struct target_waitstatus *ws)
         as not triggered.  */
       ALL_BREAKPOINTS (b)
        if (is_hardware_watchpoint (b))
-         b->watchpoint_triggered = watch_triggered_no;
+         {
+           struct watchpoint *w = (struct watchpoint *) b;
+
+           w->watchpoint_triggered = watch_triggered_no;
+         }
 
       return 0;
     }
@@ -3451,7 +3598,11 @@ watchpoints_triggered (struct target_waitstatus *ws)
         Mark all watchpoints as unknown.  */
       ALL_BREAKPOINTS (b)
        if (is_hardware_watchpoint (b))
-         b->watchpoint_triggered = watch_triggered_unknown;
+         {
+           struct watchpoint *w = (struct watchpoint *) b;
+
+           w->watchpoint_triggered = watch_triggered_unknown;
+         }
 
       return stopped_by_watchpoint;
     }
@@ -3463,19 +3614,20 @@ watchpoints_triggered (struct target_waitstatus *ws)
   ALL_BREAKPOINTS (b)
     if (is_hardware_watchpoint (b))
       {
+       struct watchpoint *w = (struct watchpoint *) b;
        struct bp_location *loc;
 
-       b->watchpoint_triggered = watch_triggered_no;
+       w->watchpoint_triggered = watch_triggered_no;
        for (loc = b->loc; loc; loc = loc->next)
          {
-           if (is_masked_watchpoint (loc->owner))
+           if (is_masked_watchpoint (b))
              {
-               CORE_ADDR newaddr = addr & loc->owner->hw_wp_mask;
-               CORE_ADDR start = loc->address & loc->owner->hw_wp_mask;
+               CORE_ADDR newaddr = addr & w->hw_wp_mask;
+               CORE_ADDR start = loc->address & w->hw_wp_mask;
 
                if (newaddr == start)
                  {
-                   b->watchpoint_triggered = watch_triggered_yes;
+                   w->watchpoint_triggered = watch_triggered_yes;
                    break;
                  }
              }
@@ -3484,7 +3636,7 @@ watchpoints_triggered (struct target_waitstatus *ws)
                                                         addr, loc->address,
                                                         loc->length))
              {
-               b->watchpoint_triggered = watch_triggered_yes;
+               w->watchpoint_triggered = watch_triggered_yes;
                break;
              }
          }
@@ -3517,15 +3669,13 @@ static int
 watchpoint_check (void *p)
 {
   bpstat bs = (bpstat) p;
-  struct breakpoint *b;
+  struct watchpoint *b;
   struct frame_info *fr;
   int within_current_scope;
 
   /* BS is built from an existing struct breakpoint.  */
   gdb_assert (bs->breakpoint_at != NULL);
-  b = bs->breakpoint_at;
-
-  gdb_assert (is_watchpoint (b));
+  b = (struct watchpoint *) bs->breakpoint_at;
 
   /* If this is a local watchpoint, we only want to check if the
      watchpoint frame is in scope if the current thread is the thread
@@ -3587,7 +3737,7 @@ watchpoint_check (void *p)
       struct value *mark;
       struct value *new_val;
 
-      if (is_masked_watchpoint (b))
+      if (is_masked_watchpoint (&b->base))
        /* Since we don't know the exact trigger address (from
           stopped_data_address), just tell the user we've triggered
           a mask watchpoint.  */
@@ -3622,6 +3772,8 @@ watchpoint_check (void *p)
     }
   else
     {
+      struct ui_out *uiout = current_uiout;
+
       /* This seems like the only logical thing to do because
          if we temporarily ignored the watchpoint, then when
          we reenter the block in which it is valid it contains
@@ -3639,13 +3791,13 @@ watchpoint_check (void *p)
        ui_out_field_string
          (uiout, "reason", async_reason_lookup (EXEC_ASYNC_WATCHPOINT_SCOPE));
       ui_out_text (uiout, "\nWatchpoint ");
-      ui_out_field_int (uiout, "wpnum", b->number);
+      ui_out_field_int (uiout, "wpnum", b->base.number);
       ui_out_text (uiout,
                   " deleted because the program has left the block in\n\
 which its expression is valid.\n");     
 
       /* Make sure the watchpoint's commands aren't executed.  */
-      decref_counted_command_line (&b->commands);
+      decref_counted_command_line (&b->base.commands);
       watchpoint_del_at_next_stop (b);
 
       return WP_DELETED;
@@ -3668,26 +3820,25 @@ bpstat_check_location (const struct bp_location *bl,
   return b->ops->breakpoint_hit (bl, aspace, bp_addr);
 }
 
-/* If BS refers to a watchpoint, determine if the watched values
-   has actually changed, and we should stop.  If not, set BS->stop
-   to 0.  */
+/* Determine if the watched values have actually changed, and we
+   should stop.  If not, set BS->stop to 0.  */
+
 static void
 bpstat_check_watchpoint (bpstat bs)
 {
   const struct bp_location *bl;
-  struct breakpoint *b;
+  struct watchpoint *b;
 
   /* BS is built for existing struct breakpoint.  */
   bl = bs->bp_location_at;
   gdb_assert (bl != NULL);
-  b = bs->breakpoint_at;
+  b = (struct watchpoint *) bs->breakpoint_at;
   gdb_assert (b != NULL);
 
-  if (is_watchpoint (b))
     {
       int must_check_value = 0;
       
-      if (b->type == bp_watchpoint)
+      if (b->base.type == bp_watchpoint)
        /* For a software watchpoint, we must always check the
           watched value.  */
        must_check_value = 1;
@@ -3697,18 +3848,18 @@ bpstat_check_watchpoint (bpstat bs)
           this watchpoint.  */
        must_check_value = 1;
       else if (b->watchpoint_triggered == watch_triggered_unknown
-              && b->type == bp_hardware_watchpoint)
+              && b->base.type == bp_hardware_watchpoint)
        /* We were stopped by a hardware watchpoint, but the target could
           not report the data address.  We must check the watchpoint's
           value.  Access and read watchpoints are out of luck; without
           a data address, we can't figure it out.  */
        must_check_value = 1;
-      
+
       if (must_check_value)
        {
          char *message
            = xstrprintf ("Error evaluating expression for watchpoint %d\n",
-                         b->number);
+                         b->base.number);
          struct cleanup *cleanups = make_cleanup (xfree, message);
          int e = catch_errors (watchpoint_check, bs, message,
                                RETURN_MASK_ALL);
@@ -3725,7 +3876,7 @@ bpstat_check_watchpoint (bpstat bs)
              bs->stop = 0;
              break;
            case WP_VALUE_CHANGED:
-             if (b->type == bp_read_watchpoint)
+             if (b->base.type == bp_read_watchpoint)
                {
                  /* There are two cases to consider here:
 
@@ -3768,13 +3919,18 @@ bpstat_check_watchpoint (bpstat bs)
                      struct breakpoint *other_b;
 
                      ALL_BREAKPOINTS (other_b)
-                       if ((other_b->type == bp_hardware_watchpoint
-                            || other_b->type == bp_access_watchpoint)
-                           && (other_b->watchpoint_triggered
-                               == watch_triggered_yes))
+                       if (other_b->type == bp_hardware_watchpoint
+                           || other_b->type == bp_access_watchpoint)
                          {
-                           other_write_watchpoint = 1;
-                           break;
+                           struct watchpoint *other_w =
+                             (struct watchpoint *) other_b;
+
+                           if (other_w->watchpoint_triggered
+                               == watch_triggered_yes)
+                             {
+                               other_write_watchpoint = 1;
+                               break;
+                             }
                          }
                    }
 
@@ -3791,8 +3947,8 @@ bpstat_check_watchpoint (bpstat bs)
                }
              break;
            case WP_VALUE_NOT_CHANGED:
-             if (b->type == bp_hardware_watchpoint
-                 || b->type == bp_watchpoint)
+             if (b->base.type == bp_hardware_watchpoint
+                 || b->base.type == bp_watchpoint)
                {
                  /* Don't stop: write watchpoints shouldn't fire if
                     the value hasn't changed.  */
@@ -3805,7 +3961,7 @@ bpstat_check_watchpoint (bpstat bs)
              /* Can't happen.  */
            case 0:
              /* Error from catch_errors.  */
-             printf_filtered (_("Watchpoint %d deleted.\n"), b->number);
+             printf_filtered (_("Watchpoint %d deleted.\n"), b->base.number);
              watchpoint_del_at_next_stop (b);
              /* We've already printed what needs to be printed.  */
              bs->print_it = print_it_done;
@@ -3856,13 +4012,18 @@ bpstat_check_breakpoint_conditions (bpstat bs, ptid_t ptid)
        bs->stop = gdbpy_should_stop (b->py_bp_object);
 
       if (is_watchpoint (b))
-       cond = b->cond_exp;
+       {
+         struct watchpoint *w = (struct watchpoint *) b;
+
+         cond = w->cond_exp;
+       }
       else
        cond = bl->cond;
 
       if (cond && b->disposition != disp_del_at_next_stop)
        {
          int within_current_scope = 1;
+         struct watchpoint * w;
 
          /* We use value_mark and value_free_to_mark because it could
             be a long time before we return to the command level and
@@ -3871,13 +4032,18 @@ bpstat_check_breakpoint_conditions (bpstat bs, ptid_t ptid)
             function call.  */
          struct value *mark = value_mark ();
 
+         if (is_watchpoint (b))
+           w = (struct watchpoint *) b;
+         else
+           w = NULL;
+
          /* Need to select the frame, with all that implies so that
             the conditions will have the right context.  Because we
             use the frame, we will not see an inlined function's
             variables when we arrive at a breakpoint at the start
             of the inlined function; the current frame will be the
             call site.  */
-         if (!is_watchpoint (b) || b->cond_exp_valid_block == NULL)
+         if (w == NULL || w->cond_exp_valid_block == NULL)
            select_frame (get_current_frame ());
          else
            {
@@ -3897,7 +4063,7 @@ bpstat_check_breakpoint_conditions (bpstat bs, ptid_t ptid)
                 the innermost frame that's executing where it makes
                 sense to evaluate the condition.  It seems
                 intuitive.  */
-             frame = block_innermost_frame (b->cond_exp_valid_block);
+             frame = block_innermost_frame (w->cond_exp_valid_block);
              if (frame != NULL)
                select_frame (frame);
              else
@@ -4019,7 +4185,11 @@ bpstat_stop_status (struct address_space *aspace,
             out-of-scope event.  We'll get to the watchpoint next
             iteration.  */
          if (b->type == bp_watchpoint_scope && b->related_breakpoint != b)
-           b->related_breakpoint->watchpoint_triggered = watch_triggered_yes;
+           {
+             struct watchpoint *w = (struct watchpoint *) b->related_breakpoint;
+
+             w->watchpoint_triggered = watch_triggered_yes;
+           }
        }
     }
 
@@ -4068,16 +4238,9 @@ bpstat_stop_status (struct address_space *aspace,
                bs->print = 0;
              bs->commands = b->commands;
              incref_counted_command_line (bs->commands);
-             bs->commands_left = bs->commands ? bs->commands->commands : NULL;
-             if (bs->commands_left
-                 && (strcmp ("silent", bs->commands_left->line) == 0
-                     || (xdb_commands
-                         && strcmp ("Q",
-                                    bs->commands_left->line) == 0)))
-               {
-                 bs->commands_left = bs->commands_left->next;
-                 bs->print = 0;
-               }
+             if (command_line_is_silent (bs->commands
+                                         ? bs->commands->commands : NULL))
+               bs->print = 0;
            }
 
          /* Print nothing for this entry if we don't stop or don't print.  */
@@ -4097,7 +4260,9 @@ bpstat_stop_status (struct address_space *aspace,
          && bs->breakpoint_at
          && is_hardware_watchpoint (bs->breakpoint_at))
        {
-         update_watchpoint (bs->breakpoint_at, 0 /* don't reparse.  */);
+         struct watchpoint *w = (struct watchpoint *) bs->breakpoint_at;
+
+         update_watchpoint (w, 0 /* don't reparse.  */);
          need_remove_insert = 1;
        }
 
@@ -4415,6 +4580,7 @@ static void
 print_breakpoint_location (struct breakpoint *b,
                           struct bp_location *loc)
 {
+  struct ui_out *uiout = current_uiout;
   struct cleanup *old_chain = save_current_program_space ();
 
   if (loc != NULL && loc->shlib_disabled)
@@ -4425,7 +4591,7 @@ print_breakpoint_location (struct breakpoint *b,
 
   if (b->display_canonical)
     ui_out_field_string (uiout, "what", b->addr_string);
-  else if (b->source_file && loc)
+  else if (loc && loc->source_file)
     {
       struct symbol *sym 
        = find_pc_sect_function (loc->address, loc->section);
@@ -4438,7 +4604,7 @@ print_breakpoint_location (struct breakpoint *b,
          ui_out_wrap_hint (uiout, wrap_indent_at_field (uiout, "what"));
          ui_out_text (uiout, "at ");
        }
-      ui_out_field_string (uiout, "file", b->source_file);
+      ui_out_field_string (uiout, "file", loc->source_file);
       ui_out_text (uiout, ":");
       
       if (ui_out_is_mi_like_p (uiout))
@@ -4450,7 +4616,7 @@ print_breakpoint_location (struct breakpoint *b,
            ui_out_field_string (uiout, "fullname", fullname);
        }
       
-      ui_out_field_int (uiout, "line", b->line_number);
+      ui_out_field_int (uiout, "line", loc->line_number);
     }
   else if (loc)
     {
@@ -4533,6 +4699,7 @@ print_one_breakpoint_location (struct breakpoint *b,
   struct command_line *l;
   static char bpenables[] = "nynny";
 
+  struct ui_out *uiout = current_uiout;
   int header_of_multiple = 0;
   int part_of_multiple = (loc != NULL);
   struct value_print_options opts;
@@ -4611,13 +4778,17 @@ print_one_breakpoint_location (struct breakpoint *b,
       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 (opts.addressprint)
-         ui_out_field_skip (uiout, "addr");
-       annotate_field (5);
-       ui_out_field_string (uiout, "what", b->exp_string);
+       {
+         struct watchpoint *w = (struct watchpoint *) b;
+
+         /* 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 (opts.addressprint)
+           ui_out_field_skip (uiout, "addr");
+         annotate_field (5);
+         ui_out_field_string (uiout, "what", w->exp_string);
+       }
        break;
 
       case bp_breakpoint:
@@ -4752,6 +4923,8 @@ print_one_breakpoint_location (struct breakpoint *b,
       /* FIXME should make an annotation for this.  */
       if (ep_is_catchpoint (b))
        ui_out_text (uiout, "\tcatchpoint");
+      else if (is_tracepoint (b))
+       ui_out_text (uiout, "\ttracepoint");
       else
        ui_out_text (uiout, "\tbreakpoint");
       ui_out_text (uiout, " already hit ");
@@ -4776,6 +4949,18 @@ print_one_breakpoint_location (struct breakpoint *b,
       ui_out_text (uiout, " hits\n");
     }
 
+  if (!part_of_multiple && is_tracepoint (b))
+    {
+      struct tracepoint *tp = (struct tracepoint *) b;
+
+      if (tp->traceframe_usage)
+       {
+         ui_out_text (uiout, "\ttrace buffer usage ");
+         ui_out_field_int (uiout, "traceframe-usage", tp->traceframe_usage);
+         ui_out_text (uiout, " bytes\n");
+       }
+    }
+  
   l = b->commands ? b->commands->commands : NULL;
   if (!part_of_multiple && l)
     {
@@ -4787,20 +4972,29 @@ print_one_breakpoint_location (struct breakpoint *b,
       do_cleanups (script_chain);
     }
 
-  if (!part_of_multiple && b->pass_count)
+  if (is_tracepoint (b))
     {
-      annotate_field (10);
-      ui_out_text (uiout, "\tpass count ");
-      ui_out_field_int (uiout, "pass", b->pass_count);
-      ui_out_text (uiout, " \n");
+      struct tracepoint *t = (struct tracepoint *) b;
+
+      if (!part_of_multiple && t->pass_count)
+       {
+         annotate_field (10);
+         ui_out_text (uiout, "\tpass count ");
+         ui_out_field_int (uiout, "pass", t->pass_count);
+         ui_out_text (uiout, " \n");
+       }
     }
 
   if (ui_out_is_mi_like_p (uiout) && !part_of_multiple)
     {
-      if (b->addr_string)
+      if (is_watchpoint (b))
+       {
+         struct watchpoint *w = (struct watchpoint *) b;
+
+         ui_out_field_string (uiout, "original-location", w->exp_string);
+       }
+      else if (b->addr_string)
        ui_out_field_string (uiout, "original-location", b->addr_string);
-      else if (b->exp_string)
-       ui_out_field_string (uiout, "original-location", b->exp_string);
     }
 }
 
@@ -4810,6 +5004,7 @@ print_one_breakpoint (struct breakpoint *b,
                      int allflag)
 {
   struct cleanup *bkpt_chain;
+  struct ui_out *uiout = current_uiout;
 
   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "bkpt");
 
@@ -4935,6 +5130,7 @@ breakpoint_1 (char *args, int allflag,
   struct value_print_options opts;
   int print_address_bits = 0;
   int print_type_col_width = 14;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
 
@@ -5081,6 +5277,8 @@ breakpoint_1 (char *args, int allflag,
 static void
 default_collect_info (void)
 {
+  struct ui_out *uiout = current_uiout;
+
   /* If it has no value (which is frequently the case), say nothing; a
      message like "No default-collect." gets in user's face when it's
      not wanted.  */
@@ -5106,6 +5304,7 @@ static void
 watchpoints_info (char *args, int from_tty)
 {
   int num_printed = breakpoint_1 (args, 0, is_watchpoint);
+  struct ui_out *uiout = current_uiout;
 
   if (num_printed == 0)
     {
@@ -5141,7 +5340,7 @@ breakpoint_has_pc (struct breakpoint *b,
   return 0;
 }
 
-/* Print a message describing any breakpoints set at PC.  This
+/* Print a message describing any user-breakpoints set at PC.  This
    concerns with logical breakpoints, so we match program spaces, not
    address spaces.  */
 
@@ -5154,7 +5353,8 @@ describe_other_breakpoints (struct gdbarch *gdbarch,
   struct breakpoint *b;
 
   ALL_BREAKPOINTS (b)
-    others += breakpoint_has_pc (b, pspace, pc, section);
+    others += (user_breakpoint_p (b)
+               && breakpoint_has_pc (b, pspace, pc, section));
   if (others > 0)
     {
       if (others == 1)
@@ -5162,7 +5362,7 @@ describe_other_breakpoints (struct gdbarch *gdbarch,
       else /* if (others == ???) */
        printf_filtered (_("Note: breakpoints "));
       ALL_BREAKPOINTS (b)
-       if (breakpoint_has_pc (b, pspace, pc, section))
+       if (user_breakpoint_p (b) && breakpoint_has_pc (b, pspace, pc, section))
          {
            others--;
            printf_filtered ("%d", b->number);
@@ -5172,8 +5372,7 @@ describe_other_breakpoints (struct gdbarch *gdbarch,
              printf_filtered (" (thread %d)", b->thread);
            printf_filtered ("%s%s ",
                             ((b->enable_state == bp_disabled
-                              || b->enable_state == bp_call_disabled
-                              || b->enable_state == bp_startup_disabled)
+                              || b->enable_state == bp_call_disabled)
                              ? " (disabled)"
                              : b->enable_state == bp_permanent 
                              ? " (permanent)"
@@ -5187,20 +5386,6 @@ describe_other_breakpoints (struct gdbarch *gdbarch,
     }
 }
 \f
-/* Set the default place to put a breakpoint
-   for the `break' command with no arguments.  */
-
-void
-set_default_breakpoint (int valid, struct program_space *pspace,
-                       CORE_ADDR addr, struct symtab *symtab,
-                       int line)
-{
-  default_breakpoint_valid = valid;
-  default_breakpoint_pspace = pspace;
-  default_breakpoint_address = addr;
-  default_breakpoint_symtab = symtab;
-  default_breakpoint_line = line;
-}
 
 /* Return true iff it is meaningful to use the address member of
    BPT.  For some breakpoint types, the address member is irrelevant
@@ -5232,9 +5417,12 @@ static int
 watchpoint_locations_match (struct bp_location *loc1, 
                            struct bp_location *loc2)
 {
-  /* Both of them must not be in moribund_locations.  */
-  gdb_assert (loc1->owner != NULL);
-  gdb_assert (loc2->owner != NULL);
+  struct watchpoint *w1 = (struct watchpoint *) loc1->owner;
+  struct watchpoint *w2 = (struct watchpoint *) loc2->owner;
+
+  /* Both of them must exist.  */
+  gdb_assert (w1 != NULL);
+  gdb_assert (w2 != NULL);
 
   /* If the target can evaluate the condition expression in hardware,
      then we we need to insert both watchpoints even if they are at
@@ -5242,16 +5430,16 @@ watchpoint_locations_match (struct bp_location *loc1,
      the condition of whichever watchpoint was inserted evaluates to
      true, not giving a chance for GDB to check the condition of the
      other watchpoint.  */
-  if ((loc1->owner->cond_exp
+  if ((w1->cond_exp
        && target_can_accel_watchpoint_condition (loc1->address, 
                                                 loc1->length,
                                                 loc1->watchpoint_type,
-                                                loc1->owner->cond_exp))
-      || (loc2->owner->cond_exp
+                                                w1->cond_exp))
+      || (w2->cond_exp
          && target_can_accel_watchpoint_condition (loc2->address, 
                                                    loc2->length,
                                                    loc2->watchpoint_type,
-                                                   loc2->owner->cond_exp)))
+                                                   w2->cond_exp)))
     return 0;
 
   /* Note that this checks the owner's type, not the location's.  In
@@ -5313,6 +5501,23 @@ breakpoint_location_address_match (struct bp_location *bl,
                                                 aspace, addr)));
 }
 
+/* If LOC1 and LOC2's owners are not tracepoints, returns false directly.
+   Then, if LOC1 and LOC2 represent the same tracepoint location, returns
+   true, otherwise returns false.  */
+
+static int
+tracepoint_locations_match (struct bp_location *loc1,
+                           struct bp_location *loc2)
+{
+  if (is_tracepoint (loc1->owner) && is_tracepoint (loc2->owner))
+    /* Since tracepoint locations are never duplicated with others', tracepoint
+       locations at the same address of different tracepoints are regarded as
+       different locations.  */
+    return (loc1->address == loc2->address && loc1->owner == loc2->owner);
+  else
+    return 0;
+}
+
 /* Assuming LOC1 and LOC2's types' have meaningful target addresses
    (breakpoint_address_is_meaningful), returns true if LOC1 and LOC2
    represent the same location.  */
@@ -5334,6 +5539,8 @@ breakpoint_locations_match (struct bp_location *loc1,
     return 0;
   else if (hw_point1)
     return watchpoint_locations_match (loc1, loc2);
+  else if (is_tracepoint (loc1->owner) || is_tracepoint (loc2->owner))
+    return tracepoint_locations_match (loc1, loc2);
   else
     /* We compare bp_location.length in order to cover ranged breakpoints.  */
     return (breakpoint_address_match (loc1->pspace->aspace, loc1->address,
@@ -5525,7 +5732,7 @@ static void
 init_raw_breakpoint_without_location (struct breakpoint *b,
                                      struct gdbarch *gdbarch,
                                      enum bptype bptype,
-                                     struct breakpoint_ops *ops)
+                                     const struct breakpoint_ops *ops)
 {
   memset (b, 0, sizeof (*b));
 
@@ -5554,7 +5761,7 @@ init_raw_breakpoint_without_location (struct breakpoint *b,
 static struct breakpoint *
 set_raw_breakpoint_without_location (struct gdbarch *gdbarch,
                                     enum bptype bptype,
-                                    struct breakpoint_ops *ops)
+                                    const struct breakpoint_ops *ops)
 {
   struct breakpoint *b = XNEW (struct breakpoint);
 
@@ -5609,7 +5816,7 @@ set_breakpoint_location_function (struct bp_location *loc, int explicit_loc)
 }
 
 /* Attempt to determine architecture of location identified by SAL.  */
-static struct gdbarch *
+struct gdbarch *
 get_sal_arch (struct symtab_and_line sal)
 {
   if (sal.section)
@@ -5631,48 +5838,20 @@ get_sal_arch (struct symtab_and_line sal)
 static void
 init_raw_breakpoint (struct breakpoint *b, struct gdbarch *gdbarch,
                     struct symtab_and_line sal, enum bptype bptype,
-                    struct breakpoint_ops *ops)
+                    const struct breakpoint_ops *ops)
 {
-  CORE_ADDR adjusted_address;
-  struct gdbarch *loc_gdbarch;
-
   init_raw_breakpoint_without_location (b, gdbarch, bptype, ops);
 
-  loc_gdbarch = get_sal_arch (sal);
-  if (!loc_gdbarch)
-    loc_gdbarch = b->gdbarch;
+  add_location_to_breakpoint (b, &sal);
 
   if (bptype != bp_catchpoint)
     gdb_assert (sal.pspace != NULL);
 
-  /* Adjust the breakpoint's address prior to allocating a location.
-     Once we call allocate_bp_location(), that mostly uninitialized
-     location will be placed on the location chain.  Adjustment of the
-     breakpoint may cause target_read_memory() to be called and we do
-     not want its scan of the location chain to find a breakpoint and
-     location that's only been partially initialized.  */
-  adjusted_address = adjust_breakpoint_address (loc_gdbarch, 
-                                               sal.pc, b->type);
-
-  b->loc = allocate_bp_location (b);
-  b->loc->gdbarch = loc_gdbarch;
-  b->loc->requested_address = sal.pc;
-  b->loc->address = adjusted_address;
-  b->loc->pspace = sal.pspace;
-
-  /* Store the program space that was used to set the breakpoint, for
-     breakpoint resetting.  */
-  b->pspace = sal.pspace;
-
-  if (sal.symtab == NULL)
-    b->source_file = NULL;
-  else
-    b->source_file = xstrdup (sal.symtab->filename);
-  b->loc->section = sal.section;
-  b->line_number = sal.line;
-
-  set_breakpoint_location_function (b->loc,
-                                   sal.explicit_pc || sal.explicit_line);
+  /* Store the program space that was used to set the breakpoint,
+     except for ordinary breakpoints, which are independent of the
+     program space.  */
+  if (bptype != bp_breakpoint && bptype != bp_hardware_breakpoint)
+    b->pspace = sal.pspace;
 
   breakpoints_changed ();
 }
@@ -5695,7 +5874,7 @@ init_raw_breakpoint (struct breakpoint *b, struct gdbarch *gdbarch,
 struct breakpoint *
 set_raw_breakpoint (struct gdbarch *gdbarch,
                    struct symtab_and_line sal, enum bptype bptype,
-                   struct breakpoint_ops *ops)
+                   const struct breakpoint_ops *ops)
 {
   struct breakpoint *b = XNEW (struct breakpoint);
 
@@ -5941,8 +6120,8 @@ disable_breakpoints_in_shlibs (void)
   }
 }
 
-/* Disable any breakpoints that are in an unloaded shared library.
-   Only apply to enabled breakpoints, disabled ones can just stay
+/* Disable any breakpoints and tracepoints that are in an unloaded shared
+   library.  Only apply to enabled breakpoints, disabled ones can just stay
    disabled.  */
 
 static void
@@ -5964,13 +6143,14 @@ disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
     /* ALL_BP_LOCATIONS bp_location has LOC->OWNER always non-NULL.  */
     struct breakpoint *b = loc->owner;
 
-    if ((loc->loc_type == bp_loc_hardware_breakpoint
-        || loc->loc_type == bp_loc_software_breakpoint)
-       && solib->pspace == loc->pspace
+    if (solib->pspace == loc->pspace
        && !loc->shlib_disabled
-       && (b->type == bp_breakpoint
-           || b->type == bp_jit_event
-           || b->type == bp_hardware_breakpoint)
+       && (((b->type == bp_breakpoint
+             || b->type == bp_jit_event
+             || b->type == bp_hardware_breakpoint)
+            && (loc->loc_type == bp_loc_hardware_breakpoint
+                || loc->loc_type == bp_loc_software_breakpoint))
+           || is_tracepoint (b))
        && solib_contains_address_p (solib, loc->address))
       {
        loc->shlib_disabled = 1;
@@ -6049,12 +6229,25 @@ breakpoint_hit_catch_fork (const struct bp_location *bl,
 static enum print_stop_action
 print_it_catch_fork (bpstat bs)
 {
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b = bs->breakpoint_at;
   struct fork_catchpoint *c = (struct fork_catchpoint *) bs->breakpoint_at;
 
   annotate_catchpoint (b->number);
-  printf_filtered (_("\nCatchpoint %d (forked process %d), "),
-                  b->number, ptid_get_pid (c->forked_inferior_pid));
+  if (b->disposition == disp_del)
+    ui_out_text (uiout, "\nTemporary catchpoint ");
+  else
+    ui_out_text (uiout, "\nCatchpoint ");
+  if (ui_out_is_mi_like_p (uiout))
+    {
+      ui_out_field_string (uiout, "reason",
+                          async_reason_lookup (EXEC_ASYNC_FORK));
+      ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
+    }
+  ui_out_field_int (uiout, "bkptno", b->number);
+  ui_out_text (uiout, " (forked process ");
+  ui_out_field_int (uiout, "newpid", ptid_get_pid (c->forked_inferior_pid));
+  ui_out_text (uiout, "), ");
   return PRINT_SRC_AND_LOC;
 }
 
@@ -6066,6 +6259,7 @@ print_one_catch_fork (struct breakpoint *b, struct bp_location **last_loc)
 {
   struct fork_catchpoint *c = (struct fork_catchpoint *) b;
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
 
@@ -6101,27 +6295,12 @@ static void
 print_recreate_catch_fork (struct breakpoint *b, struct ui_file *fp)
 {
   fprintf_unfiltered (fp, "catch fork");
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in fork catchpoints.  */
 
-static struct breakpoint_ops catch_fork_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  null_re_set,
-  insert_catch_fork,
-  remove_catch_fork,
-  breakpoint_hit_catch_fork,
-  null_check_status,
-  null_resources_needed,
-  null_works_in_software_mode,
-  print_it_catch_fork,
-  print_one_catch_fork,
-  null_print_one_detail,
-  print_mention_catch_fork,
-  print_recreate_catch_fork
-};
+static struct breakpoint_ops catch_fork_breakpoint_ops;
 
 /* Implement the "insert" breakpoint_ops method for vfork
    catchpoints.  */
@@ -6159,12 +6338,25 @@ breakpoint_hit_catch_vfork (const struct bp_location *bl,
 static enum print_stop_action
 print_it_catch_vfork (bpstat bs)
 {
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b = bs->breakpoint_at;
   struct fork_catchpoint *c = (struct fork_catchpoint *) b;
 
   annotate_catchpoint (b->number);
-  printf_filtered (_("\nCatchpoint %d (vforked process %d), "),
-                  b->number, ptid_get_pid (c->forked_inferior_pid));
+  if (b->disposition == disp_del)
+    ui_out_text (uiout, "\nTemporary catchpoint ");
+  else
+    ui_out_text (uiout, "\nCatchpoint ");
+  if (ui_out_is_mi_like_p (uiout))
+    {
+      ui_out_field_string (uiout, "reason",
+                          async_reason_lookup (EXEC_ASYNC_VFORK));
+      ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
+    }
+  ui_out_field_int (uiout, "bkptno", b->number);
+  ui_out_text (uiout, " (vforked process ");
+  ui_out_field_int (uiout, "newpid", ptid_get_pid (c->forked_inferior_pid));
+  ui_out_text (uiout, "), ");
   return PRINT_SRC_AND_LOC;
 }
 
@@ -6176,6 +6368,7 @@ print_one_catch_vfork (struct breakpoint *b, struct bp_location **last_loc)
 {
   struct fork_catchpoint *c = (struct fork_catchpoint *) b;
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
   /* Field 4, the address, is omitted (which makes the columns not
@@ -6210,27 +6403,12 @@ static void
 print_recreate_catch_vfork (struct breakpoint *b, struct ui_file *fp)
 {
   fprintf_unfiltered (fp, "catch vfork");
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in vfork catchpoints.  */
 
-static struct breakpoint_ops catch_vfork_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  null_re_set,
-  insert_catch_vfork,
-  remove_catch_vfork,
-  breakpoint_hit_catch_vfork,
-  null_check_status,
-  null_resources_needed,
-  null_works_in_software_mode,
-  print_it_catch_vfork,
-  print_one_catch_vfork,
-  null_print_one_detail,
-  print_mention_catch_vfork,
-  print_recreate_catch_vfork
-};
+static struct breakpoint_ops catch_vfork_breakpoint_ops;
 
 /* An instance of this type is used to represent a syscall catchpoint.
    It includes a "struct breakpoint" as a kind of base class; users
@@ -6260,7 +6438,7 @@ dtor_catch_syscall (struct breakpoint *b)
 
   VEC_free (int, c->syscalls_to_be_caught);
 
-  bkpt_dtor (b);
+  base_breakpoint_ops.dtor (b);
 }
 
 /* Implement the "insert" breakpoint_ops method for syscall
@@ -6387,6 +6565,7 @@ breakpoint_hit_catch_syscall (const struct bp_location *bl,
 static enum print_stop_action
 print_it_catch_syscall (bpstat bs)
 {
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b = bs->breakpoint_at;
   /* These are needed because we want to know in which state a
      syscall is.  It can be in the TARGET_WAITKIND_SYSCALL_ENTRY
@@ -6395,7 +6574,6 @@ print_it_catch_syscall (bpstat bs)
   ptid_t ptid;
   struct target_waitstatus last;
   struct syscall s;
-  struct cleanup *old_chain;
   char *syscall_id;
 
   get_last_target_status (&ptid, &last);
@@ -6404,21 +6582,31 @@ print_it_catch_syscall (bpstat bs)
 
   annotate_catchpoint (b->number);
 
-  if (s.name == NULL)
-    syscall_id = xstrprintf ("%d", last.value.syscall_number);
+  if (b->disposition == disp_del)
+    ui_out_text (uiout, "\nTemporary catchpoint ");
   else
-    syscall_id = xstrprintf ("'%s'", s.name);
-
-  old_chain = make_cleanup (xfree, syscall_id);
+    ui_out_text (uiout, "\nCatchpoint ");
+  if (ui_out_is_mi_like_p (uiout))
+    {
+      ui_out_field_string (uiout, "reason",
+                          async_reason_lookup (last.kind == TARGET_WAITKIND_SYSCALL_ENTRY
+                                               ? EXEC_ASYNC_SYSCALL_ENTRY
+                                               : EXEC_ASYNC_SYSCALL_RETURN));
+      ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
+    }
+  ui_out_field_int (uiout, "bkptno", b->number);
 
   if (last.kind == TARGET_WAITKIND_SYSCALL_ENTRY)
-    printf_filtered (_("\nCatchpoint %d (call to syscall %s), "),
-                     b->number, syscall_id);
-  else if (last.kind == TARGET_WAITKIND_SYSCALL_RETURN)
-    printf_filtered (_("\nCatchpoint %d (returned from syscall %s), "),
-                     b->number, syscall_id);
+    ui_out_text (uiout, " (call to syscall ");
+  else
+    ui_out_text (uiout, " (returned from syscall ");
 
-  do_cleanups (old_chain);
+  if (s.name == NULL || ui_out_is_mi_like_p (uiout))
+    ui_out_field_int (uiout, "syscall-number", last.value.syscall_number);
+  if (s.name != NULL)
+    ui_out_field_string (uiout, "syscall-name", s.name);
+
+  ui_out_text (uiout, "), ");
 
   return PRINT_SRC_AND_LOC;
 }
@@ -6432,6 +6620,7 @@ print_one_catch_syscall (struct breakpoint *b,
 {
   struct syscall_catchpoint *c = (struct syscall_catchpoint *) b;
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
   /* Field 4, the address, is omitted (which makes the columns not
@@ -6542,27 +6731,12 @@ print_recreate_catch_syscall (struct breakpoint *b, struct ui_file *fp)
             fprintf_unfiltered (fp, " %d", s.number);
         }
     }
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in syscall catchpoints.  */
 
-static struct breakpoint_ops catch_syscall_breakpoint_ops =
-{
-  dtor_catch_syscall,
-  bkpt_allocate_location,
-  null_re_set,
-  insert_catch_syscall,
-  remove_catch_syscall,
-  breakpoint_hit_catch_syscall,
-  null_check_status,
-  null_resources_needed,
-  null_works_in_software_mode,
-  print_it_catch_syscall,
-  print_one_catch_syscall,
-  null_print_one_detail,
-  print_mention_catch_syscall,
-  print_recreate_catch_syscall
-};
+static struct breakpoint_ops catch_syscall_breakpoint_ops;
 
 /* Returns non-zero if 'b' is a syscall catchpoint.  */
 
@@ -6581,7 +6755,7 @@ static void
 init_catchpoint (struct breakpoint *b,
                 struct gdbarch *gdbarch, int tempflag,
                 char *cond_string,
-                struct breakpoint_ops *ops)
+                const struct breakpoint_ops *ops)
 {
   struct symtab_and_line sal;
 
@@ -6595,20 +6769,22 @@ init_catchpoint (struct breakpoint *b,
 }
 
 void
-install_breakpoint (struct breakpoint *b)
+install_breakpoint (int internal, struct breakpoint *b, int update_gll)
 {
   add_to_breakpoint_chain (b);
-  set_breakpoint_count (breakpoint_count + 1);
-  b->number = breakpoint_count;
-  mention (b);
+  set_breakpoint_number (internal, b);
+  if (!internal)
+    mention (b);
   observer_notify_breakpoint_created (b);
-  update_global_location_list (1);
+
+  if (update_gll)
+    update_global_location_list (1);
 }
 
 static void
 create_fork_vfork_event_catchpoint (struct gdbarch *gdbarch,
                                    int tempflag, char *cond_string,
-                                    struct breakpoint_ops *ops)
+                                    const struct breakpoint_ops *ops)
 {
   struct fork_catchpoint *c = XNEW (struct fork_catchpoint);
 
@@ -6616,7 +6792,7 @@ create_fork_vfork_event_catchpoint (struct gdbarch *gdbarch,
 
   c->forked_inferior_pid = null_ptid;
 
-  install_breakpoint (&c->base);
+  install_breakpoint (0, &c->base, 1);
 }
 
 /* Exec catchpoints.  */
@@ -6648,7 +6824,7 @@ dtor_catch_exec (struct breakpoint *b)
 
   xfree (c->exec_pathname);
 
-  bkpt_dtor (b);
+  base_breakpoint_ops.dtor (b);
 }
 
 static int
@@ -6675,12 +6851,26 @@ breakpoint_hit_catch_exec (const struct bp_location *bl,
 static enum print_stop_action
 print_it_catch_exec (bpstat bs)
 {
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b = bs->breakpoint_at;
   struct exec_catchpoint *c = (struct exec_catchpoint *) b;
 
   annotate_catchpoint (b->number);
-  printf_filtered (_("\nCatchpoint %d (exec'd %s), "), b->number,
-                  c->exec_pathname);
+  if (b->disposition == disp_del)
+    ui_out_text (uiout, "\nTemporary catchpoint ");
+  else
+    ui_out_text (uiout, "\nCatchpoint ");
+  if (ui_out_is_mi_like_p (uiout))
+    {
+      ui_out_field_string (uiout, "reason",
+                          async_reason_lookup (EXEC_ASYNC_EXEC));
+      ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
+    }
+  ui_out_field_int (uiout, "bkptno", b->number);
+  ui_out_text (uiout, " (exec'd ");
+  ui_out_field_string (uiout, "new-exec", c->exec_pathname);
+  ui_out_text (uiout, "), ");
+
   return PRINT_SRC_AND_LOC;
 }
 
@@ -6689,6 +6879,7 @@ print_one_catch_exec (struct breakpoint *b, struct bp_location **last_loc)
 {
   struct exec_catchpoint *c = (struct exec_catchpoint *) b;
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
 
@@ -6720,29 +6911,14 @@ static void
 print_recreate_catch_exec (struct breakpoint *b, struct ui_file *fp)
 {
   fprintf_unfiltered (fp, "catch exec");
+  print_recreate_thread (b, fp);
 }
 
-static struct breakpoint_ops catch_exec_breakpoint_ops =
-{
-  dtor_catch_exec,
-  bkpt_allocate_location,
-  null_re_set,
-  insert_catch_exec,
-  remove_catch_exec,
-  breakpoint_hit_catch_exec,
-  null_check_status,
-  null_resources_needed,
-  null_works_in_software_mode,
-  print_it_catch_exec,
-  print_one_catch_exec,
-  null_print_one_detail,
-  print_mention_catch_exec,
-  print_recreate_catch_exec
-};
+static struct breakpoint_ops catch_exec_breakpoint_ops;
 
 static void
 create_syscall_event_catchpoint (int tempflag, VEC(int) *filter,
-                                 struct breakpoint_ops *ops)
+                                 const struct breakpoint_ops *ops)
 {
   struct syscall_catchpoint *c;
   struct gdbarch *gdbarch = get_current_arch ();
@@ -6751,7 +6927,7 @@ create_syscall_event_catchpoint (int tempflag, VEC(int) *filter,
   init_catchpoint (&c->base, gdbarch, tempflag, NULL, ops);
   c->syscalls_to_be_caught = filter;
 
-  install_breakpoint (&c->base);
+  install_breakpoint (0, &c->base, 1);
 }
 
 static int
@@ -6775,28 +6951,52 @@ hw_breakpoint_used_count (void)
   return i;
 }
 
+/* Returns the resources B would use if it were a hardware
+   watchpoint.  */
+
 static int
-hw_watchpoint_used_count (enum bptype type, int *other_type_used)
+hw_watchpoint_use_count (struct breakpoint *b)
 {
   int i = 0;
-  struct breakpoint *b;
   struct bp_location *bl;
 
+  if (!breakpoint_enabled (b))
+    return 0;
+
+  for (bl = b->loc; bl; bl = bl->next)
+    {
+      /* Special types of hardware watchpoints may use more than
+        one register.  */
+      i += b->ops->resources_needed (bl);
+    }
+
+  return i;
+}
+
+/* Returns the sum the used resources of all hardware watchpoints of
+   type TYPE in the breakpoints list.  Also returns in OTHER_TYPE_USED
+   the sum of the used resources of all hardware watchpoints of other
+   types _not_ TYPE.  */
+
+static int
+hw_watchpoint_used_count_others (struct breakpoint *except,
+                                enum bptype type, int *other_type_used)
+{
+  int i = 0;
+  struct breakpoint *b;
+
   *other_type_used = 0;
   ALL_BREAKPOINTS (b)
     {
+      if (b == except)
+       continue;
       if (!breakpoint_enabled (b))
        continue;
 
-       if (b->type == type)
-         for (bl = b->loc; bl; bl = bl->next)
-           {
-             /* Special types of hardware watchpoints may use more than
-                one register.  */
-             i += b->ops->resources_needed (bl);
-           }
-       else if (is_hardware_watchpoint (b))
-         *other_type_used = 1;
+      if (b->type == type)
+       i += hw_watchpoint_use_count (b);
+      else if (is_hardware_watchpoint (b))
+       *other_type_used = 1;
     }
 
   return i;
@@ -6835,53 +7035,15 @@ enable_watchpoints_after_interactive_call_stop (void)
 void
 disable_breakpoints_before_startup (void)
 {
-  struct breakpoint *b;
-  int found = 0;
-
-  ALL_BREAKPOINTS (b)
-    {
-      if (b->pspace != current_program_space)
-       continue;
-
-      if ((b->type == bp_breakpoint
-          || b->type == bp_hardware_breakpoint)
-         && breakpoint_enabled (b))
-       {
-         b->enable_state = bp_startup_disabled;
-         found = 1;
-       }
-    }
-
-  if (found)
-    update_global_location_list (0);
-
-  current_program_space->executing_startup = 1;
-}
+  current_program_space->executing_startup = 1;
+  update_global_location_list (0);
+}
 
 void
 enable_breakpoints_after_startup (void)
 {
-  struct breakpoint *b;
-  int found = 0;
-
   current_program_space->executing_startup = 0;
-
-  ALL_BREAKPOINTS (b)
-    {
-      if (b->pspace != current_program_space)
-       continue;
-
-      if ((b->type == bp_breakpoint
-          || b->type == bp_hardware_breakpoint)
-         && b->enable_state == bp_startup_disabled)
-       {
-         b->enable_state = bp_enabled;
-         found = 1;
-       }
-    }
-
-  if (found)
-    breakpoint_re_set ();
+  breakpoint_re_set ();
 }
 
 
@@ -6922,7 +7084,7 @@ set_momentary_breakpoint (struct gdbarch *gdbarch, struct symtab_and_line sal,
 static struct breakpoint *
 momentary_breakpoint_from_master (struct breakpoint *orig,
                                  enum bptype type,
-                                 struct breakpoint_ops *ops)
+                                 const struct breakpoint_ops *ops)
 {
   struct breakpoint *copy;
 
@@ -6936,12 +7098,10 @@ momentary_breakpoint_from_master (struct breakpoint *orig,
   copy->loc->section = orig->loc->section;
   copy->loc->pspace = orig->loc->pspace;
 
-  if (orig->source_file == NULL)
-    copy->source_file = NULL;
-  else
-    copy->source_file = xstrdup (orig->source_file);
+  if (orig->loc->source_file != NULL)
+    copy->loc->source_file = xstrdup (orig->loc->source_file);
 
-  copy->line_number = orig->line_number;
+  copy->loc->line_number = orig->loc->line_number;
   copy->frame_id = orig->frame_id;
   copy->thread = orig->thread;
   copy->pspace = orig->pspace;
@@ -6988,7 +7148,7 @@ static void
 mention (struct breakpoint *b)
 {
   b->ops->print_mention (b);
-  if (ui_out_is_mi_like_p (uiout))
+  if (ui_out_is_mi_like_p (current_uiout))
     return;
   printf_filtered ("\n");
 }
@@ -6999,20 +7159,36 @@ add_location_to_breakpoint (struct breakpoint *b,
                            const struct symtab_and_line *sal)
 {
   struct bp_location *loc, **tmp;
+  CORE_ADDR adjusted_address;
+  struct gdbarch *loc_gdbarch = get_sal_arch (*sal);
+
+  if (loc_gdbarch == NULL)
+    loc_gdbarch = b->gdbarch;
+
+  /* Adjust the breakpoint's address prior to allocating a location.
+     Once we call allocate_bp_location(), that mostly uninitialized
+     location will be placed on the location chain.  Adjustment of the
+     breakpoint may cause target_read_memory() to be called and we do
+     not want its scan of the location chain to find a breakpoint and
+     location that's only been partially initialized.  */
+  adjusted_address = adjust_breakpoint_address (loc_gdbarch,
+                                               sal->pc, b->type);
 
   loc = allocate_bp_location (b);
   for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
     ;
   *tmp = loc;
-  loc->gdbarch = get_sal_arch (*sal);
-  if (!loc->gdbarch)
-    loc->gdbarch = b->gdbarch;
+
   loc->requested_address = sal->pc;
-  loc->address = adjust_breakpoint_address (loc->gdbarch,
-                                           loc->requested_address, b->type);
+  loc->address = adjusted_address;
   loc->pspace = sal->pspace;
   gdb_assert (loc->pspace != NULL);
   loc->section = sal->section;
+  loc->gdbarch = loc_gdbarch;
+
+  if (sal->symtab != NULL)
+    loc->source_file = xstrdup (sal->symtab->filename);
+  loc->line_number = sal->line;
 
   set_breakpoint_location_function (loc,
                                    sal->explicit_pc || sal->explicit_line);
@@ -7028,7 +7204,7 @@ bp_loc_is_permanent (struct bp_location *loc)
 {
   int len;
   CORE_ADDR addr;
-  const gdb_byte *brk;
+  const gdb_byte *bpoint;
   gdb_byte *target_mem;
   struct cleanup *cleanup;
   int retval = 0;
@@ -7036,10 +7212,10 @@ bp_loc_is_permanent (struct bp_location *loc)
   gdb_assert (loc != NULL);
 
   addr = loc->address;
-  brk = gdbarch_breakpoint_from_pc (loc->gdbarch, &addr, &len);
+  bpoint = gdbarch_breakpoint_from_pc (loc->gdbarch, &addr, &len);
 
   /* Software breakpoints unsupported?  */
-  if (brk == NULL)
+  if (bpoint == NULL)
     return 0;
 
   target_mem = alloca (len);
@@ -7053,7 +7229,7 @@ bp_loc_is_permanent (struct bp_location *loc)
   make_show_memory_breakpoints_cleanup (0);
 
   if (target_read_memory (loc->address, target_mem, len) == 0
-      && memcmp (target_mem, brk, len) == 0)
+      && memcmp (target_mem, bpoint, len) == 0)
     retval = 1;
 
   do_cleanups (cleanup);
@@ -7068,22 +7244,23 @@ bp_loc_is_permanent (struct bp_location *loc)
    as condition expression.  */
 
 static void
-create_breakpoint_sal (struct gdbarch *gdbarch,
-                      struct symtabs_and_lines sals, char *addr_string,
-                      char *cond_string,
-                      enum bptype type, enum bpdisp disposition,
-                      int thread, int task, int ignore_count,
-                      struct breakpoint_ops *ops, int from_tty,
-                      int enabled, int internal, int display_canonical)
+init_breakpoint_sal (struct breakpoint *b, struct gdbarch *gdbarch,
+                    struct symtabs_and_lines sals, char *addr_string,
+                    char *filter, char *cond_string,
+                    enum bptype type, enum bpdisp disposition,
+                    int thread, int task, int ignore_count,
+                    const struct breakpoint_ops *ops, int from_tty,
+                    int enabled, int internal, int display_canonical)
 {
-  struct breakpoint *b = NULL;
   int i;
 
   if (type == bp_hardware_breakpoint)
     {
-      int i = hw_breakpoint_used_count ();
-      int target_resources_ok = 
-       target_can_use_hardware_watchpoint (bp_hardware_breakpoint, 
+      int target_resources_ok;
+
+      i = hw_breakpoint_used_count ();
+      target_resources_ok =
+       target_can_use_hardware_watchpoint (bp_hardware_breakpoint,
                                            i + 1, 0);
       if (target_resources_ok == 0)
        error (_("No hardware breakpoint support in the target."));
@@ -7110,8 +7287,7 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
 
       if (i == 0)
        {
-         b = set_raw_breakpoint (gdbarch, sal, type, ops);
-         set_breakpoint_number (internal, b);
+         init_raw_breakpoint (b, gdbarch, sal, type, ops);
          b->thread = thread;
          b->task = task;
   
@@ -7119,10 +7295,10 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
          b->ignore_count = ignore_count;
          b->enable_state = enabled ? bp_enabled : bp_disabled;
          b->disposition = disposition;
-         b->pspace = sals.sals[0].pspace;
 
          if (type == bp_static_tracepoint)
            {
+             struct tracepoint *t = (struct tracepoint *) b;
              struct static_tracepoint_marker marker;
 
              if (is_marker_spec (addr_string))
@@ -7132,38 +7308,32 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
                  char *p = &addr_string[3];
                  char *endp;
                  char *marker_str;
-                 int i;
 
                  p = skip_spaces (p);
 
                  endp = skip_to_space (p);
 
                  marker_str = savestring (p, endp - p);
-                 b->static_trace_marker_id = marker_str;
+                 t->static_trace_marker_id = marker_str;
 
                  printf_filtered (_("Probed static tracepoint "
                                     "marker \"%s\"\n"),
-                                  b->static_trace_marker_id);
+                                  t->static_trace_marker_id);
                }
              else if (target_static_tracepoint_marker_at (sal.pc, &marker))
                {
-                 b->static_trace_marker_id = xstrdup (marker.str_id);
+                 t->static_trace_marker_id = xstrdup (marker.str_id);
                  release_static_tracepoint_marker (&marker);
 
                  printf_filtered (_("Probed static tracepoint "
                                     "marker \"%s\"\n"),
-                                  b->static_trace_marker_id);
+                                  t->static_trace_marker_id);
                }
              else
                warning (_("Couldn't determine the static "
                           "tracepoint marker to probe"));
            }
 
-         if (enabled && b->pspace->executing_startup
-             && (b->type == bp_breakpoint
-                 || b->type == bp_hardware_breakpoint))
-           b->enable_state = bp_startup_disabled;
-
          loc = b->loc;
        }
       else
@@ -7191,144 +7361,43 @@ create_breakpoint_sal (struct gdbarch *gdbarch,
        me.  */
     b->addr_string
       = xstrprintf ("*%s", paddress (b->loc->gdbarch, b->loc->address));
-
-  /* Do not mention breakpoints with a negative number, but do
-     notify observers.  */
-  if (!internal)
-    mention (b);
-  observer_notify_breakpoint_created (b);
+  b->filter = filter;
 }
 
-/* Remove element at INDEX_TO_REMOVE from SAL, shifting other
-   elements to fill the void space.  */
 static void
-remove_sal (struct symtabs_and_lines *sal, int index_to_remove)
-{
-  int i = index_to_remove+1;
-  int last_index = sal->nelts-1;
-
-  for (;i <= last_index; ++i)
-    sal->sals[i-1] = sal->sals[i];
-
-  --(sal->nelts);
-}
-
-/* If appropriate, obtains all sals that correspond to the same file
-   and line as SAL, in all program spaces.  Users debugging with IDEs,
-   will want to set a breakpoint at foo.c:line, and not really care
-   about program spaces.  This is done only if SAL does not have
-   explicit PC and has line and file information.  If we got just a
-   single expanded sal, return the original.
-
-   Otherwise, if SAL.explicit_line is not set, filter out all sals for
-   which the name of enclosing function is different from SAL.  This
-   makes sure that if we have breakpoint originally set in template
-   instantiation, say foo<int>(), we won't expand SAL to locations at
-   the same line in all existing instantiations of 'foo'.  */
-
-static struct symtabs_and_lines
-expand_line_sal_maybe (struct symtab_and_line sal)
+create_breakpoint_sal (struct gdbarch *gdbarch,
+                      struct symtabs_and_lines sals, char *addr_string,
+                      char *filter, char *cond_string,
+                      enum bptype type, enum bpdisp disposition,
+                      int thread, int task, int ignore_count,
+                      const struct breakpoint_ops *ops, int from_tty,
+                      int enabled, int internal, int display_canonical)
 {
-  struct symtabs_and_lines expanded;
-  CORE_ADDR original_pc = sal.pc;
-  char *original_function = NULL;
-  int found;
-  int i;
+  struct breakpoint *b;
   struct cleanup *old_chain;
 
-  /* If we have explicit pc, don't expand.
-     If we have no line number, we can't expand.  */
-  if (sal.explicit_pc || sal.line == 0 || sal.symtab == NULL)
-    {
-      expanded.nelts = 1;
-      expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-      expanded.sals[0] = sal;
-      return expanded;
-    }
-
-  sal.pc = 0;
-
-  old_chain = save_current_space_and_thread ();
-
-  switch_to_program_space_and_thread (sal.pspace);
-
-  find_pc_partial_function (original_pc, &original_function, NULL, NULL);
-
-  /* Note that expand_line_sal visits *all* program spaces.  */
-  expanded = expand_line_sal (sal);
-
-  if (expanded.nelts == 1)
-    {
-      /* We had one sal, we got one sal.  Return that sal, adjusting it
-         past the function prologue if necessary.  */
-      xfree (expanded.sals);
-      expanded.nelts = 1;
-      expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-      sal.pc = original_pc;
-      expanded.sals[0] = sal;
-      skip_prologue_sal (&expanded.sals[0]);
-      do_cleanups (old_chain);
-      return expanded;      
-    }
-
-  if (!sal.explicit_line)
+  if (is_tracepoint_type (type))
     {
-      CORE_ADDR func_addr, func_end;
-      for (i = 0; i < expanded.nelts; ++i)
-       {
-         CORE_ADDR pc = expanded.sals[i].pc;
-         char *this_function;
-
-         /* We need to switch threads as well since we're about to
-            read memory.  */
-         switch_to_program_space_and_thread (expanded.sals[i].pspace);
+      struct tracepoint *t;
 
-         if (find_pc_partial_function (pc, &this_function, 
-                                       &func_addr, &func_end))
-           {
-             if (this_function
-                 && strcmp (this_function, original_function) != 0)
-               {
-                 remove_sal (&expanded, i);
-                 --i;
-               }
-           }
-       }
+      t = XCNEW (struct tracepoint);
+      b = &t->base;
     }
+  else
+    b = XNEW (struct breakpoint);
 
-  /* Skip the function prologue if necessary.  */
-  for (i = 0; i < expanded.nelts; ++i)
-    skip_prologue_sal (&expanded.sals[i]);
-
-  do_cleanups (old_chain);
-
-  if (expanded.nelts <= 1)
-    {
-      /* This is an ugly workaround.  If we get zero expanded sals
-         then something is really wrong.  Fix that by returning the
-         original sal.  */
-
-      xfree (expanded.sals);
-      expanded.nelts = 1;
-      expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-      sal.pc = original_pc;
-      expanded.sals[0] = sal;
-      return expanded;      
-    }
+  old_chain = make_cleanup (xfree, b);
 
-  if (original_pc)
-    {
-      found = 0;
-      for (i = 0; i < expanded.nelts; ++i)
-       if (expanded.sals[i].pc == original_pc)
-         {
-           found = 1;
-           break;
-         }
-      gdb_assert (found);
-    }
+  init_breakpoint_sal (b, gdbarch,
+                      sals, addr_string,
+                      filter, cond_string,
+                      type, disposition,
+                      thread, task, ignore_count,
+                      ops, from_tty,
+                      enabled, internal, display_canonical);
+  discard_cleanups (old_chain);
 
-  return expanded;
+  install_breakpoint (internal, b, 0);
 }
 
 /* Add SALS.nelts breakpoints to the breakpoint table.  For each
@@ -7348,26 +7417,38 @@ expand_line_sal_maybe (struct symtab_and_line sal)
 
 static void
 create_breakpoints_sal (struct gdbarch *gdbarch,
-                       struct symtabs_and_lines sals,
                        struct linespec_result *canonical,
                        char *cond_string,
                        enum bptype type, enum bpdisp disposition,
                        int thread, int task, int ignore_count,
-                       struct breakpoint_ops *ops, int from_tty,
+                       const struct breakpoint_ops *ops, int from_tty,
                        int enabled, int internal)
 {
   int i;
+  struct linespec_sals *lsal;
 
-  for (i = 0; i < sals.nelts; ++i)
+  if (canonical->pre_expanded)
+    gdb_assert (VEC_length (linespec_sals, canonical->sals) == 1);
+
+  for (i = 0; VEC_iterate (linespec_sals, canonical->sals, i, lsal); ++i)
     {
-      struct symtabs_and_lines expanded = 
-       expand_line_sal_maybe (sals.sals[i]);
+      /* Note that 'addr_string' can be NULL in the case of a plain
+        'break', without arguments.  */
+      char *addr_string = (canonical->addr_string
+                          ? xstrdup (canonical->addr_string)
+                          : NULL);
+      char *filter_string = lsal->canonical ? xstrdup (lsal->canonical) : NULL;
+      struct cleanup *inner = make_cleanup (xfree, addr_string);
 
-      create_breakpoint_sal (gdbarch, expanded, canonical->canonical[i],
+      make_cleanup (xfree, filter_string);
+      create_breakpoint_sal (gdbarch, lsal->sals,
+                            addr_string,
+                            filter_string,
                             cond_string, type, disposition,
                             thread, task, ignore_count, ops,
                             from_tty, enabled, internal,
                             canonical->special_display);
+      discard_cleanups (inner);
     }
 }
 
@@ -7381,7 +7462,6 @@ create_breakpoints_sal (struct gdbarch *gdbarch,
 
 static void
 parse_breakpoint_sals (char **address,
-                      struct symtabs_and_lines *sals,
                       struct linespec_result *canonical)
 {
   char *addr_start = *address;
@@ -7391,28 +7471,34 @@ parse_breakpoint_sals (char **address,
   if ((*address) == NULL
       || (strncmp ((*address), "if", 2) == 0 && isspace ((*address)[2])))
     {
-      if (default_breakpoint_valid)
+      /* The last displayed codepoint, if it's valid, is our default breakpoint
+         address.  */
+      if (last_displayed_sal_is_valid ())
        {
+         struct linespec_sals lsal;
          struct symtab_and_line sal;
 
          init_sal (&sal);              /* Initialize to zeroes.  */
-         sals->sals = (struct symtab_and_line *)
+         lsal.sals.sals = (struct symtab_and_line *)
            xmalloc (sizeof (struct symtab_and_line));
-         sal.pc = default_breakpoint_address;
-         sal.line = default_breakpoint_line;
-         sal.symtab = default_breakpoint_symtab;
-         sal.pspace = default_breakpoint_pspace;
-         sal.section = find_pc_overlay (sal.pc);
+
+         /* Set sal's pspace, pc, symtab, and line to the values
+            corresponding to the last call to print_frame_info.  */
+         get_last_displayed_sal (&sal);
+          sal.section = find_pc_overlay (sal.pc);
 
          /* "break" without arguments is equivalent to "break *PC"
-            where PC is the default_breakpoint_address.  So make sure
-            to set sal.explicit_pc to prevent GDB from trying to
-            expand the list of sals to include all other instances
-            with the same symtab and line.  */
+            where PC is the last displayed codepoint's address.  So
+            make sure to set sal.explicit_pc to prevent GDB from
+            trying to expand the list of sals to include all other
+            instances with the same symtab and line.  */
          sal.explicit_pc = 1;
 
-         sals->sals[0] = sal;
-         sals->nelts = 1;
+         lsal.sals.sals[0] = sal;
+         lsal.sals.nelts = 1;
+         lsal.canonical = NULL;
+
+         VEC_safe_push (linespec_sals, canonical->sals, &lsal);
        }
       else
        error (_("No default breakpoint address now."));
@@ -7422,37 +7508,16 @@ parse_breakpoint_sals (char **address,
       /* Force almost all breakpoints to be in terms of the
          current_source_symtab (which is decode_line_1's default).
          This should produce the results we want almost all of the
-         time while leaving default_breakpoint_* alone.
-
-         ObjC: However, don't match an Objective-C method name which
-         may have a '+' or '-' succeeded by a '[' */
-        
-      struct symtab_and_line cursal = get_current_source_symtab_and_line ();
-                       
-      if (default_breakpoint_valid
-         && (!cursal.symtab
-             || ((strchr ("+-", (*address)[0]) != NULL)
-                 && ((*address)[1] != '['))))
-       *sals = decode_line_1 (address, 1, default_breakpoint_symtab,
-                              default_breakpoint_line, canonical);
+         time while leaving default_breakpoint_* alone.  */
+      if (last_displayed_sal_is_valid ())
+       decode_line_full (address, DECODE_LINE_FUNFIRSTLINE,
+                         get_last_displayed_symtab (),
+                         get_last_displayed_line (),
+                         canonical, NULL, NULL);
       else
-       *sals = decode_line_1 (address, 1, (struct symtab *) NULL, 0,
-                              canonical);
-    }
-  /* For any SAL that didn't have a canonical string, fill one in.  */
-  if (sals->nelts > 0 && canonical->canonical == NULL)
-    canonical->canonical = xcalloc (sals->nelts, sizeof (char *));
-  if (addr_start != (*address))
-    {
-      int i;
-
-      for (i = 0; i < sals->nelts; i++)
-       {
-         /* Add the string if not present.  */
-         if (canonical->canonical[i] == NULL)
-           canonical->canonical[i] = savestring (addr_start, 
-                                                 (*address) - addr_start);
-       }
+       decode_line_full (address, DECODE_LINE_FUNFIRSTLINE,
+                         (struct symtab *) NULL, 0,
+                         canonical, NULL, NULL);
     }
 }
 
@@ -7487,15 +7552,22 @@ check_fast_tracepoint_sals (struct gdbarch *gdbarch,
 
   for (i = 0; i < sals->nelts; i++)
     {
+      struct gdbarch *sarch;
+
       sal = &sals->sals[i];
 
-      rslt = gdbarch_fast_tracepoint_valid_at (gdbarch, sal->pc,
+      sarch = get_sal_arch (*sal);
+      /* We fall back to GDBARCH if there is no architecture
+        associated with SAL.  */
+      if (sarch == NULL)
+       sarch = gdbarch;
+      rslt = gdbarch_fast_tracepoint_valid_at (sarch, sal->pc,
                                               NULL, &msg);
       old_chain = make_cleanup (xfree, msg);
 
       if (!rslt)
        error (_("May not have a fast tracepoint at 0x%s%s"),
-              paddress (gdbarch, sal->pc), (msg ? msg : ""));
+              paddress (sarch, sal->pc), (msg ? msg : ""));
 
       do_cleanups (old_chain);
     }
@@ -7633,13 +7705,11 @@ create_breakpoint (struct gdbarch *gdbarch,
                   int tempflag, enum bptype type_wanted,
                   int ignore_count,
                   enum auto_boolean pending_break_support,
-                  struct breakpoint_ops *ops,
+                  const struct breakpoint_ops *ops,
                   int from_tty, int enabled, int internal)
 {
   volatile struct gdb_exception e;
-  struct symtabs_and_lines sals;
-  struct symtab_and_line pending_sal;
-  char *copy_arg;
+  char *copy_arg = NULL;
   char *addr_start = arg;
   struct linespec_result canonical;
   struct cleanup *old_chain;
@@ -7651,26 +7721,27 @@ create_breakpoint (struct gdbarch *gdbarch,
 
   gdb_assert (ops != NULL);
 
-  sals.sals = NULL;
-  sals.nelts = 0;
   init_linespec_result (&canonical);
 
   if (type_wanted == bp_static_tracepoint && is_marker_spec (arg))
     {
       int i;
+      struct linespec_sals lsal;
 
-      sals = decode_static_tracepoint_spec (&arg);
+      lsal.sals = decode_static_tracepoint_spec (&arg);
 
       copy_arg = savestring (addr_start, arg - addr_start);
-      canonical.canonical = xcalloc (sals.nelts, sizeof (char *));
-      for (i = 0; i < sals.nelts; i++)
-       canonical.canonical[i] = xstrdup (copy_arg);
+
+      canonical.addr_string = xstrdup (copy_arg);
+      lsal.canonical = xstrdup (copy_arg);
+      VEC_safe_push (linespec_sals, canonical.sals, &lsal);
+
       goto done;
     }
 
   TRY_CATCH (e, RETURN_MASK_ALL)
     {
-      parse_breakpoint_sals (&arg, &sals, &canonical);
+      parse_breakpoint_sals (&arg, &canonical);
     }
 
   /* If caller is interested in rc value from parse, set value.  */
@@ -7694,43 +7765,39 @@ create_breakpoint (struct gdbarch *gdbarch,
           /* If pending breakpoint support is auto query and the user
             selects no, then simply return the error code.  */
          if (pending_break_support == AUTO_BOOLEAN_AUTO
-             && !nquery (_("Make breakpoint pending on "
-                           "future shared library load? ")))
+             && !nquery (_("Make %s pending on future shared library load? "),
+                         bptype_string (type_wanted)))
            return 0;
 
          /* At this point, either the user was queried about setting
             a pending breakpoint and selected yes, or pending
             breakpoint behavior is on and thus a pending breakpoint
             is defaulted on behalf of the user.  */
-         copy_arg = xstrdup (addr_start);
-         canonical.canonical = &copy_arg;
-         sals.nelts = 1;
-         sals.sals = &pending_sal;
-         pending_sal.pc = 0;
-         pending = 1;
+         {
+           struct linespec_sals lsal;
+
+           copy_arg = xstrdup (addr_start);
+           lsal.canonical = xstrdup (copy_arg);
+           lsal.sals.nelts = 1;
+           lsal.sals.sals = XNEW (struct symtab_and_line);
+           init_sal (&lsal.sals.sals[0]);
+           pending = 1;
+           VEC_safe_push (linespec_sals, canonical.sals, &lsal);
+         }
          break;
        default:
          throw_exception (e);
        }
       break;
     default:
-      if (!sals.nelts)
+      if (VEC_empty (linespec_sals, canonical.sals))
        return 0;
     }
 
   done:
 
   /* Create a chain of things that always need to be cleaned up.  */
-  old_chain = make_cleanup (null_cleanup, 0);
-
-  if (!pending)
-    {
-      /* Make sure that all storage allocated to SALS gets freed.  */
-      make_cleanup (xfree, sals.sals);
-      
-      /* Cleanup the canonical array but not its contents.  */
-      make_cleanup (xfree, canonical.canonical);
-    }
+  old_chain = make_cleanup_destroy_linespec_result (&canonical);
 
   /* ----------------------------- SNIP -----------------------------
      Anything added to the cleanup chain beyond this point is assumed
@@ -7738,28 +7805,36 @@ create_breakpoint (struct gdbarch *gdbarch,
      then the memory is not reclaimed.  */
   bkpt_chain = make_cleanup (null_cleanup, 0);
 
-  /* Mark the contents of the canonical for cleanup.  These go on
-     the bkpt_chain and only occur if the breakpoint create fails.  */
-  for (i = 0; i < sals.nelts; i++)
-    {
-      if (canonical.canonical[i] != NULL)
-       make_cleanup (xfree, canonical.canonical[i]);
-    }
-
   /* Resolve all line numbers to PC's and verify that the addresses
      are ok for the target.  */
   if (!pending)
-    breakpoint_sals_to_pc (&sals);
+    {
+      int ix;
+      struct linespec_sals *iter;
+
+      for (ix = 0; VEC_iterate (linespec_sals, canonical.sals, ix, iter); ++ix)
+       breakpoint_sals_to_pc (&iter->sals);
+    }
 
   /* Fast tracepoints may have additional restrictions on location.  */
-  if (type_wanted == bp_fast_tracepoint)
-    check_fast_tracepoint_sals (gdbarch, &sals);
+  if (!pending && type_wanted == bp_fast_tracepoint)
+    {
+      int ix;
+      struct linespec_sals *iter;
+
+      for (ix = 0; VEC_iterate (linespec_sals, canonical.sals, ix, iter); ++ix)
+       check_fast_tracepoint_sals (gdbarch, &iter->sals);
+    }
 
   /* Verify that condition can be parsed, before setting any
      breakpoints.  Allocate a separate condition expression for each
      breakpoint.  */
   if (!pending)
     {
+      struct linespec_sals *lsal;
+
+      lsal = VEC_index (linespec_sals, canonical.sals, 0);
+
       if (parse_condition_and_thread)
         {
             /* Here we only parse 'arg' to separate condition
@@ -7768,7 +7843,7 @@ create_breakpoint (struct gdbarch *gdbarch,
                re-parse it in context of each sal.  */
             cond_string = NULL;
             thread = -1;
-            find_condition_and_thread (arg, sals.sals[0].pc, &cond_string,
+            find_condition_and_thread (arg, lsal->sals.sals[0].pc, &cond_string,
                                        &thread, &task);
             if (cond_string)
                 make_cleanup (xfree, cond_string);
@@ -7790,37 +7865,31 @@ create_breakpoint (struct gdbarch *gdbarch,
         expand multiple locations for each sal, given than SALS
         already should contain all sals for MARKER_ID.  */
       if (type_wanted == bp_static_tracepoint
-         && is_marker_spec (canonical.canonical[0]))
+         && is_marker_spec (copy_arg))
        {
          int i;
 
-         for (i = 0; i < sals.nelts; ++i)
+         for (i = 0; i < lsal->sals.nelts; ++i)
            {
              struct symtabs_and_lines expanded;
-             struct breakpoint *tp;
+             struct tracepoint *tp;
              struct cleanup *old_chain;
+             char *addr_string;
 
              expanded.nelts = 1;
-             expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-             expanded.sals[0] = sals.sals[i];
-             old_chain = make_cleanup (xfree, expanded.sals);
-
-             create_breakpoint_sal (gdbarch, expanded, canonical.canonical[i],
-                                    cond_string, type_wanted,
-                                    tempflag ? disp_del : disp_donttouch,
-                                    thread, task, ignore_count, ops,
-                                    from_tty, enabled, internal,
-                                    canonical.special_display);
-
-             do_cleanups (old_chain);
-
-             /* Get the tracepoint we just created.  */
-             if (internal)
-               tp = get_breakpoint (internal_breakpoint_number);
-             else
-               tp = get_breakpoint (breakpoint_count);
-             gdb_assert (tp != NULL);
-
+             expanded.sals = &lsal->sals.sals[i];
+
+             addr_string = xstrdup (canonical.addr_string);
+             old_chain = make_cleanup (xfree, addr_string);
+
+             tp = XCNEW (struct tracepoint);
+             init_breakpoint_sal (&tp->base, gdbarch, expanded,
+                                  addr_string, NULL,
+                                  cond_string, type_wanted,
+                                  tempflag ? disp_del : disp_donttouch,
+                                  thread, task, ignore_count, ops,
+                                  from_tty, enabled, internal,
+                                  canonical.special_display);
              /* Given that its possible to have multiple markers with
                 the same string id, if the user is creating a static
                 tracepoint by marker id ("strace -m MARKER_ID"), then
@@ -7828,10 +7897,14 @@ create_breakpoint (struct gdbarch *gdbarch,
                 try to match up which of the newly found markers
                 corresponds to this one  */
              tp->static_trace_marker_id_idx = i;
+
+             install_breakpoint (internal, &tp->base, 0);
+
+             discard_cleanups (old_chain);
            }
        }
       else
-       create_breakpoints_sal (gdbarch, sals, &canonical, cond_string,
+       create_breakpoints_sal (gdbarch, &canonical, cond_string,
                                type_wanted,
                                tempflag ? disp_del : disp_donttouch,
                                thread, task, ignore_count, ops, from_tty,
@@ -7843,31 +7916,31 @@ create_breakpoint (struct gdbarch *gdbarch,
 
       make_cleanup (xfree, copy_arg);
 
-      b = set_raw_breakpoint_without_location (gdbarch, type_wanted, ops);
-      set_breakpoint_number (internal, b);
-      b->thread = -1;
-      b->addr_string = canonical.canonical[0];
+      if (is_tracepoint_type (type_wanted))
+       {
+         struct tracepoint *t;
+
+         t = XCNEW (struct tracepoint);
+         b = &t->base;
+       }
+      else
+       b = XNEW (struct breakpoint);
+
+      init_raw_breakpoint_without_location (b, gdbarch, type_wanted, ops);
+
+      b->addr_string = copy_arg;
       b->cond_string = NULL;
       b->ignore_count = ignore_count;
       b->disposition = tempflag ? disp_del : disp_donttouch;
       b->condition_not_parsed = 1;
       b->enable_state = enabled ? bp_enabled : bp_disabled;
-      b->pspace = current_program_space;
-      b->py_bp_object = NULL;
-
-      if (enabled && b->pspace->executing_startup
-         && (b->type == bp_breakpoint
-             || b->type == bp_hardware_breakpoint))
-       b->enable_state = bp_startup_disabled;
+      if (type_wanted != bp_breakpoint && type_wanted != bp_hardware_breakpoint)
+       b->pspace = current_program_space;
 
-      if (!internal)
-        /* Do not mention breakpoints with a negative number, 
-          but do notify observers.  */
-       mention (b);
-      observer_notify_breakpoint_created (b);
+      install_breakpoint (internal, b, 0);
     }
   
-  if (sals.nelts > 1)
+  if (VEC_length (linespec_sals, canonical.sals) > 1)
     {
       warning (_("Multiple breakpoints were set.\nUse the "
                 "\"delete\" command to delete unwanted breakpoints."));
@@ -8096,6 +8169,7 @@ print_it_ranged_breakpoint (bpstat bs)
 {
   struct breakpoint *b = bs->breakpoint_at;
   struct bp_location *bl = b->loc;
+  struct ui_out *uiout = current_uiout;
 
   gdb_assert (b->type == bp_hardware_breakpoint);
 
@@ -8128,6 +8202,7 @@ print_one_ranged_breakpoint (struct breakpoint *b,
 {
   struct bp_location *bl = b->loc;
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   /* Ranged breakpoints have only one location.  */
   gdb_assert (bl && bl->next == NULL);
@@ -8177,6 +8252,7 @@ static void
 print_mention_ranged_breakpoint (struct breakpoint *b)
 {
   struct bp_location *bl = b->loc;
+  struct ui_out *uiout = current_uiout;
 
   gdb_assert (bl);
   gdb_assert (b->type == bp_hardware_breakpoint);
@@ -8197,27 +8273,12 @@ print_recreate_ranged_breakpoint (struct breakpoint *b, struct ui_file *fp)
 {
   fprintf_unfiltered (fp, "break-range %s, %s", b->addr_string,
                      b->addr_string_range_end);
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in ranged breakpoints.  */
 
-static struct breakpoint_ops ranged_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  bkpt_re_set,
-  bkpt_insert_location,
-  bkpt_remove_location,
-  breakpoint_hit_ranged_breakpoint,
-  null_check_status,
-  resources_needed_ranged_breakpoint,
-  null_works_in_software_mode,
-  print_it_ranged_breakpoint,
-  print_one_ranged_breakpoint,
-  print_one_detail_ranged_breakpoint,
-  print_mention_ranged_breakpoint,
-  print_recreate_ranged_breakpoint
-};
+static struct breakpoint_ops ranged_breakpoint_ops;
 
 /* Find the address where the end of the breakpoint range should be
    placed, given the SAL of the end of the range.  This is so that if
@@ -8260,8 +8321,8 @@ break_range_command (char *arg, int from_tty)
   CORE_ADDR end;
   struct breakpoint *b;
   struct symtab_and_line sal_start, sal_end;
-  struct symtabs_and_lines sals_start, sals_end;
   struct cleanup *cleanup_bkpt;
+  struct linespec_sals *lsal_start, *lsal_end;
 
   /* We don't support software ranged breakpoints.  */
   if (target_ranged_break_num_registers () < 0)
@@ -8274,71 +8335,62 @@ break_range_command (char *arg, int from_tty)
   if (can_use_bp < 0)
     error (_("Hardware breakpoints used exceeds limit."));
 
+  arg = skip_spaces (arg);
   if (arg == NULL || arg[0] == '\0')
     error(_("No address range specified."));
 
-  sals_start.sals = NULL;
-  sals_start.nelts = 0;
   init_linespec_result (&canonical_start);
 
-  while (*arg == ' ' || *arg == '\t')
-    arg++;
-
-  parse_breakpoint_sals (&arg, &sals_start, &canonical_start);
+  arg_start = arg;
+  parse_breakpoint_sals (&arg, &canonical_start);
 
-  sal_start = sals_start.sals[0];
-  addr_string_start = canonical_start.canonical[0];
-  cleanup_bkpt = make_cleanup (xfree, addr_string_start);
-  xfree (sals_start.sals);
-  xfree (canonical_start.canonical);
+  cleanup_bkpt = make_cleanup_destroy_linespec_result (&canonical_start);
 
   if (arg[0] != ',')
     error (_("Too few arguments."));
-  else if (sals_start.nelts == 0)
+  else if (VEC_empty (linespec_sals, canonical_start.sals))
     error (_("Could not find location of the beginning of the range."));
-  else if (sals_start.nelts != 1)
+
+  lsal_start = VEC_index (linespec_sals, canonical_start.sals, 0);
+
+  if (VEC_length (linespec_sals, canonical_start.sals) > 1
+      || lsal_start->sals.nelts != 1)
     error (_("Cannot create a ranged breakpoint with multiple locations."));
 
-  resolve_sal_pc (&sal_start);
+  sal_start = lsal_start->sals.sals[0];
+  addr_string_start = savestring (arg_start, arg - arg_start);
+  make_cleanup (xfree, addr_string_start);
 
   arg++;       /* Skip the comma.  */
-  while (*arg == ' ' || *arg == '\t')
-    arg++;
+  arg = skip_spaces (arg);
 
   /* Parse the end location.  */
 
-  sals_end.sals = NULL;
-  sals_end.nelts = 0;
   init_linespec_result (&canonical_end);
   arg_start = arg;
 
-  /* We call decode_line_1 directly here instead of using
+  /* We call decode_line_full directly here instead of using
      parse_breakpoint_sals because we need to specify the start location's
      symtab and line as the default symtab and line for the end of the
      range.  This makes it possible to have ranges like "foo.c:27, +14",
      where +14 means 14 lines from the start location.  */
-  sals_end = decode_line_1 (&arg, 1, sal_start.symtab, sal_start.line,
-                           &canonical_end);
-
-  /* canonical_end can be NULL if it was of the form "*0xdeadbeef".  */
-  if (canonical_end.canonical == NULL)
-    canonical_end.canonical = xcalloc (1, sizeof (char *));
-  /* Add the string if not present.  */
-  if (arg_start != arg && canonical_end.canonical[0] == NULL)
-    canonical_end.canonical[0] = savestring (arg_start, arg - arg_start);
-
-  sal_end = sals_end.sals[0];
-  addr_string_end = canonical_end.canonical[0];
-  make_cleanup (xfree, addr_string_end);
-  xfree (sals_end.sals);
-  xfree (canonical_end.canonical);
+  decode_line_full (&arg, DECODE_LINE_FUNFIRSTLINE,
+                   sal_start.symtab, sal_start.line,
+                   &canonical_end, NULL, NULL);
 
-  if (sals_end.nelts == 0)
+  make_cleanup_destroy_linespec_result (&canonical_end);
+
+  if (VEC_empty (linespec_sals, canonical_end.sals))
     error (_("Could not find location of the end of the range."));
-  else if (sals_end.nelts != 1)
+
+  lsal_end = VEC_index (linespec_sals, canonical_end.sals, 0);
+  if (VEC_length (linespec_sals, canonical_end.sals) > 1
+      || lsal_end->sals.nelts != 1)
     error (_("Cannot create a ranged breakpoint with multiple locations."));
 
-  resolve_sal_pc (&sal_end);
+  sal_end = lsal_end->sals.sals[0];
+  addr_string_end = savestring (arg_start, arg - arg_start);
+  make_cleanup (xfree, addr_string_end);
 
   end = find_breakpoint_range_end (sal_end);
   if (sal_start.pc > end)
@@ -8365,11 +8417,11 @@ break_range_command (char *arg, int from_tty)
   set_breakpoint_count (breakpoint_count + 1);
   b->number = breakpoint_count;
   b->disposition = disp_donttouch;
-  b->addr_string = addr_string_start;
-  b->addr_string_range_end = addr_string_end;
+  b->addr_string = xstrdup (addr_string_start);
+  b->addr_string_range_end = xstrdup (addr_string_end);
   b->loc->length = length;
 
-  discard_cleanups (cleanup_bkpt);
+  do_cleanups (cleanup_bkpt);
 
   mention (b);
   observer_notify_breakpoint_created (b);
@@ -8485,11 +8537,29 @@ watchpoint_exp_is_const (const struct expression *exp)
   return 1;
 }
 
+/* Implement the "dtor" breakpoint_ops method for watchpoints.  */
+
+static void
+dtor_watchpoint (struct breakpoint *self)
+{
+  struct watchpoint *w = (struct watchpoint *) self;
+
+  xfree (w->cond_exp);
+  xfree (w->exp);
+  xfree (w->exp_string);
+  xfree (w->exp_string_reparse);
+  value_free (w->val);
+
+  base_breakpoint_ops.dtor (self);
+}
+
 /* Implement the "re_set" breakpoint_ops method for watchpoints.  */
 
 static void
 re_set_watchpoint (struct breakpoint *b)
 {
+  struct watchpoint *w = (struct watchpoint *) b;
+
   /* Watchpoint can be either on expression using entirely global
      variables, or it can be on local variables.
 
@@ -8511,11 +8581,11 @@ re_set_watchpoint (struct breakpoint *b)
      I'm not sure we'll ever be called in this case.
 
      If a local watchpoint's frame id is still valid, then
-     b->exp_valid_block is likewise valid, and we can safely use it.
+     w->exp_valid_block is likewise valid, and we can safely use it.
 
-     Don't do anything about disabled watchpoints, since they will
-     be reevaluated again when enabled.  */
-  update_watchpoint (b, 1 /* reparse */);
+     Don't do anything about disabled watchpoints, since they will be
+     reevaluated again when enabled.  */
+  update_watchpoint (w, 1 /* reparse */);
 }
 
 /* Implement the "insert" breakpoint_ops method for hardware watchpoints.  */
@@ -8523,10 +8593,11 @@ re_set_watchpoint (struct breakpoint *b)
 static int
 insert_watchpoint (struct bp_location *bl)
 {
-  int length = bl->owner->exact? 1 : bl->length;
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+  int length = w->exact ? 1 : bl->length;
 
   return target_insert_watchpoint (bl->address, length, bl->watchpoint_type,
-                                  bl->owner->cond_exp);
+                                  w->cond_exp);
 }
 
 /* Implement the "remove" breakpoint_ops method for hardware watchpoints.  */
@@ -8534,10 +8605,11 @@ insert_watchpoint (struct bp_location *bl)
 static int
 remove_watchpoint (struct bp_location *bl)
 {
-  int length = bl->owner->exact? 1 : bl->length;
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+  int length = w->exact ? 1 : bl->length;
 
   return target_remove_watchpoint (bl->address, length, bl->watchpoint_type,
-                                  bl->owner->cond_exp);
+                                  w->cond_exp);
 }
 
 static int
@@ -8545,6 +8617,7 @@ breakpoint_hit_watchpoint (const struct bp_location *bl,
                           struct address_space *aspace, CORE_ADDR bp_addr)
 {
   struct breakpoint *b = bl->owner;
+  struct watchpoint *w = (struct watchpoint *) b;
 
   /* Continuable hardware watchpoints are treated as non-existent if the
      reason we stopped wasn't a hardware watchpoint (we didn't stop on
@@ -8553,7 +8626,7 @@ breakpoint_hit_watchpoint (const struct bp_location *bl,
      been defined.  Also skip watchpoints which we know did not trigger
      (did not match the data address).  */
   if (is_hardware_watchpoint (b)
-      && b->watchpoint_triggered == watch_triggered_no)
+      && w->watchpoint_triggered == watch_triggered_no)
     return 0;
 
   return 1;
@@ -8573,7 +8646,8 @@ check_status_watchpoint (bpstat bs)
 static int
 resources_needed_watchpoint (const struct bp_location *bl)
 {
-  int length = bl->owner->exact? 1 : bl->length;
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+  int length = w->exact? 1 : bl->length;
 
   return target_region_ok_for_hw_watchpoint (bl->address, length);
 }
@@ -8584,7 +8658,8 @@ resources_needed_watchpoint (const struct bp_location *bl)
 static int
 works_in_software_mode_watchpoint (const struct breakpoint *b)
 {
-  return b->type == bp_hardware_watchpoint;
+  /* Read and access watchpoints only work with hardware support.  */
+  return b->type == bp_watchpoint || b->type == bp_hardware_watchpoint;
 }
 
 static enum print_stop_action
@@ -8595,11 +8670,14 @@ print_it_watchpoint (bpstat bs)
   const struct bp_location *bl;
   struct ui_stream *stb;
   enum print_stop_action result;
+  struct watchpoint *w;
+  struct ui_out *uiout = current_uiout;
 
   gdb_assert (bs->bp_location_at != NULL);
 
   bl = bs->bp_location_at;
   b = bs->breakpoint_at;
+  w = (struct watchpoint *) b;
 
   stb = ui_out_stream_new (uiout);
   old_chain = make_cleanup_ui_out_stream_delete (stb);
@@ -8619,7 +8697,7 @@ print_it_watchpoint (bpstat bs)
       watchpoint_value_print (bs->old_val, stb->stream);
       ui_out_field_stream (uiout, "old", stb);
       ui_out_text (uiout, "\nNew value = ");
-      watchpoint_value_print (b->val, stb->stream);
+      watchpoint_value_print (w->val, stb->stream);
       ui_out_field_stream (uiout, "new", stb);
       ui_out_text (uiout, "\n");
       /* More than one watchpoint may have been triggered.  */
@@ -8634,7 +8712,7 @@ print_it_watchpoint (bpstat bs)
       mention (b);
       make_cleanup_ui_out_tuple_begin_end (uiout, "value");
       ui_out_text (uiout, "\nValue = ");
-      watchpoint_value_print (b->val, stb->stream);
+      watchpoint_value_print (w->val, stb->stream);
       ui_out_field_stream (uiout, "value", stb);
       ui_out_text (uiout, "\n");
       result = PRINT_UNKNOWN;
@@ -8665,7 +8743,7 @@ print_it_watchpoint (bpstat bs)
          make_cleanup_ui_out_tuple_begin_end (uiout, "value");
          ui_out_text (uiout, "\nValue = ");
        }
-      watchpoint_value_print (b->val, stb->stream);
+      watchpoint_value_print (w->val, stb->stream);
       ui_out_field_stream (uiout, "new", stb);
       ui_out_text (uiout, "\n");
       result = PRINT_UNKNOWN;
@@ -8685,6 +8763,8 @@ static void
 print_mention_watchpoint (struct breakpoint *b)
 {
   struct cleanup *ui_out_chain;
+  struct watchpoint *w = (struct watchpoint *) b;
+  struct ui_out *uiout = current_uiout;
 
   switch (b->type)
     {
@@ -8711,7 +8791,7 @@ print_mention_watchpoint (struct breakpoint *b)
 
   ui_out_field_int (uiout, "number", b->number);
   ui_out_text (uiout, ": ");
-  ui_out_field_string (uiout, "exp", b->exp_string);
+  ui_out_field_string (uiout, "exp", w->exp_string);
   do_cleanups (ui_out_chain);
 }
 
@@ -8721,6 +8801,8 @@ print_mention_watchpoint (struct breakpoint *b)
 static void
 print_recreate_watchpoint (struct breakpoint *b, struct ui_file *fp)
 {
+  struct watchpoint *w = (struct watchpoint *) b;
+
   switch (b->type)
     {
     case bp_watchpoint:
@@ -8738,28 +8820,13 @@ print_recreate_watchpoint (struct breakpoint *b, struct ui_file *fp)
                      _("Invalid watchpoint type."));
     }
 
-  fprintf_unfiltered (fp, " %s", b->exp_string);
+  fprintf_unfiltered (fp, " %s", w->exp_string);
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in hardware watchpoints.  */
 
-static struct breakpoint_ops watchpoint_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  re_set_watchpoint,
-  insert_watchpoint,
-  remove_watchpoint,
-  breakpoint_hit_watchpoint,
-  check_status_watchpoint,
-  resources_needed_watchpoint,
-  works_in_software_mode_watchpoint,
-  print_it_watchpoint,
-  NULL, /* print_one */
-  null_print_one_detail,
-  print_mention_watchpoint,
-  print_recreate_watchpoint
-};
+static struct breakpoint_ops watchpoint_breakpoint_ops;
 
 /* Implement the "insert" breakpoint_ops method for
    masked hardware watchpoints.  */
@@ -8767,7 +8834,9 @@ static struct breakpoint_ops watchpoint_breakpoint_ops =
 static int
 insert_masked_watchpoint (struct bp_location *bl)
 {
-  return target_insert_mask_watchpoint (bl->address, bl->owner->hw_wp_mask,
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+
+  return target_insert_mask_watchpoint (bl->address, w->hw_wp_mask,
                                        bl->watchpoint_type);
 }
 
@@ -8777,7 +8846,9 @@ insert_masked_watchpoint (struct bp_location *bl)
 static int
 remove_masked_watchpoint (struct bp_location *bl)
 {
-  return target_remove_mask_watchpoint (bl->address, bl->owner->hw_wp_mask,
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+
+  return target_remove_mask_watchpoint (bl->address, w->hw_wp_mask,
                                        bl->watchpoint_type);
 }
 
@@ -8787,8 +8858,9 @@ remove_masked_watchpoint (struct bp_location *bl)
 static int
 resources_needed_masked_watchpoint (const struct bp_location *bl)
 {
-  return target_masked_watch_num_registers (bl->address,
-                                           bl->owner->hw_wp_mask);
+  struct watchpoint *w = (struct watchpoint *) bl->owner;
+
+  return target_masked_watch_num_registers (bl->address, w->hw_wp_mask);
 }
 
 /* Implement the "works_in_software_mode" breakpoint_ops method for
@@ -8807,6 +8879,7 @@ static enum print_stop_action
 print_it_masked_watchpoint (bpstat bs)
 {
   struct breakpoint *b = bs->breakpoint_at;
+  struct ui_out *uiout = current_uiout;
 
   /* Masked watchpoints have only one location.  */
   gdb_assert (b->loc && b->loc->next == NULL);
@@ -8856,11 +8929,13 @@ static void
 print_one_detail_masked_watchpoint (const struct breakpoint *b,
                                    struct ui_out *uiout)
 {
+  struct watchpoint *w = (struct watchpoint *) b;
+
   /* Masked watchpoints have only one location.  */
   gdb_assert (b->loc && b->loc->next == NULL);
 
   ui_out_text (uiout, "\tmask ");
-  ui_out_field_core_addr (uiout, "mask", b->loc->gdbarch, b->hw_wp_mask);
+  ui_out_field_core_addr (uiout, "mask", b->loc->gdbarch, w->hw_wp_mask);
   ui_out_text (uiout, "\n");
 }
 
@@ -8870,6 +8945,8 @@ print_one_detail_masked_watchpoint (const struct breakpoint *b,
 static void
 print_mention_masked_watchpoint (struct breakpoint *b)
 {
+  struct watchpoint *w = (struct watchpoint *) b;
+  struct ui_out *uiout = current_uiout;
   struct cleanup *ui_out_chain;
 
   switch (b->type)
@@ -8893,7 +8970,7 @@ print_mention_masked_watchpoint (struct breakpoint *b)
 
   ui_out_field_int (uiout, "number", b->number);
   ui_out_text (uiout, ": ");
-  ui_out_field_string (uiout, "exp", b->exp_string);
+  ui_out_field_string (uiout, "exp", w->exp_string);
   do_cleanups (ui_out_chain);
 }
 
@@ -8903,6 +8980,7 @@ print_mention_masked_watchpoint (struct breakpoint *b)
 static void
 print_recreate_masked_watchpoint (struct breakpoint *b, struct ui_file *fp)
 {
+  struct watchpoint *w = (struct watchpoint *) b;
   char tmp[40];
 
   switch (b->type)
@@ -8921,29 +8999,14 @@ print_recreate_masked_watchpoint (struct breakpoint *b, struct ui_file *fp)
                      _("Invalid hardware watchpoint type."));
     }
 
-  sprintf_vma (tmp, b->hw_wp_mask);
-  fprintf_unfiltered (fp, " %s mask 0x%s", b->exp_string, tmp);
+  sprintf_vma (tmp, w->hw_wp_mask);
+  fprintf_unfiltered (fp, " %s mask 0x%s", w->exp_string, tmp);
+  print_recreate_thread (b, fp);
 }
 
 /* The breakpoint_ops structure to be used in masked hardware watchpoints.  */
 
-static struct breakpoint_ops masked_watchpoint_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  re_set_watchpoint,
-  insert_masked_watchpoint,
-  remove_masked_watchpoint,
-  breakpoint_hit_watchpoint,
-  check_status_watchpoint,
-  resources_needed_masked_watchpoint,
-  works_in_software_mode_masked_watchpoint,
-  print_it_masked_watchpoint,
-  NULL, /* print_one */
-  print_one_detail_masked_watchpoint,
-  print_mention_masked_watchpoint,
-  print_recreate_masked_watchpoint
-};
+static struct breakpoint_ops masked_watchpoint_breakpoint_ops;
 
 /* Tell whether the given watchpoint is a masked hardware watchpoint.  */
 
@@ -8979,6 +9042,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
      the hardware watchpoint.  */
   int use_mask = 0;
   CORE_ADDR mask = 0;
+  struct watchpoint *w;
 
   /* Make sure that we actually have parameters to parse.  */
   if (arg != NULL && arg[0] != '\0')
@@ -9175,18 +9239,21 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
     }
 
   /* Now set up the breakpoint.  */
+
+  w = XCNEW (struct watchpoint);
+  b = &w->base;
   if (use_mask)
-    b = set_raw_breakpoint_without_location (NULL, bp_type,
-                                            &masked_watchpoint_breakpoint_ops);
+    init_raw_breakpoint_without_location (b, NULL, bp_type,
+                                         &masked_watchpoint_breakpoint_ops);
   else
-    b = set_raw_breakpoint_without_location (NULL, bp_type,
-                                            &watchpoint_breakpoint_ops);
+    init_raw_breakpoint_without_location (b, NULL, bp_type,
+                                         &watchpoint_breakpoint_ops);
   b->thread = thread;
   b->disposition = disp_donttouch;
-  b->exp = exp;
-  b->exp_valid_block = exp_valid_block;
-  b->cond_exp_valid_block = cond_exp_valid_block;
   b->pspace = current_program_space;
+  w->exp = exp;
+  w->exp_valid_block = exp_valid_block;
+  w->cond_exp_valid_block = cond_exp_valid_block;
   if (just_location)
     {
       struct type *t = value_type (val);
@@ -9196,27 +9263,27 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
       t = check_typedef (TYPE_TARGET_TYPE (check_typedef (t)));
       name = type_to_string (t);
 
-      b->exp_string_reparse = xstrprintf ("* (%s *) %s", name,
+      w->exp_string_reparse = xstrprintf ("* (%s *) %s", name,
                                          core_addr_to_string (addr));
       xfree (name);
 
-      b->exp_string = xstrprintf ("-location %.*s",
+      w->exp_string = xstrprintf ("-location %.*s",
                                  (int) (exp_end - exp_start), exp_start);
 
       /* The above expression is in C.  */
       b->language = language_c;
     }
   else
-    b->exp_string = savestring (exp_start, exp_end - exp_start);
+    w->exp_string = savestring (exp_start, exp_end - exp_start);
 
   if (use_mask)
     {
-      b->hw_wp_mask = mask;
+      w->hw_wp_mask = mask;
     }
   else
     {
-      b->val = val;
-      b->val_valid = 1;
+      w->val = val;
+      w->val_valid = 1;
     }
 
   if (cond_start)
@@ -9226,13 +9293,13 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
 
   if (frame)
     {
-      b->watchpoint_frame = get_frame_id (frame);
-      b->watchpoint_thread = inferior_ptid;
+      w->watchpoint_frame = get_frame_id (frame);
+      w->watchpoint_thread = inferior_ptid;
     }
   else
     {
-      b->watchpoint_frame = null_frame_id;
-      b->watchpoint_thread = null_ptid;
+      w->watchpoint_frame = null_frame_id;
+      w->watchpoint_thread = null_ptid;
     }
 
   if (scope_breakpoint != NULL)
@@ -9250,7 +9317,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
     {
       /* Finally update the new watchpoint.  This creates the locations
         that should be inserted.  */
-      update_watchpoint (b, 1);
+      update_watchpoint (w, 1);
     }
   if (e.reason < 0)
     {
@@ -9258,15 +9325,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty,
       throw_exception (e);
     }
 
-  set_breakpoint_number (internal, b);
-
-  /* Do not mention breakpoints with a negative number, but do
-     notify observers.  */
-  if (!internal)
-    mention (b);
-  observer_notify_breakpoint_created (b);
-
-  update_global_location_list (1);
+  install_breakpoint (internal, b, 1);
 }
 
 /* Return count of debug registers needed to watch the given expression.
@@ -9468,11 +9527,13 @@ until_break_command (char *arg, int from_tty, int anywhere)
   /* Set a breakpoint where the user wants it and at return from
      this function.  */
 
-  if (default_breakpoint_valid)
-    sals = decode_line_1 (&arg, 1, default_breakpoint_symtab,
-                         default_breakpoint_line, NULL);
+  if (last_displayed_sal_is_valid ())
+    sals = decode_line_1 (&arg, DECODE_LINE_FUNFIRSTLINE,
+                         get_last_displayed_symtab (),
+                         get_last_displayed_line ());
   else
-    sals = decode_line_1 (&arg, 1, (struct symtab *) NULL, 0, NULL);
+    sals = decode_line_1 (&arg, DECODE_LINE_FUNFIRSTLINE,
+                         (struct symtab *) NULL, 0);
 
   if (sals.nelts != 1)
     error (_("Couldn't get information on specified line."));
@@ -9662,12 +9723,13 @@ catch_exec_command_1 (char *arg, int from_tty,
                   &catch_exec_breakpoint_ops);
   c->exec_pathname = NULL;
 
-  install_breakpoint (&c->base);
+  install_breakpoint (0, &c->base, 1);
 }
 
 static enum print_stop_action
 print_it_exception_catchpoint (bpstat bs)
 {
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b = bs->breakpoint_at;
   int bp_temp, bp_throw;
 
@@ -9702,6 +9764,7 @@ print_one_exception_catchpoint (struct breakpoint *b,
                                struct bp_location **last_loc)
 {
   struct value_print_options opts;
+  struct ui_out *uiout = current_uiout;
 
   get_user_print_options (&opts);
   if (opts.addressprint)
@@ -9725,6 +9788,7 @@ print_one_exception_catchpoint (struct breakpoint *b,
 static void
 print_mention_exception_catchpoint (struct breakpoint *b)
 {
+  struct ui_out *uiout = current_uiout;
   int bp_temp;
   int bp_throw;
 
@@ -9751,24 +9815,10 @@ print_recreate_exception_catchpoint (struct breakpoint *b,
   bp_throw = strstr (b->addr_string, "throw") != NULL;
   fprintf_unfiltered (fp, bp_temp ? "tcatch " : "catch ");
   fprintf_unfiltered (fp, bp_throw ? "throw" : "catch");
+  print_recreate_thread (b, fp);
 }
 
-static struct breakpoint_ops gnu_v3_exception_catchpoint_ops = {
-  bkpt_dtor,
-  bkpt_allocate_location,
-  bkpt_re_set,
-  bkpt_insert_location,
-  bkpt_remove_location,
-  bkpt_breakpoint_hit,
-  bkpt_check_status,
-  bkpt_resources_needed,
-  null_works_in_software_mode,
-  print_it_exception_catchpoint,
-  print_one_exception_catchpoint,
-  null_print_one_detail,
-  print_mention_exception_catchpoint,
-  print_recreate_exception_catchpoint
-};
+static struct breakpoint_ops gnu_v3_exception_catchpoint_ops;
 
 static int
 handle_gnu_v3_exceptions (int tempflag, char *cond_string,
@@ -9846,7 +9896,7 @@ init_ada_exception_breakpoint (struct breakpoint *b,
                               struct gdbarch *gdbarch,
                               struct symtab_and_line sal,
                               char *addr_string,
-                              struct breakpoint_ops *ops,
+                              const struct breakpoint_ops *ops,
                               int tempflag,
                               int from_tty)
 {
@@ -9876,21 +9926,13 @@ init_ada_exception_breakpoint (struct breakpoint *b,
   b->language = language_ada;
 }
 
-/* Cleanup function for a syscall filter list.  */
-static void
-clean_up_filters (void *arg)
-{
-  VEC(int) *iter = *(VEC(int) **) arg;
-  VEC_free (int, iter);
-}
-
 /* Splits the argument using space as delimiter.  Returns an xmalloc'd
    filter list, or NULL if no filtering is required.  */
 static VEC(int) *
 catch_syscall_split_args (char *arg)
 {
   VEC(int) *result = NULL;
-  struct cleanup *cleanup = make_cleanup (clean_up_filters, &result);
+  struct cleanup *cleanup = make_cleanup (VEC_cleanup (int), &result);
 
   while (*arg != '\0')
     {
@@ -9987,22 +10029,46 @@ tcatch_command (char *arg, int from_tty)
   error (_("Catch requires an event name."));
 }
 
+/* A qsort comparison function that sorts breakpoints in order.  */
+
+static int
+compare_breakpoints (const void *a, const void *b)
+{
+  const breakpoint_p *ba = a;
+  uintptr_t ua = (uintptr_t) *ba;
+  const breakpoint_p *bb = b;
+  uintptr_t ub = (uintptr_t) *bb;
+
+  if ((*ba)->number < (*bb)->number)
+    return -1;
+  else if ((*ba)->number > (*bb)->number)
+    return 1;
+
+  /* Now sort by address, in case we see, e..g, two breakpoints with
+     the number 0.  */
+  if (ua < ub)
+    return -1;
+  return ub > ub ? 1 : 0;
+}
+
 /* Delete breakpoints by address or line.  */
 
 static void
 clear_command (char *arg, int from_tty)
 {
-  struct breakpoint *b;
+  struct breakpoint *b, *prev;
   VEC(breakpoint_p) *found = 0;
   int ix;
   int default_match;
   struct symtabs_and_lines sals;
   struct symtab_and_line sal;
   int i;
+  struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
 
   if (arg)
     {
-      sals = decode_line_spec (arg, 1);
+      sals = decode_line_spec (arg, (DECODE_LINE_FUNFIRSTLINE
+                                    | DECODE_LINE_LIST_MODE));
       default_match = 0;
     }
   else
@@ -10011,10 +10077,11 @@ clear_command (char *arg, int from_tty)
        xmalloc (sizeof (struct symtab_and_line));
       make_cleanup (xfree, sals.sals);
       init_sal (&sal);         /* Initialize to zeroes.  */
-      sal.line = default_breakpoint_line;
-      sal.symtab = default_breakpoint_symtab;
-      sal.pc = default_breakpoint_address;
-      sal.pspace = default_breakpoint_pspace;
+
+      /* Set sal's line, symtab, pc, and pspace to the values
+        corresponding to the last call to print_frame_info.  If the
+        codepoint is not valid, this will set all the fields to 0.  */
+      get_last_displayed_sal (&sal);
       if (sal.symtab == 0)
        error (_("No source file specified."));
 
@@ -10047,6 +10114,7 @@ clear_command (char *arg, int from_tty)
      breakpoint.  */
 
   found = NULL;
+  make_cleanup (VEC_cleanup (breakpoint_p), &found);
   for (i = 0; i < sals.nelts; i++)
     {
       /* If exact pc given, clear bpts at that pc.
@@ -10073,18 +10141,21 @@ clear_command (char *arg, int from_tty)
              struct bp_location *loc = b->loc;
              for (; loc; loc = loc->next)
                {
-                 int pc_match = sal.pc
-                   && (loc->pspace == sal.pspace)
-                   && (loc->address == sal.pc)
-                   && (!section_is_overlay (loc->section)
-                       || loc->section == sal.section);
-                 int line_match = ((default_match || (0 == sal.pc))
-                                   && b->source_file != NULL
+                 /* If the user specified file:line, don't allow a PC
+                    match.  This matches historical gdb behavior.  */
+                 int pc_match = (!sal.explicit_line
+                                 && sal.pc
+                                 && (loc->pspace == sal.pspace)
+                                 && (loc->address == sal.pc)
+                                 && (!section_is_overlay (loc->section)
+                                     || loc->section == sal.section));
+                 int line_match = ((default_match || sal.explicit_line)
+                                   && loc->source_file != NULL
                                    && sal.symtab != NULL
                                    && sal.pspace == loc->pspace
-                                   && filename_cmp (b->source_file,
+                                   && filename_cmp (loc->source_file,
                                                     sal.symtab->filename) == 0
-                                   && b->line_number == sal.line);
+                                   && loc->line_number == sal.line);
                  if (pc_match || line_match)
                    {
                      match = 1;
@@ -10097,6 +10168,7 @@ clear_command (char *arg, int from_tty)
            VEC_safe_push(breakpoint_p, found, b);
        }
     }
+
   /* Now go thru the 'found' chain and delete them.  */
   if (VEC_empty(breakpoint_p, found))
     {
@@ -10106,6 +10178,21 @@ clear_command (char *arg, int from_tty)
        error (_("No breakpoint at this line."));
     }
 
+  /* Remove duplicates from the vec.  */
+  qsort (VEC_address (breakpoint_p, found),
+        VEC_length (breakpoint_p, found),
+        sizeof (breakpoint_p),
+        compare_breakpoints);
+  prev = VEC_index (breakpoint_p, found, 0);
+  for (ix = 1; VEC_iterate (breakpoint_p, found, ix, b); ++ix)
+    {
+      if (b == prev)
+       {
+         VEC_ordered_remove (breakpoint_p, found, ix);
+         --ix;
+       }
+    }
+
   if (VEC_length(breakpoint_p, found) > 1)
     from_tty = 1;      /* Always report if deleted more than one.  */
   if (from_tty)
@@ -10125,6 +10212,8 @@ clear_command (char *arg, int from_tty)
     }
   if (from_tty)
     putchar_unfiltered ('\n');
+
+  do_cleanups (cleanups);
 }
 \f
 /* Delete breakpoint in BS if they are `delete' breakpoints and
@@ -10218,6 +10307,72 @@ bp_location_target_extensions_update (void)
     }
 }
 
+/* Download tracepoint locations if they haven't been.  */
+
+static void
+download_tracepoint_locations (void)
+{
+  struct bp_location *bl, **blp_tmp;
+  struct cleanup *old_chain;
+
+  if (!target_can_download_tracepoint ())
+    return;
+
+  old_chain = save_current_space_and_thread ();
+
+  ALL_BP_LOCATIONS (bl, blp_tmp)
+    {
+      struct tracepoint *t;
+
+      if (!is_tracepoint (bl->owner))
+       continue;
+
+      if ((bl->owner->type == bp_fast_tracepoint
+          ? !may_insert_fast_tracepoints
+          : !may_insert_tracepoints))
+       continue;
+
+      /* In tracepoint, locations are _never_ duplicated, so
+        should_be_inserted is equivalent to
+        unduplicated_should_be_inserted.  */
+      if (!should_be_inserted (bl) || bl->inserted)
+       continue;
+
+      switch_to_program_space_and_thread (bl->pspace);
+
+      target_download_tracepoint (bl);
+
+      bl->inserted = 1;
+      t = (struct tracepoint *) bl->owner;
+      t->number_on_target = bl->owner->number;
+    }
+
+  do_cleanups (old_chain);
+}
+
+/* Swap the insertion/duplication state between two locations.  */
+
+static void
+swap_insertion (struct bp_location *left, struct bp_location *right)
+{
+  const int left_inserted = left->inserted;
+  const int left_duplicate = left->duplicate;
+  const struct bp_target_info left_target_info = left->target_info;
+
+  /* Locations of tracepoints can never be duplicated.  */
+  if (is_tracepoint (left->owner))
+    gdb_assert (!left->duplicate);
+  if (is_tracepoint (right->owner))
+    gdb_assert (!right->duplicate);
+
+  left->inserted = right->inserted;
+  left->duplicate = right->duplicate;
+  left->target_info = right->target_info;
+  right->inserted = left_inserted;
+  right->duplicate = left_duplicate;
+  right->target_info = left_target_info;
+}
+
 /* If SHOULD_INSERT is false, do not insert any breakpoint locations
    into the inferior, only remove already-inserted locations that no
    longer should be inserted.  Functions that delete a breakpoint or
@@ -10354,11 +10509,6 @@ update_global_location_list (int should_insert)
 
                      if (breakpoint_locations_match (loc2, old_loc))
                        {
-                         /* For the sake of should_be_inserted.
-                            Duplicates check below will fix up this
-                            later.  */
-                         loc2->duplicate = 0;
-
                          /* Read watchpoint locations are switched to
                             access watchpoints, if the former are not
                             supported, but the latter are.  */
@@ -10368,10 +10518,13 @@ update_global_location_list (int should_insert)
                              loc2->watchpoint_type = old_loc->watchpoint_type;
                            }
 
-                         if (loc2 != old_loc && should_be_inserted (loc2))
+                         /* loc2 is a duplicated location. We need to check
+                            if it should be inserted in case it will be
+                            unduplicated.  */
+                         if (loc2 != old_loc
+                             && unduplicated_should_be_inserted (loc2))
                            {
-                             loc2->inserted = 1;
-                             loc2->target_info = old_loc->target_info;
+                             swap_insertion (old_loc, loc2);
                              keep_in_target = 1;
                              break;
                            }
@@ -10482,15 +10635,14 @@ update_global_location_list (int should_insert)
     {
       /* ALL_BP_LOCATIONS bp_location has LOC->OWNER always
         non-NULL.  */
-      struct breakpoint *b = loc->owner;
       struct bp_location **loc_first_p;
+      b = loc->owner;
 
-      if (b->enable_state == bp_disabled
-         || b->enable_state == bp_call_disabled
-         || b->enable_state == bp_startup_disabled
-         || !loc->enabled
-         || loc->shlib_disabled
+      if (!should_be_inserted (loc)
          || !breakpoint_address_is_meaningful (b)
+         /* Don't detect duplicate for tracepoint locations because they are
+          never duplicated.  See the comments in field `duplicate' of
+          `struct bp_location'.  */
          || is_tracepoint (b))
        continue;
 
@@ -10518,6 +10670,12 @@ update_global_location_list (int should_insert)
          continue;
        }
 
+
+      /* This and the above ensure the invariant that the first location
+        is not duplicated, and is the inserted one.
+        All following are marked as duplicated, and are not inserted.  */
+      if (loc->inserted)
+       swap_insertion (loc, *loc_first_p);
       loc->duplicate = 1;
 
       if ((*loc_first_p)->owner->enable_state == bp_permanent && loc->inserted
@@ -10532,6 +10690,9 @@ update_global_location_list (int should_insert)
          || (gdbarch_has_global_breakpoints (target_gdbarch))))
     insert_breakpoint_locations ();
 
+  if (should_insert)
+    download_tracepoint_locations ();
+
   do_cleanups (cleanups);
 }
 
@@ -10591,6 +10752,7 @@ bpstat_remove_breakpoint_callback (struct thread_info *th, void *data)
 static void
 say_where (struct breakpoint *b)
 {
+  struct ui_out *uiout = current_uiout;
   struct value_print_options opts;
 
   get_user_print_options (&opts);
@@ -10603,15 +10765,25 @@ say_where (struct breakpoint *b)
     }
   else
     {
-      if (opts.addressprint || b->source_file == NULL)
+      if (opts.addressprint || b->loc->source_file == NULL)
        {
          printf_filtered (" at ");
          fputs_filtered (paddress (b->loc->gdbarch, b->loc->address),
                          gdb_stdout);
        }
-      if (b->source_file)
-       printf_filtered (": file %s, line %d.",
-                        b->source_file, b->line_number);
+      if (b->loc->source_file)
+       {
+         /* If there is a single location, we can print the location
+            more nicely.  */
+         if (b->loc->next == NULL)
+           printf_filtered (": file %s, line %d.",
+                            b->loc->source_file, b->loc->line_number);
+         else
+           /* This is not ideal, but each location may have a
+              different file name, and this at least reflects the
+              real situation somewhat.  */
+           printf_filtered (": %s.", b->addr_string);
+       }
 
       if (b->loc->next)
        {
@@ -10624,93 +10796,145 @@ say_where (struct breakpoint *b)
     }
 }
 
-/* Default breakpoint_ops methods that do nothing.  */
+/* Default bp_location_ops methods.  */
 
-void
-null_re_set (struct breakpoint *b)
+static void
+bp_location_dtor (struct bp_location *self)
 {
-  /* Nothing to re-set. */
+  xfree (self->cond);
+  xfree (self->function_name);
+  xfree (self->source_file);
 }
 
-void
-null_check_status (bpstat bs)
+static const struct bp_location_ops bp_location_ops =
 {
-  /* nothing */
-}
+  bp_location_dtor
+};
+
+/* Default breakpoint_ops methods all breakpoint_ops ultimately
+   inherit from.  */
+
+static void
+base_breakpoint_dtor (struct breakpoint *self)
+{
+  decref_counted_command_line (&self->commands);
+  xfree (self->cond_string);
+  xfree (self->addr_string);
+  xfree (self->filter);
+  xfree (self->addr_string_range_end);
+}
+
+static struct bp_location *
+base_breakpoint_allocate_location (struct breakpoint *self)
+{
+  struct bp_location *loc;
+
+  loc = XNEW (struct bp_location);
+  init_bp_location (loc, &bp_location_ops, self);
+  return loc;
+}
+
+static void
+base_breakpoint_re_set (struct breakpoint *b)
+{
+  /* Nothing to re-set. */
+}
+
+#define internal_error_pure_virtual_called() \
+  gdb_assert_not_reached ("pure virtual function called")
+
+static int
+base_breakpoint_insert_location (struct bp_location *bl)
+{
+  internal_error_pure_virtual_called ();
+}
+
+static int
+base_breakpoint_remove_location (struct bp_location *bl)
+{
+  internal_error_pure_virtual_called ();
+}
+
+static int
+base_breakpoint_breakpoint_hit (const struct bp_location *bl,
+                               struct address_space *aspace,
+                               CORE_ADDR bp_addr)
+{
+  internal_error_pure_virtual_called ();
+}
+
+static void
+base_breakpoint_check_status (bpstat bs)
+{
+  /* Always stop.   */
+}
 
 /* A "works_in_software_mode" breakpoint_ops method that just internal
    errors.  */
 
-int
-null_works_in_software_mode (const struct breakpoint *b)
+static int
+base_breakpoint_works_in_software_mode (const struct breakpoint *b)
 {
-  gdb_assert_not_reached ("null_works_in_software_mode called");
+  internal_error_pure_virtual_called ();
 }
 
 /* A "resources_needed" breakpoint_ops method that just internal
    errors.  */
 
-int
-null_resources_needed (const struct bp_location *bl)
+static int
+base_breakpoint_resources_needed (const struct bp_location *bl)
 {
-  gdb_assert_not_reached ("null_resources_needed");
+  internal_error_pure_virtual_called ();
 }
 
-void
-null_print_one_detail (const struct breakpoint *self,
-                      struct ui_out *uiout)
+static enum print_stop_action
+base_breakpoint_print_it (bpstat bs)
 {
-  /* nothing */
+  internal_error_pure_virtual_called ();
 }
 
-/* Default bp_location_ops methods.  */
-
 static void
-bp_location_dtor (struct bp_location *self)
+base_breakpoint_print_one_detail (const struct breakpoint *self,
+                                 struct ui_out *uiout)
 {
-  xfree (self->cond);
-  xfree (self->function_name);
+  /* nothing */
 }
 
-static const struct bp_location_ops bp_location_ops =
+static void
+base_breakpoint_print_mention (struct breakpoint *b)
 {
-  bp_location_dtor
-};
-
-/* Default breakpoint_ops methods.  */
+  internal_error_pure_virtual_called ();
+}
 
-void
-bkpt_dtor (struct breakpoint *self)
+static void
+base_breakpoint_print_recreate (struct breakpoint *b, struct ui_file *fp)
 {
-  decref_counted_command_line (&self->commands);
-  xfree (self->cond_string);
-  xfree (self->cond_exp);
-  xfree (self->addr_string);
-  xfree (self->addr_string_range_end);
-  xfree (self->exp);
-  xfree (self->exp_string);
-  xfree (self->exp_string_reparse);
-  value_free (self->val);
-  xfree (self->source_file);
+  internal_error_pure_virtual_called ();
 }
 
-struct bp_location *
-bkpt_allocate_location (struct breakpoint *self)
+static struct breakpoint_ops base_breakpoint_ops =
 {
-  struct bp_location *loc;
+  base_breakpoint_dtor,
+  base_breakpoint_allocate_location,
+  base_breakpoint_re_set,
+  base_breakpoint_insert_location,
+  base_breakpoint_remove_location,
+  base_breakpoint_breakpoint_hit,
+  base_breakpoint_check_status,
+  base_breakpoint_resources_needed,
+  base_breakpoint_works_in_software_mode,
+  base_breakpoint_print_it,
+  NULL,
+  base_breakpoint_print_one_detail,
+  base_breakpoint_print_mention,
+  base_breakpoint_print_recreate
+};
 
-  loc = XNEW (struct bp_location);
-  init_bp_location (loc, &bp_location_ops, self);
-  return loc;
-}
+/* Default breakpoint_ops methods.  */
 
-void
+static void
 bkpt_re_set (struct breakpoint *b)
 {
-  /* Do not attempt to re-set breakpoints disabled during startup.  */
-  if (b->enable_state == bp_startup_disabled)
-    return;
-
   /* FIXME: is this still reachable?  */
   if (b->addr_string == NULL)
     {
@@ -10722,7 +10946,7 @@ bkpt_re_set (struct breakpoint *b)
   breakpoint_re_set_default (b);
 }
 
-int
+static int
 bkpt_insert_location (struct bp_location *bl)
 {
   if (bl->loc_type == bp_loc_hardware_breakpoint)
@@ -10733,7 +10957,7 @@ bkpt_insert_location (struct bp_location *bl)
                                     &bl->target_info);
 }
 
-int
+static int
 bkpt_remove_location (struct bp_location *bl)
 {
   if (bl->loc_type == bp_loc_hardware_breakpoint)
@@ -10742,7 +10966,7 @@ bkpt_remove_location (struct bp_location *bl)
     return target_remove_breakpoint (bl->gdbarch, &bl->target_info);
 }
 
-int
+static int
 bkpt_breakpoint_hit (const struct bp_location *bl,
                     struct address_space *aspace, CORE_ADDR bp_addr)
 {
@@ -10760,13 +10984,7 @@ bkpt_breakpoint_hit (const struct bp_location *bl,
   return 1;
 }
 
-void
-bkpt_check_status (bpstat bs)
-{
-  /* nothing, always stop */
-}
-
-int
+static int
 bkpt_resources_needed (const struct bp_location *bl)
 {
   gdb_assert (bl->owner->type == bp_hardware_breakpoint);
@@ -10774,68 +10992,45 @@ bkpt_resources_needed (const struct bp_location *bl)
   return 1;
 }
 
-int
-bkpt_works_in_software_mode (const struct breakpoint *b)
-{
-  gdb_assert_not_reached ("bkpt_works_in_software_mode called");
-}
-
-enum print_stop_action
+static enum print_stop_action
 bkpt_print_it (bpstat bs)
 {
-  struct cleanup *old_chain;
   struct breakpoint *b;
   const struct bp_location *bl;
-  struct ui_stream *stb;
-  int bp_temp = 0;
-  enum print_stop_action result;
+  int bp_temp;
+  struct ui_out *uiout = current_uiout;
 
   gdb_assert (bs->bp_location_at != NULL);
 
   bl = bs->bp_location_at;
   b = bs->breakpoint_at;
 
-  stb = ui_out_stream_new (uiout);
-  old_chain = make_cleanup_ui_out_stream_delete (stb);
-
-  switch (b->type)
+  bp_temp = b->disposition == disp_del;
+  if (bl->address != bl->requested_address)
+    breakpoint_adjustment_warning (bl->requested_address,
+                                  bl->address,
+                                  b->number, 1);
+  annotate_breakpoint (b->number);
+  if (bp_temp)
+    ui_out_text (uiout, "\nTemporary breakpoint ");
+  else
+    ui_out_text (uiout, "\nBreakpoint ");
+  if (ui_out_is_mi_like_p (uiout))
     {
-    case bp_breakpoint:
-    case bp_hardware_breakpoint:
-      bp_temp = b->disposition == disp_del;
-      if (bl->address != bl->requested_address)
-       breakpoint_adjustment_warning (bl->requested_address,
-                                      bl->address,
-                                      b->number, 1);
-      annotate_breakpoint (b->number);
-      if (bp_temp)
-       ui_out_text (uiout, "\nTemporary breakpoint ");
-      else
-       ui_out_text (uiout, "\nBreakpoint ");
-      if (ui_out_is_mi_like_p (uiout))
-       {
-         ui_out_field_string (uiout, "reason",
-                         async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT));
-         ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
-       }
-      ui_out_field_int (uiout, "bkptno", b->number);
-      ui_out_text (uiout, ", ");
-      result = PRINT_SRC_AND_LOC;
-      break;
-
-    default:
-      result = PRINT_UNKNOWN;
-      break;
+      ui_out_field_string (uiout, "reason",
+                          async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT));
+      ui_out_field_string (uiout, "disp", bpdisp_text (b->disposition));
     }
+  ui_out_field_int (uiout, "bkptno", b->number);
+  ui_out_text (uiout, ", ");
 
-  do_cleanups (old_chain);
-  return result;
+  return PRINT_SRC_AND_LOC;
 }
 
-void
+static void
 bkpt_print_mention (struct breakpoint *b)
 {
-  if (ui_out_is_mi_like_p (uiout))
+  if (ui_out_is_mi_like_p (current_uiout))
     return;
 
   switch (b->type)
@@ -10858,7 +11053,7 @@ bkpt_print_mention (struct breakpoint *b)
   say_where (b);
 }
 
-void
+static void
 bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
 {
   if (tp->type == bp_breakpoint && tp->disposition == disp_del)
@@ -10874,39 +11069,10 @@ bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
     internal_error (__FILE__, __LINE__,
                    _("unhandled breakpoint type %d"), (int) tp->type);
 
-  if (tp->exp_string)
-    fprintf_unfiltered (fp, " %s", tp->exp_string);
-  else if (tp->addr_string)
-    fprintf_unfiltered (fp, " %s", tp->addr_string);
-  else
-    {
-      char tmp[40];
-
-      sprintf_vma (tmp, tp->loc->address);
-      fprintf_unfiltered (fp, " *0x%s", tmp);
-    }
+  fprintf_unfiltered (fp, " %s", tp->addr_string);
+  print_recreate_thread (tp, fp);
 }
 
-/* The breakpoint_ops structure to be used in regular breakpoints.  */
-
-struct breakpoint_ops bkpt_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  bkpt_re_set,
-  bkpt_insert_location,
-  bkpt_remove_location,
-  bkpt_breakpoint_hit,
-  bkpt_check_status,
-  bkpt_resources_needed,
-  null_works_in_software_mode,
-  bkpt_print_it,
-  NULL, /* print_one */
-  null_print_one_detail,
-  bkpt_print_mention,
-  bkpt_print_recreate
-};
-
 /* Virtual table for internal breakpoints.  */
 
 static void
@@ -10944,71 +11110,53 @@ internal_bkpt_check_status (bpstat bs)
 static enum print_stop_action
 internal_bkpt_print_it (bpstat bs)
 {
-  struct cleanup *old_chain;
+  struct ui_out *uiout = current_uiout;
   struct breakpoint *b;
-  const struct bp_location *bl;
-  struct ui_stream *stb;
-  int bp_temp = 0;
-  enum print_stop_action result;
-
-  gdb_assert (bs->bp_location_at != NULL);
 
-  bl = bs->bp_location_at;
   b = bs->breakpoint_at;
 
-  stb = ui_out_stream_new (uiout);
-  old_chain = make_cleanup_ui_out_stream_delete (stb);
-
   switch (b->type)
     {
     case bp_shlib_event:
       /* Did we stop because the user set the stop_on_solib_events
         variable?  (If so, we report this as a generic, "Stopped due
         to shlib event" message.) */
-      printf_filtered (_("Stopped due to shared library event\n"));
-      result = PRINT_NOTHING;
+      ui_out_text (uiout, _("Stopped due to shared library event\n"));
+      if (ui_out_is_mi_like_p (uiout))
+       ui_out_field_string (uiout, "reason",
+                            async_reason_lookup (EXEC_ASYNC_SOLIB_EVENT));
       break;
 
     case bp_thread_event:
       /* Not sure how we will get here.
         GDB should not stop for these breakpoints.  */
       printf_filtered (_("Thread Event Breakpoint: gdb should not stop!\n"));
-      result = PRINT_NOTHING;
       break;
 
     case bp_overlay_event:
       /* By analogy with the thread event, GDB should not stop for these.  */
       printf_filtered (_("Overlay Event Breakpoint: gdb should not stop!\n"));
-      result = PRINT_NOTHING;
       break;
 
     case bp_longjmp_master:
       /* These should never be enabled.  */
       printf_filtered (_("Longjmp Master Breakpoint: gdb should not stop!\n"));
-      result = PRINT_NOTHING;
       break;
 
     case bp_std_terminate_master:
       /* These should never be enabled.  */
       printf_filtered (_("std::terminate Master Breakpoint: "
                         "gdb should not stop!\n"));
-      result = PRINT_NOTHING;
       break;
 
     case bp_exception_master:
       /* These should never be enabled.  */
       printf_filtered (_("Exception Master Breakpoint: "
                         "gdb should not stop!\n"));
-      result = PRINT_NOTHING;
-      break;
-
-    default:
-      result = PRINT_UNKNOWN;
       break;
     }
 
-  do_cleanups (old_chain);
-  return result;
+  return PRINT_NOTHING;
 }
 
 static void
@@ -11017,33 +11165,6 @@ internal_bkpt_print_mention (struct breakpoint *b)
   /* Nothing to mention.  These breakpoints are internal.  */
 }
 
-static void
-internal_bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
-{
-  gdb_assert_not_reached ("internal_bkpt_print_recreate called");
-}
-
-/* The breakpoint_ops structure to be used with internal
-   breakpoints.  */
-
-static struct breakpoint_ops internal_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  internal_bkpt_re_set,
-  bkpt_insert_location,
-  bkpt_remove_location,
-  bkpt_breakpoint_hit,
-  internal_bkpt_check_status,
-  bkpt_resources_needed,
-  null_works_in_software_mode,
-  internal_bkpt_print_it,
-  NULL, /* print_one */
-  null_print_one_detail,
-  internal_bkpt_print_mention,
-  internal_bkpt_print_recreate
-};
-
 /* Virtual table for momentary breakpoints  */
 
 static void
@@ -11064,46 +11185,29 @@ momentary_bkpt_check_status (bpstat bs)
 static enum print_stop_action
 momentary_bkpt_print_it (bpstat bs)
 {
-  struct cleanup *old_chain;
-  struct breakpoint *b;
-  const struct bp_location *bl;
-  struct ui_stream *stb;
-  int bp_temp = 0;
-  enum print_stop_action result;
-
-  gdb_assert (bs->bp_location_at != NULL);
-
-  bl = bs->bp_location_at;
-  b = bs->breakpoint_at;
-
-  stb = ui_out_stream_new (uiout);
-  old_chain = make_cleanup_ui_out_stream_delete (stb);
+  struct ui_out *uiout = current_uiout;
 
-  switch (b->type)
+  if (ui_out_is_mi_like_p (uiout))
     {
-    case bp_finish:
-      if (ui_out_is_mi_like_p (uiout))
-       ui_out_field_string
-         (uiout, "reason",
-          async_reason_lookup (EXEC_ASYNC_FUNCTION_FINISHED));
-      result = PRINT_UNKNOWN;
-      break;
+      struct breakpoint *b = bs->breakpoint_at;
 
-    case bp_until:
-      if (ui_out_is_mi_like_p (uiout))
-       ui_out_field_string
-         (uiout, "reason",
-          async_reason_lookup (EXEC_ASYNC_LOCATION_REACHED));
-      result = PRINT_UNKNOWN;
-      break;
+      switch (b->type)
+       {
+       case bp_finish:
+         ui_out_field_string
+           (uiout, "reason",
+            async_reason_lookup (EXEC_ASYNC_FUNCTION_FINISHED));
+         break;
 
-    default:
-      result = PRINT_UNKNOWN;
-      break;
+       case bp_until:
+         ui_out_field_string
+           (uiout, "reason",
+            async_reason_lookup (EXEC_ASYNC_LOCATION_REACHED));
+         break;
+       }
     }
 
-  do_cleanups (old_chain);
-  return result;
+  return PRINT_UNKNOWN;
 }
 
 static void
@@ -11112,33 +11216,6 @@ momentary_bkpt_print_mention (struct breakpoint *b)
   /* Nothing to mention.  These breakpoints are internal.  */
 }
 
-static void
-momentary_bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
-{
-  gdb_assert_not_reached ("momentary_bkpt_print_recreate called");
-}
-
-/* The breakpoint_ops structure to be used with momentary
-   breakpoints.  */
-
-static struct breakpoint_ops momentary_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  momentary_bkpt_re_set,
-  bkpt_insert_location,
-  bkpt_remove_location,
-  bkpt_breakpoint_hit,
-  momentary_bkpt_check_status,
-  bkpt_resources_needed,
-  null_works_in_software_mode,
-  momentary_bkpt_print_it,
-  NULL, /* print_one */
-  null_print_one_detail,
-  momentary_bkpt_print_mention,
-  momentary_bkpt_print_recreate
-};
-
 /* The breakpoint_ops structure to be used in tracepoints.  */
 
 static void
@@ -11147,18 +11224,6 @@ tracepoint_re_set (struct breakpoint *b)
   breakpoint_re_set_default (b);
 }
 
-static int
-tracepoint_insert_location (struct bp_location *bl)
-{
-  gdb_assert_not_reached ("tracepoint_insert_location called");
-}
-
-static int
-tracepoint_remove_location (struct bp_location *bl)
-{
-  gdb_assert_not_reached ("tracepoint_remove_location called");
-}
-
 static int
 tracepoint_breakpoint_hit (const struct bp_location *bl,
                           struct address_space *aspace, CORE_ADDR bp_addr)
@@ -11168,35 +11233,18 @@ tracepoint_breakpoint_hit (const struct bp_location *bl,
   return 0;
 }
 
-static void
-tracepoint_check_status (bpstat bs)
-{
-  gdb_assert_not_reached ("tracepoint_check_status called");
-}
-
-static int
-tracepoint_works_in_software_mode (const struct breakpoint *b)
-{
-  gdb_assert_not_reached ("tracepoint_works_in_software_mode called");
-}
-
-static enum print_stop_action
-tracepoint_print_it (bpstat bs)
-{
-  gdb_assert_not_reached ("tracepoint_print_it called");
-}
-
 static void
 tracepoint_print_one_detail (const struct breakpoint *self,
                             struct ui_out *uiout)
 {
-  if (self->static_trace_marker_id)
+  struct tracepoint *tp = (struct tracepoint *) self;
+  if (tp->static_trace_marker_id)
     {
       gdb_assert (self->type == bp_static_tracepoint);
 
       ui_out_text (uiout, "\tmarker id is ");
       ui_out_field_string (uiout, "static-tracepoint-marker-string-id",
-                          self->static_trace_marker_id);
+                          tp->static_trace_marker_id);
       ui_out_text (uiout, "\n");
     }
 }
@@ -11204,7 +11252,7 @@ tracepoint_print_one_detail (const struct breakpoint *self,
 static void
 tracepoint_print_mention (struct breakpoint *b)
 {
-  if (ui_out_is_mi_like_p (uiout))
+  if (ui_out_is_mi_like_p (current_uiout))
     return;
 
   switch (b->type)
@@ -11230,38 +11278,28 @@ tracepoint_print_mention (struct breakpoint *b)
 }
 
 static void
-tracepoint_print_recreate (struct breakpoint *tp, struct ui_file *fp)
+tracepoint_print_recreate (struct breakpoint *self, struct ui_file *fp)
 {
-  if (tp->type == bp_fast_tracepoint)
+  struct tracepoint *tp = (struct tracepoint *) self;
+
+  if (self->type == bp_fast_tracepoint)
     fprintf_unfiltered (fp, "ftrace");
-  if (tp->type == bp_static_tracepoint)
+  if (self->type == bp_static_tracepoint)
     fprintf_unfiltered (fp, "strace");
-  else if (tp->type == bp_tracepoint)
+  else if (self->type == bp_tracepoint)
     fprintf_unfiltered (fp, "trace");
   else
     internal_error (__FILE__, __LINE__,
-                   _("unhandled tracepoint type %d"), (int) tp->type);
+                   _("unhandled tracepoint type %d"), (int) self->type);
 
-  fprintf_unfiltered (fp, " %s", tp->addr_string);
+  fprintf_unfiltered (fp, " %s", self->addr_string);
+  print_recreate_thread (self, fp);
+
+  if (tp->pass_count)
+    fprintf_unfiltered (fp, "  passcount %d\n", tp->pass_count);
 }
 
-struct breakpoint_ops tracepoint_breakpoint_ops =
-{
-  bkpt_dtor,
-  bkpt_allocate_location,
-  tracepoint_re_set,
-  tracepoint_insert_location,
-  tracepoint_remove_location,
-  tracepoint_breakpoint_hit,
-  tracepoint_check_status,
-  null_resources_needed,
-  tracepoint_works_in_software_mode,
-  tracepoint_print_it,
-  NULL, /* print_one */
-  tracepoint_print_one_detail,
-  tracepoint_print_mention,
-  tracepoint_print_recreate
-};
+struct breakpoint_ops tracepoint_breakpoint_ops;
 
 /* Delete a breakpoint and clean up all traces of it in the data
    structures.  */
@@ -11297,11 +11335,16 @@ delete_breakpoint (struct breakpoint *bpt)
   if (bpt->related_breakpoint != bpt)
     {
       struct breakpoint *related;
+      struct watchpoint *w;
 
       if (bpt->type == bp_watchpoint_scope)
-       watchpoint_del_at_next_stop (bpt->related_breakpoint);
+       w = (struct watchpoint *) bpt->related_breakpoint;
       else if (bpt->related_breakpoint->type == bp_watchpoint_scope)
-       watchpoint_del_at_next_stop (bpt);
+       w = (struct watchpoint *) bpt;
+      else
+       w = NULL;
+      if (w != NULL)
+       watchpoint_del_at_next_stop (w);
 
       /* Unlink bpt from the bpt->related_breakpoint ring.  */
       for (related = bpt; related->related_breakpoint != bpt;
@@ -11535,6 +11578,7 @@ ambiguous_names_p (struct bp_location *loc)
 static struct symtab_and_line
 update_static_tracepoint (struct breakpoint *b, struct symtab_and_line sal)
 {
+  struct tracepoint *tp = (struct tracepoint *) b;
   struct static_tracepoint_marker marker;
   CORE_ADDR pc;
   int i;
@@ -11545,13 +11589,13 @@ update_static_tracepoint (struct breakpoint *b, struct symtab_and_line sal)
 
   if (target_static_tracepoint_marker_at (pc, &marker))
     {
-      if (strcmp (b->static_trace_marker_id, marker.str_id) != 0)
+      if (strcmp (tp->static_trace_marker_id, marker.str_id) != 0)
        warning (_("static tracepoint %d changed probed marker from %s to %s"),
                 b->number,
-                b->static_trace_marker_id, marker.str_id);
+                tp->static_trace_marker_id, marker.str_id);
 
-      xfree (b->static_trace_marker_id);
-      b->static_trace_marker_id = xstrdup (marker.str_id);
+      xfree (tp->static_trace_marker_id);
+      tp->static_trace_marker_id = xstrdup (marker.str_id);
       release_static_tracepoint_marker (&marker);
 
       return sal;
@@ -11562,34 +11606,35 @@ update_static_tracepoint (struct breakpoint *b, struct symtab_and_line sal)
   if (!sal.explicit_pc
       && sal.line != 0
       && sal.symtab != NULL
-      && b->static_trace_marker_id != NULL)
+      && tp->static_trace_marker_id != NULL)
     {
       VEC(static_tracepoint_marker_p) *markers;
 
       markers
-       = target_static_tracepoint_markers_by_strid (b->static_trace_marker_id);
+       = target_static_tracepoint_markers_by_strid (tp->static_trace_marker_id);
 
       if (!VEC_empty(static_tracepoint_marker_p, markers))
        {
-         struct symtab_and_line sal;
+         struct symtab_and_line sal2;
          struct symbol *sym;
-         struct static_tracepoint_marker *marker;
+         struct static_tracepoint_marker *tpmarker;
+         struct ui_out *uiout = current_uiout;
 
-         marker = VEC_index (static_tracepoint_marker_p, markers, 0);
+         tpmarker = VEC_index (static_tracepoint_marker_p, markers, 0);
 
-         xfree (b->static_trace_marker_id);
-         b->static_trace_marker_id = xstrdup (marker->str_id);
+         xfree (tp->static_trace_marker_id);
+         tp->static_trace_marker_id = xstrdup (tpmarker->str_id);
 
          warning (_("marker for static tracepoint %d (%s) not "
                     "found at previous line number"),
-                  b->number, b->static_trace_marker_id);
+                  b->number, tp->static_trace_marker_id);
 
-         init_sal (&sal);
+         init_sal (&sal2);
 
-         sal.pc = marker->address;
+         sal2.pc = tpmarker->address;
 
-         sal = find_pc_line (marker->address, 0);
-         sym = find_pc_sect_function (marker->address, NULL);
+         sal2 = find_pc_line (tpmarker->address, 0);
+         sym = find_pc_sect_function (tpmarker->address, NULL);
          ui_out_text (uiout, "Now in ");
          if (sym)
            {
@@ -11597,36 +11642,37 @@ update_static_tracepoint (struct breakpoint *b, struct symtab_and_line sal)
                                   SYMBOL_PRINT_NAME (sym));
              ui_out_text (uiout, " at ");
            }
-         ui_out_field_string (uiout, "file", sal.symtab->filename);
+         ui_out_field_string (uiout, "file", sal2.symtab->filename);
          ui_out_text (uiout, ":");
 
          if (ui_out_is_mi_like_p (uiout))
            {
-             char *fullname = symtab_to_fullname (sal.symtab);
+             char *fullname = symtab_to_fullname (sal2.symtab);
 
              if (fullname)
                ui_out_field_string (uiout, "fullname", fullname);
            }
 
-         ui_out_field_int (uiout, "line", sal.line);
+         ui_out_field_int (uiout, "line", sal2.line);
          ui_out_text (uiout, "\n");
 
-         b->line_number = sal.line;
+         b->loc->line_number = sal2.line;
 
-         xfree (b->source_file);
+         xfree (b->loc->source_file);
          if (sym)
-           b->source_file = xstrdup (sal.symtab->filename);
+           b->loc->source_file = xstrdup (sal2.symtab->filename);
          else
-           b->source_file = NULL;
+           b->loc->source_file = NULL;
 
          xfree (b->addr_string);
          b->addr_string = xstrprintf ("%s:%d",
-                                      sal.symtab->filename, b->line_number);
+                                      sal2.symtab->filename,
+                                      b->loc->line_number);
 
          /* Might be nice to check if function changed, and warn if
             so.  */
 
-         release_static_tracepoint_marker (marker);
+         release_static_tracepoint_marker (tpmarker);
        }
     }
   return sal;
@@ -11671,8 +11717,17 @@ update_breakpoint_locations (struct breakpoint *b,
   int i;
   struct bp_location *existing_locations = b->loc;
 
-  /* Ranged breakpoints have only one start location and one end location.  */
-  gdb_assert (sals_end.nelts == 0 || (sals.nelts == 1 && sals_end.nelts == 1));
+  if (sals_end.nelts != 0 && (sals.nelts != 1 || sals_end.nelts != 1))
+    {
+      /* Ranged breakpoints have only one start location and one end
+        location.  */
+      b->enable_state = bp_disabled;
+      update_global_location_list (1);
+      printf_unfiltered (_("Could not reset ranged breakpoint %d: "
+                          "multiple locations found\n"),
+                        b->number);
+      return;
+    }
 
   /* If there's no new locations, and all existing locations are
      pending, don't do anything.  This optimizes the common case where
@@ -11687,8 +11742,11 @@ update_breakpoint_locations (struct breakpoint *b,
 
   for (i = 0; i < sals.nelts; ++i)
     {
-      struct bp_location *new_loc = 
-       add_location_to_breakpoint (b, &(sals.sals[i]));
+      struct bp_location *new_loc;
+
+      switch_to_program_space_and_thread (sals.sals[i].pspace);
+
+      new_loc = add_location_to_breakpoint (b, &(sals.sals[i]));
 
       /* Reparse conditions, they might contain references to the
         old symtab.  */
@@ -11712,16 +11770,6 @@ update_breakpoint_locations (struct breakpoint *b,
            }
        }
 
-      if (b->source_file != NULL)
-       xfree (b->source_file);
-      if (sals.sals[i].symtab == NULL)
-       b->source_file = NULL;
-      else
-       b->source_file = xstrdup (sals.sals[i].symtab->filename);
-
-      if (b->line_number == 0)
-       b->line_number = sals.sals[i].line;
-
       if (sals_end.nelts)
        {
          CORE_ADDR end = find_breakpoint_range_end (sals_end.sals[0]);
@@ -11788,7 +11836,7 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
   char *s;
   int marker_spec;
   struct symtabs_and_lines sals = {0};
-  struct gdb_exception e;
+  volatile struct gdb_exception e;
 
   s = addr_string;
   marker_spec = b->type == bp_static_tracepoint && is_marker_spec (s);
@@ -11797,17 +11845,43 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
     {
       if (marker_spec)
        {
+         struct tracepoint *tp = (struct tracepoint *) b;
+
          sals = decode_static_tracepoint_spec (&s);
-         if (sals.nelts > b->static_trace_marker_id_idx)
+         if (sals.nelts > tp->static_trace_marker_id_idx)
            {
-             sals.sals[0] = sals.sals[b->static_trace_marker_id_idx];
+             sals.sals[0] = sals.sals[tp->static_trace_marker_id_idx];
              sals.nelts = 1;
            }
          else
-           error (_("marker %s not found"), b->static_trace_marker_id);
+           error (_("marker %s not found"), tp->static_trace_marker_id);
        }
       else
-       sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, NULL);
+       {
+         struct linespec_result canonical;
+
+         init_linespec_result (&canonical);
+         decode_line_full (&s, DECODE_LINE_FUNFIRSTLINE,
+                           (struct symtab *) NULL, 0,
+                           &canonical, multiple_symbols_all,
+                           b->filter);
+
+         /* We should get 0 or 1 resulting SALs.  */
+         gdb_assert (VEC_length (linespec_sals, canonical.sals) < 2);
+
+         if (VEC_length (linespec_sals, canonical.sals) > 0)
+           {
+             struct linespec_sals *lsal;
+
+             lsal = VEC_index (linespec_sals, canonical.sals, 0);
+             sals = lsal->sals;
+             /* Arrange it so the destructor does not free the
+                contents.  */
+             lsal->sals.sals = NULL;
+           }
+
+         destroy_linespec_result (&canonical);
+       }
     }
   if (e.reason < 0)
     {
@@ -11822,6 +11896,7 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
       if (e.error == NOT_FOUND_ERROR
          && (b->condition_not_parsed 
              || (b->loc && b->loc->shlib_disabled)
+             || (b->loc && b->loc->pspace->executing_startup)
              || b->enable_state == bp_disabled))
        not_found_and_ok = 1;
 
@@ -11840,9 +11915,10 @@ addr_string_to_sals (struct breakpoint *b, char *addr_string, int *found)
 
   if (e.reason == 0 || e.error != NOT_FOUND_ERROR)
     {
-      gdb_assert (sals.nelts == 1);
+      int i;
 
-      resolve_sal_pc (&sals.sals[0]);
+      for (i = 0; i < sals.nelts; ++i)
+       resolve_sal_pc (&sals.sals[i]);
       if (b->condition_not_parsed && s && s[0])
        {
          char *cond_string = 0;
@@ -11885,7 +11961,7 @@ breakpoint_re_set_default (struct breakpoint *b)
   if (found)
     {
       make_cleanup (xfree, sals.sals);
-      expanded = expand_line_sal_maybe (sals.sals[0]);
+      expanded = sals;
     }
 
   if (b->addr_string_range_end)
@@ -11894,7 +11970,7 @@ breakpoint_re_set_default (struct breakpoint *b)
       if (found)
        {
          make_cleanup (xfree, sals_end.sals);
-         expanded_end = expand_line_sal_maybe (sals_end.sals[0]);
+         expanded_end = sals_end;
        }
     }
 
@@ -11910,7 +11986,8 @@ prepare_re_set_context (struct breakpoint *b)
 
   input_radix = b->input_radix;
   cleanups = save_current_space_and_thread ();
-  switch_to_program_space_and_thread (b->pspace);
+  if (b->pspace != NULL)
+    switch_to_program_space_and_thread (b->pspace);
   set_language (b->language);
 
   return cleanups;
@@ -11966,6 +12043,9 @@ breakpoint_re_set (void)
   create_longjmp_master_breakpoint ();
   create_std_terminate_master_breakpoint ();
   create_exception_master_breakpoint ();
+
+  /* While we're at it, reset the skip list too.  */
+  skip_re_set ();
 }
 \f
 /* Reset the thread number of this breakpoint:
@@ -12248,9 +12328,11 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition)
 
       TRY_CATCH (e, RETURN_MASK_ALL)
        {
+         struct watchpoint *w = (struct watchpoint *) bpt;
+
          orig_enable_state = bpt->enable_state;
          bpt->enable_state = bp_enabled;
-         update_watchpoint (bpt, 1 /* reparse */);
+         update_watchpoint (w, 1 /* reparse */);
        }
       if (e.reason < 0)
        {
@@ -12392,40 +12474,43 @@ invalidate_bp_value_on_memory_change (CORE_ADDR addr, int len,
 
   ALL_BREAKPOINTS (bp)
     if (bp->enable_state == bp_enabled
-       && bp->type == bp_hardware_watchpoint
-       && bp->val_valid && bp->val)
+       && bp->type == bp_hardware_watchpoint)
       {
-       struct bp_location *loc;
+       struct watchpoint *wp = (struct watchpoint *) bp;
 
-       for (loc = bp->loc; loc != NULL; loc = loc->next)
-         if (loc->loc_type == bp_loc_hardware_watchpoint
-             && loc->address + loc->length > addr
-             && addr + len > loc->address)
-           {
-             value_free (bp->val);
-             bp->val = NULL;
-             bp->val_valid = 0;
-           }
+       if (wp->val_valid && wp->val)
+         {
+           struct bp_location *loc;
+
+           for (loc = bp->loc; loc != NULL; loc = loc->next)
+             if (loc->loc_type == bp_loc_hardware_watchpoint
+                 && loc->address + loc->length > addr
+                 && addr + len > loc->address)
+               {
+                 value_free (wp->val);
+                 wp->val = NULL;
+                 wp->val_valid = 0;
+               }
+         }
       }
 }
 
-/* Use default_breakpoint_'s, or nothing if they aren't valid.  */
+/* Use the last displayed codepoint's values, or nothing
+   if they aren't valid.  */
 
 struct symtabs_and_lines
-decode_line_spec_1 (char *string, int funfirstline)
+decode_line_spec_1 (char *string, int flags)
 {
   struct symtabs_and_lines sals;
 
   if (string == 0)
     error (_("Empty line specification."));
-  if (default_breakpoint_valid)
-    sals = decode_line_1 (&string, funfirstline,
-                         default_breakpoint_symtab,
-                         default_breakpoint_line,
-                         NULL);
+  if (last_displayed_sal_is_valid ())
+    sals = decode_line_1 (&string, flags,
+                         get_last_displayed_symtab (),
+                         get_last_displayed_line ());
   else
-    sals = decode_line_1 (&string, funfirstline,
-                         (struct symtab *) NULL, 0, NULL);
+    sals = decode_line_1 (&string, flags, (struct symtab *) NULL, 0);
   if (*string)
     error (_("Junk at end of line specification: %s"), string);
   return sals;
@@ -12748,11 +12833,11 @@ read_uploaded_action (void)
    the target does not necessarily have all the information used when
    the tracepoint was originally defined.  */
   
-struct breakpoint *
+struct tracepoint *
 create_tracepoint_from_upload (struct uploaded_tp *utp)
 {
   char *addr_str, small_buf[100];
-  struct breakpoint *tp;
+  struct tracepoint *tp;
 
   if (utp->at_string)
     addr_str = utp->at_string;
@@ -12796,7 +12881,7 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
 
   if (utp->pass > 0)
     {
-      sprintf (small_buf, "%d %d", utp->pass, tp->number);
+      sprintf (small_buf, "%d %d", utp->pass, tp->base.number);
 
       trace_pass_command (small_buf, 0);
     }
@@ -12814,7 +12899,7 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
 
       cmd_list = read_command_lines_1 (read_uploaded_action, 1, NULL, NULL);
 
-      breakpoint_set_commands (tp, cmd_list);
+      breakpoint_set_commands (&tp->base, cmd_list);
     }
   else if (!VEC_empty (char_ptr, utp->actions)
           || !VEC_empty (char_ptr, utp->step_actions))
@@ -12822,8 +12907,12 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
               "have no source form, ignoring them"),
             utp->number);
 
+  /* Copy any status information that might be available.  */
+  tp->base.hit_count = utp->hit_count;
+  tp->traceframe_usage = utp->traceframe_usage;
+
   return tp;
-  }
+}
   
 /* Print information on tracepoint number TPNUM_EXP, or all if
    omitted.  */
@@ -12831,6 +12920,7 @@ create_tracepoint_from_upload (struct uploaded_tp *utp)
 static void
 tracepoints_info (char *args, int from_tty)
 {
+  struct ui_out *uiout = current_uiout;
   int num_printed;
 
   num_printed = breakpoint_1 (args, 0, is_tracepoint);
@@ -12901,13 +12991,13 @@ delete_trace_command (char *arg, int from_tty)
 /* Helper function for trace_pass_command.  */
 
 static void
-trace_pass_set_count (struct breakpoint *bp, int count, int from_tty)
+trace_pass_set_count (struct tracepoint *tp, int count, int from_tty)
 {
-  bp->pass_count = count;
-  observer_notify_tracepoint_modified (bp->number);
+  tp->pass_count = count;
+  observer_notify_tracepoint_modified (tp->base.number);
   if (from_tty)
     printf_filtered (_("Setting tracepoint %d's passcount to %d\n"),
-                    bp->number, count);
+                    tp->base.number, count);
 }
 
 /* Set passcount for tracepoint.
@@ -12919,7 +13009,7 @@ trace_pass_set_count (struct breakpoint *bp, int count, int from_tty)
 static void
 trace_pass_command (char *args, int from_tty)
 {
-  struct breakpoint *t1;
+  struct tracepoint *t1;
   unsigned int count;
 
   if (args == 0 || *args == 0)
@@ -12933,12 +13023,15 @@ trace_pass_command (char *args, int from_tty)
 
   if (*args && strncasecmp (args, "all", 3) == 0)
     {
+      struct breakpoint *b;
+
       args += 3;                       /* Skip special argument "all".  */
       if (*args)
        error (_("Junk at end of arguments."));
 
-      ALL_TRACEPOINTS (t1)
+      ALL_TRACEPOINTS (b)
       {
+       t1 = (struct tracepoint *) b;
        trace_pass_set_count (t1, count, from_tty);
       }
     }
@@ -12962,14 +13055,14 @@ trace_pass_command (char *args, int from_tty)
     }
 }
 
-struct breakpoint *
+struct tracepoint *
 get_tracepoint (int num)
 {
   struct breakpoint *t;
 
   ALL_TRACEPOINTS (t)
     if (t->number == num)
-      return t;
+      return (struct tracepoint *) t;
 
   return NULL;
 }
@@ -12978,14 +13071,18 @@ get_tracepoint (int num)
    different from the tracepoint number after disconnecting and
    reconnecting).  */
 
-struct breakpoint *
+struct tracepoint *
 get_tracepoint_by_number_on_target (int num)
 {
-  struct breakpoint *t;
+  struct breakpoint *b;
 
-  ALL_TRACEPOINTS (t)
-    if (t->number_on_target == num)
-      return t;
+  ALL_TRACEPOINTS (b)
+    {
+      struct tracepoint *t = (struct tracepoint *) b;
+
+      if (t->number_on_target == num)
+       return t;
+    }
 
   return NULL;
 }
@@ -12994,7 +13091,7 @@ get_tracepoint_by_number_on_target (int num)
    If STATE is not NULL, use, get_number_or_range_state and ignore ARG.
    If OPTIONAL_P is true, then if the argument is missing, the most
    recent tracepoint (tracepoint_count) is returned.  */
-struct breakpoint *
+struct tracepoint *
 get_tracepoint_by_number (char **arg,
                          struct get_number_or_range_state *state,
                          int optional_p)
@@ -13033,13 +13130,25 @@ get_tracepoint_by_number (char **arg,
   ALL_TRACEPOINTS (t)
     if (t->number == tpnum)
     {
-      return t;
+      return (struct tracepoint *) t;
     }
 
   printf_unfiltered ("No tracepoint number %d.\n", tpnum);
   return NULL;
 }
 
+void
+print_recreate_thread (struct breakpoint *b, struct ui_file *fp)
+{
+  if (b->thread != -1)
+    fprintf_unfiltered (fp, " thread %d", b->thread);
+
+  if (b->task != 0)
+    fprintf_unfiltered (fp, " task %d", b->task);
+
+  fprintf_unfiltered (fp, "\n");
+}
+
 /* Save information on user settable breakpoints (watchpoints, etc) to
    a new script file named FILENAME.  If FILTER is non-NULL, call it
    on each breakpoint and only include the ones for which it returns
@@ -13110,14 +13219,6 @@ save_breakpoints (char *filename, int from_tty,
 
     tp->ops->print_recreate (tp, fp);
 
-    if (tp->thread != -1)
-      fprintf_unfiltered (fp, " thread %d", tp->thread);
-
-    if (tp->task != 0)
-      fprintf_unfiltered (fp, " task %d", tp->task);
-
-    fprintf_unfiltered (fp, "\n");
-
     /* Note, we can't rely on tp->number for anything, as we can't
        assume the recreated breakpoint numbers will match.  Use $bpnum
        instead.  */
@@ -13128,21 +13229,18 @@ save_breakpoints (char *filename, int from_tty,
     if (tp->ignore_count)
       fprintf_unfiltered (fp, "  ignore $bpnum %d\n", tp->ignore_count);
 
-    if (tp->pass_count)
-      fprintf_unfiltered (fp, "  passcount %d\n", tp->pass_count);
-
     if (tp->commands)
       {
        volatile struct gdb_exception ex;       
 
        fprintf_unfiltered (fp, "  commands\n");
        
-       ui_out_redirect (uiout, fp);
+       ui_out_redirect (current_uiout, fp);
        TRY_CATCH (ex, RETURN_MASK_ALL)
          {
-           print_command_lines (uiout, tp->commands->commands, 2);
+           print_command_lines (current_uiout, tp->commands->commands, 2);
          }
-       ui_out_redirect (uiout, NULL);
+       ui_out_redirect (current_uiout, NULL);
 
        if (ex.reason < 0)
          throw_exception (ex);
@@ -13290,11 +13388,200 @@ iterate_over_breakpoints (int (*callback) (struct breakpoint *, void *),
   return NULL;
 }
 
+/* Zero if any of the breakpoint's locations could be a location where
+   functions have been inlined, nonzero otherwise.  */
+
+static int
+is_non_inline_function (struct breakpoint *b)
+{
+  /* The shared library event breakpoint is set on the address of a
+     non-inline function.  */
+  if (b->type == bp_shlib_event)
+    return 1;
+
+  return 0;
+}
+
+/* Nonzero if the specified PC cannot be a location where functions
+   have been inlined.  */
+
+int
+pc_at_non_inline_function (struct address_space *aspace, CORE_ADDR pc)
+{
+  struct breakpoint *b;
+  struct bp_location *bl;
+
+  ALL_BREAKPOINTS (b)
+    {
+      if (!is_non_inline_function (b))
+       continue;
+
+      for (bl = b->loc; bl != NULL; bl = bl->next)
+       {
+         if (!bl->shlib_disabled
+             && bpstat_check_location (bl, aspace, pc))
+           return 1;
+       }
+    }
+
+  return 0;
+}
+
+void
+initialize_breakpoint_ops (void)
+{
+  static int initialized = 0;
+
+  struct breakpoint_ops *ops;
+
+  if (initialized)
+    return;
+  initialized = 1;
+
+  /* The breakpoint_ops structure to be inherit by all kinds of
+     breakpoints (real breakpoints, i.e., user "break" breakpoints,
+     internal and momentary breakpoints, etc.).  */
+  ops = &bkpt_base_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->re_set = bkpt_re_set;
+  ops->insert_location = bkpt_insert_location;
+  ops->remove_location = bkpt_remove_location;
+  ops->breakpoint_hit = bkpt_breakpoint_hit;
+
+  /* The breakpoint_ops structure to be used in regular breakpoints.  */
+  ops = &bkpt_breakpoint_ops;
+  *ops = bkpt_base_breakpoint_ops;
+  ops->re_set = bkpt_re_set;
+  ops->resources_needed = bkpt_resources_needed;
+  ops->print_it = bkpt_print_it;
+  ops->print_mention = bkpt_print_mention;
+  ops->print_recreate = bkpt_print_recreate;
+
+  /* Ranged breakpoints.  */
+  ops = &ranged_breakpoint_ops;
+  *ops = bkpt_breakpoint_ops;
+  ops->breakpoint_hit = breakpoint_hit_ranged_breakpoint;
+  ops->resources_needed = resources_needed_ranged_breakpoint;
+  ops->print_it = print_it_ranged_breakpoint;
+  ops->print_one = print_one_ranged_breakpoint;
+  ops->print_one_detail = print_one_detail_ranged_breakpoint;
+  ops->print_mention = print_mention_ranged_breakpoint;
+  ops->print_recreate = print_recreate_ranged_breakpoint;
+
+  /* Internal breakpoints.  */
+  ops = &internal_breakpoint_ops;
+  *ops = bkpt_base_breakpoint_ops;
+  ops->re_set = internal_bkpt_re_set;
+  ops->check_status = internal_bkpt_check_status;
+  ops->print_it = internal_bkpt_print_it;
+  ops->print_mention = internal_bkpt_print_mention;
+
+  /* Momentary breakpoints.  */
+  ops = &momentary_breakpoint_ops;
+  *ops = bkpt_base_breakpoint_ops;
+  ops->re_set = momentary_bkpt_re_set;
+  ops->check_status = momentary_bkpt_check_status;
+  ops->print_it = momentary_bkpt_print_it;
+  ops->print_mention = momentary_bkpt_print_mention;
+
+  /* GNU v3 exception catchpoints.  */
+  ops = &gnu_v3_exception_catchpoint_ops;
+  *ops = bkpt_breakpoint_ops;
+  ops->print_it = print_it_exception_catchpoint;
+  ops->print_one = print_one_exception_catchpoint;
+  ops->print_mention = print_mention_exception_catchpoint;
+  ops->print_recreate = print_recreate_exception_catchpoint;
+
+  /* Watchpoints.  */
+  ops = &watchpoint_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->dtor = dtor_watchpoint;
+  ops->re_set = re_set_watchpoint;
+  ops->insert_location = insert_watchpoint;
+  ops->remove_location = remove_watchpoint;
+  ops->breakpoint_hit = breakpoint_hit_watchpoint;
+  ops->check_status = check_status_watchpoint;
+  ops->resources_needed = resources_needed_watchpoint;
+  ops->works_in_software_mode = works_in_software_mode_watchpoint;
+  ops->print_it = print_it_watchpoint;
+  ops->print_mention = print_mention_watchpoint;
+  ops->print_recreate = print_recreate_watchpoint;
+
+  /* Masked watchpoints.  */
+  ops = &masked_watchpoint_breakpoint_ops;
+  *ops = watchpoint_breakpoint_ops;
+  ops->insert_location = insert_masked_watchpoint;
+  ops->remove_location = remove_masked_watchpoint;
+  ops->resources_needed = resources_needed_masked_watchpoint;
+  ops->works_in_software_mode = works_in_software_mode_masked_watchpoint;
+  ops->print_it = print_it_masked_watchpoint;
+  ops->print_one_detail = print_one_detail_masked_watchpoint;
+  ops->print_mention = print_mention_masked_watchpoint;
+  ops->print_recreate = print_recreate_masked_watchpoint;
+
+  /* Tracepoints.  */
+  ops = &tracepoint_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->re_set = tracepoint_re_set;
+  ops->breakpoint_hit = tracepoint_breakpoint_hit;
+  ops->print_one_detail = tracepoint_print_one_detail;
+  ops->print_mention = tracepoint_print_mention;
+  ops->print_recreate = tracepoint_print_recreate;
+
+  /* Fork catchpoints.  */
+  ops = &catch_fork_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->insert_location = insert_catch_fork;
+  ops->remove_location = remove_catch_fork;
+  ops->breakpoint_hit = breakpoint_hit_catch_fork;
+  ops->print_it = print_it_catch_fork;
+  ops->print_one = print_one_catch_fork;
+  ops->print_mention = print_mention_catch_fork;
+  ops->print_recreate = print_recreate_catch_fork;
+
+  /* Vfork catchpoints.  */
+  ops = &catch_vfork_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->insert_location = insert_catch_vfork;
+  ops->remove_location = remove_catch_vfork;
+  ops->breakpoint_hit = breakpoint_hit_catch_vfork;
+  ops->print_it = print_it_catch_vfork;
+  ops->print_one = print_one_catch_vfork;
+  ops->print_mention = print_mention_catch_vfork;
+  ops->print_recreate = print_recreate_catch_vfork;
+
+  /* Exec catchpoints.  */
+  ops = &catch_exec_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->dtor = dtor_catch_exec;
+  ops->insert_location = insert_catch_exec;
+  ops->remove_location = remove_catch_exec;
+  ops->breakpoint_hit = breakpoint_hit_catch_exec;
+  ops->print_it = print_it_catch_exec;
+  ops->print_one = print_one_catch_exec;
+  ops->print_mention = print_mention_catch_exec;
+  ops->print_recreate = print_recreate_catch_exec;
+
+  /* Syscall catchpoints.  */
+  ops = &catch_syscall_breakpoint_ops;
+  *ops = base_breakpoint_ops;
+  ops->dtor = dtor_catch_syscall;
+  ops->insert_location = insert_catch_syscall;
+  ops->remove_location = remove_catch_syscall;
+  ops->breakpoint_hit = breakpoint_hit_catch_syscall;
+  ops->print_it = print_it_catch_syscall;
+  ops->print_one = print_one_catch_syscall;
+  ops->print_mention = print_mention_catch_syscall;
+  ops->print_recreate = print_recreate_catch_syscall;
+}
+
 void
 _initialize_breakpoint (void)
 {
   struct cmd_list_element *c;
 
+  initialize_breakpoint_ops ();
+
   observer_attach_solib_unloaded (disable_breakpoints_in_unloaded_shlib);
   observer_attach_inferior_exit (clear_syscall_counts);
   observer_attach_memory_changed (invalidate_bp_value_on_memory_change);
This page took 0.094078 seconds and 4 git commands to generate.