OSDN Git Service

2005-02-14 Andrew Cagney <cagney@gnu.org>
[pf3gnuchains/pf3gnuchains3x.git] / gdb / breakpoint.c
index 3c7ba46..ae5d79f 100644 (file)
@@ -1,7 +1,7 @@
 /* Everything about breakpoints, for GDB.
 
    Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -49,6 +49,9 @@
 #include "cli/cli-script.h"
 #include "gdb_assert.h"
 #include "block.h"
+#include "solist.h"
+#include "observer.h"
+#include "exceptions.h"
 
 #include "gdb-events.h"
 
@@ -84,11 +87,6 @@ static void watch_command (char *, int);
 
 static int can_use_hardware_watchpoint (struct value *);
 
-extern void break_at_finish_command (char *, int);
-extern void break_at_finish_at_depth_command (char *, int);
-
-extern void tbreak_at_finish_command (char *, int);
-
 static int break_command_1 (char *, int, int, struct breakpoint *);
 
 static void mention (struct breakpoint *);
@@ -99,7 +97,8 @@ static void check_duplicates (struct breakpoint *);
 
 static void breakpoint_adjustment_warning (CORE_ADDR, CORE_ADDR, int, int);
 
-static CORE_ADDR adjust_breakpoint_address (CORE_ADDR bpaddr);
+static CORE_ADDR adjust_breakpoint_address (CORE_ADDR bpaddr,
+                                            enum bptype bptype);
 
 static void describe_other_breakpoints (CORE_ADDR, asection *);
 
@@ -119,8 +118,6 @@ static void condition_command (char *, int);
 
 static int get_number_trailer (char **, int);
 
-static int do_captured_parse_breakpoint (struct ui_out *, void *);
-
 void set_breakpoint_count (int);
 
 typedef enum
@@ -178,11 +175,6 @@ static void create_fork_vfork_event_catchpoint (int tempflag,
                                                char *cond_string,
                                                enum bptype bp_kind);
 
-static void break_at_finish_at_depth_command_1 (char *arg,
-                                               int flag, int from_tty);
-
-static void break_at_finish_command_1 (char *arg, int flag, int from_tty);
-
 static void stop_command (char *arg, int from_tty);
 
 static void stopin_command (char *arg, int from_tty);
@@ -212,6 +204,12 @@ static void ep_skip_leading_whitespace (char **s);
    if such is available. */
 static int can_use_hw_watchpoints;
 
+/* If AUTO_BOOLEAN_FALSE, gdb will not attempt to create pending breakpoints.
+   If AUTO_BOOLEAN_TRUE, gdb will automatically create pending breakpoints
+   for unrecognized breakpoint locations.  
+   If AUTO_BOOLEAN_AUTO, gdb will query when breakpoints are unrecognized.  */
+static enum auto_boolean pending_break_support;
+
 void _initialize_breakpoint (void);
 
 extern int addressprint;       /* Print machine addresses? */
@@ -259,13 +257,13 @@ int breakpoint_count;
 /* Pointer to current exception event record */
 static struct exception_event_record *current_exception_event;
 
-/* Indicator of whether exception catchpoints should be nuked
-   between runs of a program */
-int exception_catchpoints_are_fragile = 0;
+/* Indicator of whether exception catchpoints should be nuked between
+   runs of a program.  */
+int deprecated_exception_catchpoints_are_fragile = 0;
 
 /* Indicator of when exception catchpoints set-up should be
-   reinitialized -- e.g. when program is re-run */
-int exception_support_initialized = 0;
+   reinitialized -- e.g. when program is re-run */
+int deprecated_exception_support_initialized = 0;
 
 /* This function returns a pointer to the string representation of the
    pathname of the dynamically-linked library that has just been
@@ -307,7 +305,7 @@ int exception_support_initialized = 0;
 
 #ifndef SOLIB_CREATE_CATCH_LOAD_HOOK
 #define SOLIB_CREATE_CATCH_LOAD_HOOK(pid,tempflag,filename,cond_string) \
-   error ("catch of library loads not yet implemented on this platform")
+   error (_("catch of library loads not yet implemented on this platform"))
 #endif
 
 /* This function is called by the "catch unload" command.  It allows
@@ -316,8 +314,8 @@ int exception_support_initialized = 0;
    unloaded.  */
 
 #ifndef SOLIB_CREATE_CATCH_UNLOAD_HOOK
-#define SOLIB_CREATE_CATCH_UNLOAD_HOOK(pid,tempflag,filename,cond_string) \
-   error ("catch of library unloads not yet implemented on this platform")
+#define SOLIB_CREATE_CATCH_UNLOAD_HOOK(pid, tempflag, filename, cond_string) \
+   error (_("catch of library unloads not yet implemented on this platform"))
 #endif
 
 /* Return whether a breakpoint is an active enabled breakpoint.  */
@@ -392,11 +390,11 @@ get_number_trailer (char **pp, int trailer)
       strncpy (varname, start, p - start);
       varname[p - start] = '\0';
       val = value_of_internalvar (lookup_internalvar (varname));
-      if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT)
+      if (TYPE_CODE (value_type (val)) == TYPE_CODE_INT)
        retval = (int) value_as_long (val);
       else
        {
-         printf_filtered ("Convenience variable must have integer value.\n");
+         printf_filtered (_("Convenience variable must have integer value.\n"));
          retval = 0;
        }
     }
@@ -482,7 +480,7 @@ get_number_or_range (char **pp)
          end_value = get_number (temp);
          if (end_value < last_retval) 
            {
-             error ("inverted range");
+             error (_("inverted range"));
            }
          else if (end_value == last_retval)
            {
@@ -496,7 +494,7 @@ get_number_or_range (char **pp)
        }
     }
   else if (! in_range)
-    error ("negative value");
+    error (_("negative value"));
   else
     {
       /* pp points to the '-' that betokens a range.  All
@@ -527,12 +525,12 @@ condition_command (char *arg, int from_tty)
   int bnum;
 
   if (arg == 0)
-    error_no_arg ("breakpoint number");
+    error_no_arg (_("breakpoint number"));
 
   p = arg;
   bnum = get_number (&p);
   if (bnum == 0)
-    error ("Bad breakpoint argument: '%s'", arg);
+    error (_("Bad breakpoint argument: '%s'"), arg);
 
   ALL_BREAKPOINTS (b)
     if (b->number == bnum)
@@ -550,7 +548,7 @@ condition_command (char *arg, int from_tty)
          b->cond = 0;
          b->cond_string = NULL;
          if (from_tty)
-           printf_filtered ("Breakpoint %d now unconditional.\n", bnum);
+           printf_filtered (_("Breakpoint %d now unconditional.\n"), bnum);
        }
       else
        {
@@ -562,7 +560,7 @@ condition_command (char *arg, int from_tty)
            {
              b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0);
              if (*arg)
-               error ("Junk at end of expression");
+               error (_("Junk at end of expression"));
            }
        }
       breakpoints_changed ();
@@ -570,7 +568,7 @@ condition_command (char *arg, int from_tty)
       return;
     }
 
-  error ("No breakpoint number %d.", bnum);
+  error (_("No breakpoint number %d."), bnum);
 }
 
 static void
@@ -586,13 +584,13 @@ commands_command (char *arg, int from_tty)
      being read from.  */
 
   if (executing_breakpoint_commands)
-    error ("Can't use the \"commands\" command among a breakpoint's commands.");
+    error (_("Can't use the \"commands\" command among a breakpoint's commands."));
 
   p = arg;
   bnum = get_number (&p);
 
   if (p && *p)
-    error ("Unexpected extra arguments following breakpoint number.");
+    error (_("Unexpected extra arguments following breakpoint number."));
 
   ALL_BREAKPOINTS (b)
     if (b->number == bnum)
@@ -608,7 +606,7 @@ commands_command (char *arg, int from_tty)
        breakpoint_modify_event (b->number);
        return;
     }
-  error ("No breakpoint number %d.", bnum);
+  error (_("No breakpoint number %d."), bnum);
 }
 \f
 /* Like target_read_memory() but if breakpoints are inserted, return
@@ -620,7 +618,7 @@ commands_command (char *arg, int from_tty)
    shadow contents, not the breakpoints themselves.  From breakpoint.c.  */
 
 int
-read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
+deprecated_read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
 {
   int status;
   struct bp_location *b;
@@ -634,7 +632,7 @@ read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
   ALL_BP_LOCATIONS (b)
   {
     if (b->owner->type == bp_none)
-      warning ("reading through apparently deleted breakpoint #%d?",
+      warning (_("reading through apparently deleted breakpoint #%d?"),
               b->owner->number);
 
     if (b->loc_type != bp_loc_software_breakpoint)
@@ -688,7 +686,7 @@ read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
       if (bp_addr > memaddr)
        {
          /* Copy the section of memory before the breakpoint.  */
-         status = read_memory_nobpt (memaddr, myaddr, bp_addr - memaddr);
+         status = deprecated_read_memory_nobpt (memaddr, myaddr, bp_addr - memaddr);
          if (status != 0)
            return status;
        }
@@ -696,7 +694,7 @@ read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
       if (bp_addr + bp_size < memaddr + len)
        {
          /* Copy the section of memory after the breakpoint.  */
-         status = read_memory_nobpt (bp_addr + bp_size,
+         status = deprecated_read_memory_nobpt (bp_addr + bp_size,
                                      myaddr + bp_addr + bp_size - memaddr,
                                      memaddr + len - (bp_addr + bp_size));
          if (status != 0)
@@ -711,7 +709,7 @@ read_memory_nobpt (CORE_ADDR memaddr, char *myaddr, unsigned len)
 \f
 
 /* A wrapper function for inserting catchpoints.  */
-static int
+static void
 insert_catchpoint (struct ui_out *uo, void *args)
 {
   struct breakpoint *b = (struct breakpoint *) args;
@@ -720,23 +718,35 @@ insert_catchpoint (struct ui_out *uo, void *args)
   switch (b->type)
     {
     case bp_catch_fork:
-      val = target_insert_fork_catchpoint (PIDGET (inferior_ptid));
+      target_insert_fork_catchpoint (PIDGET (inferior_ptid));
       break;
     case bp_catch_vfork:
-      val = target_insert_vfork_catchpoint (PIDGET (inferior_ptid));
+      target_insert_vfork_catchpoint (PIDGET (inferior_ptid));
       break;
     case bp_catch_exec:
-      val = target_insert_exec_catchpoint (PIDGET (inferior_ptid));
+      target_insert_exec_catchpoint (PIDGET (inferior_ptid));
       break;
     default:
-      internal_error (__FILE__, __LINE__, "unknown breakpoint type");
+      internal_error (__FILE__, __LINE__, _("unknown breakpoint type"));
       break;
     }
+}
 
-  if (val < 0)
-    throw_exception (RETURN_ERROR);
+/* Helper routine: free the value chain for a breakpoint (watchpoint).  */
 
-  return 0;
+static void free_valchain (struct bp_location *b)
+{
+  struct value *v;
+  struct value *n;
+
+  /* Free the saved value chain.  We will construct a new one
+     the next time the watchpoint is inserted.  */
+  for (v = b->owner->val_chain; v; v = n)
+    {
+      n = value_next (v);
+      value_free (v);
+    }
+  b->owner->val_chain = NULL;
 }
 
 /* Insert a low-level "breakpoint" of some type.  BPT is the breakpoint.
@@ -788,7 +798,7 @@ insert_bp_location (struct bp_location *bpt,
                 so we must try to set a breakpoint at the LMA.
                 This will not work for a hardware breakpoint.  */
              if (bpt->loc_type == bp_loc_hardware_breakpoint)
-               warning ("hardware breakpoint %d not supported in overlay!\n",
+               warning (_("hardware breakpoint %d not supported in overlay!"),
                         bpt->owner->number);
              else
                {
@@ -862,7 +872,7 @@ insert_bp_location (struct bp_location *bpt,
                                      bpt->owner->number);
                  fprintf_filtered (tmp_error_stream, 
                                    "Error accessing memory address ");
-                 print_address_numeric (bpt->address, 1, tmp_error_stream);
+                 deprecated_print_address_numeric (bpt->address, 1, tmp_error_stream);
                  fprintf_filtered (tmp_error_stream, ": %s.\n",
                                    safe_strerror (val));
                }
@@ -886,18 +896,17 @@ insert_bp_location (struct bp_location *bpt,
         must watch.  As soon as a many-to-one mapping is available I'll
         convert this.  */
 
-      struct frame_info *saved_frame;
-      int saved_level, within_current_scope;
+      int within_current_scope;
       struct value *mark = value_mark ();
       struct value *v;
+      struct frame_id saved_frame_id;
 
-      /* Save the current frame and level so we can restore it after
+      /* Save the current frame's ID so we can restore it after
         evaluating the watchpoint expression on its own frame.  */
       /* FIXME drow/2003-09-09: It would be nice if evaluate_expression
         took a frame parameter, so that we didn't have to change the
         selected frame.  */
-      saved_frame = deprecated_selected_frame;
-      saved_level = frame_relative_level (deprecated_selected_frame);
+      saved_frame_id = get_frame_id (deprecated_selected_frame);
 
       /* Determine if the watchpoint is within scope.  */
       if (bpt->owner->exp_valid_block == NULL)
@@ -913,6 +922,8 @@ insert_bp_location (struct bp_location *bpt,
 
       if (within_current_scope)
        {
+         free_valchain (bpt);
+
          /* Evaluate the expression and cut the chain of values
             produced off from the value chain.
 
@@ -920,22 +931,22 @@ insert_bp_location (struct bp_location *bpt,
             laziness to determine what memory GDB actually needed
             in order to compute the value of the expression.  */
          v = evaluate_expression (bpt->owner->exp);
-         VALUE_CONTENTS (v);
+         value_contents (v);
          value_release_to_mark (mark);
 
          bpt->owner->val_chain = v;
          bpt->inserted = 1;
 
          /* Look at each value on the value chain.  */
-         for (; v; v = v->next)
+         for (; v; v = value_next (v))
            {
              /* If it's a memory location, and GDB actually needed
                 its contents to evaluate the expression, then we
                 must watch it.  */
              if (VALUE_LVAL (v) == lval_memory
-                 && ! VALUE_LAZY (v))
+                 && ! value_lazy (v))
                {
-                 struct type *vtype = check_typedef (VALUE_TYPE (v));
+                 struct type *vtype = check_typedef (value_type (v));
 
                  /* We only watch structs and arrays if user asked
                     for it explicitly, never if they just happen to
@@ -947,8 +958,8 @@ insert_bp_location (struct bp_location *bpt,
                      CORE_ADDR addr;
                      int len, type;
 
-                     addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
-                     len = TYPE_LENGTH (VALUE_TYPE (v));
+                     addr = VALUE_ADDRESS (v) + value_offset (v);
+                     len = TYPE_LENGTH (value_type (v));
                      type = hw_write;
                      if (bpt->owner->type == bp_read_watchpoint)
                        type = hw_read;
@@ -984,18 +995,17 @@ insert_bp_location (struct bp_location *bpt,
        }
       else
        {
-         printf_filtered ("Hardware watchpoint %d deleted ", bpt->owner->number);
-         printf_filtered ("because the program has left the block \n");
-         printf_filtered ("in which its expression is valid.\n");
+         printf_filtered (_("\
+Hardware watchpoint %d deleted because the program has left the block \n\
+in which its expression is valid.\n"),
+                          bpt->owner->number);
          if (bpt->owner->related_breakpoint)
            bpt->owner->related_breakpoint->disposition = disp_del_at_next_stop;
          bpt->owner->disposition = disp_del_at_next_stop;
        }
 
-      /* Restore the frame and level.  */
-      if (saved_frame != deprecated_selected_frame
-         || saved_level != frame_relative_level (deprecated_selected_frame))
-       select_frame (saved_frame);
+      /* Restore the selected frame.  */
+      select_frame (frame_find_by_id (saved_frame_id));
 
       return val;
     }
@@ -1018,7 +1028,7 @@ insert_bp_location (struct bp_location *bpt,
                              bpt->owner->number);
          fprintf_filtered (tmp_error_stream, 
                            "Error accessing memory address ");
-         print_address_numeric (bpt->address, 1, tmp_error_stream);
+         deprecated_print_address_numeric (bpt->address, 1, tmp_error_stream);
          fprintf_filtered (tmp_error_stream, ": %s.\n",
                            safe_strerror (val));
          bpt->owner->enable_state = bp_disabled;
@@ -1059,13 +1069,11 @@ insert_bp_location (struct bp_location *bpt,
           || bpt->owner->type == bp_catch_vfork
           || bpt->owner->type == bp_catch_exec)
     {
-      char *prefix = xstrprintf ("warning: inserting catchpoint %d: ",
-                                bpt->owner->number);
-      struct cleanup *cleanups = make_cleanup (xfree, prefix);
-      val = catch_exceptions (uiout, insert_catchpoint, bpt->owner, prefix,
-                             RETURN_MASK_ERROR);
-      do_cleanups (cleanups);
-      if (val < 0)
+      struct exception e = catch_exception (uiout, insert_catchpoint,
+                                           bpt->owner, RETURN_MASK_ERROR);
+      exception_fprintf (gdb_stderr, e, "warning: inserting catchpoint %d: ",
+                        bpt->owner->number);
+      if (e.reason < 0)
        bpt->owner->enable_state = bp_disabled;
       else
        bpt->inserted = 1;
@@ -1116,7 +1124,7 @@ insert_breakpoints (void)
          struct value *val;
          val = evaluate_expression (b->owner->exp);
          release_value (val);
-         if (VALUE_LAZY (val))
+         if (value_lazy (val))
            value_fetch_lazy (val);
          b->owner->val = val;
        }
@@ -1358,7 +1366,7 @@ detach_breakpoints (int pid)
   struct cleanup *old_chain = save_inferior_ptid ();
 
   if (pid == PIDGET (inferior_ptid))
-    error ("Cannot detach breakpoints of inferior_ptid");
+    error (_("Cannot detach breakpoints of inferior_ptid"));
 
   /* Set inferior_ptid; remove_breakpoint uses this global.  */
   inferior_ptid = pid_to_ptid (pid);
@@ -1388,7 +1396,7 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
     return 0;
 
   if (b->owner->type == bp_none)
-    warning ("attempted to remove apparently deleted breakpoint #%d?"
+    warning (_("attempted to remove apparently deleted breakpoint #%d?")
             b->owner->number);
 
   if (b->loc_type == bp_loc_software_breakpoint
@@ -1463,14 +1471,14 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
 
       b->inserted = (is == mark_inserted);
       /* Walk down the saved value chain.  */
-      for (v = b->owner->val_chain; v; v = v->next)
+      for (v = b->owner->val_chain; v; v = value_next (v))
        {
          /* For each memory reference remove the watchpoint
             at that address.  */
          if (VALUE_LVAL (v) == lval_memory
-             && ! VALUE_LAZY (v))
+             && ! value_lazy (v))
            {
-             struct type *vtype = check_typedef (VALUE_TYPE (v));
+             struct type *vtype = check_typedef (value_type (v));
 
              if (v == b->owner->val_chain
                  || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
@@ -1479,8 +1487,8 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
                  CORE_ADDR addr;
                  int len, type;
 
-                 addr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
-                 len = TYPE_LENGTH (VALUE_TYPE (v));
+                 addr = VALUE_ADDRESS (v) + value_offset (v);
+                 len = TYPE_LENGTH (value_type (v));
                  type   = hw_write;
                  if (b->owner->type == bp_read_watchpoint)
                    type = hw_read;
@@ -1496,17 +1504,8 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
        }
       /* Failure to remove any of the hardware watchpoints comes here.  */
       if ((is == mark_uninserted) && (b->inserted))
-       warning ("Could not remove hardware watchpoint %d.",
+       warning (_("Could not remove hardware watchpoint %d."),
                 b->owner->number);
-
-      /* Free the saved value chain.  We will construct a new one
-         the next time the watchpoint is inserted.  */
-      for (v = b->owner->val_chain; v; v = n)
-       {
-         n = v->next;
-         value_free (v);
-       }
-      b->owner->val_chain = NULL;
     }
   else if ((b->owner->type == bp_catch_fork ||
            b->owner->type == bp_catch_vfork ||
@@ -1527,7 +1526,7 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
          val = target_remove_exec_catchpoint (PIDGET (inferior_ptid));
          break;
        default:
-         warning ("Internal error, %s line %d.", __FILE__, __LINE__);
+         warning (_("Internal error, %s line %d."), __FILE__, __LINE__);
          break;
        }
       if (val)
@@ -1629,8 +1628,8 @@ breakpoint_init_inferior (enum inf_context context)
       default:
        /* Likewise for exception catchpoints in dynamic-linked
           executables where required */
-       if (ep_is_exception_catchpoint (b) &&
-           exception_catchpoints_are_fragile)
+       if (ep_is_exception_catchpoint (b)
+           && deprecated_exception_catchpoints_are_fragile)
          {
            warning_needed = 1;
            delete_breakpoint (b);
@@ -1639,14 +1638,14 @@ breakpoint_init_inferior (enum inf_context context)
       }
   }
 
-  if (exception_catchpoints_are_fragile)
-    exception_support_initialized = 0;
+  if (deprecated_exception_catchpoints_are_fragile)
+    deprecated_exception_support_initialized = 0;
 
   /* Don't issue the warning unless it's really needed... */
   if (warning_needed && (context != inf_exited))
     {
-      warning ("Exception catchpoints from last run were deleted.");
-      warning ("You must reinsert them explicitly.");
+      warning (_("Exception catchpoints from last run were deleted.\n"
+                "You must reinsert them explicitly."));
       warning_needed = 0;
     }
 }
@@ -1753,37 +1752,6 @@ software_breakpoint_inserted_here_p (CORE_ADDR pc)
   return 0;
 }
 
-/* Return nonzero if FRAME is a dummy frame.  We can't use
-   DEPRECATED_PC_IN_CALL_DUMMY because figuring out the saved SP would
-   take too much time, at least using frame_register() on the 68k.
-   This means that for this function to work right a port must use the
-   bp_call_dummy breakpoint.  */
-
-int
-deprecated_frame_in_dummy (struct frame_info *frame)
-{
-  struct breakpoint *b;
-
-  /* This function is used by two files: get_frame_type(), after first
-     checking that !DEPRECATED_USE_GENERIC_DUMMY_FRAMES; and
-     sparc-tdep.c, which doesn't yet use generic dummy frames anyway.  */
-  gdb_assert (!DEPRECATED_USE_GENERIC_DUMMY_FRAMES);
-
-  ALL_BREAKPOINTS (b)
-  {
-    if (b->type == bp_call_dummy
-       && frame_id_eq (b->frame_id, get_frame_id (frame))
-    /* We need to check the PC as well as the frame on the sparc,
-       for signals.exp in the testsuite.  */
-       && (get_frame_pc (frame)
-           >= (b->loc->address
-               - DEPRECATED_SIZEOF_CALL_DUMMY_WORDS / sizeof (LONGEST) * DEPRECATED_REGISTER_SIZE))
-       && get_frame_pc (frame) <= b->loc->address)
-      return 1;
-  }
-  return 0;
-}
-
 /* breakpoint_thread_match (PC, PTID) returns true if the breakpoint at
    PC is valid for process/thread PTID.  */
 
@@ -1939,8 +1907,7 @@ bpstat_find_step_resume_breakpoint (bpstat bsp)
 {
   int current_thread;
 
-  if (bsp == NULL)
-    error ("Internal error (bpstat_find_step_resume_breakpoint)");
+  gdb_assert (bsp != NULL);
 
   current_thread = pid_to_thread_id (inferior_ptid);
 
@@ -1953,7 +1920,7 @@ bpstat_find_step_resume_breakpoint (bpstat bsp)
        return bsp->breakpoint_at;
     }
 
-  error ("Internal error (no step_resume breakpoint found)");
+  internal_error (__FILE__, __LINE__, _("No step_resume breakpoint found."));
 }
 
 
@@ -2132,60 +2099,58 @@ print_it_typical (bpstat bs)
       /* 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");
+      printf_filtered (_("Stopped due to shared library event\n"));
       return PRINT_NOTHING;
       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");
+      printf_filtered (_("Thread Event Breakpoint: gdb should not stop!\n"));
       return 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");
+      printf_filtered (_("Overlay Event Breakpoint: gdb should not stop!\n"));
       return PRINT_NOTHING;
       break;
 
     case bp_catch_load:
       annotate_catchpoint (bs->breakpoint_at->number);
-      printf_filtered ("\nCatchpoint %d (", bs->breakpoint_at->number);
-      printf_filtered ("loaded");
-      printf_filtered (" %s), ", bs->breakpoint_at->triggered_dll_pathname);
+      printf_filtered (_("\nCatchpoint %d (loaded %s), "),
+                      bs->breakpoint_at->number,
+                      bs->breakpoint_at->triggered_dll_pathname);
       return PRINT_SRC_AND_LOC;
       break;
 
     case bp_catch_unload:
       annotate_catchpoint (bs->breakpoint_at->number);
-      printf_filtered ("\nCatchpoint %d (", bs->breakpoint_at->number);
-      printf_filtered ("unloaded");
-      printf_filtered (" %s), ", bs->breakpoint_at->triggered_dll_pathname);
+      printf_filtered (_("\nCatchpoint %d (unloaded %s), "),
+                      bs->breakpoint_at->number,
+                      bs->breakpoint_at->triggered_dll_pathname);
       return PRINT_SRC_AND_LOC;
       break;
 
     case bp_catch_fork:
       annotate_catchpoint (bs->breakpoint_at->number);
-      printf_filtered ("\nCatchpoint %d (", bs->breakpoint_at->number);
-      printf_filtered ("forked");
-      printf_filtered (" process %d), ", 
+      printf_filtered (_("\nCatchpoint %d (forked process %d), "),
+                      bs->breakpoint_at->number, 
                       bs->breakpoint_at->forked_inferior_pid);
       return PRINT_SRC_AND_LOC;
       break;
 
     case bp_catch_vfork:
       annotate_catchpoint (bs->breakpoint_at->number);
-      printf_filtered ("\nCatchpoint %d (", bs->breakpoint_at->number);
-      printf_filtered ("vforked");
-      printf_filtered (" process %d), ", 
+      printf_filtered (_("\nCatchpoint %d (vforked process %d), "),
+                      bs->breakpoint_at->number, 
                       bs->breakpoint_at->forked_inferior_pid);
       return PRINT_SRC_AND_LOC;
       break;
 
     case bp_catch_exec:
       annotate_catchpoint (bs->breakpoint_at->number);
-      printf_filtered ("\nCatchpoint %d (exec'd %s), ",
+      printf_filtered (_("\nCatchpoint %d (exec'd %s), "),
                       bs->breakpoint_at->number,
                       bs->breakpoint_at->exec_pathname);
       return PRINT_SRC_AND_LOC;
@@ -2196,25 +2161,22 @@ print_it_typical (bpstat bs)
          (CURRENT_EXCEPTION_KIND == EX_EVENT_CATCH))
        {
          annotate_catchpoint (bs->breakpoint_at->number);
-         printf_filtered ("\nCatchpoint %d (exception caught), "
+         printf_filtered (_("\nCatchpoint %d (exception caught), ")
                           bs->breakpoint_at->number);
-         printf_filtered ("throw location ");
          if (CURRENT_EXCEPTION_THROW_PC && CURRENT_EXCEPTION_THROW_LINE)
-           printf_filtered ("%s:%d",
+           printf_filtered (_("throw location %s:%d, "),
                             CURRENT_EXCEPTION_THROW_FILE,
                             CURRENT_EXCEPTION_THROW_LINE);
          else
-           printf_filtered ("unknown");
+           printf_filtered (_("throw location unknown, "));
 
-         printf_filtered (", catch location ");
          if (CURRENT_EXCEPTION_CATCH_PC && CURRENT_EXCEPTION_CATCH_LINE)
-           printf_filtered ("%s:%d",
+           printf_filtered (_("catch location %s:%d\n"),
                             CURRENT_EXCEPTION_CATCH_FILE,
                             CURRENT_EXCEPTION_CATCH_LINE);
          else
-           printf_filtered ("unknown");
+           printf_filtered (_("catch location unknown\n"));
 
-         printf_filtered ("\n");
          /* don't bother to print location frame info */
          return PRINT_SRC_ONLY;
        }
@@ -2230,25 +2192,22 @@ print_it_typical (bpstat bs)
          (CURRENT_EXCEPTION_KIND == EX_EVENT_THROW))
        {
          annotate_catchpoint (bs->breakpoint_at->number);
-         printf_filtered ("\nCatchpoint %d (exception thrown), ",
+         printf_filtered (_("\nCatchpoint %d (exception thrown), "),
                           bs->breakpoint_at->number);
-         printf_filtered ("throw location ");
          if (CURRENT_EXCEPTION_THROW_PC && CURRENT_EXCEPTION_THROW_LINE)
-           printf_filtered ("%s:%d",
+           printf_filtered (_("throw location %s:%d, "),
                             CURRENT_EXCEPTION_THROW_FILE,
                             CURRENT_EXCEPTION_THROW_LINE);
          else
-           printf_filtered ("unknown");
+           printf_filtered (_("throw location unknown, "));
 
-         printf_filtered (", catch location ");
          if (CURRENT_EXCEPTION_CATCH_PC && CURRENT_EXCEPTION_CATCH_LINE)
-           printf_filtered ("%s:%d",
+           printf_filtered (_("catch location %s:%d\n"),
                             CURRENT_EXCEPTION_CATCH_FILE,
                             CURRENT_EXCEPTION_CATCH_LINE);
          else
-           printf_filtered ("unknown");
+           printf_filtered (_("catch location unknown\n"));
 
-         printf_filtered ("\n");
          /* don't bother to print location frame info */
          return PRINT_SRC_ONLY; 
        }
@@ -2387,7 +2346,7 @@ print_bp_stop_message (bpstat bs)
 
     default:
       internal_error (__FILE__, __LINE__,
-                     "print_bp_stop_message: unrecognized enum value");
+                     _("print_bp_stop_message: unrecognized enum value"));
       break;
     }
 }
@@ -2576,7 +2535,9 @@ which its expression is valid.\n");
 }
 
 /* Get a bpstat associated with having just stopped at address
-   BP_ADDR.  */
+   BP_ADDR in thread PTID.  STOPPED_BY_WATCHPOINT is 1 if the
+   target thinks we stopped due to a hardware watchpoint, 0 if we
+   know we did not trigger a hardware watchpoint, and -1 if we do not know.  */
 
 /* Determine whether we stopped at a breakpoint, etc, or whether we
    don't understand this stop.  Result is a chain of bpstat's such that:
@@ -2593,7 +2554,7 @@ which its expression is valid.\n");
    commands, FIXME??? fields.  */
 
 bpstat
-bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
+bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid, int stopped_by_watchpoint)
 {
   struct breakpoint *b, *temp;
   /* True if we've hit a breakpoint (as opposed to a watchpoint).  */
@@ -2628,6 +2589,18 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
          continue;
       }
 
+    /* Continuable hardware watchpoints are treated as non-existent if the 
+       reason we stopped wasn't a hardware watchpoint (we didn't stop on 
+       some data address).  Otherwise gdb won't stop on a break instruction 
+       in the code (not from a breakpoint) when a hardware watchpoint has 
+       been defined.  */
+
+    if ((b->type == bp_hardware_watchpoint
+        || b->type == bp_read_watchpoint
+        || b->type == bp_access_watchpoint)
+       && !stopped_by_watchpoint)
+      continue;
+
     if (b->type == bp_hardware_breakpoint)
       {
        if (b->loc->address != bp_addr)
@@ -2724,7 +2697,7 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
            /* FALLTHROUGH */
          case 0:
            /* Error from catch_errors.  */
-           printf_filtered ("Watchpoint %d deleted.\n", b->number);
+           printf_filtered (_("Watchpoint %d deleted.\n"), b->number);
            if (b->related_breakpoint)
              b->related_breakpoint->disposition = disp_del_at_next_stop;
            b->disposition = disp_del_at_next_stop;
@@ -2742,15 +2715,14 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
        struct value *v;
        int found = 0;
 
-       addr = target_stopped_data_address ();
-       if (addr == 0)
+       if (!target_stopped_data_address (&current_target, &addr))
          continue;
-       for (v = b->val_chain; v; v = v->next)
+       for (v = b->val_chain; v; v = value_next (v))
          {
            if (VALUE_LVAL (v) == lval_memory
-               && ! VALUE_LAZY (v))
+               && ! value_lazy (v))
              {
-               struct type *vtype = check_typedef (VALUE_TYPE (v));
+               struct type *vtype = check_typedef (value_type (v));
 
                if (v == b->val_chain
                    || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
@@ -2758,11 +2730,11 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
                  {
                    CORE_ADDR vaddr;
 
-                   vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+                   vaddr = VALUE_ADDRESS (v) + value_offset (v);
                    /* Exact match not required.  Within range is
                        sufficient.  */
                    if (addr >= vaddr &&
-                       addr < vaddr + TYPE_LENGTH (VALUE_TYPE (v)))
+                       addr < vaddr + TYPE_LENGTH (value_type (v)))
                      found = 1;
                  }
              }
@@ -2802,7 +2774,7 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
                /* Can't happen.  */
              case 0:
                /* Error from catch_errors.  */
-               printf_filtered ("Watchpoint %d deleted.\n", b->number);
+               printf_filtered (_("Watchpoint %d deleted.\n"), b->number);
                if (b->related_breakpoint)
                  b->related_breakpoint->disposition = disp_del_at_next_stop;
                b->disposition = disp_del_at_next_stop;
@@ -3010,7 +2982,7 @@ bpstat_what (bpstat bs)
 
   /* step_resume entries: a step resume breakpoint overrides another
      breakpoint of signal handling (see comment in wait_for_inferior
-     at first PC_IN_SIGTRAMP where we set the step_resume breakpoint).  */
+     at where we set the step_resume breakpoint).  */
   /* We handle the through_sigtramp_breakpoint the same way; having both
      one of those and a step_resume_breakpoint is probably very rare (?).  */
 
@@ -3334,7 +3306,7 @@ print_one_breakpoint (struct breakpoint *b,
   if (((int) b->type > (sizeof (bptypes) / sizeof (bptypes[0])))
       || ((int) b->type != bptypes[(int) b->type].type))
     internal_error (__FILE__, __LINE__,
-                   "bptypes table does not describe type #%d.",
+                   _("bptypes table does not describe type #%d."),
                    (int) b->type);
   ui_out_field_string (uiout, "type", bptypes[(int) b->type].description);
 
@@ -3364,7 +3336,7 @@ print_one_breakpoint (struct breakpoint *b,
       {
       case bp_none:
        internal_error (__FILE__, __LINE__,
-                       "print_one_breakpoint: bp_none encountered\n");
+                       _("print_one_breakpoint: bp_none encountered\n"));
        break;
 
       case bp_watchpoint:
@@ -3471,13 +3443,7 @@ print_one_breakpoint (struct breakpoint *b,
          {
            annotate_field (4);
            if (b->pending)
-             {
-               ui_out_field_string (uiout, "addr", "<PENDING>");
-               if (TARGET_ADDR_BIT <= 32)
-                 ui_out_spaces (uiout, 2);
-               else
-                 ui_out_spaces (uiout, 8);
-             }
+             ui_out_field_string (uiout, "addr", "<PENDING>");
            else
              ui_out_field_core_addr (uiout, "addr", b->loc->address);
          }
@@ -3620,14 +3586,14 @@ do_captured_breakpoint_query (struct ui_out *uiout, void *data)
 }
 
 enum gdb_rc
-gdb_breakpoint_query (struct ui_out *uiout, int bnum)
+gdb_breakpoint_query (struct ui_out *uiout, int bnum, char **error_message)
 {
   struct captured_breakpoint_query_args args;
   args.bnum = bnum;
   /* For the moment we don't trust print_one_breakpoint() to not throw
      an error. */
-  return catch_exceptions (uiout, do_captured_breakpoint_query, &args,
-                          NULL, RETURN_MASK_ALL);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint_query, &args,
+                                   error_message, RETURN_MASK_ALL);
 }
 
 /* Return non-zero if B is user settable (breakpoints, watchpoints,
@@ -3781,7 +3747,10 @@ describe_other_breakpoints (CORE_ADDR pc, asection *section)
        others++;
   if (others > 0)
     {
-      printf_filtered ("Note: breakpoint%s ", (others > 1) ? "s" : "");
+      if (others == 1)
+       printf_filtered (_("Note: breakpoint "));
+      else /* if (others == ???) */
+       printf_filtered (_("Note: breakpoints "));
       ALL_BREAKPOINTS (b)
        if (b->loc->address == pc)      /* address match / overlay match */
          if (!b->pending && (!overlay_debugging || b->loc->section == section))
@@ -3799,8 +3768,8 @@ describe_other_breakpoints (CORE_ADDR pc, asection *section)
                               (others > 1) ? "," 
                               : ((others == 1) ? " and" : ""));
            }
-      printf_filtered ("also set at pc ");
-      print_address_numeric (pc, 1, gdb_stdout);
+      printf_filtered (_("also set at pc "));
+      deprecated_print_address_numeric (pc, 1, gdb_stdout);
       printf_filtered (".\n");
     }
 }
@@ -3900,8 +3869,8 @@ check_duplicates (struct breakpoint *bpt)
       /* Permanent breakpoint should always be inserted.  */
       if (! perm_bp->inserted)
        internal_error (__FILE__, __LINE__,
-                       "allegedly permanent breakpoint is not "
-                       "actually inserted");
+                       _("allegedly permanent breakpoint is not "
+                       "actually inserted"));
 
       ALL_BP_LOCATIONS (b)
        if (b != perm_bp)
@@ -3916,8 +3885,8 @@ check_duplicates (struct breakpoint *bpt)
              {
                if (b->inserted)
                  internal_error (__FILE__, __LINE__,
-                                 "another breakpoint was inserted on top of "
-                                 "a permanent breakpoint");
+                                 _("another breakpoint was inserted on top of "
+                                 "a permanent breakpoint"));
 
                b->duplicate = 1;
              }
@@ -3932,13 +3901,13 @@ breakpoint_adjustment_warning (CORE_ADDR from_addr, CORE_ADDR to_addr,
   char astr1[40];
   char astr2[40];
 
-  strcpy (astr1, local_hex_string_custom ((unsigned long) from_addr, "08l"));
-  strcpy (astr2, local_hex_string_custom ((unsigned long) to_addr, "08l"));
+  strcpy (astr1, hex_string_custom ((unsigned long) from_addr, 8));
+  strcpy (astr2, hex_string_custom ((unsigned long) to_addr, 8));
   if (have_bnum)
-    warning ("Breakpoint %d address previously adjusted from %s to %s.",
+    warning (_("Breakpoint %d address previously adjusted from %s to %s."),
              bnum, astr1, astr2);
   else
-    warning ("Breakpoint address adjusted from %s to %s.", astr1, astr2);
+    warning (_("Breakpoint address adjusted from %s to %s."), astr1, astr2);
 }
 
 /* Adjust a breakpoint's address to account for architectural constraints
@@ -3947,13 +3916,25 @@ breakpoint_adjustment_warning (CORE_ADDR from_addr, CORE_ADDR to_addr,
    this function is simply the identity function.  */
 
 static CORE_ADDR
-adjust_breakpoint_address (CORE_ADDR bpaddr)
+adjust_breakpoint_address (CORE_ADDR bpaddr, enum bptype bptype)
 {
   if (!gdbarch_adjust_breakpoint_address_p (current_gdbarch))
     {
       /* Very few targets need any kind of breakpoint adjustment.  */
       return bpaddr;
     }
+  else if (bptype == bp_watchpoint
+           || bptype == bp_hardware_watchpoint
+           || bptype == bp_read_watchpoint
+           || bptype == bp_access_watchpoint
+           || bptype == bp_catch_fork
+           || bptype == bp_catch_vfork
+           || bptype == bp_catch_exec)
+    {
+      /* Watchpoints and the various bp_catch_* eventpoints should not
+         have their addresses modified.  */
+      return bpaddr;
+    }
   else
     {
       CORE_ADDR adjusted_bpaddr;
@@ -4020,7 +4001,7 @@ allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type)
       loc->loc_type = bp_loc_other;
       break;
     default:
-      internal_error (__FILE__, __LINE__, "unknown breakpoint type");
+      internal_error (__FILE__, __LINE__, _("unknown breakpoint type"));
     }
 
   /* Add this breakpoint to the end of the chain.  */
@@ -4062,7 +4043,8 @@ set_raw_breakpoint (struct symtab_and_line sal, enum bptype bptype)
   memset (b, 0, sizeof (*b));
   b->loc = allocate_bp_location (b, bptype);
   b->loc->requested_address = sal.pc;
-  b->loc->address = adjust_breakpoint_address (b->loc->requested_address);
+  b->loc->address = adjust_breakpoint_address (b->loc->requested_address,
+                                               bptype);
   if (sal.symtab == NULL)
     b->source_file = NULL;
   else
@@ -4254,7 +4236,7 @@ create_thread_event_breakpoint (CORE_ADDR address)
   
   b->enable_state = bp_enabled;
   /* addr_string has to be used or breakpoint_re_set will delete me.  */
-  xasprintf (&b->addr_string, "*0x%s", paddr (b->loc->address));
+  b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address));
 
   return b;
 }
@@ -4269,61 +4251,6 @@ remove_thread_event_breakpoints (void)
       delete_breakpoint (b);
 }
 
-#ifdef SOLIB_ADD
-void
-remove_solib_event_breakpoints (void)
-{
-  struct breakpoint *b, *temp;
-
-  ALL_BREAKPOINTS_SAFE (b, temp)
-    if (b->type == bp_shlib_event)
-      delete_breakpoint (b);
-}
-
-struct breakpoint *
-create_solib_event_breakpoint (CORE_ADDR address)
-{
-  struct breakpoint *b;
-
-  b = create_internal_breakpoint (address, bp_shlib_event);
-  return b;
-}
-
-/* Disable any breakpoints that are on code in shared libraries.  Only
-   apply to enabled breakpoints, disabled ones can just stay disabled.  */
-
-void
-disable_breakpoints_in_shlibs (int silent)
-{
-  struct breakpoint *b;
-  int disabled_shlib_breaks = 0;
-
-  /* See also: insert_breakpoints, under DISABLE_UNSETTABLE_BREAK. */
-  ALL_BREAKPOINTS (b)
-  {
-#if defined (PC_SOLIB)
-    if (((b->type == bp_breakpoint) ||
-        (b->type == bp_hardware_breakpoint)) &&
-       breakpoint_enabled (b) &&
-       !b->loc->duplicate &&
-       PC_SOLIB (b->loc->address))
-      {
-       b->enable_state = bp_shlib_disabled;
-       if (!silent)
-         {
-           if (!disabled_shlib_breaks)
-             {
-               target_terminal_ours_for_output ();
-               warning ("Temporarily disabling shared library breakpoints:");
-             }
-           disabled_shlib_breaks = 1;
-           warning ("breakpoint #%d ", b->number);
-         }
-      }
-#endif
-  }
-}
-
 struct captured_parse_breakpoint_args
   {
     char **arg_p;
@@ -4378,12 +4305,107 @@ resolve_pending_breakpoint (struct breakpoint *b)
   
   if (rc == GDB_RC_OK)
     /* Pending breakpoint has been resolved.  */
-    printf_filtered ("Pending breakpoint \"%s\" resolved\n", b->addr_string);
+    printf_filtered (_("Pending breakpoint \"%s\" resolved\n"), b->addr_string);
 
   do_cleanups (old_chain);
   return rc;
 }
 
+#ifdef SOLIB_ADD
+void
+remove_solib_event_breakpoints (void)
+{
+  struct breakpoint *b, *temp;
+
+  ALL_BREAKPOINTS_SAFE (b, temp)
+    if (b->type == bp_shlib_event)
+      delete_breakpoint (b);
+}
+
+struct breakpoint *
+create_solib_event_breakpoint (CORE_ADDR address)
+{
+  struct breakpoint *b;
+
+  b = create_internal_breakpoint (address, bp_shlib_event);
+  return b;
+}
+
+/* Disable any breakpoints that are on code in shared libraries.  Only
+   apply to enabled breakpoints, disabled ones can just stay disabled.  */
+
+void
+disable_breakpoints_in_shlibs (int silent)
+{
+  struct breakpoint *b;
+  int disabled_shlib_breaks = 0;
+
+  /* See also: insert_breakpoints, under DISABLE_UNSETTABLE_BREAK. */
+  ALL_BREAKPOINTS (b)
+  {
+#if defined (PC_SOLIB)
+    if (((b->type == bp_breakpoint) ||
+        (b->type == bp_hardware_breakpoint)) &&
+       breakpoint_enabled (b) &&
+       !b->loc->duplicate &&
+       PC_SOLIB (b->loc->address))
+      {
+       b->enable_state = bp_shlib_disabled;
+       if (!silent)
+         {
+           if (!disabled_shlib_breaks)
+             {
+               target_terminal_ours_for_output ();
+               warning (_("Temporarily disabling shared library breakpoints:"));
+             }
+           disabled_shlib_breaks = 1;
+           warning (_("breakpoint #%d "), b->number);
+         }
+      }
+#endif
+  }
+}
+
+/* Disable any breakpoints that are in in an unloaded shared library.  Only
+   apply to enabled breakpoints, disabled ones can just stay disabled.  */
+
+void
+disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
+{
+  struct breakpoint *b;
+  int disabled_shlib_breaks = 0;
+
+#if defined (PC_SOLIB)
+  /* See also: insert_breakpoints, under DISABLE_UNSETTABLE_BREAK.  */
+  ALL_BREAKPOINTS (b)
+  {
+    if ((b->loc->loc_type == bp_loc_hardware_breakpoint
+       || b->loc->loc_type == bp_loc_software_breakpoint)
+       && breakpoint_enabled (b) 
+       && !b->loc->duplicate)
+      {
+       char *so_name = PC_SOLIB (b->loc->address);
+       if (so_name 
+           && !strcmp (so_name, solib->so_name))
+          {
+           b->enable_state = bp_shlib_disabled;
+           /* At this point, we cannot rely on remove_breakpoint
+              succeeding so we must mark the breakpoint as not inserted
+              to prevent future errors occurring in remove_breakpoints.  */
+           b->loc->inserted = 0;
+           if (!disabled_shlib_breaks)
+             {
+               target_terminal_ours_for_output ();
+               warning (_("Temporarily disabling breakpoints for unloaded shared library \"%s\""),
+                         so_name);
+             }
+           disabled_shlib_breaks = 1;
+         }
+      }
+  }
+#endif
+}
+
 /* Try to reenable any breakpoints in shared libraries.  */
 void
 re_enable_breakpoints_in_shlibs (void)
@@ -4425,21 +4447,22 @@ solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
   char **canonical = (char **) NULL;
   int thread = -1;             /* All threads. */
 
-  /* Set a breakpoint on the specified hook. */
-  sals = decode_line_1 (&hookname, 1, (struct symtab *) NULL, 0, &canonical, NULL);
+  /* Set a breakpoint on the specified hook.  */
+  sals = decode_line_1 (&hookname, 1, (struct symtab *) NULL, 
+                       0, &canonical, NULL);
   addr_end = hookname;
 
   if (sals.nelts == 0)
     {
-      warning ("Unable to set a breakpoint on dynamic linker callback.");
-      warning ("Suggest linking with /opt/langtools/lib/end.o.");
-      warning ("GDB will be unable to track shl_load/shl_unload calls");
+      warning (_("Unable to set a breakpoint on dynamic linker callback.\n"
+                "Suggest linking with /opt/langtools/lib/end.o.\n"
+                "GDB will be unable to track shl_load/shl_unload calls."));
       return;
     }
   if (sals.nelts != 1)
     {
-      warning ("Unable to set unique breakpoint on dynamic linker callback.");
-      warning ("GDB will be unable to track shl_load/shl_unload calls");
+      warning (_("Unable to set unique breakpoint on dynamic linker callback.\n"
+                "GDB will be unable to track shl_load/shl_unload calls."));
       return;
     }
 
@@ -4500,7 +4523,7 @@ void
 create_solib_unload_event_breakpoint (char *hookname, int tempflag,
                                      char *dll_pathname, char *cond_string)
 {
-  solib_load_unload_1 (hookname,tempflag, dll_pathname, 
+  solib_load_unload_1 (hookname, tempflag, dll_pathname, 
                       cond_string, bp_catch_unload);
 }
 
@@ -4622,7 +4645,8 @@ set_longjmp_resume_breakpoint (CORE_ADDR pc, struct frame_id frame_id)
     if (b->type == bp_longjmp_resume)
     {
       b->loc->requested_address = pc;
-      b->loc->address = adjust_breakpoint_address (b->loc->requested_address);
+      b->loc->address = adjust_breakpoint_address (b->loc->requested_address,
+                                                   b->type);
       b->enable_state = bp_enabled;
       b->frame_id = frame_id;
       check_duplicates (b);
@@ -4707,13 +4731,13 @@ mention (struct breakpoint *b)
   stb = ui_out_stream_new (uiout);
   old_chain = make_cleanup_ui_out_stream_delete (stb);
 
-  /* FIXME: This is misplaced; mention() is called by things (like hitting a
-     watchpoint) other than breakpoint creation.  It should be possible to
-     clean this up and at the same time replace the random calls to
-     breakpoint_changed with this hook, as has already been done for
-     delete_breakpoint_hook and so on.  */
-  if (create_breakpoint_hook)
-    create_breakpoint_hook (b);
+  /* FIXME: This is misplaced; mention() is called by things (like
+     hitting a watchpoint) other than breakpoint creation.  It should
+     be possible to clean this up and at the same time replace the
+     random calls to breakpoint_changed with this hook, as has already
+     been done for deprecated_delete_breakpoint_hook and so on.  */
+  if (deprecated_create_breakpoint_hook)
+    deprecated_create_breakpoint_hook (b);
   breakpoint_create_event (b->number);
 
   if (b->ops != NULL && b->ops->print_mention != NULL)
@@ -4722,7 +4746,7 @@ mention (struct breakpoint *b)
     switch (b->type)
       {
       case bp_none:
-       printf_filtered ("(apparently deleted?) Eventpoint %d: ", b->number);
+       printf_filtered (_("(apparently deleted?) Eventpoint %d: "), b->number);
        break;
       case bp_watchpoint:
        ui_out_text (uiout, "Watchpoint ");
@@ -4766,7 +4790,7 @@ mention (struct breakpoint *b)
            say_where = 0;
            break;
          }
-       printf_filtered ("Breakpoint %d", b->number);
+       printf_filtered (_("Breakpoint %d"), b->number);
        say_where = 1;
        break;
       case bp_hardware_breakpoint:
@@ -4775,12 +4799,12 @@ mention (struct breakpoint *b)
            say_where = 0;
            break;
          }
-       printf_filtered ("Hardware assisted breakpoint %d", b->number);
+       printf_filtered (_("Hardware assisted breakpoint %d"), b->number);
        say_where = 1;
        break;
       case bp_catch_load:
       case bp_catch_unload:
-       printf_filtered ("Catchpoint %d (%s %s)",
+       printf_filtered (_("Catchpoint %d (%s %s)"),
                         b->number,
                         (b->type == bp_catch_load) ? "load" : "unload",
                         (b->dll_pathname != NULL) ? 
@@ -4788,17 +4812,17 @@ mention (struct breakpoint *b)
        break;
       case bp_catch_fork:
       case bp_catch_vfork:
-       printf_filtered ("Catchpoint %d (%s)",
+       printf_filtered (_("Catchpoint %d (%s)"),
                         b->number,
                         (b->type == bp_catch_fork) ? "fork" : "vfork");
        break;
       case bp_catch_exec:
-       printf_filtered ("Catchpoint %d (exec)",
+       printf_filtered (_("Catchpoint %d (exec)"),
                         b->number);
        break;
       case bp_catch_catch:
       case bp_catch_throw:
-       printf_filtered ("Catchpoint %d (%s)",
+       printf_filtered (_("Catchpoint %d (%s)"),
                         b->number,
                         (b->type == bp_catch_catch) ? "catch" : "throw");
        break;
@@ -4819,16 +4843,18 @@ mention (struct breakpoint *b)
 
   if (say_where)
     {
+      /* i18n: cagney/2005-02-11: Below needs to be merged into a
+        single string.  */
       if (b->pending)
        {
-         printf_filtered (" (%s) pending.", b->addr_string);
+         printf_filtered (_(" (%s) pending."), b->addr_string);
        }
       else
        {
          if (addressprint || b->source_file == NULL)
            {
              printf_filtered (" at ");
-             print_address_numeric (b->loc->address, 1, gdb_stdout);
+             deprecated_print_address_numeric (b->loc->address, 1, gdb_stdout);
            }
          if (b->source_file)
            printf_filtered (": file %s, line %d.",
@@ -4871,9 +4897,9 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
        TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_hardware_breakpoint, 
                                            i + sals.nelts, 0);
       if (target_resources_ok == 0)
-       error ("No hardware breakpoint support in the target.");
+       error (_("No hardware breakpoint support in the target."));
       else if (target_resources_ok < 0)
-       error ("Hardware breakpoints used exceeds limit.");
+       error (_("Hardware breakpoints used exceeds limit."));
     }
 
   /* Now set all the breakpoints.  */
@@ -4897,7 +4923,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
        else
          /* addr_string has to be used or breakpoint_re_set will delete
             me.  */
-         xasprintf (&b->addr_string, "*0x%s", paddr (b->loc->address));
+         b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address));
        b->cond_string = cond_string[i];
        b->ignore_count = ignore_count;
        b->enable_state = bp_enabled;
@@ -4915,12 +4941,16 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
                b->cond_string = savestring (arg, strlen (arg));
                b->cond = parse_exp_1 (&arg, block_for_pc (b->loc->address), 0);
                if (*arg)
-                 error ("Junk at end of pending breakpoint condition expression");
+                 error (_("Junk at end of pending breakpoint condition expression"));
              }
            /* If there are commands associated with the breakpoint, they should 
               be copied too.  */
            if (pending_bp->commands)
              b->commands = copy_command_lines (pending_bp->commands);
+           
+           /* We have to copy over the ignore_count and thread as well.  */
+           b->ignore_count = pending_bp->ignore_count;
+           b->thread = pending_bp->thread;
          }
        mention (b);
       }
@@ -4959,7 +4989,7 @@ parse_breakpoint_sals (char **address,
          sals->nelts = 1;
        }
       else
-       error ("No default breakpoint address now.");
+       error (_("No default breakpoint address now."));
     }
   else
     {
@@ -5024,26 +5054,26 @@ breakpoint_sals_to_pc (struct symtabs_and_lines *sals,
 
          Give the target a chance to bless sals.sals[i].pc before we
          try to make a breakpoint for it. */
-      if (PC_REQUIRES_RUN_BEFORE_USE (sals->sals[i].pc))
+#ifdef DEPRECATED_PC_REQUIRES_RUN_BEFORE_USE
+      if (DEPRECATED_PC_REQUIRES_RUN_BEFORE_USE (sals->sals[i].pc))
        {
          if (address == NULL)
-           error ("Cannot break without a running program.");
+           error (_("Cannot break without a running program."));
          else
-           error ("Cannot break on %s without a running program."
+           error (_("Cannot break on %s without a running program.")
                   address);
        }
+#endif
     }
 }
 
-static int
+static void
 do_captured_parse_breakpoint (struct ui_out *ui, void *data)
 {
   struct captured_parse_breakpoint_args *args = data;
   
   parse_breakpoint_sals (args->arg_p, args->sals_p, args->addr_string_p, 
                         args->not_found_ptr);
-
-  return GDB_RC_OK;
 }
 
 /* Set a breakpoint according to ARG (function, linenum or *address)
@@ -5056,6 +5086,7 @@ do_captured_parse_breakpoint (struct ui_out *ui, void *data)
 static int
 break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_bp)
 {
+  struct exception e;
   int tempflag, hardwareflag;
   struct symtabs_and_lines sals;
   struct expression **cond = 0;
@@ -5068,7 +5099,7 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
   struct cleanup *old_chain;
   struct cleanup *breakpoint_chain = NULL;
   struct captured_parse_breakpoint_args parse_args;
-  int i, rc;
+  int i;
   int pending = 0;
   int thread = -1;
   int ignore_count = 0;
@@ -5086,37 +5117,57 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
   parse_args.addr_string_p = &addr_string;
   parse_args.not_found_ptr = &not_found;
 
-  rc = catch_exceptions_with_msg (uiout, do_captured_parse_breakpoint, 
-                                 &parse_args, NULL, &err_msg, 
-                                 RETURN_MASK_ALL);
+  e = catch_exception (uiout, do_captured_parse_breakpoint, 
+                      &parse_args, RETURN_MASK_ALL);
 
   /* If caller is interested in rc value from parse, set value.  */
-
-  if (rc != GDB_RC_OK)
+  switch (e.reason)
     {
-      /* Check for file or function not found.  */
-      if (not_found)
+    case RETURN_QUIT:
+      exception_print (gdb_stderr, e);
+      return e.reason;
+    case RETURN_ERROR:
+      switch (e.error)
        {
-         /* If called to resolve pending breakpoint, just return error code.  */
+       case NOT_FOUND_ERROR:
+         /* If called to resolve pending breakpoint, just return
+            error code.  */
          if (pending_bp)
-           return rc;
+           return e.reason;
+
+         exception_print (gdb_stderr, e);
+
+         /* If pending breakpoint support is turned off, throw
+            error.  */
 
-         error_output_message (NULL, err_msg);
-         xfree (err_msg);
-         if (!query ("Make breakpoint pending on future shared library load? "))
-           return rc;
+         if (pending_break_support == AUTO_BOOLEAN_FALSE)
+           deprecated_throw_reason (RETURN_ERROR);
+
+          /* 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? "))
+           return e.reason;
+
+         /* 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);
          addr_string = &copy_arg;
          sals.nelts = 1;
          sals.sals = &pending_sal;
          pending_sal.pc = 0;
          pending = 1;
+         break;
+       default:
+         exception_print (gdb_stderr, e);
+         return e.reason;
        }
-      else
-       return rc;
+    default:
+      if (!sals.nelts)
+       return GDB_RC_FAIL;
     }
-  else if (!sals.nelts)
-    return GDB_RC_FAIL;
 
   /* Create a chain of things that always need to be cleaned up. */
   old_chain = make_cleanup (null_cleanup, 0);
@@ -5202,12 +5253,12 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
                  tmptok = tok;
                  thread = strtol (tok, &tok, 0);
                  if (tok == tmptok)
-                   error ("Junk after thread keyword.");
+                   error (_("Junk after thread keyword."));
                  if (!valid_thread_id (thread))
-                   error ("Unknown thread %d\n", thread);
+                   error (_("Unknown thread %d."), thread);
                }
              else
-               error ("Junk at end of arguments.");
+               error (_("Junk at end of arguments."));
            }
        }
       create_breakpoints (sals, addr_string, cond, cond_string,
@@ -5244,10 +5295,8 @@ break_command_1 (char *arg, int flag, int from_tty, struct breakpoint *pending_b
     }
   
   if (sals.nelts > 1)
-    {
-      warning ("Multiple breakpoints were set.");
-      warning ("Use the \"delete\" command to delete unwanted breakpoints.");
-    }
+    warning (_("Multiple breakpoints were set.\n"
+              "Use the \"delete\" command to delete unwanted breakpoints."));
   /* That's it. Discard the cleanups for data inserted into the
      breakpoint. */
   discard_cleanups (breakpoint_chain);
@@ -5271,7 +5320,7 @@ struct captured_breakpoint_args
   };
 
 static int
-do_captured_breakpoint (void *data)
+do_captured_breakpoint (struct ui_out *uiout, void *data)
 {
   struct captured_breakpoint_args *args = data;
   struct symtabs_and_lines sals;
@@ -5332,7 +5381,7 @@ do_captured_breakpoint (void *data)
      address. That way cleanups can take care of freeing any
      memory. */
   if (*address_end != '\0')
-    error ("Garbage %s following breakpoint address", address_end);
+    error (_("Garbage %s following breakpoint address"), address_end);
 
   /* Resolve all line numbers to PC's.  */
   breakpoint_sals_to_pc (&sals, args->address);
@@ -5346,7 +5395,7 @@ do_captured_breakpoint (void *data)
          char *tok = args->condition;
          cond[i] = parse_exp_1 (&tok, block_for_pc (sals.sals[i].pc), 0);
          if (*tok != '\0')
-           error ("Garbage %s follows condition", tok);
+           error (_("Garbage %s follows condition"), tok);
          make_cleanup (xfree, cond[i]);
          cond_string[i] = xstrdup (args->condition);
        }
@@ -5369,7 +5418,8 @@ do_captured_breakpoint (void *data)
 enum gdb_rc
 gdb_breakpoint (char *address, char *condition,
                int hardwareflag, int tempflag,
-               int thread, int ignore_count)
+               int thread, int ignore_count,
+               char **error_message)
 {
   struct captured_breakpoint_args args;
   args.address = address;
@@ -5378,171 +5428,8 @@ gdb_breakpoint (char *address, char *condition,
   args.tempflag = tempflag;
   args.thread = thread;
   args.ignore_count = ignore_count;
-  return catch_errors (do_captured_breakpoint, &args,
-                      NULL, RETURN_MASK_ALL);
-}
-
-
-static void
-break_at_finish_at_depth_command_1 (char *arg, int flag, int from_tty)
-{
-  struct frame_info *frame;
-  CORE_ADDR low, high, selected_pc = 0;
-  char *extra_args = NULL;
-  char *level_arg;
-  int extra_args_len = 0, if_arg = 0;
-
-  if (!arg ||
-      (arg[0] == 'i' && arg[1] == 'f' && (arg[2] == ' ' || arg[2] == '\t')))
-    {
-
-      if (default_breakpoint_valid)
-       {
-         if (deprecated_selected_frame)
-           {
-             selected_pc = get_frame_pc (deprecated_selected_frame);
-             if (arg)
-               if_arg = 1;
-           }
-         else
-           error ("No selected frame.");
-       }
-      else
-       error ("No default breakpoint address now.");
-    }
-  else
-    {
-      extra_args = strchr (arg, ' ');
-      if (extra_args)
-       {
-         extra_args++;
-         extra_args_len = strlen (extra_args);
-         level_arg = (char *) xmalloc (extra_args - arg);
-         strncpy (level_arg, arg, extra_args - arg - 1);
-         level_arg[extra_args - arg - 1] = '\0';
-       }
-      else
-       {
-         level_arg = (char *) xmalloc (strlen (arg) + 1);
-         strcpy (level_arg, arg);
-       }
-
-      frame = parse_frame_specification (level_arg);
-      if (frame)
-       selected_pc = get_frame_pc (frame);
-      else
-       selected_pc = 0;
-    }
-  if (if_arg)
-    {
-      extra_args = arg;
-      extra_args_len = strlen (arg);
-    }
-
-  if (selected_pc)
-    {
-      if (find_pc_partial_function (selected_pc, (char **) NULL, &low, &high))
-       {
-         char *addr_string;
-         if (extra_args_len)
-           addr_string = xstrprintf ("*0x%s %s", paddr_nz (high), extra_args);
-         else
-           addr_string = xstrprintf ("*0x%s", paddr_nz (high));
-         break_command_1 (addr_string, flag, from_tty, NULL);
-         xfree (addr_string);
-       }
-      else
-       error ("No function contains the specified address");
-    }
-  else
-    error ("Unable to set breakpoint at procedure exit");
-}
-
-
-static void
-break_at_finish_command_1 (char *arg, int flag, int from_tty)
-{
-  char *addr_string, *break_string, *beg_addr_string;
-  CORE_ADDR low, high;
-  struct symtabs_and_lines sals;
-  struct symtab_and_line sal;
-  struct cleanup *old_chain;
-  char *extra_args = NULL;
-  int extra_args_len = 0;
-  int i, if_arg = 0;
-
-  if (!arg ||
-      (arg[0] == 'i' && arg[1] == 'f' && (arg[2] == ' ' || arg[2] == '\t')))
-    {
-      if (default_breakpoint_valid)
-       {
-         if (deprecated_selected_frame)
-           {
-             addr_string = xstrprintf ("*0x%s",
-                                       paddr_nz (get_frame_pc (deprecated_selected_frame)));
-             if (arg)
-               if_arg = 1;
-           }
-         else
-           error ("No selected frame.");
-       }
-      else
-       error ("No default breakpoint address now.");
-    }
-  else
-    {
-      addr_string = (char *) xmalloc (strlen (arg) + 1);
-      strcpy (addr_string, arg);
-    }
-
-  if (if_arg)
-    {
-      extra_args = arg;
-      extra_args_len = strlen (arg);
-    }
-  else if (arg)
-    {
-      /* get the stuff after the function name or address */
-      extra_args = strchr (arg, ' ');
-      if (extra_args)
-       {
-         extra_args++;
-         extra_args_len = strlen (extra_args);
-       }
-    }
-
-  sals.sals = NULL;
-  sals.nelts = 0;
-
-  beg_addr_string = addr_string;
-  sals = decode_line_1 (&addr_string, 1, (struct symtab *) NULL, 0,
-                       (char ***) NULL, NULL);
-
-  xfree (beg_addr_string);
-  old_chain = make_cleanup (xfree, sals.sals);
-  for (i = 0; (i < sals.nelts); i++)
-    {
-      sal = sals.sals[i];
-      if (find_pc_partial_function (sal.pc, (char **) NULL, &low, &high))
-       {
-         break_string;
-         if (extra_args_len)
-           break_string = xstrprintf ("*0x%s %s", paddr_nz (high),
-                                      extra_args);
-         else
-           break_string = xstrprintf ("*0x%s", paddr_nz (high));
-         break_command_1 (break_string, flag, from_tty, NULL);
-         xfree (break_string);
-       }
-      else
-       error ("No function contains the specified address");
-    }
-  if (sals.nelts > 1)
-    {
-      warning ("Multiple breakpoints were set.\n");
-      warning ("Use the \"delete\" command to delete unwanted breakpoints.");
-    }
-  do_cleanups (old_chain);
+  return catch_exceptions_with_msg (uiout, do_captured_breakpoint, &args,
+                                   error_message, RETURN_MASK_ALL);
 }
 
 
@@ -5556,7 +5443,7 @@ resolve_sal_pc (struct symtab_and_line *sal)
   if (sal->pc == 0 && sal->symtab != NULL)
     {
       if (!find_line_pc (sal->symtab, sal->line, &pc))
-       error ("No line %d in file \"%s\".",
+       error (_("No line %d in file \"%s\"."),
               sal->line, sal->symtab->filename);
       sal->pc = pc;
     }
@@ -5602,29 +5489,11 @@ break_command (char *arg, int from_tty)
 }
 
 void
-break_at_finish_command (char *arg, int from_tty)
-{
-  break_at_finish_command_1 (arg, 0, from_tty);
-}
-
-void
-break_at_finish_at_depth_command (char *arg, int from_tty)
-{
-  break_at_finish_at_depth_command_1 (arg, 0, from_tty);
-}
-
-void
 tbreak_command (char *arg, int from_tty)
 {
   break_command_1 (arg, BP_TEMPFLAG, from_tty, NULL);
 }
 
-void
-tbreak_at_finish_command (char *arg, int from_tty)
-{
-  break_at_finish_command_1 (arg, BP_TEMPFLAG, from_tty);
-}
-
 static void
 hbreak_command (char *arg, int from_tty)
 {
@@ -5640,9 +5509,9 @@ thbreak_command (char *arg, int from_tty)
 static void
 stop_command (char *arg, int from_tty)
 {
-  printf_filtered ("Specify the type of breakpoint to set.\n\
+  printf_filtered (_("Specify the type of breakpoint to set.\n\
 Usage: stop in <function | address>\n\
-       stop at <line>\n");
+       stop at <line>\n"));
 }
 
 static void
@@ -5673,7 +5542,7 @@ stopin_command (char *arg, int from_tty)
     }
 
   if (badInput)
-    printf_filtered ("Usage: stop in <function | address>\n");
+    printf_filtered (_("Usage: stop in <function | address>\n"));
   else
     break_command_1 (arg, 0, from_tty, NULL);
 }
@@ -5705,7 +5574,7 @@ stopat_command (char *arg, int from_tty)
     }
 
   if (badInput)
-    printf_filtered ("Usage: stop at <line>\n");
+    printf_filtered (_("Usage: stop at <line>\n"));
   else
     break_command_1 (arg, 0, from_tty, NULL);
 }
@@ -5745,7 +5614,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
   mark = value_mark ();
   val = evaluate_expression (exp);
   release_value (val);
-  if (VALUE_LAZY (val))
+  if (value_lazy (val))
     value_fetch_lazy (val);
 
   tok = arg;
@@ -5764,7 +5633,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
       cond_end = tok;
     }
   if (*tok)
-    error ("Junk at end of command.");
+    error (_("Junk at end of command."));
 
   if (accessflag == hw_read)
     bp_type = bp_read_watchpoint;
@@ -5775,7 +5644,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
 
   mem_cnt = can_use_hardware_watchpoint (val);
   if (mem_cnt == 0 && bp_type != bp_hardware_watchpoint)
-    error ("Expression cannot be implemented with read/access watchpoint.");
+    error (_("Expression cannot be implemented with read/access watchpoint."));
   if (mem_cnt != 0)
     {
       i = hw_watchpoint_used_count (bp_type, &other_type_used);
@@ -5783,10 +5652,10 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
        TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_type, i + mem_cnt, 
                                            other_type_used);
       if (target_resources_ok == 0 && bp_type != bp_hardware_watchpoint)
-       error ("Target does not support this type of hardware watchpoint.");
+       error (_("Target does not support this type of hardware watchpoint."));
 
       if (target_resources_ok < 0 && bp_type != bp_hardware_watchpoint)
-       error ("Target can only support one kind of HW watchpoint at a time.");
+       error (_("Target can only support one kind of HW watchpoint at a time."));
     }
 
 #if defined(HPUXHPPA)
@@ -5806,7 +5675,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
      set watches after getting the program started. */
   if (!target_has_execution)
     {
-      warning ("can't do that without a running program; try \"break main\", \"run\" first");
+      warning (_("can't do that without a running program; try \"break main\"), \"run\" first");
       return;
     }
 #endif /* HPUXHPPA */
@@ -5865,7 +5734,8 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
          scope_breakpoint->loc->requested_address
            = get_frame_pc (prev_frame);
          scope_breakpoint->loc->address
-           = adjust_breakpoint_address (scope_breakpoint->loc->requested_address);
+           = adjust_breakpoint_address (scope_breakpoint->loc->requested_address,
+                                        scope_breakpoint->type);
 
          /* The scope breakpoint is related to the watchpoint.  We
             will need to act on them together.  */
@@ -5880,11 +5750,6 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
    in hardware.  If the watchpoint can not be handled
    in hardware return zero.  */
 
-#if !defined(TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT)
-#define TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(BYTE_SIZE) \
-    ((BYTE_SIZE) <= (DEPRECATED_REGISTER_SIZE))
-#endif
-
 #if !defined(TARGET_REGION_OK_FOR_HW_WATCHPOINT)
 #define TARGET_REGION_OK_FOR_HW_WATCHPOINT(ADDR,LEN) \
      (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT(LEN))
@@ -5919,11 +5784,11 @@ can_use_hardware_watchpoint (struct value *v)
      function calls are special in any way.  So this function may not
      notice that an expression involving an inferior function call
      can't be watched with hardware watchpoints.  FIXME.  */
-  for (; v; v = v->next)
+  for (; v; v = value_next (v))
     {
       if (VALUE_LVAL (v) == lval_memory)
        {
-         if (VALUE_LAZY (v))
+         if (value_lazy (v))
            /* A lazy memory lvalue is one that GDB never needed to fetch;
               we either just used its address (e.g., `a' in `a.b') or
               we never needed it at all (e.g., `a' in `a,b').  */
@@ -5932,7 +5797,7 @@ can_use_hardware_watchpoint (struct value *v)
            {
              /* Ahh, memory we actually used!  Check if we can cover
                  it with hardware watchpoints.  */
-             struct type *vtype = check_typedef (VALUE_TYPE (v));
+             struct type *vtype = check_typedef (value_type (v));
 
              /* We only watch structs and arrays if user asked for it
                 explicitly, never if they just happen to appear in a
@@ -5941,8 +5806,8 @@ can_use_hardware_watchpoint (struct value *v)
                  || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
                      && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
                {
-                 CORE_ADDR vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
-                 int       len   = TYPE_LENGTH (VALUE_TYPE (v));
+                 CORE_ADDR vaddr = VALUE_ADDRESS (v) + value_offset (v);
+                 int       len   = TYPE_LENGTH (value_type (v));
 
                  if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
                    return 0;
@@ -5951,9 +5816,10 @@ can_use_hardware_watchpoint (struct value *v)
                }
            }
        }
-      else if (v->lval != not_lval && v->modifiable == 0)
+      else if (VALUE_LVAL (v) != not_lval
+              && deprecated_value_modifiable (v) == 0)
        return 0;       /* ??? What does this represent? */
-      else if (v->lval == lval_register)
+      else if (VALUE_LVAL (v) == lval_register)
        return 0;       /* cannot watch a register with a HW watchpoint */
     }
 
@@ -6039,13 +5905,13 @@ until_break_command (char *arg, int from_tty, int anywhere)
                          0, (char ***) NULL, NULL);
 
   if (sals.nelts != 1)
-    error ("Couldn't get information on specified line.");
+    error (_("Couldn't get information on specified line."));
 
   sal = sals.sals[0];
   xfree (sals.sals);   /* malloc'd, so freed */
 
   if (*arg)
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   resolve_sal_pc (&sal);
 
@@ -6060,7 +5926,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
                                           get_frame_id (deprecated_selected_frame),
                                           bp_until);
 
-  if (!event_loop_p || !target_can_async_p ())
+  if (!target_can_async_p ())
     old_chain = make_cleanup_delete_breakpoint (breakpoint);
   else
     old_chain = make_exec_cleanup_delete_breakpoint (breakpoint);
@@ -6072,7 +5938,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
      where we get a chance to do that is in fetch_inferior_event, so
      we must set things up for that. */
 
-  if (event_loop_p && target_can_async_p ())
+  if (target_can_async_p ())
     {
       /* In this case the arg for the continuation is just the point
          in the exec_cleanups chain from where to start doing
@@ -6094,7 +5960,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
       sal.pc = get_frame_pc (prev_frame);
       breakpoint = set_momentary_breakpoint (sal, get_frame_id (prev_frame),
                                             bp_until);
-      if (!event_loop_p || !target_can_async_p ())
+      if (!target_can_async_p ())
        make_cleanup_delete_breakpoint (breakpoint);
       else
        make_exec_cleanup_delete_breakpoint (breakpoint);
@@ -6103,7 +5969,7 @@ until_break_command (char *arg, int from_tty, int anywhere)
   proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
   /* Do the cleanups now, anly if we are not running asynchronously,
      of if we are, but the target is still synchronous. */
-  if (!event_loop_p || !target_can_async_p ())
+  if (!target_can_async_p ())
     do_cleanups (old_chain);
 }
 
@@ -6237,7 +6103,7 @@ catch_fork_command_1 (catch_fork_kind fork_kind, char *arg, int tempflag,
   cond_string = ep_parse_optional_if_clause (&arg);
 
   if ((*arg != '\0') && !isspace (*arg))
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   /* If this target supports it, create a fork or vfork catchpoint
      and enable reporting of such events. */
@@ -6250,7 +6116,7 @@ catch_fork_command_1 (catch_fork_kind fork_kind, char *arg, int tempflag,
       create_vfork_event_catchpoint (tempflag, cond_string);
       break;
     default:
-      error ("unsupported or unknown fork kind; cannot catch it");
+      error (_("unsupported or unknown fork kind; cannot catch it"));
       break;
     }
 }
@@ -6270,7 +6136,7 @@ catch_exec_command_1 (char *arg, int tempflag, int from_tty)
   cond_string = ep_parse_optional_if_clause (&arg);
 
   if ((*arg != '\0') && !isspace (*arg))
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   /* If this target supports it, create an exec catchpoint
      and enable reporting of such events. */
@@ -6310,7 +6176,7 @@ catch_load_command_1 (char *arg, int tempflag, int from_tty)
     }
 
   if ((*arg != '\0') && !isspace (*arg))
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   /* Create a load breakpoint that only triggers when a load of
      the specified dll (or any dll, if no pathname was specified)
@@ -6352,7 +6218,7 @@ catch_unload_command_1 (char *arg, int tempflag, int from_tty)
     }
 
   if ((*arg != '\0') && !isspace (*arg))
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   /* Create an unload breakpoint that only triggers when an unload of
      the specified dll (or any dll, if no pathname was specified)
@@ -6387,7 +6253,7 @@ create_exception_catchpoint (int tempflag, char *cond_string,
       bptype = bp_catch_catch;
       break;
     default:                   /* error condition */
-      error ("Internal error -- invalid catchpoint kind");
+      error (_("Internal error -- invalid catchpoint kind"));
     }
 
   b = set_raw_breakpoint (*sal, bptype);
@@ -6409,10 +6275,10 @@ print_exception_catchpoint (struct breakpoint *b)
   annotate_catchpoint (b->number);
 
   if (strstr (b->addr_string, "throw") != NULL)
-    printf_filtered ("\nCatchpoint %d (exception thrown)\n",
+    printf_filtered (_("\nCatchpoint %d (exception thrown)\n"),
                     b->number);
   else
-    printf_filtered ("\nCatchpoint %d (exception caught)\n",
+    printf_filtered (_("\nCatchpoint %d (exception caught)\n"),
                     b->number);
 
   return PRINT_SRC_AND_LOC;
@@ -6438,9 +6304,9 @@ static void
 print_mention_exception_catchpoint (struct breakpoint *b)
 {
   if (strstr (b->addr_string, "throw") != NULL)
-    printf_filtered ("Catchpoint %d (throw)", b->number);
+    printf_filtered (_("Catchpoint %d (throw)"), b->number);
   else
-    printf_filtered ("Catchpoint %d (catch)", b->number);
+    printf_filtered (_("Catchpoint %d (catch)"), b->number);
 }
 
 static struct breakpoint_ops gnu_v3_exception_catchpoint_ops = {
@@ -6501,11 +6367,11 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
   cond_string = ep_parse_optional_if_clause (&arg);
 
   if ((*arg != '\0') && !isspace (*arg))
-    error ("Junk at end of arguments.");
+    error (_("Junk at end of arguments."));
 
   if ((ex_event != EX_EVENT_THROW) &&
       (ex_event != EX_EVENT_CATCH))
-    error ("Unsupported or unknown exception event; cannot catch it");
+    error (_("Unsupported or unknown exception event; cannot catch it"));
 
   if (handle_gnu_v3_exceptions (tempflag, cond_string, ex_event, from_tty))
     return;
@@ -6523,7 +6389,7 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
        return;         /* something went wrong with setting up callbacks */
     }
 
-  warning ("Unsupported with this platform/compiler combination.");
+  warning (_("Unsupported with this platform/compiler combination."));
 }
 
 /* Cover routine to allow wrapping target_enable_exception_catchpoints
@@ -6563,18 +6429,18 @@ catch_command_1 (char *arg, int tempflag, int from_tty)
       /* catch_throw_command_1 (arg1_start, tempflag, from_tty); */
       /* return; */
       /* Now, this is not allowed */
-      error ("Catch requires an event name.");
+      error (_("Catch requires an event name."));
 
     }
   arg1_end = ep_find_event_name_end (arg1_start);
   if (arg1_end == NULL)
-    error ("catch requires an event");
+    error (_("catch requires an event"));
   arg1_length = arg1_end + 1 - arg1_start;
 
   /* Try to match what we found against known event names. */
   if (strncmp (arg1_start, "signal", arg1_length) == 0)
     {
-      error ("Catch of signal not yet implemented");
+      error (_("Catch of signal not yet implemented"));
     }
   else if (strncmp (arg1_start, "catch", arg1_length) == 0)
     {
@@ -6588,23 +6454,23 @@ catch_command_1 (char *arg, int tempflag, int from_tty)
     }
   else if (strncmp (arg1_start, "thread_start", arg1_length) == 0)
     {
-      error ("Catch of thread_start not yet implemented");
+      error (_("Catch of thread_start not yet implemented"));
     }
   else if (strncmp (arg1_start, "thread_exit", arg1_length) == 0)
     {
-      error ("Catch of thread_exit not yet implemented");
+      error (_("Catch of thread_exit not yet implemented"));
     }
   else if (strncmp (arg1_start, "thread_join", arg1_length) == 0)
     {
-      error ("Catch of thread_join not yet implemented");
+      error (_("Catch of thread_join not yet implemented"));
     }
   else if (strncmp (arg1_start, "start", arg1_length) == 0)
     {
-      error ("Catch of start not yet implemented");
+      error (_("Catch of start not yet implemented"));
     }
   else if (strncmp (arg1_start, "exit", arg1_length) == 0)
     {
-      error ("Catch of exit not yet implemented");
+      error (_("Catch of exit not yet implemented"));
     }
   else if (strncmp (arg1_start, "fork", arg1_length) == 0)
     {
@@ -6628,7 +6494,7 @@ catch_command_1 (char *arg, int tempflag, int from_tty)
     }
   else if (strncmp (arg1_start, "stop", arg1_length) == 0)
     {
-      error ("Catch of stop not yet implemented");
+      error (_("Catch of stop not yet implemented"));
     }
 
   /* This doesn't appear to be an event name */
@@ -6639,7 +6505,7 @@ catch_command_1 (char *arg, int tempflag, int from_tty)
          as the name of an exception */
       /* catch_throw_command_1 (arg1_start, tempflag, from_tty); */
       /* Now this is not allowed */
-      error ("Unknown event kind specified for catch");
+      error (_("Unknown event kind specified for catch"));
 
     }
 }
@@ -6697,7 +6563,7 @@ clear_command (char *arg, int from_tty)
       sal.symtab = default_breakpoint_symtab;
       sal.pc = default_breakpoint_address;
       if (sal.symtab == 0)
-       error ("No source file specified.");
+       error (_("No source file specified."));
 
       sals.sals[0] = sal;
       sals.nelts = 1;
@@ -6775,15 +6641,20 @@ clear_command (char *arg, int from_tty)
   if (found == 0)
     {
       if (arg)
-       error ("No breakpoint at %s.", arg);
+       error (_("No breakpoint at %s."), arg);
       else
-       error ("No breakpoint at this line.");
+       error (_("No breakpoint at this line."));
     }
 
   if (found->next)
     from_tty = 1;              /* Always report if deleted more than one */
   if (from_tty)
-    printf_unfiltered ("Deleted breakpoint%s ", found->next ? "s" : "");
+    {
+      if (!found->next)
+       printf_unfiltered (_("Deleted breakpoint "));
+      else
+       printf_unfiltered (_("Deleted breakpoints "));
+    }
   breakpoints_changed ();
   while (found)
     {
@@ -6828,9 +6699,7 @@ delete_breakpoint (struct breakpoint *bpt)
   bpstat bs;
   struct bp_location *loc;
 
-  if (bpt == NULL)
-    error ("Internal error (attempted to delete a NULL breakpoint)");
-
+  gdb_assert (bpt != NULL);
 
   /* Has this bp already been deleted?  This can happen because multiple
      lists can hold pointers to bp's.  bpstat lists are especial culprits.
@@ -6844,17 +6713,19 @@ delete_breakpoint (struct breakpoint *bpt)
      A real solution to this problem might involve reference counts in bp's,
      and/or giving them pointers back to their referencing bpstat's, and
      teaching delete_breakpoint to only free a bp's storage when no more
-     references were extent.  A cheaper bandaid was chosen. */
+     references were extent.  A cheaper bandaid was chosen.  */
   if (bpt->type == bp_none)
     return;
 
-  if (delete_breakpoint_hook)
-    delete_breakpoint_hook (bpt);
+  if (deprecated_delete_breakpoint_hook)
+    deprecated_delete_breakpoint_hook (bpt);
   breakpoint_delete_event (bpt->number);
 
   if (bpt->loc->inserted)
     remove_breakpoint (bpt->loc, mark_inserted);
 
+  free_valchain (bpt->loc);
+
   if (breakpoint_chain == bpt)
     breakpoint_chain = bpt->next;
 
@@ -6866,7 +6737,7 @@ delete_breakpoint (struct breakpoint *bpt)
      isn't actually running.  target_enable_exception_callback for a
      null target ops vector gives an undesirable error message, so we
      check here and avoid it. Since currently (1997-09-17) only HP-UX aCC's
-     exceptions are supported in this way, it's OK for now. FIXME */
+     exceptions are supported in this way, it's OK for now.  FIXME */
   if (ep_is_exception_catchpoint (bpt) && target_has_execution)
     {
       /* Format possible error msg */
@@ -6925,8 +6796,8 @@ delete_breakpoint (struct breakpoint *bpt)
             always be the only one inserted.  */
          if (b->enable_state == bp_permanent)
            internal_error (__FILE__, __LINE__,
-                           "another breakpoint was inserted on top of "
-                           "a permanent breakpoint");
+                           _("another breakpoint was inserted on top of "
+                           "a permanent breakpoint"));
 
          if (b->type == bp_hardware_breakpoint)
            val = target_insert_hw_breakpoint (b->loc->address, b->loc->shadow_contents);
@@ -6951,7 +6822,7 @@ delete_breakpoint (struct breakpoint *bpt)
                  {
                    fprintf_unfiltered (tmp_error_stream, "Cannot insert breakpoint %d.\n", b->number);
                    fprintf_filtered (tmp_error_stream, "Error accessing memory address ");
-                   print_address_numeric (b->loc->address, 1, tmp_error_stream);
+                   deprecated_print_address_numeric (b->loc->address, 1, tmp_error_stream);
                    fprintf_filtered (tmp_error_stream, ": %s.\n",
                                      safe_strerror (val));
                  }
@@ -7049,7 +6920,7 @@ delete_command (char *arg, int from_tty)
 
       /* Ask user only if there are some breakpoints to delete.  */
       if (!from_tty
-         || (breaks_to_delete && query ("Delete all breakpoints? ")))
+         || (breaks_to_delete && query (_("Delete all breakpoints? "))))
        {
          ALL_BREAKPOINTS_SAFE (b, temp)
          {
@@ -7077,6 +6948,8 @@ breakpoint_re_set_one (void *bint)
   struct breakpoint *b = (struct breakpoint *) bint;
   struct value *mark;
   int i;
+  int not_found;
+  int *not_found_ptr = NULL;
   struct symtabs_and_lines sals;
   char *s;
   enum enable_state save_enable;
@@ -7084,7 +6957,7 @@ breakpoint_re_set_one (void *bint)
   switch (b->type)
     {
     case bp_none:
-      warning ("attempted to reset apparently deleted breakpoint #%d?",
+      warning (_("attempted to reset apparently deleted breakpoint #%d?"),
               b->number);
       return 0;
     case bp_breakpoint:
@@ -7127,11 +7000,19 @@ breakpoint_re_set_one (void *bint)
       save_enable = b->enable_state;
       if (b->enable_state != bp_shlib_disabled)
         b->enable_state = bp_disabled;
+      else
+       /* If resetting a shlib-disabled breakpoint, we don't want to
+          see an error message if it is not found since we will expect
+          this to occur until the shared library is finally reloaded.
+          We accomplish this by giving decode_line_1 a pointer to use
+          for silent notification that the symbol is not found.  */
+       not_found_ptr = &not_found;
 
       set_language (b->language);
       input_radix = b->input_radix;
       s = b->addr_string;
-      sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL, NULL);
+      sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL,
+                           not_found_ptr);
       for (i = 0; i < sals.nelts; i++)
        {
          resolve_sal_pc (&sals.sals[i]);
@@ -7176,7 +7057,8 @@ breakpoint_re_set_one (void *bint)
              b->line_number = sals.sals[i].line;
              b->loc->requested_address = sals.sals[i].pc;
              b->loc->address
-               = adjust_breakpoint_address (b->loc->requested_address);
+               = adjust_breakpoint_address (b->loc->requested_address,
+                                            b->type);
 
              /* Used to check for duplicates here, but that can
                 cause trouble, as it doesn't check for disabled
@@ -7233,7 +7115,7 @@ breakpoint_re_set_one (void *bint)
        }
       b->val = evaluate_expression (b->exp);
       release_value (b->val);
-      if (VALUE_LAZY (b->val) && breakpoint_enabled (b))
+      if (value_lazy (b->val) && breakpoint_enabled (b))
        value_fetch_lazy (b->val);
 
       if (b->cond_string != NULL)
@@ -7264,7 +7146,7 @@ breakpoint_re_set_one (void *bint)
       break;
 
     default:
-      printf_filtered ("Deleting unknown breakpoint type %d\n", b->type);
+      printf_filtered (_("Deleting unknown breakpoint type %d\n"), b->type);
       /* fall through */
       /* Delete longjmp and overlay event breakpoints; they will be
          reset later by breakpoint_re_set.  */
@@ -7364,13 +7246,13 @@ set_ignore_count (int bptnum, int count, int from_tty)
       if (from_tty)
        {
          if (count == 0)
-           printf_filtered ("Will stop next time breakpoint %d is reached.",
+           printf_filtered (_("Will stop next time breakpoint %d is reached."),
                             bptnum);
          else if (count == 1)
-           printf_filtered ("Will ignore next crossing of breakpoint %d.",
+           printf_filtered (_("Will ignore next crossing of breakpoint %d."),
                             bptnum);
          else
-           printf_filtered ("Will ignore next %d crossings of breakpoint %d.",
+           printf_filtered (_("Will ignore next %d crossings of breakpoint %d."),
                             count, bptnum);
        }
       breakpoints_changed ();
@@ -7378,7 +7260,7 @@ set_ignore_count (int bptnum, int count, int from_tty)
       return;
     }
 
-  error ("No breakpoint number %d.", bptnum);
+  error (_("No breakpoint number %d."), bptnum);
 }
 
 /* Clear the ignore counts of all breakpoints.  */
@@ -7400,13 +7282,13 @@ ignore_command (char *args, int from_tty)
   int num;
 
   if (p == 0)
-    error_no_arg ("a breakpoint number");
+    error_no_arg (_("a breakpoint number"));
 
   num = get_number (&p);
   if (num == 0)
-    error ("bad breakpoint number: '%s'", args);
+    error (_("bad breakpoint number: '%s'"), args);
   if (*p == 0)
-    error ("Second argument (specified ignore-count) is missing.");
+    error (_("Second argument (specified ignore-count) is missing."));
 
   set_ignore_count (num,
                    longest_to_int (value_as_long (parse_and_eval (p))),
@@ -7428,7 +7310,7 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *))
   int match;
 
   if (p == 0)
-    error_no_arg ("one or more breakpoint numbers");
+    error_no_arg (_("one or more breakpoint numbers"));
 
   while (*p)
     {
@@ -7438,7 +7320,7 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *))
       num = get_number_or_range (&p1);
       if (num == 0)
        {
-         warning ("bad breakpoint number at or near '%s'", p);
+         warning (_("bad breakpoint number at or near '%s'"), p);
        }
       else
        {
@@ -7453,7 +7335,7 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *))
                break;
              }
          if (match == 0)
-           printf_unfiltered ("No breakpoint number %d.\n", num);
+           printf_unfiltered (_("No breakpoint number %d.\n"), num);
        }
       p = p1;
     }
@@ -7480,8 +7362,8 @@ disable_breakpoint (struct breakpoint *bpt)
 
   check_duplicates (bpt);
 
-  if (modify_breakpoint_hook)
-    modify_breakpoint_hook (bpt);
+  if (deprecated_modify_breakpoint_hook)
+    deprecated_modify_breakpoint_hook (bpt);
   breakpoint_modify_event (bpt->number);
 }
 
@@ -7494,7 +7376,7 @@ disable_command (char *args, int from_tty)
       switch (bpt->type)
       {
       case bp_none:
-       warning ("attempted to disable apparently deleted breakpoint #%d?",
+       warning (_("attempted to disable apparently deleted breakpoint #%d?"),
                 bpt->number);
        continue;
       case bp_breakpoint:
@@ -7521,8 +7403,6 @@ disable_command (char *args, int from_tty)
 static void
 do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
 {
-  struct frame_info *save_selected_frame = NULL;
-  int save_selected_frame_level = -1;
   int target_resources_ok, other_type_used;
   struct value *mark;
 
@@ -7534,9 +7414,9 @@ do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
        TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_hardware_breakpoint, 
                                            i + 1, 0);
       if (target_resources_ok == 0)
-       error ("No hardware breakpoint support in the target.");
+       error (_("No hardware breakpoint support in the target."));
       else if (target_resources_ok < 0)
-       error ("Hardware breakpoints used exceeds limit.");
+       error (_("Hardware breakpoints used exceeds limit."));
     }
 
   if (bpt->pending)
@@ -7569,21 +7449,21 @@ do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
          bpt->type == bp_read_watchpoint || 
          bpt->type == bp_access_watchpoint)
        {
+         struct frame_id saved_frame_id;
+
+         saved_frame_id = get_frame_id (get_selected_frame (NULL));
          if (bpt->exp_valid_block != NULL)
            {
              struct frame_info *fr =
                fr = frame_find_by_id (bpt->watchpoint_frame);
              if (fr == NULL)
                {
-                 printf_filtered ("\
+                 printf_filtered (_("\
 Cannot enable watchpoint %d because the block in which its expression\n\
-is valid is not currently in scope.\n", bpt->number);
+is valid is not currently in scope.\n"), bpt->number);
                  bpt->enable_state = bp_disabled;
                  return;
                }
-             
-             save_selected_frame = deprecated_selected_frame;
-             save_selected_frame_level = frame_relative_level (deprecated_selected_frame);
              select_frame (fr);
            }
          
@@ -7591,7 +7471,7 @@ is valid is not currently in scope.\n", bpt->number);
          mark = value_mark ();
          bpt->val = evaluate_expression (bpt->exp);
          release_value (bpt->val);
-         if (VALUE_LAZY (bpt->val))
+         if (value_lazy (bpt->val))
            value_fetch_lazy (bpt->val);
          
          if (bpt->type == bp_hardware_watchpoint ||
@@ -7609,23 +7489,22 @@ is valid is not currently in scope.\n", bpt->number);
                 bp_watchpoint in the following condition */
              if (target_resources_ok < 0)
                {
-                 printf_filtered ("\
+                 printf_filtered (_("\
 Cannot enable watchpoint %d because target watch resources\n\
-have been allocated for other watchpoints.\n", bpt->number);
+have been allocated for other watchpoints.\n"), bpt->number);
                  bpt->enable_state = bp_disabled;
                  value_free_to_mark (mark);
                  return;
                }
            }
          
-         if (save_selected_frame_level >= 0)
-           select_frame (save_selected_frame);
+         select_frame (frame_find_by_id (saved_frame_id));
          value_free_to_mark (mark);
        }
     }
 
-  if (modify_breakpoint_hook)
-    modify_breakpoint_hook (bpt);
+  if (deprecated_modify_breakpoint_hook)
+    deprecated_modify_breakpoint_hook (bpt);
   breakpoint_modify_event (bpt->number);
 }
 
@@ -7637,7 +7516,7 @@ enable_breakpoint (struct breakpoint *bpt)
 
 /* The enable command enables the specified breakpoints (or all defined
    breakpoints) so they once again become (or continue to be) effective
-   in stopping the inferior. */
+   in stopping the inferior.  */
 
 static void
 enable_command (char *args, int from_tty)
@@ -7648,7 +7527,7 @@ enable_command (char *args, int from_tty)
       switch (bpt->type)
       {
       case bp_none:
-       warning ("attempted to enable apparently deleted breakpoint #%d?",
+       warning (_("attempted to enable apparently deleted breakpoint #%d?"),
                 bpt->number);
        continue;
       case bp_breakpoint:
@@ -7696,6 +7575,16 @@ enable_delete_command (char *args, int from_tty)
   map_breakpoint_numbers (args, enable_delete_breakpoint);
 }
 \f
+static void
+set_breakpoint_cmd (char *args, int from_tty)
+{
+}
+
+static void
+show_breakpoint_cmd (char *args, int from_tty)
+{
+}
+
 /* Use default_breakpoint_'s, or nothing if they aren't valid.  */
 
 struct symtabs_and_lines
@@ -7703,7 +7592,7 @@ decode_line_spec_1 (char *string, int funfirstline)
 {
   struct symtabs_and_lines sals;
   if (string == 0)
-    error ("Empty line specification.");
+    error (_("Empty line specification."));
   if (default_breakpoint_valid)
     sals = decode_line_1 (&string, funfirstline,
                          default_breakpoint_symtab,
@@ -7713,15 +7602,21 @@ decode_line_spec_1 (char *string, int funfirstline)
     sals = decode_line_1 (&string, funfirstline,
                          (struct symtab *) NULL, 0, (char ***) NULL, NULL);
   if (*string)
-    error ("Junk at end of line specification: %s", string);
+    error (_("Junk at end of line specification: %s"), string);
   return sals;
 }
 \f
 void
 _initialize_breakpoint (void)
 {
+  static struct cmd_list_element *breakpoint_set_cmdlist;
+  static struct cmd_list_element *breakpoint_show_cmdlist;
   struct cmd_list_element *c;
 
+#ifdef SOLIB_ADD
+  observer_attach_solib_unloaded (disable_breakpoints_in_unloaded_shlib);
+#endif
+
   breakpoint_chain = 0;
   /* Don't bother to call set_breakpoint_count.  $bpnum isn't useful
      before a breakpoint is set.  */
@@ -8035,7 +7930,35 @@ such is available.  (However, any hardware watchpoints that were\n\
 created before setting this to nonzero, will continue to use watchpoint\n\
 hardware.)",
                   &setlist);
-  add_show_from_set (c, &showlist);
+  deprecated_add_show_from_set (c, &showlist);
 
   can_use_hw_watchpoints = 1;
+
+  add_prefix_cmd ("breakpoint", class_maintenance, set_breakpoint_cmd, "\
+Breakpoint specific settings\n\
+Configure various breakpoint-specific variables such as\n\
+pending breakpoint behavior",
+                 &breakpoint_set_cmdlist, "set breakpoint ",
+                 0/*allow-unknown*/, &setlist);
+  add_prefix_cmd ("breakpoint", class_maintenance, show_breakpoint_cmd, "\
+Breakpoint specific settings\n\
+Configure various breakpoint-specific variables such as\n\
+pending breakpoint behavior",
+                 &breakpoint_show_cmdlist, "show breakpoint ",
+                 0/*allow-unknown*/, &showlist);
+
+  add_setshow_auto_boolean_cmd ("pending", no_class,
+                               &pending_break_support, _("\
+Set debugger's behavior regarding pending breakpoints."), _("\
+Show debugger's behavior regarding pending breakpoints."), _("\
+If on, an unrecognized breakpoint location will cause gdb to create a\n\
+pending breakpoint.  If off, an unrecognized breakpoint location results in\n\
+an error.  If auto, an unrecognized breakpoint location results in a\n\
+user-query to see if a pending breakpoint should be created."),
+                               NULL, /* FIXME: i18n: Debugger's behavior regarding pending breakpoints is %s.  */
+                               NULL, NULL,
+                               &breakpoint_set_cmdlist,
+                               &breakpoint_show_cmdlist);
+
+  pending_break_support = AUTO_BOOLEAN_AUTO;
 }