summaryrefslogtreecommitdiffstats
path: root/contrib/crossrpms/patches
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2008-09-18 03:51:34 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2008-09-18 03:51:34 +0000
commit641ef00ab6b2ce6b6008b38cfdb3dc7b5ceebae1 (patch)
treedeef382985cd158ded28b27380dc46729f9c12dd /contrib/crossrpms/patches
parent2008-09-17 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-641ef00ab6b2ce6b6008b38cfdb3dc7b5ceebae1.tar.bz2
Remove *.orig files having crept into patch.
Diffstat (limited to 'contrib/crossrpms/patches')
-rw-r--r--contrib/crossrpms/patches/gdb-6.8-rtems4.10-20080917.diff11614
1 files changed, 0 insertions, 11614 deletions
diff --git a/contrib/crossrpms/patches/gdb-6.8-rtems4.10-20080917.diff b/contrib/crossrpms/patches/gdb-6.8-rtems4.10-20080917.diff
index 5b5243fa2e..09609a9cc7 100644
--- a/contrib/crossrpms/patches/gdb-6.8-rtems4.10-20080917.diff
+++ b/contrib/crossrpms/patches/gdb-6.8-rtems4.10-20080917.diff
@@ -325,8367 +325,6 @@ diff -Naur gdb-6.8.orig/gdb/breakpoint.c gdb-6.8/gdb/breakpoint.c
if (bpt->type == bp_hardware_watchpoint ||
bpt->type == bp_read_watchpoint ||
bpt->type == bp_access_watchpoint)
-diff -Naur gdb-6.8.orig/gdb/breakpoint.c.orig gdb-6.8/gdb/breakpoint.c.orig
---- gdb-6.8.orig/gdb/breakpoint.c.orig 1970-01-01 01:00:00.000000000 +0100
-+++ gdb-6.8/gdb/breakpoint.c.orig 2008-02-26 09:14:11.000000000 +0100
-@@ -0,0 +1,8357 @@
-+/* Everything about breakpoints, for GDB.
-+
-+ Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-+ 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-+ 2008 Free Software Foundation, Inc.
-+
-+ This file is part of GDB.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 3 of the License, or
-+ (at your option) any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
-+
-+#include "defs.h"
-+#include <ctype.h>
-+#include "hashtab.h"
-+#include "symtab.h"
-+#include "frame.h"
-+#include "breakpoint.h"
-+#include "gdbtypes.h"
-+#include "expression.h"
-+#include "gdbcore.h"
-+#include "gdbcmd.h"
-+#include "value.h"
-+#include "command.h"
-+#include "inferior.h"
-+#include "gdbthread.h"
-+#include "target.h"
-+#include "language.h"
-+#include "gdb_string.h"
-+#include "demangle.h"
-+#include "annotate.h"
-+#include "symfile.h"
-+#include "objfiles.h"
-+#include "source.h"
-+#include "linespec.h"
-+#include "completer.h"
-+#include "gdb.h"
-+#include "ui-out.h"
-+#include "cli/cli-script.h"
-+#include "gdb_assert.h"
-+#include "block.h"
-+#include "solib.h"
-+#include "solist.h"
-+#include "observer.h"
-+#include "exceptions.h"
-+#include "memattr.h"
-+#include "ada-lang.h"
-+#include "top.h"
-+
-+#include "gdb-events.h"
-+#include "mi/mi-common.h"
-+
-+/* Prototypes for local functions. */
-+
-+static void until_break_command_continuation (struct continuation_arg *arg);
-+
-+static void catch_command_1 (char *, int, int);
-+
-+static void enable_delete_command (char *, int);
-+
-+static void enable_delete_breakpoint (struct breakpoint *);
-+
-+static void enable_once_command (char *, int);
-+
-+static void enable_once_breakpoint (struct breakpoint *);
-+
-+static void disable_command (char *, int);
-+
-+static void enable_command (char *, int);
-+
-+static void map_breakpoint_numbers (char *, void (*)(struct breakpoint *));
-+
-+static void ignore_command (char *, int);
-+
-+static int breakpoint_re_set_one (void *);
-+
-+static void clear_command (char *, int);
-+
-+static void catch_command (char *, int);
-+
-+static void watch_command (char *, int);
-+
-+static int can_use_hardware_watchpoint (struct value *);
-+
-+static void break_command_1 (char *, int, int);
-+
-+static void mention (struct breakpoint *);
-+
-+struct breakpoint *set_raw_breakpoint (struct symtab_and_line, enum bptype);
-+
-+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,
-+ enum bptype bptype);
-+
-+static void describe_other_breakpoints (CORE_ADDR, asection *, int);
-+
-+static void breakpoints_info (char *, int);
-+
-+static void breakpoint_1 (int, int);
-+
-+static bpstat bpstat_alloc (const struct bp_location *, bpstat);
-+
-+static int breakpoint_cond_eval (void *);
-+
-+static void cleanup_executing_breakpoints (void *);
-+
-+static void commands_command (char *, int);
-+
-+static void condition_command (char *, int);
-+
-+static int get_number_trailer (char **, int);
-+
-+void set_breakpoint_count (int);
-+
-+typedef enum
-+ {
-+ mark_inserted,
-+ mark_uninserted
-+ }
-+insertion_state_t;
-+
-+static int remove_breakpoint (struct bp_location *, insertion_state_t);
-+
-+static enum print_stop_action print_it_typical (bpstat);
-+
-+static enum print_stop_action print_bp_stop_message (bpstat bs);
-+
-+typedef struct
-+ {
-+ enum exception_event_kind kind;
-+ int enable_p;
-+ }
-+args_for_catchpoint_enable;
-+
-+static int watchpoint_check (void *);
-+
-+static void maintenance_info_breakpoints (char *, int);
-+
-+static void create_longjmp_breakpoint (char *);
-+
-+static void create_overlay_event_breakpoint (char *);
-+
-+static int hw_breakpoint_used_count (void);
-+
-+static int hw_watchpoint_used_count (enum bptype, int *);
-+
-+static void hbreak_command (char *, int);
-+
-+static void thbreak_command (char *, int);
-+
-+static void watch_command_1 (char *, int, int);
-+
-+static void rwatch_command (char *, int);
-+
-+static void awatch_command (char *, int);
-+
-+static void do_enable_breakpoint (struct breakpoint *, enum bpdisp);
-+
-+static void create_fork_vfork_event_catchpoint (int tempflag,
-+ char *cond_string,
-+ enum bptype bp_kind);
-+
-+static void stop_command (char *arg, int from_tty);
-+
-+static void stopin_command (char *arg, int from_tty);
-+
-+static void stopat_command (char *arg, int from_tty);
-+
-+static char *ep_find_event_name_end (char *arg);
-+
-+static char *ep_parse_optional_if_clause (char **arg);
-+
-+static char *ep_parse_optional_filename (char **arg);
-+
-+static void create_exception_catchpoint (int tempflag, char *cond_string,
-+ enum exception_event_kind ex_event,
-+ struct symtab_and_line *sal);
-+
-+static void catch_exception_command_1 (enum exception_event_kind ex_event,
-+ char *arg, int tempflag, int from_tty);
-+
-+static void tcatch_command (char *arg, int from_tty);
-+
-+static void ep_skip_leading_whitespace (char **s);
-+
-+static int single_step_breakpoint_inserted_here_p (CORE_ADDR pc);
-+
-+static void free_bp_location (struct bp_location *loc);
-+
-+static void mark_breakpoints_out (void);
-+
-+static struct bp_location *
-+allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type);
-+
-+static void
-+unlink_locations_from_global_list (struct breakpoint *bpt);
-+
-+static int
-+is_hardware_watchpoint (struct breakpoint *bpt);
-+
-+/* Prototypes for exported functions. */
-+
-+/* If FALSE, gdb will not use hardware support for watchpoints, even
-+ if such is available. */
-+static int can_use_hw_watchpoints;
-+
-+static void
-+show_can_use_hw_watchpoints (struct ui_file *file, int from_tty,
-+ struct cmd_list_element *c,
-+ const char *value)
-+{
-+ fprintf_filtered (file, _("\
-+Debugger's willingness to use watchpoint hardware is %s.\n"),
-+ value);
-+}
-+
-+/* 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;
-+static void
-+show_pending_break_support (struct ui_file *file, int from_tty,
-+ struct cmd_list_element *c,
-+ const char *value)
-+{
-+ fprintf_filtered (file, _("\
-+Debugger's behavior regarding pending breakpoints is %s.\n"),
-+ value);
-+}
-+
-+/* If 1, gdb will automatically use hardware breakpoints for breakpoints
-+ set with "break" but falling in read-only memory.
-+ If 0, gdb will warn about such breakpoints, but won't automatically
-+ use hardware breakpoints. */
-+static int automatic_hardware_breakpoints;
-+static void
-+show_automatic_hardware_breakpoints (struct ui_file *file, int from_tty,
-+ struct cmd_list_element *c,
-+ const char *value)
-+{
-+ fprintf_filtered (file, _("\
-+Automatic usage of hardware breakpoints is %s.\n"),
-+ value);
-+}
-+
-+
-+void _initialize_breakpoint (void);
-+
-+extern int addressprint; /* Print machine addresses? */
-+
-+/* Are we executing breakpoint commands? */
-+static int executing_breakpoint_commands;
-+
-+/* Are overlay event breakpoints enabled? */
-+static int overlay_events_enabled;
-+
-+/* Walk the following statement or block through all breakpoints.
-+ ALL_BREAKPOINTS_SAFE does so even if the statment deletes the current
-+ breakpoint. */
-+
-+#define ALL_BREAKPOINTS(B) for (B = breakpoint_chain; B; B = B->next)
-+
-+#define ALL_BREAKPOINTS_SAFE(B,TMP) \
-+ for (B = breakpoint_chain; \
-+ B ? (TMP=B->next, 1): 0; \
-+ B = TMP)
-+
-+/* Similar iterators for the low-level breakpoints. */
-+
-+#define ALL_BP_LOCATIONS(B) for (B = bp_location_chain; B; B = B->global_next)
-+
-+#define ALL_BP_LOCATIONS_SAFE(B,TMP) \
-+ for (B = bp_location_chain; \
-+ B ? (TMP=B->global_next, 1): 0; \
-+ B = TMP)
-+
-+/* True if breakpoint hit counts should be displayed in breakpoint info. */
-+
-+int show_breakpoint_hit_counts = 1;
-+
-+/* Chains of all breakpoints defined. */
-+
-+struct breakpoint *breakpoint_chain;
-+
-+struct bp_location *bp_location_chain;
-+
-+/* Number of last breakpoint made. */
-+
-+int breakpoint_count;
-+
-+/* Pointer to current exception event record */
-+static struct exception_event_record *current_exception_event;
-+
-+/* This function returns a pointer to the string representation of the
-+ pathname of the dynamically-linked library that has just been
-+ loaded.
-+
-+ This function must be used only when SOLIB_HAVE_LOAD_EVENT is TRUE,
-+ or undefined results are guaranteed.
-+
-+ This string's contents are only valid immediately after the
-+ inferior has stopped in the dynamic linker hook, and becomes
-+ invalid as soon as the inferior is continued. Clients should make
-+ a copy of this string if they wish to continue the inferior and
-+ then access the string. */
-+
-+#ifndef SOLIB_LOADED_LIBRARY_PATHNAME
-+#define SOLIB_LOADED_LIBRARY_PATHNAME(pid) ""
-+#endif
-+
-+/* This function returns a pointer to the string representation of the
-+ pathname of the dynamically-linked library that has just been
-+ unloaded.
-+
-+ This function must be used only when SOLIB_HAVE_UNLOAD_EVENT is
-+ TRUE, or undefined results are guaranteed.
-+
-+ This string's contents are only valid immediately after the
-+ inferior has stopped in the dynamic linker hook, and becomes
-+ invalid as soon as the inferior is continued. Clients should make
-+ a copy of this string if they wish to continue the inferior and
-+ then access the string. */
-+
-+#ifndef SOLIB_UNLOADED_LIBRARY_PATHNAME
-+#define SOLIB_UNLOADED_LIBRARY_PATHNAME(pid) ""
-+#endif
-+
-+/* This function is called by the "catch load" command. It allows the
-+ debugger to be notified by the dynamic linker when a specified
-+ library file (or any library file, if filename is NULL) is loaded. */
-+
-+#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"))
-+#endif
-+
-+/* This function is called by the "catch unload" command. It allows
-+ the debugger to be notified by the dynamic linker when a specified
-+ library file (or any library file, if filename is NULL) is
-+ 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"))
-+#endif
-+
-+/* Return whether a breakpoint is an active enabled breakpoint. */
-+static int
-+breakpoint_enabled (struct breakpoint *b)
-+{
-+ return (b->enable_state == bp_enabled);
-+}
-+
-+/* Set breakpoint count to NUM. */
-+
-+void
-+set_breakpoint_count (int num)
-+{
-+ breakpoint_count = num;
-+ set_internalvar (lookup_internalvar ("bpnum"),
-+ value_from_longest (builtin_type_int, (LONGEST) num));
-+}
-+
-+/* Used in run_command to zero the hit count when a new run starts. */
-+
-+void
-+clear_breakpoint_hit_counts (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ b->hit_count = 0;
-+}
-+
-+/* Default address, symtab and line to put a breakpoint at
-+ for "break" command with no arg.
-+ if default_breakpoint_valid is zero, the other three are
-+ not valid, and "break" with no arg is an error.
-+
-+ This set by print_stack_frame, which calls set_default_breakpoint. */
-+
-+int default_breakpoint_valid;
-+CORE_ADDR default_breakpoint_address;
-+struct symtab *default_breakpoint_symtab;
-+int default_breakpoint_line;
-+
-+/* *PP is a string denoting a breakpoint. Get the number of the breakpoint.
-+ Advance *PP after the string and any trailing whitespace.
-+
-+ Currently the string can either be a number or "$" followed by the name
-+ of a convenience variable. Making it an expression wouldn't work well
-+ for map_breakpoint_numbers (e.g. "4 + 5 + 6").
-+
-+ If the string is a NULL pointer, that denotes the last breakpoint.
-+
-+ TRAILER is a character which can be found after the number; most
-+ commonly this is `-'. If you don't want a trailer, use \0. */
-+static int
-+get_number_trailer (char **pp, int trailer)
-+{
-+ int retval = 0; /* default */
-+ char *p = *pp;
-+
-+ if (p == NULL)
-+ /* Empty line means refer to the last breakpoint. */
-+ return breakpoint_count;
-+ else if (*p == '$')
-+ {
-+ /* Make a copy of the name, so we can null-terminate it
-+ to pass to lookup_internalvar(). */
-+ char *varname;
-+ char *start = ++p;
-+ struct value *val;
-+
-+ while (isalnum (*p) || *p == '_')
-+ p++;
-+ varname = (char *) alloca (p - start + 1);
-+ 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)
-+ retval = (int) value_as_long (val);
-+ else
-+ {
-+ printf_filtered (_("Convenience variable must have integer value.\n"));
-+ retval = 0;
-+ }
-+ }
-+ else
-+ {
-+ if (*p == '-')
-+ ++p;
-+ while (*p >= '0' && *p <= '9')
-+ ++p;
-+ if (p == *pp)
-+ /* There is no number here. (e.g. "cond a == b"). */
-+ {
-+ /* Skip non-numeric token */
-+ while (*p && !isspace((int) *p))
-+ ++p;
-+ /* Return zero, which caller must interpret as error. */
-+ retval = 0;
-+ }
-+ else
-+ retval = atoi (*pp);
-+ }
-+ if (!(isspace (*p) || *p == '\0' || *p == trailer))
-+ {
-+ /* Trailing junk: return 0 and let caller print error msg. */
-+ while (!(isspace (*p) || *p == '\0' || *p == trailer))
-+ ++p;
-+ retval = 0;
-+ }
-+ while (isspace (*p))
-+ p++;
-+ *pp = p;
-+ return retval;
-+}
-+
-+
-+/* Like get_number_trailer, but don't allow a trailer. */
-+int
-+get_number (char **pp)
-+{
-+ return get_number_trailer (pp, '\0');
-+}
-+
-+/* Parse a number or a range.
-+ * A number will be of the form handled by get_number.
-+ * A range will be of the form <number1> - <number2>, and
-+ * will represent all the integers between number1 and number2,
-+ * inclusive.
-+ *
-+ * While processing a range, this fuction is called iteratively;
-+ * At each call it will return the next value in the range.
-+ *
-+ * At the beginning of parsing a range, the char pointer PP will
-+ * be advanced past <number1> and left pointing at the '-' token.
-+ * Subsequent calls will not advance the pointer until the range
-+ * is completed. The call that completes the range will advance
-+ * pointer PP past <number2>.
-+ */
-+
-+int
-+get_number_or_range (char **pp)
-+{
-+ static int last_retval, end_value;
-+ static char *end_ptr;
-+ static int in_range = 0;
-+
-+ if (**pp != '-')
-+ {
-+ /* Default case: pp is pointing either to a solo number,
-+ or to the first number of a range. */
-+ last_retval = get_number_trailer (pp, '-');
-+ if (**pp == '-')
-+ {
-+ char **temp;
-+
-+ /* This is the start of a range (<number1> - <number2>).
-+ Skip the '-', parse and remember the second number,
-+ and also remember the end of the final token. */
-+
-+ temp = &end_ptr;
-+ end_ptr = *pp + 1;
-+ while (isspace ((int) *end_ptr))
-+ end_ptr++; /* skip white space */
-+ end_value = get_number (temp);
-+ if (end_value < last_retval)
-+ {
-+ error (_("inverted range"));
-+ }
-+ else if (end_value == last_retval)
-+ {
-+ /* degenerate range (number1 == number2). Advance the
-+ token pointer so that the range will be treated as a
-+ single number. */
-+ *pp = end_ptr;
-+ }
-+ else
-+ in_range = 1;
-+ }
-+ }
-+ else if (! in_range)
-+ error (_("negative value"));
-+ else
-+ {
-+ /* pp points to the '-' that betokens a range. All
-+ number-parsing has already been done. Return the next
-+ integer value (one greater than the saved previous value).
-+ Do not advance the token pointer 'pp' until the end of range
-+ is reached. */
-+
-+ if (++last_retval == end_value)
-+ {
-+ /* End of range reached; advance token pointer. */
-+ *pp = end_ptr;
-+ in_range = 0;
-+ }
-+ }
-+ return last_retval;
-+}
-+
-+
-+
-+/* condition N EXP -- set break condition of breakpoint N to EXP. */
-+
-+static void
-+condition_command (char *arg, int from_tty)
-+{
-+ struct breakpoint *b;
-+ char *p;
-+ int bnum;
-+
-+ if (arg == 0)
-+ error_no_arg (_("breakpoint number"));
-+
-+ p = arg;
-+ bnum = get_number (&p);
-+ if (bnum == 0)
-+ error (_("Bad breakpoint argument: '%s'"), arg);
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->number == bnum)
-+ {
-+ struct bp_location *loc = b->loc;
-+ for (; loc; loc = loc->next)
-+ {
-+ if (loc->cond)
-+ {
-+ xfree (loc->cond);
-+ loc->cond = 0;
-+ }
-+ }
-+ if (b->cond_string != NULL)
-+ xfree (b->cond_string);
-+
-+ if (*p == 0)
-+ {
-+ b->cond_string = NULL;
-+ if (from_tty)
-+ printf_filtered (_("Breakpoint %d now unconditional.\n"), bnum);
-+ }
-+ else
-+ {
-+ arg = p;
-+ /* I don't know if it matters whether this is the string the user
-+ typed in or the decompiled expression. */
-+ b->cond_string = savestring (arg, strlen (arg));
-+ b->condition_not_parsed = 0;
-+ for (loc = b->loc; loc; loc = loc->next)
-+ {
-+ arg = p;
-+ loc->cond = parse_exp_1 (&arg, block_for_pc (loc->address), 0);
-+ if (*arg)
-+ error (_("Junk at end of expression"));
-+ }
-+ }
-+ breakpoints_changed ();
-+ breakpoint_modify_event (b->number);
-+ return;
-+ }
-+
-+ error (_("No breakpoint number %d."), bnum);
-+}
-+
-+static void
-+commands_command (char *arg, int from_tty)
-+{
-+ struct breakpoint *b;
-+ char *p;
-+ int bnum;
-+ struct command_line *l;
-+
-+ /* If we allowed this, we would have problems with when to
-+ free the storage, if we change the commands currently
-+ being read from. */
-+
-+ if (executing_breakpoint_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."));
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->number == bnum)
-+ {
-+ char *tmpbuf = xstrprintf ("Type commands for when breakpoint %d is hit, one per line.",
-+ bnum);
-+ struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
-+ l = read_command_lines (tmpbuf, from_tty);
-+ do_cleanups (cleanups);
-+ free_command_lines (&b->commands);
-+ b->commands = l;
-+ breakpoints_changed ();
-+ breakpoint_modify_event (b->number);
-+ return;
-+ }
-+ error (_("No breakpoint number %d."), bnum);
-+}
-+
-+/* Like commands_command, but instead of reading the commands from
-+ input stream, takes them from an already parsed command structure.
-+
-+ This is used by cli-script.c to DTRT with breakpoint commands
-+ that are part of if and while bodies. */
-+enum command_control_type
-+commands_from_control_command (char *arg, struct command_line *cmd)
-+{
-+ struct breakpoint *b;
-+ char *p;
-+ int bnum;
-+
-+ /* If we allowed this, we would have problems with when to
-+ free the storage, if we change the commands currently
-+ being read from. */
-+
-+ if (executing_breakpoint_commands)
-+ error (_("Can't use the \"commands\" command among a breakpoint's commands."));
-+
-+ /* An empty string for the breakpoint number means the last
-+ breakpoint, but get_number expects a NULL pointer. */
-+ if (arg && !*arg)
-+ p = NULL;
-+ else
-+ p = arg;
-+ bnum = get_number (&p);
-+
-+ if (p && *p)
-+ error (_("Unexpected extra arguments following breakpoint number."));
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->number == bnum)
-+ {
-+ free_command_lines (&b->commands);
-+ if (cmd->body_count != 1)
-+ error (_("Invalid \"commands\" block structure."));
-+ /* We need to copy the commands because if/while will free the
-+ list after it finishes execution. */
-+ b->commands = copy_command_lines (cmd->body_list[0]);
-+ breakpoints_changed ();
-+ breakpoint_modify_event (b->number);
-+ return simple_control;
-+ }
-+ error (_("No breakpoint number %d."), bnum);
-+}
-+
-+/* Like target_read_memory() but if breakpoints are inserted, return
-+ the shadow contents instead of the breakpoints themselves.
-+
-+ Read "memory data" from whatever target or inferior we have.
-+ Returns zero if successful, errno value if not. EIO is used
-+ for address out of bounds. If breakpoints are inserted, returns
-+ shadow contents, not the breakpoints themselves. From breakpoint.c. */
-+
-+int
-+read_memory_nobpt (CORE_ADDR memaddr, gdb_byte *myaddr, unsigned len)
-+{
-+ int status;
-+ const struct bp_location *b;
-+ CORE_ADDR bp_addr = 0;
-+ int bp_size = 0;
-+
-+ if (gdbarch_breakpoint_from_pc (current_gdbarch, &bp_addr, &bp_size) == NULL)
-+ /* No breakpoints on this machine. */
-+ return target_read_memory (memaddr, myaddr, len);
-+
-+ ALL_BP_LOCATIONS (b)
-+ {
-+ if (b->owner->type == bp_none)
-+ warning (_("reading through apparently deleted breakpoint #%d?"),
-+ b->owner->number);
-+
-+ if (b->loc_type != bp_loc_software_breakpoint)
-+ continue;
-+ if (!b->inserted)
-+ continue;
-+ /* Addresses and length of the part of the breakpoint that
-+ we need to copy. */
-+ bp_addr = b->target_info.placed_address;
-+ bp_size = b->target_info.shadow_len;
-+ if (bp_size == 0)
-+ /* bp isn't valid, or doesn't shadow memory. */
-+ continue;
-+ if (bp_addr + bp_size <= memaddr)
-+ /* The breakpoint is entirely before the chunk of memory we
-+ are reading. */
-+ continue;
-+ if (bp_addr >= memaddr + len)
-+ /* The breakpoint is entirely after the chunk of memory we are
-+ reading. */
-+ continue;
-+ /* Copy the breakpoint from the shadow contents, and recurse for
-+ the things before and after. */
-+ {
-+ /* Offset within shadow_contents. */
-+ int bptoffset = 0;
-+
-+ if (bp_addr < memaddr)
-+ {
-+ /* Only copy the second part of the breakpoint. */
-+ bp_size -= memaddr - bp_addr;
-+ bptoffset = memaddr - bp_addr;
-+ bp_addr = memaddr;
-+ }
-+
-+ if (bp_addr + bp_size > memaddr + len)
-+ {
-+ /* Only copy the first part of the breakpoint. */
-+ bp_size -= (bp_addr + bp_size) - (memaddr + len);
-+ }
-+
-+ memcpy (myaddr + bp_addr - memaddr,
-+ b->target_info.shadow_contents + bptoffset, bp_size);
-+
-+ if (bp_addr > memaddr)
-+ {
-+ /* Copy the section of memory before the breakpoint. */
-+ status = read_memory_nobpt (memaddr, myaddr, bp_addr - memaddr);
-+ if (status != 0)
-+ return status;
-+ }
-+
-+ if (bp_addr + bp_size < memaddr + len)
-+ {
-+ /* Copy the section of memory after the breakpoint. */
-+ status = read_memory_nobpt (bp_addr + bp_size,
-+ myaddr + bp_addr + bp_size - memaddr,
-+ memaddr + len - (bp_addr + bp_size));
-+ if (status != 0)
-+ return status;
-+ }
-+ return 0;
-+ }
-+ }
-+ /* Nothing overlaps. Just call read_memory_noerr. */
-+ return target_read_memory (memaddr, myaddr, len);
-+}
-+
-+
-+/* A wrapper function for inserting catchpoints. */
-+static void
-+insert_catchpoint (struct ui_out *uo, void *args)
-+{
-+ struct breakpoint *b = (struct breakpoint *) args;
-+ int val = -1;
-+
-+ switch (b->type)
-+ {
-+ case bp_catch_fork:
-+ target_insert_fork_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ case bp_catch_vfork:
-+ target_insert_vfork_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ case bp_catch_exec:
-+ target_insert_exec_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ default:
-+ internal_error (__FILE__, __LINE__, _("unknown breakpoint type"));
-+ break;
-+ }
-+}
-+
-+static int
-+is_hardware_watchpoint (struct breakpoint *bpt)
-+{
-+ return (bpt->type == bp_hardware_watchpoint
-+ || bpt->type == bp_read_watchpoint
-+ || bpt->type == bp_access_watchpoint);
-+}
-+
-+/* Assuming that B is a hardware breakpoint:
-+ - Reparse watchpoint expression, is REPARSE is non-zero
-+ - Evaluate expression and store the result in B->val
-+ - Update the list of values that must be watched in B->loc.
-+
-+ If the watchpoint is disabled, do nothing. If this is
-+ local watchpoint that is out of scope, delete it. */
-+static void
-+update_watchpoint (struct breakpoint *b, int reparse)
-+{
-+ int within_current_scope;
-+ struct value *mark = value_mark ();
-+ struct frame_id saved_frame_id;
-+ struct bp_location *loc;
-+ bpstat bs;
-+
-+ unlink_locations_from_global_list (b);
-+ for (loc = b->loc; loc;)
-+ {
-+ struct bp_location *loc_next = loc->next;
-+ remove_breakpoint (loc, mark_uninserted);
-+ xfree (loc);
-+ loc = loc_next;
-+ }
-+ b->loc = NULL;
-+
-+ if (b->disposition == disp_del_at_next_stop)
-+ return;
-+
-+ /* 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_id = get_frame_id (get_selected_frame (NULL));
-+
-+ /* Determine if the watchpoint is within scope. */
-+ if (b->exp_valid_block == NULL)
-+ within_current_scope = 1;
-+ else
-+ {
-+ struct frame_info *fi;
-+ fi = frame_find_by_id (b->watchpoint_frame);
-+ within_current_scope = (fi != NULL);
-+ if (within_current_scope)
-+ select_frame (fi);
-+ }
-+
-+ if (within_current_scope && reparse)
-+ {
-+ char *s;
-+ if (b->exp)
-+ {
-+ xfree (b->exp);
-+ b->exp = NULL;
-+ }
-+ s = b->exp_string;
-+ b->exp = parse_exp_1 (&s, b->exp_valid_block, 0);
-+ /* If the meaning of expression itself changed, the old value is
-+ no longer relevant. We don't want to report a watchpoint hit
-+ to the user when the old value and the new value may actually
-+ be completely different objects. */
-+ value_free (b->val);
-+ b->val = NULL;
-+ }
-+
-+
-+ /* If we failed to parse the expression, for example because
-+ it refers to a global variable in a not-yet-loaded shared library,
-+ don't try to insert watchpoint. We don't automatically delete
-+ such watchpoint, though, since failure to parse expression
-+ is different from out-of-scope watchpoint. */
-+ if (within_current_scope && b->exp)
-+ {
-+ struct value *v, *next;
-+
-+ /* Evaluate the expression and make sure it's not lazy, so that
-+ after target stops again, we have a non-lazy previous value
-+ to compare with. Also, making the value non-lazy will fetch
-+ intermediate values as needed, which we use to decide which
-+ addresses to watch.
-+
-+ The value returned by evaluate_expression is stored in b->val.
-+ In addition, we look at all values which were created
-+ during evaluation, and set watchoints at addresses as needed.
-+ Those values are explicitly deleted here. */
-+ v = evaluate_expression (b->exp);
-+ /* Avoid setting b->val if it's already set. The meaning of
-+ b->val is 'the last value' user saw, and we should update
-+ it only if we reported that last value to user. As it
-+ happens, the code that reports it updates b->val directly. */
-+ if (b->val == NULL)
-+ b->val = v;
-+ value_contents (v);
-+ value_release_to_mark (mark);
-+
-+ /* Look at each value on the value chain. */
-+ for (; v; v = next)
-+ {
-+ /* 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))
-+ {
-+ 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 the middle of some value chain. */
-+ if (v == b->val
-+ || (TYPE_CODE (vtype) != TYPE_CODE_STRUCT
-+ && TYPE_CODE (vtype) != TYPE_CODE_ARRAY))
-+ {
-+ CORE_ADDR addr;
-+ int len, type;
-+ struct bp_location *loc, **tmp;
-+
-+ addr = VALUE_ADDRESS (v) + value_offset (v);
-+ len = TYPE_LENGTH (value_type (v));
-+ type = hw_write;
-+ if (b->type == bp_read_watchpoint)
-+ type = hw_read;
-+ else if (b->type == bp_access_watchpoint)
-+ type = hw_access;
-+
-+ loc = allocate_bp_location (b, bp_hardware_watchpoint);
-+ for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
-+ ;
-+ *tmp = loc;
-+ loc->address = addr;
-+ loc->length = len;
-+ loc->watchpoint_type = type;
-+ }
-+ }
-+
-+ next = value_next (v);
-+ if (v != b->val)
-+ value_free (v);
-+ }
-+
-+ if (reparse && b->cond_string != NULL)
-+ {
-+ char *s = b->cond_string;
-+ if (b->loc->cond)
-+ {
-+ xfree (b->loc->cond);
-+ b->loc->cond = NULL;
-+ }
-+ b->loc->cond = parse_exp_1 (&s, b->exp_valid_block, 0);
-+ }
-+ }
-+ else if (!within_current_scope)
-+ {
-+ printf_filtered (_("\
-+Hardware watchpoint %d deleted because the program has left the block \n\
-+in which its expression is valid.\n"),
-+ b->number);
-+ if (b->related_breakpoint)
-+ b->related_breakpoint->disposition = disp_del_at_next_stop;
-+ b->disposition = disp_del_at_next_stop;
-+ }
-+
-+ /* Restore the selected frame. */
-+ select_frame (frame_find_by_id (saved_frame_id));
-+}
-+
-+
-+/* Insert a low-level "breakpoint" of some type. BPT is the breakpoint.
-+ Any error messages are printed to TMP_ERROR_STREAM; and DISABLED_BREAKS,
-+ PROCESS_WARNING, and HW_BREAKPOINT_ERROR are used to report problems.
-+
-+ NOTE drow/2003-09-09: This routine could be broken down to an object-style
-+ method for each breakpoint or catchpoint type. */
-+static int
-+insert_bp_location (struct bp_location *bpt,
-+ struct ui_file *tmp_error_stream,
-+ int *disabled_breaks, int *process_warning,
-+ int *hw_breakpoint_error)
-+{
-+ int val = 0;
-+
-+ if (!breakpoint_enabled (bpt->owner))
-+ return 0;
-+
-+ if (!bpt->enabled || bpt->shlib_disabled || bpt->inserted || bpt->duplicate)
-+ return 0;
-+
-+ /* Initialize the target-specific information. */
-+ memset (&bpt->target_info, 0, sizeof (bpt->target_info));
-+ bpt->target_info.placed_address = bpt->address;
-+
-+ if (bpt->loc_type == bp_loc_software_breakpoint
-+ || bpt->loc_type == bp_loc_hardware_breakpoint)
-+ {
-+ if (bpt->owner->type != bp_hardware_breakpoint)
-+ {
-+ /* If the explicitly specified breakpoint type
-+ is not hardware breakpoint, check the memory map to see
-+ if the breakpoint address is in read only memory or not.
-+ Two important cases are:
-+ - location type is not hardware breakpoint, memory
-+ is readonly. We change the type of the location to
-+ hardware breakpoint.
-+ - location type is hardware breakpoint, memory is read-write.
-+ This means we've previously made the location hardware one, but
-+ then the memory map changed, so we undo.
-+
-+ When breakpoints are removed, remove_breakpoints will
-+ use location types we've just set here, the only possible
-+ problem is that memory map has changed during running program,
-+ but it's not going to work anyway with current gdb. */
-+ struct mem_region *mr
-+ = lookup_mem_region (bpt->target_info.placed_address);
-+
-+ if (mr)
-+ {
-+ if (automatic_hardware_breakpoints)
-+ {
-+ int changed = 0;
-+ enum bp_loc_type new_type;
-+
-+ if (mr->attrib.mode != MEM_RW)
-+ new_type = bp_loc_hardware_breakpoint;
-+ else
-+ new_type = bp_loc_software_breakpoint;
-+
-+ if (new_type != bpt->loc_type)
-+ {
-+ static int said = 0;
-+ bpt->loc_type = new_type;
-+ if (!said)
-+ {
-+ fprintf_filtered (gdb_stdout, _("\
-+Note: automatically using hardware breakpoints for read-only addresses.\n"));
-+ said = 1;
-+ }
-+ }
-+ }
-+ else if (bpt->loc_type == bp_loc_software_breakpoint
-+ && mr->attrib.mode != MEM_RW)
-+ warning (_("cannot set software breakpoint at readonly address %s"),
-+ paddr (bpt->address));
-+ }
-+ }
-+
-+ /* First check to see if we have to handle an overlay. */
-+ if (overlay_debugging == ovly_off
-+ || bpt->section == NULL
-+ || !(section_is_overlay (bpt->section)))
-+ {
-+ /* No overlay handling: just set the breakpoint. */
-+
-+ if (bpt->loc_type == bp_loc_hardware_breakpoint)
-+ val = target_insert_hw_breakpoint (&bpt->target_info);
-+ else
-+ val = target_insert_breakpoint (&bpt->target_info);
-+ }
-+ else
-+ {
-+ /* This breakpoint is in an overlay section.
-+ Shall we set a breakpoint at the LMA? */
-+ if (!overlay_events_enabled)
-+ {
-+ /* Yes -- overlay event support is not active,
-+ 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!"),
-+ bpt->owner->number);
-+ else
-+ {
-+ CORE_ADDR addr = overlay_unmapped_address (bpt->address,
-+ bpt->section);
-+ /* Set a software (trap) breakpoint at the LMA. */
-+ bpt->overlay_target_info = bpt->target_info;
-+ bpt->overlay_target_info.placed_address = addr;
-+ val = target_insert_breakpoint (&bpt->overlay_target_info);
-+ if (val != 0)
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Overlay breakpoint %d failed: in ROM?",
-+ bpt->owner->number);
-+ }
-+ }
-+ /* Shall we set a breakpoint at the VMA? */
-+ if (section_is_mapped (bpt->section))
-+ {
-+ /* Yes. This overlay section is mapped into memory. */
-+ if (bpt->loc_type == bp_loc_hardware_breakpoint)
-+ val = target_insert_hw_breakpoint (&bpt->target_info);
-+ else
-+ val = target_insert_breakpoint (&bpt->target_info);
-+ }
-+ else
-+ {
-+ /* No. This breakpoint will not be inserted.
-+ No error, but do not mark the bp as 'inserted'. */
-+ return 0;
-+ }
-+ }
-+
-+ if (val)
-+ {
-+ /* Can't set the breakpoint. */
-+ if (solib_address (bpt->address))
-+ {
-+ /* See also: disable_breakpoints_in_shlibs. */
-+ val = 0;
-+ bpt->shlib_disabled = 1;
-+ if (!*disabled_breaks)
-+ {
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Cannot insert breakpoint %d.\n",
-+ bpt->owner->number);
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Temporarily disabling shared library breakpoints:\n");
-+ }
-+ *disabled_breaks = 1;
-+ fprintf_unfiltered (tmp_error_stream,
-+ "breakpoint #%d\n", bpt->owner->number);
-+ }
-+ else
-+ {
-+#ifdef ONE_PROCESS_WRITETEXT
-+ *process_warning = 1;
-+#endif
-+ if (bpt->loc_type == bp_loc_hardware_breakpoint)
-+ {
-+ *hw_breakpoint_error = 1;
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Cannot insert hardware breakpoint %d.\n",
-+ bpt->owner->number);
-+ }
-+ else
-+ {
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Cannot insert breakpoint %d.\n",
-+ bpt->owner->number);
-+ fprintf_filtered (tmp_error_stream,
-+ "Error accessing memory address ");
-+ fputs_filtered (paddress (bpt->address), tmp_error_stream);
-+ fprintf_filtered (tmp_error_stream, ": %s.\n",
-+ safe_strerror (val));
-+ }
-+
-+ }
-+ }
-+ else
-+ bpt->inserted = 1;
-+
-+ return val;
-+ }
-+
-+ else if (bpt->loc_type == bp_loc_hardware_watchpoint
-+ /* NOTE drow/2003-09-08: This state only exists for removing
-+ watchpoints. It's not clear that it's necessary... */
-+ && bpt->owner->disposition != disp_del_at_next_stop)
-+ {
-+ val = target_insert_watchpoint (bpt->address,
-+ bpt->length,
-+ bpt->watchpoint_type);
-+ bpt->inserted = (val != -1);
-+ }
-+
-+ else if (bpt->owner->type == bp_catch_fork
-+ || bpt->owner->type == bp_catch_vfork
-+ || bpt->owner->type == bp_catch_exec)
-+ {
-+ struct gdb_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;
-+
-+ /* We've already printed an error message if there was a problem
-+ inserting this catchpoint, and we've disabled the catchpoint,
-+ so just return success. */
-+ return 0;
-+ }
-+
-+ return 0;
-+}
-+
-+/* insert_breakpoints is used when starting or continuing the program.
-+ remove_breakpoints is used when the program stops.
-+ Both return zero if successful,
-+ or an `errno' value if could not write the inferior. */
-+
-+void
-+insert_breakpoints (void)
-+{
-+ struct breakpoint *bpt;
-+ struct bp_location *b, *temp;
-+ int error = 0;
-+ int val = 0;
-+ int disabled_breaks = 0;
-+ int hw_breakpoint_error = 0;
-+ int process_warning = 0;
-+
-+ struct ui_file *tmp_error_stream = mem_fileopen ();
-+ make_cleanup_ui_file_delete (tmp_error_stream);
-+
-+ /* Explicitly mark the warning -- this will only be printed if
-+ there was an error. */
-+ fprintf_unfiltered (tmp_error_stream, "Warning:\n");
-+
-+ ALL_BREAKPOINTS (bpt)
-+ if (is_hardware_watchpoint (bpt))
-+ update_watchpoint (bpt, 0 /* don't reparse */);
-+
-+ ALL_BP_LOCATIONS_SAFE (b, temp)
-+ {
-+ if (!breakpoint_enabled (b->owner))
-+ continue;
-+
-+ /* There is no point inserting thread-specific breakpoints if the
-+ thread no longer exists. */
-+ if (b->owner->thread != -1
-+ && !valid_thread_id (b->owner->thread))
-+ continue;
-+
-+ val = insert_bp_location (b, tmp_error_stream,
-+ &disabled_breaks, &process_warning,
-+ &hw_breakpoint_error);
-+ if (val)
-+ error = val;
-+ }
-+
-+ /* If we failed to insert all locations of a watchpoint,
-+ remove them, as half-inserted watchpoint is of limited use. */
-+ ALL_BREAKPOINTS (bpt)
-+ {
-+ int some_failed = 0;
-+ struct bp_location *loc;
-+
-+ if (!is_hardware_watchpoint (bpt))
-+ continue;
-+
-+ if (bpt->enable_state != bp_enabled)
-+ continue;
-+
-+ for (loc = bpt->loc; loc; loc = loc->next)
-+ if (!loc->inserted)
-+ {
-+ some_failed = 1;
-+ break;
-+ }
-+ if (some_failed)
-+ {
-+ for (loc = bpt->loc; loc; loc = loc->next)
-+ if (loc->inserted)
-+ remove_breakpoint (loc, mark_uninserted);
-+
-+ hw_breakpoint_error = 1;
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Could not insert hardware watchpoint %d.\n",
-+ bpt->number);
-+ error = -1;
-+ }
-+ }
-+
-+ if (error)
-+ {
-+ /* If a hardware breakpoint or watchpoint was inserted, add a
-+ message about possibly exhausted resources. */
-+ if (hw_breakpoint_error)
-+ {
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Could not insert hardware breakpoints:\n\
-+You may have requested too many hardware breakpoints/watchpoints.\n");
-+ }
-+#ifdef ONE_PROCESS_WRITETEXT
-+ if (process_warning)
-+ fprintf_unfiltered (tmp_error_stream,
-+ "The same program may be running in another process.");
-+#endif
-+ target_terminal_ours_for_output ();
-+ error_stream (tmp_error_stream);
-+ }
-+}
-+
-+int
-+remove_breakpoints (void)
-+{
-+ struct bp_location *b;
-+ int val;
-+
-+ ALL_BP_LOCATIONS (b)
-+ {
-+ if (b->inserted)
-+ {
-+ val = remove_breakpoint (b, mark_uninserted);
-+ if (val != 0)
-+ return val;
-+ }
-+ }
-+ return 0;
-+}
-+
-+int
-+remove_hw_watchpoints (void)
-+{
-+ struct bp_location *b;
-+ int val;
-+
-+ ALL_BP_LOCATIONS (b)
-+ {
-+ if (b->inserted && b->loc_type == bp_loc_hardware_watchpoint)
-+ {
-+ val = remove_breakpoint (b, mark_uninserted);
-+ if (val != 0)
-+ return val;
-+ }
-+ }
-+ return 0;
-+}
-+
-+int
-+reattach_breakpoints (int pid)
-+{
-+ struct bp_location *b;
-+ int val;
-+ struct cleanup *old_chain = save_inferior_ptid ();
-+ struct ui_file *tmp_error_stream = mem_fileopen ();
-+ int dummy1 = 0, dummy2 = 0, dummy3 = 0;
-+
-+ make_cleanup_ui_file_delete (tmp_error_stream);
-+
-+ inferior_ptid = pid_to_ptid (pid);
-+ ALL_BP_LOCATIONS (b)
-+ {
-+ if (b->inserted)
-+ {
-+ b->inserted = 0;
-+ val = insert_bp_location (b, tmp_error_stream,
-+ &dummy1, &dummy2, &dummy3);
-+ if (val != 0)
-+ {
-+ do_cleanups (old_chain);
-+ return val;
-+ }
-+ }
-+ }
-+ do_cleanups (old_chain);
-+ return 0;
-+}
-+
-+void
-+update_breakpoints_after_exec (void)
-+{
-+ struct breakpoint *b;
-+ struct breakpoint *temp;
-+
-+ /* Doing this first prevents the badness of having delete_breakpoint()
-+ write a breakpoint's current "shadow contents" to lift the bp. That
-+ shadow is NOT valid after an exec()! */
-+ mark_breakpoints_out ();
-+
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ {
-+ /* Solib breakpoints must be explicitly reset after an exec(). */
-+ if (b->type == bp_shlib_event)
-+ {
-+ delete_breakpoint (b);
-+ continue;
-+ }
-+
-+ /* Thread event breakpoints must be set anew after an exec(),
-+ as must overlay event breakpoints. */
-+ if (b->type == bp_thread_event || b->type == bp_overlay_event)
-+ {
-+ delete_breakpoint (b);
-+ continue;
-+ }
-+
-+ /* Step-resume breakpoints are meaningless after an exec(). */
-+ if (b->type == bp_step_resume)
-+ {
-+ delete_breakpoint (b);
-+ continue;
-+ }
-+
-+ /* Don't delete an exec catchpoint, because else the inferior
-+ won't stop when it ought!
-+
-+ Similarly, we probably ought to keep vfork catchpoints, 'cause
-+ on this target, we may not be able to stop when the vfork is
-+ seen, but only when the subsequent exec is seen. (And because
-+ deleting fork catchpoints here but not vfork catchpoints will
-+ seem mysterious to users, keep those too.) */
-+ if ((b->type == bp_catch_exec) ||
-+ (b->type == bp_catch_vfork) ||
-+ (b->type == bp_catch_fork))
-+ {
-+ continue;
-+ }
-+
-+ /* bp_finish is a special case. The only way we ought to be able
-+ to see one of these when an exec() has happened, is if the user
-+ caught a vfork, and then said "finish". Ordinarily a finish just
-+ carries them to the call-site of the current callee, by setting
-+ a temporary bp there and resuming. But in this case, the finish
-+ will carry them entirely through the vfork & exec.
-+
-+ We don't want to allow a bp_finish to remain inserted now. But
-+ we can't safely delete it, 'cause finish_command has a handle to
-+ the bp on a bpstat, and will later want to delete it. There's a
-+ chance (and I've seen it happen) that if we delete the bp_finish
-+ here, that its storage will get reused by the time finish_command
-+ gets 'round to deleting the "use to be a bp_finish" breakpoint.
-+ We really must allow finish_command to delete a bp_finish.
-+
-+ In the absense of a general solution for the "how do we know
-+ it's safe to delete something others may have handles to?"
-+ problem, what we'll do here is just uninsert the bp_finish, and
-+ let finish_command delete it.
-+
-+ (We know the bp_finish is "doomed" in the sense that it's
-+ momentary, and will be deleted as soon as finish_command sees
-+ the inferior stopped. So it doesn't matter that the bp's
-+ address is probably bogus in the new a.out, unlike e.g., the
-+ solib breakpoints.) */
-+
-+ if (b->type == bp_finish)
-+ {
-+ continue;
-+ }
-+
-+ /* Without a symbolic address, we have little hope of the
-+ pre-exec() address meaning the same thing in the post-exec()
-+ a.out. */
-+ if (b->addr_string == NULL)
-+ {
-+ delete_breakpoint (b);
-+ continue;
-+ }
-+ }
-+ /* FIXME what about longjmp breakpoints? Re-create them here? */
-+ create_overlay_event_breakpoint ("_ovly_debug_event");
-+}
-+
-+int
-+detach_breakpoints (int pid)
-+{
-+ struct bp_location *b;
-+ int val;
-+ struct cleanup *old_chain = save_inferior_ptid ();
-+
-+ if (pid == PIDGET (inferior_ptid))
-+ error (_("Cannot detach breakpoints of inferior_ptid"));
-+
-+ /* Set inferior_ptid; remove_breakpoint uses this global. */
-+ inferior_ptid = pid_to_ptid (pid);
-+ ALL_BP_LOCATIONS (b)
-+ {
-+ if (b->inserted)
-+ {
-+ val = remove_breakpoint (b, mark_inserted);
-+ if (val != 0)
-+ {
-+ do_cleanups (old_chain);
-+ return val;
-+ }
-+ }
-+ }
-+ do_cleanups (old_chain);
-+ return 0;
-+}
-+
-+static int
-+remove_breakpoint (struct bp_location *b, insertion_state_t is)
-+{
-+ int val;
-+
-+ if (b->owner->enable_state == bp_permanent)
-+ /* Permanent breakpoints cannot be inserted or removed. */
-+ return 0;
-+
-+ if (b->owner->type == bp_none)
-+ warning (_("attempted to remove apparently deleted breakpoint #%d?"),
-+ b->owner->number);
-+
-+ if (b->loc_type == bp_loc_software_breakpoint
-+ || b->loc_type == bp_loc_hardware_breakpoint)
-+ {
-+ /* "Normal" instruction breakpoint: either the standard
-+ trap-instruction bp (bp_breakpoint), or a
-+ bp_hardware_breakpoint. */
-+
-+ /* First check to see if we have to handle an overlay. */
-+ if (overlay_debugging == ovly_off
-+ || b->section == NULL
-+ || !(section_is_overlay (b->section)))
-+ {
-+ /* No overlay handling: just remove the breakpoint. */
-+
-+ if (b->loc_type == bp_loc_hardware_breakpoint)
-+ val = target_remove_hw_breakpoint (&b->target_info);
-+ else
-+ val = target_remove_breakpoint (&b->target_info);
-+ }
-+ else
-+ {
-+ /* This breakpoint is in an overlay section.
-+ Did we set a breakpoint at the LMA? */
-+ if (!overlay_events_enabled)
-+ {
-+ /* Yes -- overlay event support is not active, so we
-+ should have set a breakpoint at the LMA. Remove it.
-+ */
-+ /* Ignore any failures: if the LMA is in ROM, we will
-+ have already warned when we failed to insert it. */
-+ if (b->loc_type == bp_loc_hardware_breakpoint)
-+ target_remove_hw_breakpoint (&b->overlay_target_info);
-+ else
-+ target_remove_breakpoint (&b->overlay_target_info);
-+ }
-+ /* Did we set a breakpoint at the VMA?
-+ If so, we will have marked the breakpoint 'inserted'. */
-+ if (b->inserted)
-+ {
-+ /* Yes -- remove it. Previously we did not bother to
-+ remove the breakpoint if the section had been
-+ unmapped, but let's not rely on that being safe. We
-+ don't know what the overlay manager might do. */
-+ if (b->loc_type == bp_loc_hardware_breakpoint)
-+ val = target_remove_hw_breakpoint (&b->target_info);
-+
-+ /* However, we should remove *software* breakpoints only
-+ if the section is still mapped, or else we overwrite
-+ wrong code with the saved shadow contents. */
-+ else if (section_is_mapped (b->section))
-+ val = target_remove_breakpoint (&b->target_info);
-+ else
-+ val = 0;
-+ }
-+ else
-+ {
-+ /* No -- not inserted, so no need to remove. No error. */
-+ val = 0;
-+ }
-+ }
-+ if (val)
-+ return val;
-+ b->inserted = (is == mark_inserted);
-+ }
-+ else if (b->loc_type == bp_loc_hardware_watchpoint)
-+ {
-+ struct value *v;
-+ struct value *n;
-+
-+ b->inserted = (is == mark_inserted);
-+ val = target_remove_watchpoint (b->address, b->length,
-+ b->watchpoint_type);
-+
-+ /* Failure to remove any of the hardware watchpoints comes here. */
-+ if ((is == mark_uninserted) && (b->inserted))
-+ warning (_("Could not remove hardware watchpoint %d."),
-+ b->owner->number);
-+ }
-+ else if ((b->owner->type == bp_catch_fork ||
-+ b->owner->type == bp_catch_vfork ||
-+ b->owner->type == bp_catch_exec)
-+ && breakpoint_enabled (b->owner)
-+ && !b->duplicate)
-+ {
-+ val = -1;
-+ switch (b->owner->type)
-+ {
-+ case bp_catch_fork:
-+ val = target_remove_fork_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ case bp_catch_vfork:
-+ val = target_remove_vfork_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ case bp_catch_exec:
-+ val = target_remove_exec_catchpoint (PIDGET (inferior_ptid));
-+ break;
-+ default:
-+ warning (_("Internal error, %s line %d."), __FILE__, __LINE__);
-+ break;
-+ }
-+ if (val)
-+ return val;
-+ b->inserted = (is == mark_inserted);
-+ }
-+
-+ return 0;
-+}
-+
-+/* Clear the "inserted" flag in all breakpoints. */
-+
-+static void
-+mark_breakpoints_out (void)
-+{
-+ struct bp_location *bpt;
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ bpt->inserted = 0;
-+}
-+
-+/* Clear the "inserted" flag in all breakpoints and delete any
-+ breakpoints which should go away between runs of the program.
-+
-+ Plus other such housekeeping that has to be done for breakpoints
-+ between runs.
-+
-+ Note: this function gets called at the end of a run (by
-+ generic_mourn_inferior) and when a run begins (by
-+ init_wait_for_inferior). */
-+
-+
-+
-+void
-+breakpoint_init_inferior (enum inf_context context)
-+{
-+ struct breakpoint *b, *temp;
-+ struct bp_location *bpt;
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ bpt->inserted = 0;
-+
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ {
-+ switch (b->type)
-+ {
-+ case bp_call_dummy:
-+ case bp_watchpoint_scope:
-+
-+ /* If the call dummy breakpoint is at the entry point it will
-+ cause problems when the inferior is rerun, so we better
-+ get rid of it.
-+
-+ Also get rid of scope breakpoints. */
-+ delete_breakpoint (b);
-+ break;
-+
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+
-+ /* Likewise for watchpoints on local expressions. */
-+ if (b->exp_valid_block != NULL)
-+ delete_breakpoint (b);
-+ else if (context == inf_starting)
-+ {
-+ /* Reset val field to force reread of starting value
-+ in insert_breakpoints. */
-+ if (b->val)
-+ value_free (b->val);
-+ b->val = NULL;
-+ }
-+ break;
-+ default:
-+ break;
-+ }
-+ }
-+}
-+
-+/* breakpoint_here_p (PC) returns non-zero if an enabled breakpoint
-+ exists at PC. It returns ordinary_breakpoint_here if it's an
-+ ordinary breakpoint, or permanent_breakpoint_here if it's a
-+ permanent breakpoint.
-+ - When continuing from a location with an ordinary breakpoint, we
-+ actually single step once before calling insert_breakpoints.
-+ - When continuing from a localion with a permanent breakpoint, we
-+ need to use the `SKIP_PERMANENT_BREAKPOINT' macro, provided by
-+ the target, to advance the PC past the breakpoint. */
-+
-+enum breakpoint_here
-+breakpoint_here_p (CORE_ADDR pc)
-+{
-+ const struct bp_location *bpt;
-+ int any_breakpoint_here = 0;
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ {
-+ if (bpt->loc_type != bp_loc_software_breakpoint
-+ && bpt->loc_type != bp_loc_hardware_breakpoint)
-+ continue;
-+
-+ if ((breakpoint_enabled (bpt->owner)
-+ || bpt->owner->enable_state == bp_permanent)
-+ && bpt->address == pc) /* bp is enabled and matches pc */
-+ {
-+ if (overlay_debugging
-+ && section_is_overlay (bpt->section)
-+ && !section_is_mapped (bpt->section))
-+ continue; /* unmapped overlay -- can't be a match */
-+ else if (bpt->owner->enable_state == bp_permanent)
-+ return permanent_breakpoint_here;
-+ else
-+ any_breakpoint_here = 1;
-+ }
-+ }
-+
-+ return any_breakpoint_here ? ordinary_breakpoint_here : 0;
-+}
-+
-+
-+/* Returns non-zero if there's a breakpoint inserted at PC, which is
-+ inserted using regular breakpoint_chain/bp_location_chain mechanism.
-+ This does not check for single-step breakpoints, which are
-+ inserted and removed using direct target manipulation. */
-+
-+int
-+regular_breakpoint_inserted_here_p (CORE_ADDR pc)
-+{
-+ const struct bp_location *bpt;
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ {
-+ if (bpt->loc_type != bp_loc_software_breakpoint
-+ && bpt->loc_type != bp_loc_hardware_breakpoint)
-+ continue;
-+
-+ if (bpt->inserted
-+ && bpt->address == pc) /* bp is inserted and matches pc */
-+ {
-+ if (overlay_debugging
-+ && section_is_overlay (bpt->section)
-+ && !section_is_mapped (bpt->section))
-+ continue; /* unmapped overlay -- can't be a match */
-+ else
-+ return 1;
-+ }
-+ }
-+ return 0;
-+}
-+
-+/* Returns non-zero iff there's either regular breakpoint
-+ or a single step breakpoint inserted at PC. */
-+
-+int
-+breakpoint_inserted_here_p (CORE_ADDR pc)
-+{
-+ if (regular_breakpoint_inserted_here_p (pc))
-+ return 1;
-+
-+ if (single_step_breakpoint_inserted_here_p (pc))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/* This function returns non-zero iff there is a software breakpoint
-+ inserted at PC. */
-+
-+int
-+software_breakpoint_inserted_here_p (CORE_ADDR pc)
-+{
-+ const struct bp_location *bpt;
-+ int any_breakpoint_here = 0;
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ {
-+ if (bpt->loc_type != bp_loc_software_breakpoint)
-+ continue;
-+
-+ if (bpt->inserted
-+ && bpt->address == pc) /* bp is enabled and matches pc */
-+ {
-+ if (overlay_debugging
-+ && section_is_overlay (bpt->section)
-+ && !section_is_mapped (bpt->section))
-+ continue; /* unmapped overlay -- can't be a match */
-+ else
-+ return 1;
-+ }
-+ }
-+
-+ /* Also check for software single-step breakpoints. */
-+ if (single_step_breakpoint_inserted_here_p (pc))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/* breakpoint_thread_match (PC, PTID) returns true if the breakpoint at
-+ PC is valid for process/thread PTID. */
-+
-+int
-+breakpoint_thread_match (CORE_ADDR pc, ptid_t ptid)
-+{
-+ const struct bp_location *bpt;
-+ int thread;
-+
-+ thread = pid_to_thread_id (ptid);
-+
-+ ALL_BP_LOCATIONS (bpt)
-+ {
-+ if (bpt->loc_type != bp_loc_software_breakpoint
-+ && bpt->loc_type != bp_loc_hardware_breakpoint)
-+ continue;
-+
-+ if ((breakpoint_enabled (bpt->owner)
-+ || bpt->owner->enable_state == bp_permanent)
-+ && bpt->address == pc
-+ && (bpt->owner->thread == -1 || bpt->owner->thread == thread))
-+ {
-+ if (overlay_debugging
-+ && section_is_overlay (bpt->section)
-+ && !section_is_mapped (bpt->section))
-+ continue; /* unmapped overlay -- can't be a match */
-+ else
-+ return 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/* bpstat stuff. External routines' interfaces are documented
-+ in breakpoint.h. */
-+
-+int
-+ep_is_catchpoint (struct breakpoint *ep)
-+{
-+ return
-+ (ep->type == bp_catch_load)
-+ || (ep->type == bp_catch_unload)
-+ || (ep->type == bp_catch_fork)
-+ || (ep->type == bp_catch_vfork)
-+ || (ep->type == bp_catch_exec);
-+
-+ /* ??rehrauer: Add more kinds here, as are implemented... */
-+}
-+
-+int
-+ep_is_shlib_catchpoint (struct breakpoint *ep)
-+{
-+ return
-+ (ep->type == bp_catch_load)
-+ || (ep->type == bp_catch_unload);
-+}
-+
-+void
-+bpstat_free (bpstat bs)
-+{
-+ if (bs->old_val != NULL)
-+ value_free (bs->old_val);
-+ free_command_lines (&bs->commands);
-+ xfree (bs);
-+}
-+
-+/* Clear a bpstat so that it says we are not at any breakpoint.
-+ Also free any storage that is part of a bpstat. */
-+
-+void
-+bpstat_clear (bpstat *bsp)
-+{
-+ bpstat p;
-+ bpstat q;
-+
-+ if (bsp == 0)
-+ return;
-+ p = *bsp;
-+ while (p != NULL)
-+ {
-+ q = p->next;
-+ bpstat_free (p);
-+ p = q;
-+ }
-+ *bsp = NULL;
-+}
-+
-+/* Return a copy of a bpstat. Like "bs1 = bs2" but all storage that
-+ is part of the bpstat is copied as well. */
-+
-+bpstat
-+bpstat_copy (bpstat bs)
-+{
-+ bpstat p = NULL;
-+ bpstat tmp;
-+ bpstat retval = NULL;
-+
-+ if (bs == NULL)
-+ return bs;
-+
-+ for (; bs != NULL; bs = bs->next)
-+ {
-+ tmp = (bpstat) xmalloc (sizeof (*tmp));
-+ memcpy (tmp, bs, sizeof (*tmp));
-+ if (bs->commands != NULL)
-+ tmp->commands = copy_command_lines (bs->commands);
-+ if (bs->old_val != NULL)
-+ tmp->old_val = value_copy (bs->old_val);
-+
-+ if (p == NULL)
-+ /* This is the first thing in the chain. */
-+ retval = tmp;
-+ else
-+ p->next = tmp;
-+ p = tmp;
-+ }
-+ p->next = NULL;
-+ return retval;
-+}
-+
-+/* Find the bpstat associated with this breakpoint */
-+
-+bpstat
-+bpstat_find_breakpoint (bpstat bsp, struct breakpoint *breakpoint)
-+{
-+ if (bsp == NULL)
-+ return NULL;
-+
-+ for (; bsp != NULL; bsp = bsp->next)
-+ {
-+ if (bsp->breakpoint_at && bsp->breakpoint_at->owner == breakpoint)
-+ return bsp;
-+ }
-+ return NULL;
-+}
-+
-+/* Find a step_resume breakpoint associated with this bpstat.
-+ (If there are multiple step_resume bp's on the list, this function
-+ will arbitrarily pick one.)
-+
-+ It is an error to use this function if BPSTAT doesn't contain a
-+ step_resume breakpoint.
-+
-+ See wait_for_inferior's use of this function. */
-+struct breakpoint *
-+bpstat_find_step_resume_breakpoint (bpstat bsp)
-+{
-+ int current_thread;
-+
-+ gdb_assert (bsp != NULL);
-+
-+ current_thread = pid_to_thread_id (inferior_ptid);
-+
-+ for (; bsp != NULL; bsp = bsp->next)
-+ {
-+ if ((bsp->breakpoint_at != NULL) &&
-+ (bsp->breakpoint_at->owner->type == bp_step_resume) &&
-+ (bsp->breakpoint_at->owner->thread == current_thread ||
-+ bsp->breakpoint_at->owner->thread == -1))
-+ return bsp->breakpoint_at->owner;
-+ }
-+
-+ internal_error (__FILE__, __LINE__, _("No step_resume breakpoint found."));
-+}
-+
-+
-+/* Put in *NUM the breakpoint number of the first breakpoint we are stopped
-+ at. *BSP upon return is a bpstat which points to the remaining
-+ breakpoints stopped at (but which is not guaranteed to be good for
-+ anything but further calls to bpstat_num).
-+ Return 0 if passed a bpstat which does not indicate any breakpoints.
-+ Return -1 if stopped at a breakpoint that has been deleted since
-+ we set it.
-+ Return 1 otherwise. */
-+
-+int
-+bpstat_num (bpstat *bsp, int *num)
-+{
-+ struct breakpoint *b;
-+
-+ if ((*bsp) == NULL)
-+ return 0; /* No more breakpoint values */
-+
-+ /* We assume we'll never have several bpstats that
-+ correspond to a single breakpoint -- otherwise,
-+ this function might return the same number more
-+ than once and this will look ugly. */
-+ b = (*bsp)->breakpoint_at ? (*bsp)->breakpoint_at->owner : NULL;
-+ *bsp = (*bsp)->next;
-+ if (b == NULL)
-+ return -1; /* breakpoint that's been deleted since */
-+
-+ *num = b->number; /* We have its number */
-+ return 1;
-+}
-+
-+/* Modify BS so that the actions will not be performed. */
-+
-+void
-+bpstat_clear_actions (bpstat bs)
-+{
-+ for (; bs != NULL; bs = bs->next)
-+ {
-+ free_command_lines (&bs->commands);
-+ if (bs->old_val != NULL)
-+ {
-+ value_free (bs->old_val);
-+ bs->old_val = NULL;
-+ }
-+ }
-+}
-+
-+/* Stub for cleaning up our state if we error-out of a breakpoint command */
-+static void
-+cleanup_executing_breakpoints (void *ignore)
-+{
-+ executing_breakpoint_commands = 0;
-+}
-+
-+/* Execute all the commands associated with all the breakpoints at this
-+ location. Any of these commands could cause the process to proceed
-+ beyond this point, etc. We look out for such changes by checking
-+ the global "breakpoint_proceeded" after each command. */
-+
-+void
-+bpstat_do_actions (bpstat *bsp)
-+{
-+ bpstat bs;
-+ struct cleanup *old_chain;
-+
-+ /* Avoid endless recursion if a `source' command is contained
-+ in bs->commands. */
-+ if (executing_breakpoint_commands)
-+ return;
-+
-+ executing_breakpoint_commands = 1;
-+ old_chain = make_cleanup (cleanup_executing_breakpoints, 0);
-+
-+top:
-+ /* Note that (as of this writing), our callers all appear to
-+ be passing us the address of global stop_bpstat. And, if
-+ our calls to execute_control_command cause the inferior to
-+ proceed, that global (and hence, *bsp) will change.
-+
-+ We must be careful to not touch *bsp unless the inferior
-+ has not proceeded. */
-+
-+ /* This pointer will iterate over the list of bpstat's. */
-+ bs = *bsp;
-+
-+ breakpoint_proceeded = 0;
-+ for (; bs != NULL; bs = bs->next)
-+ {
-+ struct command_line *cmd;
-+ struct cleanup *this_cmd_tree_chain;
-+
-+ /* Take ownership of the BSP's command tree, if it has one.
-+
-+ The command tree could legitimately contain commands like
-+ 'step' and 'next', which call clear_proceed_status, which
-+ frees stop_bpstat's command tree. To make sure this doesn't
-+ free the tree we're executing out from under us, we need to
-+ take ownership of the tree ourselves. Since a given bpstat's
-+ commands are only executed once, we don't need to copy it; we
-+ can clear the pointer in the bpstat, and make sure we free
-+ the tree when we're done. */
-+ cmd = bs->commands;
-+ bs->commands = 0;
-+ this_cmd_tree_chain = make_cleanup_free_command_lines (&cmd);
-+
-+ while (cmd != NULL)
-+ {
-+ execute_control_command (cmd);
-+
-+ if (breakpoint_proceeded)
-+ break;
-+ else
-+ cmd = cmd->next;
-+ }
-+
-+ /* We can free this command tree now. */
-+ do_cleanups (this_cmd_tree_chain);
-+
-+ if (breakpoint_proceeded)
-+ /* The inferior is proceeded by the command; bomb out now.
-+ The bpstat chain has been blown away by wait_for_inferior.
-+ But since execution has stopped again, there is a new bpstat
-+ to look at, so start over. */
-+ goto top;
-+ }
-+ do_cleanups (old_chain);
-+}
-+
-+/* This is the normal print function for a bpstat. In the future,
-+ much of this logic could (should?) be moved to bpstat_stop_status,
-+ by having it set different print_it values.
-+
-+ Current scheme: When we stop, bpstat_print() is called. It loops
-+ through the bpstat list of things causing this stop, calling the
-+ print_bp_stop_message function on each one. The behavior of the
-+ print_bp_stop_message function depends on the print_it field of
-+ bpstat. If such field so indicates, call this function here.
-+
-+ Return values from this routine (ultimately used by bpstat_print()
-+ and normal_stop() to decide what to do):
-+ PRINT_NOTHING: Means we already printed all we needed to print,
-+ don't print anything else.
-+ PRINT_SRC_ONLY: Means we printed something, and we do *not* desire
-+ that something to be followed by a location.
-+ PRINT_SCR_AND_LOC: Means we printed something, and we *do* desire
-+ that something to be followed by a location.
-+ PRINT_UNKNOWN: Means we printed nothing or we need to do some more
-+ analysis. */
-+
-+static enum print_stop_action
-+print_it_typical (bpstat bs)
-+{
-+ struct cleanup *old_chain, *ui_out_chain;
-+ struct breakpoint *b;
-+ const struct bp_location *bl;
-+ struct ui_stream *stb;
-+ stb = ui_out_stream_new (uiout);
-+ old_chain = make_cleanup_ui_out_stream_delete (stb);
-+ /* bs->breakpoint_at can be NULL if it was a momentary breakpoint
-+ which has since been deleted. */
-+ if (bs->breakpoint_at == NULL)
-+ return PRINT_UNKNOWN;
-+ bl = bs->breakpoint_at;
-+ b = bl->owner;
-+
-+ switch (b->type)
-+ {
-+ case bp_breakpoint:
-+ case bp_hardware_breakpoint:
-+ if (bl->address != bl->requested_address)
-+ breakpoint_adjustment_warning (bl->requested_address,
-+ bl->address,
-+ b->number, 1);
-+ annotate_breakpoint (b->number);
-+ ui_out_text (uiout, "\nBreakpoint ");
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT));
-+ ui_out_field_int (uiout, "bkptno", b->number);
-+ ui_out_text (uiout, ", ");
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_shlib_event:
-+ /* Did we stop because the user set the stop_on_solib_events
-+ variable? (If so, we report this as a generic, "Stopped due
-+ to shlib event" message.) */
-+ printf_filtered (_("Stopped due to shared library event\n"));
-+ 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"));
-+ 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"));
-+ return PRINT_NOTHING;
-+ break;
-+
-+ case bp_catch_load:
-+ annotate_catchpoint (b->number);
-+ printf_filtered (_("\nCatchpoint %d (loaded %s), "),
-+ b->number,
-+ b->triggered_dll_pathname);
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_catch_unload:
-+ annotate_catchpoint (b->number);
-+ printf_filtered (_("\nCatchpoint %d (unloaded %s), "),
-+ b->number,
-+ b->triggered_dll_pathname);
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_catch_fork:
-+ annotate_catchpoint (b->number);
-+ printf_filtered (_("\nCatchpoint %d (forked process %d), "),
-+ b->number,
-+ b->forked_inferior_pid);
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_catch_vfork:
-+ annotate_catchpoint (b->number);
-+ printf_filtered (_("\nCatchpoint %d (vforked process %d), "),
-+ b->number,
-+ b->forked_inferior_pid);
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_catch_exec:
-+ annotate_catchpoint (b->number);
-+ printf_filtered (_("\nCatchpoint %d (exec'd %s), "),
-+ b->number,
-+ b->exec_pathname);
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ if (bs->old_val != NULL)
-+ {
-+ annotate_watchpoint (b->number);
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_WATCHPOINT_TRIGGER));
-+ mention (b);
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-+ ui_out_text (uiout, "\nOld value = ");
-+ value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
-+ ui_out_field_stream (uiout, "old", stb);
-+ ui_out_text (uiout, "\nNew value = ");
-+ value_print (b->val, stb->stream, 0, Val_pretty_default);
-+ ui_out_field_stream (uiout, "new", stb);
-+ do_cleanups (ui_out_chain);
-+ ui_out_text (uiout, "\n");
-+ value_free (bs->old_val);
-+ bs->old_val = NULL;
-+ }
-+ /* More than one watchpoint may have been triggered. */
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ case bp_read_watchpoint:
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_READ_WATCHPOINT_TRIGGER));
-+ mention (b);
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-+ ui_out_text (uiout, "\nValue = ");
-+ value_print (b->val, stb->stream, 0, Val_pretty_default);
-+ ui_out_field_stream (uiout, "value", stb);
-+ do_cleanups (ui_out_chain);
-+ ui_out_text (uiout, "\n");
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ case bp_access_watchpoint:
-+ if (bs->old_val != NULL)
-+ {
-+ annotate_watchpoint (b->number);
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
-+ mention (b);
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-+ ui_out_text (uiout, "\nOld value = ");
-+ value_print (bs->old_val, stb->stream, 0, Val_pretty_default);
-+ ui_out_field_stream (uiout, "old", stb);
-+ value_free (bs->old_val);
-+ bs->old_val = NULL;
-+ ui_out_text (uiout, "\nNew value = ");
-+ }
-+ else
-+ {
-+ mention (b);
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_ACCESS_WATCHPOINT_TRIGGER));
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "value");
-+ ui_out_text (uiout, "\nValue = ");
-+ }
-+ value_print (b->val, stb->stream, 0,Val_pretty_default);
-+ ui_out_field_stream (uiout, "new", stb);
-+ do_cleanups (ui_out_chain);
-+ ui_out_text (uiout, "\n");
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ /* Fall through, we don't deal with these types of breakpoints
-+ here. */
-+
-+ case bp_finish:
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_FUNCTION_FINISHED));
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ case bp_until:
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason",
-+ async_reason_lookup (EXEC_ASYNC_LOCATION_REACHED));
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ case bp_none:
-+ case bp_longjmp:
-+ case bp_longjmp_resume:
-+ case bp_step_resume:
-+ case bp_watchpoint_scope:
-+ case bp_call_dummy:
-+ default:
-+ return PRINT_UNKNOWN;
-+ }
-+}
-+
-+/* Generic routine for printing messages indicating why we
-+ stopped. The behavior of this function depends on the value
-+ 'print_it' in the bpstat structure. Under some circumstances we
-+ may decide not to print anything here and delegate the task to
-+ normal_stop(). */
-+
-+static enum print_stop_action
-+print_bp_stop_message (bpstat bs)
-+{
-+ switch (bs->print_it)
-+ {
-+ case print_it_noop:
-+ /* Nothing should be printed for this bpstat entry. */
-+ return PRINT_UNKNOWN;
-+ break;
-+
-+ case print_it_done:
-+ /* We still want to print the frame, but we already printed the
-+ relevant messages. */
-+ return PRINT_SRC_AND_LOC;
-+ break;
-+
-+ case print_it_normal:
-+ {
-+ const struct bp_location *bl = bs->breakpoint_at;
-+ struct breakpoint *b = bl ? bl->owner : NULL;
-+
-+ /* Normal case. Call the breakpoint's print_it method, or
-+ print_it_typical. */
-+ /* FIXME: how breakpoint can ever be NULL here? */
-+ if (b != NULL && b->ops != NULL && b->ops->print_it != NULL)
-+ return b->ops->print_it (b);
-+ else
-+ return print_it_typical (bs);
-+ }
-+ break;
-+
-+ default:
-+ internal_error (__FILE__, __LINE__,
-+ _("print_bp_stop_message: unrecognized enum value"));
-+ break;
-+ }
-+}
-+
-+/* Print a message indicating what happened. This is called from
-+ normal_stop(). The input to this routine is the head of the bpstat
-+ list - a list of the eventpoints that caused this stop. This
-+ routine calls the generic print routine for printing a message
-+ about reasons for stopping. This will print (for example) the
-+ "Breakpoint n," part of the output. The return value of this
-+ routine is one of:
-+
-+ PRINT_UNKNOWN: Means we printed nothing
-+ PRINT_SRC_AND_LOC: Means we printed something, and expect subsequent
-+ code to print the location. An example is
-+ "Breakpoint 1, " which should be followed by
-+ the location.
-+ PRINT_SRC_ONLY: Means we printed something, but there is no need
-+ to also print the location part of the message.
-+ An example is the catch/throw messages, which
-+ don't require a location appended to the end.
-+ PRINT_NOTHING: We have done some printing and we don't need any
-+ further info to be printed.*/
-+
-+enum print_stop_action
-+bpstat_print (bpstat bs)
-+{
-+ int val;
-+
-+ /* Maybe another breakpoint in the chain caused us to stop.
-+ (Currently all watchpoints go on the bpstat whether hit or not.
-+ That probably could (should) be changed, provided care is taken
-+ with respect to bpstat_explains_signal). */
-+ for (; bs; bs = bs->next)
-+ {
-+ val = print_bp_stop_message (bs);
-+ if (val == PRINT_SRC_ONLY
-+ || val == PRINT_SRC_AND_LOC
-+ || val == PRINT_NOTHING)
-+ return val;
-+ }
-+
-+ /* We reached the end of the chain, or we got a null BS to start
-+ with and nothing was printed. */
-+ return PRINT_UNKNOWN;
-+}
-+
-+/* Evaluate the expression EXP and return 1 if value is zero.
-+ This is used inside a catch_errors to evaluate the breakpoint condition.
-+ The argument is a "struct expression *" that has been cast to char * to
-+ make it pass through catch_errors. */
-+
-+static int
-+breakpoint_cond_eval (void *exp)
-+{
-+ struct value *mark = value_mark ();
-+ int i = !value_true (evaluate_expression ((struct expression *) exp));
-+ value_free_to_mark (mark);
-+ return i;
-+}
-+
-+/* Allocate a new bpstat and chain it to the current one. */
-+
-+static bpstat
-+bpstat_alloc (const struct bp_location *bl, bpstat cbs /* Current "bs" value */ )
-+{
-+ bpstat bs;
-+
-+ bs = (bpstat) xmalloc (sizeof (*bs));
-+ cbs->next = bs;
-+ bs->breakpoint_at = bl;
-+ /* If the condition is false, etc., don't do the commands. */
-+ bs->commands = NULL;
-+ bs->old_val = NULL;
-+ bs->print_it = print_it_normal;
-+ return bs;
-+}
-+
-+/* The target has stopped with waitstatus WS. Check if any hardware
-+ watchpoints have triggered, according to the target. */
-+
-+int
-+watchpoints_triggered (struct target_waitstatus *ws)
-+{
-+ int stopped_by_watchpoint = STOPPED_BY_WATCHPOINT (*ws);
-+ CORE_ADDR addr;
-+ struct breakpoint *b;
-+
-+ if (!stopped_by_watchpoint)
-+ {
-+ /* We were not stopped by a watchpoint. Mark all watchpoints
-+ as not triggered. */
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_hardware_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint)
-+ b->watchpoint_triggered = watch_triggered_no;
-+
-+ return 0;
-+ }
-+
-+ if (!target_stopped_data_address (&current_target, &addr))
-+ {
-+ /* We were stopped by a watchpoint, but we don't know where.
-+ Mark all watchpoints as unknown. */
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_hardware_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint)
-+ b->watchpoint_triggered = watch_triggered_unknown;
-+
-+ return stopped_by_watchpoint;
-+ }
-+
-+ /* The target could report the data address. Mark watchpoints
-+ affected by this data address as triggered, and all others as not
-+ triggered. */
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_hardware_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint)
-+ {
-+ struct bp_location *loc;
-+ struct value *v;
-+
-+ b->watchpoint_triggered = watch_triggered_no;
-+ for (loc = b->loc; loc; loc = loc->next)
-+ /* Exact match not required. Within range is
-+ sufficient. */
-+ if (addr >= loc->address
-+ && addr < loc->address + loc->length)
-+ {
-+ b->watchpoint_triggered = watch_triggered_yes;
-+ break;
-+ }
-+ }
-+
-+ return 1;
-+}
-+
-+/* Possible return values for watchpoint_check (this can't be an enum
-+ because of check_errors). */
-+/* The watchpoint has been deleted. */
-+#define WP_DELETED 1
-+/* The value has changed. */
-+#define WP_VALUE_CHANGED 2
-+/* The value has not changed. */
-+#define WP_VALUE_NOT_CHANGED 3
-+
-+#define BP_TEMPFLAG 1
-+#define BP_HARDWAREFLAG 2
-+
-+/* Check watchpoint condition. */
-+
-+static int
-+watchpoint_check (void *p)
-+{
-+ bpstat bs = (bpstat) p;
-+ struct breakpoint *b;
-+ struct frame_info *fr;
-+ int within_current_scope;
-+
-+ b = bs->breakpoint_at->owner;
-+
-+ if (b->exp_valid_block == NULL)
-+ within_current_scope = 1;
-+ else
-+ {
-+ /* There is no current frame at this moment. If we're going to have
-+ any chance of handling watchpoints on local variables, we'll need
-+ the frame chain (so we can determine if we're in scope). */
-+ reinit_frame_cache ();
-+ fr = frame_find_by_id (b->watchpoint_frame);
-+ within_current_scope = (fr != NULL);
-+
-+ /* If we've gotten confused in the unwinder, we might have
-+ returned a frame that can't describe this variable. */
-+ if (within_current_scope
-+ && block_function (b->exp_valid_block) != get_frame_function (fr))
-+ within_current_scope = 0;
-+
-+ /* in_function_epilogue_p() returns a non-zero value if we're still
-+ in the function but the stack frame has already been invalidated.
-+ Since we can't rely on the values of local variables after the
-+ stack has been destroyed, we are treating the watchpoint in that
-+ state as `not changed' without further checking.
-+
-+ vinschen/2003-09-04: The former implementation left out the case
-+ that the watchpoint frame couldn't be found by frame_find_by_id()
-+ because the current PC is currently in an epilogue. Calling
-+ gdbarch_in_function_epilogue_p() also when fr == NULL fixes that. */
-+ if ((!within_current_scope || fr == get_current_frame ())
-+ && gdbarch_in_function_epilogue_p (current_gdbarch, read_pc ()))
-+ return WP_VALUE_NOT_CHANGED;
-+ if (fr && within_current_scope)
-+ /* If we end up stopping, the current frame will get selected
-+ in normal_stop. So this call to select_frame won't affect
-+ the user. */
-+ select_frame (fr);
-+ }
-+
-+ if (within_current_scope)
-+ {
-+ /* We use value_{,free_to_}mark because it could be a
-+ *long* time before we return to the command level and
-+ call free_all_values. We can't call free_all_values because
-+ we might be in the middle of evaluating a function call. */
-+
-+ struct value *mark = value_mark ();
-+ struct value *new_val = evaluate_expression (b->exp);
-+ if (!value_equal (b->val, new_val))
-+ {
-+ release_value (new_val);
-+ value_free_to_mark (mark);
-+ bs->old_val = b->val;
-+ b->val = new_val;
-+ /* We will stop here */
-+ return WP_VALUE_CHANGED;
-+ }
-+ else
-+ {
-+ /* Nothing changed, don't do anything. */
-+ value_free_to_mark (mark);
-+ /* We won't stop here */
-+ return WP_VALUE_NOT_CHANGED;
-+ }
-+ }
-+ else
-+ {
-+ /* This seems like the only logical thing to do because
-+ if we temporarily ignored the watchpoint, then when
-+ we reenter the block in which it is valid it contains
-+ garbage (in the case of a function, it may have two
-+ garbage values, one before and one after the prologue).
-+ So we can't even detect the first assignment to it and
-+ watch after that (since the garbage may or may not equal
-+ the first value assigned). */
-+ /* We print all the stop information in print_it_typical(), but
-+ in this case, by the time we call print_it_typical() this bp
-+ will be deleted already. So we have no choice but print the
-+ information here. */
-+ if (ui_out_is_mi_like_p (uiout))
-+ ui_out_field_string
-+ (uiout, "reason", async_reason_lookup (EXEC_ASYNC_WATCHPOINT_SCOPE));
-+ ui_out_text (uiout, "\nWatchpoint ");
-+ ui_out_field_int (uiout, "wpnum", b->number);
-+ ui_out_text (uiout, " deleted because the program has left the block in\n\
-+which its expression is valid.\n");
-+
-+ if (b->related_breakpoint)
-+ b->related_breakpoint->disposition = disp_del_at_next_stop;
-+ b->disposition = disp_del_at_next_stop;
-+
-+ return WP_DELETED;
-+ }
-+}
-+
-+/* Get a bpstat associated with having just stopped at address
-+ BP_ADDR in thread PTID.
-+
-+ 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:
-+
-+ if we don't understand the stop, the result is a null pointer.
-+
-+ if we understand why we stopped, the result is not null.
-+
-+ Each element of the chain refers to a particular breakpoint or
-+ watchpoint at which we have stopped. (We may have stopped for
-+ several reasons concurrently.)
-+
-+ Each element of the chain has valid next, breakpoint_at,
-+ commands, FIXME??? fields. */
-+
-+bpstat
-+bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
-+{
-+ struct breakpoint *b = NULL;
-+ const struct bp_location *bl;
-+ /* Root of the chain of bpstat's */
-+ struct bpstats root_bs[1];
-+ /* Pointer to the last thing in the chain currently. */
-+ bpstat bs = root_bs;
-+ int thread_id = pid_to_thread_id (ptid);
-+
-+ ALL_BP_LOCATIONS (bl)
-+ {
-+ b = bl->owner;
-+ gdb_assert (b);
-+ if (!breakpoint_enabled (b) && b->enable_state != bp_permanent)
-+ continue;
-+
-+ if (b->type != bp_watchpoint
-+ && b->type != bp_hardware_watchpoint
-+ && b->type != bp_read_watchpoint
-+ && b->type != bp_access_watchpoint
-+ && b->type != bp_hardware_breakpoint
-+ && b->type != bp_catch_fork
-+ && b->type != bp_catch_vfork
-+ && b->type != bp_catch_exec) /* a non-watchpoint bp */
-+ {
-+ if (bl->address != bp_addr) /* address doesn't match */
-+ continue;
-+ if (overlay_debugging /* unmapped overlay section */
-+ && section_is_overlay (bl->section)
-+ && !section_is_mapped (bl->section))
-+ 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. Also skip watchpoints which we know did not trigger
-+ (did not match the data address). */
-+
-+ if ((b->type == bp_hardware_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint)
-+ && b->watchpoint_triggered == watch_triggered_no)
-+ continue;
-+
-+ if (b->type == bp_hardware_breakpoint)
-+ {
-+ if (bl->address != bp_addr)
-+ continue;
-+ if (overlay_debugging /* unmapped overlay section */
-+ && section_is_overlay (bl->section)
-+ && !section_is_mapped (bl->section))
-+ continue;
-+ }
-+
-+ /* Is this a catchpoint of a load or unload? If so, did we
-+ get a load or unload of the specified library? If not,
-+ ignore it. */
-+ if ((b->type == bp_catch_load)
-+#if defined(SOLIB_HAVE_LOAD_EVENT)
-+ && (!SOLIB_HAVE_LOAD_EVENT (PIDGET (inferior_ptid))
-+ || ((b->dll_pathname != NULL)
-+ && (strcmp (b->dll_pathname,
-+ SOLIB_LOADED_LIBRARY_PATHNAME (
-+ PIDGET (inferior_ptid)))
-+ != 0)))
-+#endif
-+ )
-+ continue;
-+
-+ if ((b->type == bp_catch_unload)
-+#if defined(SOLIB_HAVE_UNLOAD_EVENT)
-+ && (!SOLIB_HAVE_UNLOAD_EVENT (PIDGET (inferior_ptid))
-+ || ((b->dll_pathname != NULL)
-+ && (strcmp (b->dll_pathname,
-+ SOLIB_UNLOADED_LIBRARY_PATHNAME (
-+ PIDGET (inferior_ptid)))
-+ != 0)))
-+#endif
-+ )
-+ continue;
-+
-+ if ((b->type == bp_catch_fork)
-+ && !inferior_has_forked (PIDGET (inferior_ptid),
-+ &b->forked_inferior_pid))
-+ continue;
-+
-+ if ((b->type == bp_catch_vfork)
-+ && !inferior_has_vforked (PIDGET (inferior_ptid),
-+ &b->forked_inferior_pid))
-+ continue;
-+
-+ if ((b->type == bp_catch_exec)
-+ && !inferior_has_execd (PIDGET (inferior_ptid), &b->exec_pathname))
-+ continue;
-+
-+ /* For hardware watchpoints, we look only at the first location.
-+ The watchpoint_check function will work on entire expression,
-+ not the individual locations. For read watchopints, the
-+ watchpoints_triggered function have checked all locations
-+ alrea
-+ */
-+ if (b->type == bp_hardware_watchpoint && bl != b->loc)
-+ continue;
-+
-+ /* Come here if it's a watchpoint, or if the break address matches */
-+
-+ bs = bpstat_alloc (bl, bs); /* Alloc a bpstat to explain stop */
-+
-+ /* Watchpoints may change this, if not found to have triggered. */
-+ bs->stop = 1;
-+ bs->print = 1;
-+
-+ if (b->type == bp_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint
-+ || b->type == bp_hardware_watchpoint)
-+ {
-+ CORE_ADDR addr;
-+ struct value *v;
-+ int must_check_value = 0;
-+
-+ if (b->type == bp_watchpoint)
-+ /* For a software watchpoint, we must always check the
-+ watched value. */
-+ must_check_value = 1;
-+ else if (b->watchpoint_triggered == watch_triggered_yes)
-+ /* We have a hardware watchpoint (read, write, or access)
-+ and the target earlier reported an address watched by
-+ this watchpoint. */
-+ must_check_value = 1;
-+ else if (b->watchpoint_triggered == watch_triggered_unknown
-+ && b->type == bp_hardware_watchpoint)
-+ /* We were stopped by a hardware watchpoint, but the target could
-+ not report the data address. We must check the watchpoint's
-+ value. Access and read watchpoints are out of luck; without
-+ a data address, we can't figure it out. */
-+ must_check_value = 1;
-+
-+ if (must_check_value)
-+ {
-+ char *message = xstrprintf ("Error evaluating expression for watchpoint %d\n",
-+ b->number);
-+ struct cleanup *cleanups = make_cleanup (xfree, message);
-+ int e = catch_errors (watchpoint_check, bs, message,
-+ RETURN_MASK_ALL);
-+ do_cleanups (cleanups);
-+ switch (e)
-+ {
-+ case WP_DELETED:
-+ /* We've already printed what needs to be printed. */
-+ bs->print_it = print_it_done;
-+ /* Stop. */
-+ break;
-+ case WP_VALUE_CHANGED:
-+ if (b->type == bp_read_watchpoint)
-+ {
-+ /* Don't stop: read watchpoints shouldn't fire if
-+ the value has changed. This is for targets
-+ which cannot set read-only watchpoints. */
-+ bs->print_it = print_it_noop;
-+ bs->stop = 0;
-+ continue;
-+ }
-+ ++(b->hit_count);
-+ break;
-+ case WP_VALUE_NOT_CHANGED:
-+ if (b->type == bp_hardware_watchpoint
-+ || b->type == bp_watchpoint)
-+ {
-+ /* Don't stop: write watchpoints shouldn't fire if
-+ the value hasn't changed. */
-+ bs->print_it = print_it_noop;
-+ bs->stop = 0;
-+ continue;
-+ }
-+ /* Stop. */
-+ ++(b->hit_count);
-+ break;
-+ default:
-+ /* Can't happen. */
-+ case 0:
-+ /* Error from catch_errors. */
-+ 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;
-+ /* We've already printed what needs to be printed. */
-+ bs->print_it = print_it_done;
-+ break;
-+ }
-+ }
-+ else /* must_check_value == 0 */
-+ {
-+ /* This is a case where some watchpoint(s) triggered, but
-+ not at the address of this watchpoint, or else no
-+ watchpoint triggered after all. So don't print
-+ anything for this watchpoint. */
-+ bs->print_it = print_it_noop;
-+ bs->stop = 0;
-+ continue;
-+ }
-+ }
-+ else
-+ {
-+ /* By definition, an encountered breakpoint is a triggered
-+ breakpoint. */
-+ ++(b->hit_count);
-+ }
-+
-+ if (frame_id_p (b->frame_id)
-+ && !frame_id_eq (b->frame_id, get_frame_id (get_current_frame ())))
-+ bs->stop = 0;
-+ else
-+ {
-+ int value_is_zero = 0;
-+
-+ /* If this is a scope breakpoint, mark the associated
-+ watchpoint as triggered so that we will handle the
-+ out-of-scope event. We'll get to the watchpoint next
-+ iteration. */
-+ if (b->type == bp_watchpoint_scope)
-+ b->related_breakpoint->watchpoint_triggered = watch_triggered_yes;
-+
-+ if (bl->cond && bl->owner->disposition != disp_del_at_next_stop)
-+ {
-+ /* Need to select the frame, with all that implies
-+ so that the conditions will have the right context. */
-+ select_frame (get_current_frame ());
-+ value_is_zero
-+ = catch_errors (breakpoint_cond_eval, (bl->cond),
-+ "Error in testing breakpoint condition:\n",
-+ RETURN_MASK_ALL);
-+ /* FIXME-someday, should give breakpoint # */
-+ free_all_values ();
-+ }
-+ if (bl->cond && value_is_zero)
-+ {
-+ bs->stop = 0;
-+ /* Don't consider this a hit. */
-+ --(b->hit_count);
-+ }
-+ else if (b->thread != -1 && b->thread != thread_id)
-+ {
-+ bs->stop = 0;
-+ /* Don't consider this a hit. */
-+ --(b->hit_count);
-+ }
-+ else if (b->ignore_count > 0)
-+ {
-+ b->ignore_count--;
-+ annotate_ignore_count_change ();
-+ bs->stop = 0;
-+ }
-+ else if (b->type == bp_thread_event || b->type == bp_overlay_event)
-+ /* We do not stop for these. */
-+ bs->stop = 0;
-+ else
-+ {
-+ /* We will stop here */
-+ if (b->disposition == disp_disable)
-+ b->enable_state = bp_disabled;
-+ if (b->silent)
-+ bs->print = 0;
-+ bs->commands = b->commands;
-+ if (bs->commands &&
-+ (strcmp ("silent", bs->commands->line) == 0
-+ || (xdb_commands && strcmp ("Q", bs->commands->line) == 0)))
-+ {
-+ bs->commands = bs->commands->next;
-+ bs->print = 0;
-+ }
-+ bs->commands = copy_command_lines (bs->commands);
-+ }
-+ }
-+ /* Print nothing for this entry if we dont stop or if we dont print. */
-+ if (bs->stop == 0 || bs->print == 0)
-+ bs->print_it = print_it_noop;
-+ }
-+
-+ bs->next = NULL; /* Terminate the chain */
-+ bs = root_bs->next; /* Re-grab the head of the chain */
-+
-+ /* If we aren't stopping, the value of some hardware watchpoint may
-+ not have changed, but the intermediate memory locations we are
-+ watching may have. Don't bother if we're stopping; this will get
-+ done later. */
-+ for (bs = root_bs->next; bs != NULL; bs = bs->next)
-+ if (bs->stop)
-+ break;
-+
-+ if (bs == NULL)
-+ for (bs = root_bs->next; bs != NULL; bs = bs->next)
-+ if (!bs->stop
-+ && (bs->breakpoint_at->owner->type == bp_hardware_watchpoint
-+ || bs->breakpoint_at->owner->type == bp_read_watchpoint
-+ || bs->breakpoint_at->owner->type == bp_access_watchpoint))
-+ {
-+ /* remove/insert can invalidate bs->breakpoint_at, if this
-+ location is no longer used by the watchpoint. Prevent
-+ further code from trying to use it. */
-+ bs->breakpoint_at = NULL;
-+ remove_breakpoints ();
-+ insert_breakpoints ();
-+ break;
-+ }
-+
-+ return root_bs->next;
-+}
-+
-+/* Tell what to do about this bpstat. */
-+struct bpstat_what
-+bpstat_what (bpstat bs)
-+{
-+ /* Classify each bpstat as one of the following. */
-+ enum class
-+ {
-+ /* This bpstat element has no effect on the main_action. */
-+ no_effect = 0,
-+
-+ /* There was a watchpoint, stop but don't print. */
-+ wp_silent,
-+
-+ /* There was a watchpoint, stop and print. */
-+ wp_noisy,
-+
-+ /* There was a breakpoint but we're not stopping. */
-+ bp_nostop,
-+
-+ /* There was a breakpoint, stop but don't print. */
-+ bp_silent,
-+
-+ /* There was a breakpoint, stop and print. */
-+ bp_noisy,
-+
-+ /* We hit the longjmp breakpoint. */
-+ long_jump,
-+
-+ /* We hit the longjmp_resume breakpoint. */
-+ long_resume,
-+
-+ /* We hit the step_resume breakpoint. */
-+ step_resume,
-+
-+ /* We hit the shared library event breakpoint. */
-+ shlib_event,
-+
-+ /* We caught a shared library event. */
-+ catch_shlib_event,
-+
-+ /* This is just used to count how many enums there are. */
-+ class_last
-+ };
-+
-+ /* Here is the table which drives this routine. So that we can
-+ format it pretty, we define some abbreviations for the
-+ enum bpstat_what codes. */
-+#define kc BPSTAT_WHAT_KEEP_CHECKING
-+#define ss BPSTAT_WHAT_STOP_SILENT
-+#define sn BPSTAT_WHAT_STOP_NOISY
-+#define sgl BPSTAT_WHAT_SINGLE
-+#define slr BPSTAT_WHAT_SET_LONGJMP_RESUME
-+#define clr BPSTAT_WHAT_CLEAR_LONGJMP_RESUME
-+#define clrs BPSTAT_WHAT_CLEAR_LONGJMP_RESUME_SINGLE
-+#define sr BPSTAT_WHAT_STEP_RESUME
-+#define shl BPSTAT_WHAT_CHECK_SHLIBS
-+#define shlr BPSTAT_WHAT_CHECK_SHLIBS_RESUME_FROM_HOOK
-+
-+/* "Can't happen." Might want to print an error message.
-+ abort() is not out of the question, but chances are GDB is just
-+ a bit confused, not unusable. */
-+#define err BPSTAT_WHAT_STOP_NOISY
-+
-+ /* Given an old action and a class, come up with a new action. */
-+ /* One interesting property of this table is that wp_silent is the same
-+ as bp_silent and wp_noisy is the same as bp_noisy. That is because
-+ after stopping, the check for whether to step over a breakpoint
-+ (BPSTAT_WHAT_SINGLE type stuff) is handled in proceed() without
-+ reference to how we stopped. We retain separate wp_silent and
-+ bp_silent codes in case we want to change that someday.
-+
-+ Another possibly interesting property of this table is that
-+ there's a partial ordering, priority-like, of the actions. Once
-+ you've decided that some action is appropriate, you'll never go
-+ back and decide something of a lower priority is better. The
-+ ordering is:
-+
-+ kc < clr sgl shl shlr slr sn sr ss
-+ sgl < clrs shl shlr slr sn sr ss
-+ slr < err shl shlr sn sr ss
-+ clr < clrs err shl shlr sn sr ss
-+ clrs < err shl shlr sn sr ss
-+ ss < shl shlr sn sr
-+ sn < shl shlr sr
-+ shl < shlr sr
-+ shlr < sr
-+ sr <
-+
-+ What I think this means is that we don't need a damned table
-+ here. If you just put the rows and columns in the right order,
-+ it'd look awfully regular. We could simply walk the bpstat list
-+ and choose the highest priority action we find, with a little
-+ logic to handle the 'err' cases, and the CLEAR_LONGJMP_RESUME/
-+ CLEAR_LONGJMP_RESUME_SINGLE distinction (which breakpoint.h says
-+ is messy anyway). */
-+
-+ /* step_resume entries: a step resume breakpoint overrides another
-+ breakpoint of signal handling (see comment in wait_for_inferior
-+ at where we set the step_resume breakpoint). */
-+
-+ static const enum bpstat_what_main_action
-+ table[(int) class_last][(int) BPSTAT_WHAT_LAST] =
-+ {
-+ /* old action */
-+ /* kc ss sn sgl slr clr clrs sr shl shlr
-+ */
-+/*no_effect */
-+ {kc, ss, sn, sgl, slr, clr, clrs, sr, shl, shlr},
-+/*wp_silent */
-+ {ss, ss, sn, ss, ss, ss, ss, sr, shl, shlr},
-+/*wp_noisy */
-+ {sn, sn, sn, sn, sn, sn, sn, sr, shl, shlr},
-+/*bp_nostop */
-+ {sgl, ss, sn, sgl, slr, clrs, clrs, sr, shl, shlr},
-+/*bp_silent */
-+ {ss, ss, sn, ss, ss, ss, ss, sr, shl, shlr},
-+/*bp_noisy */
-+ {sn, sn, sn, sn, sn, sn, sn, sr, shl, shlr},
-+/*long_jump */
-+ {slr, ss, sn, slr, slr, err, err, sr, shl, shlr},
-+/*long_resume */
-+ {clr, ss, sn, clrs, err, err, err, sr, shl, shlr},
-+/*step_resume */
-+ {sr, sr, sr, sr, sr, sr, sr, sr, sr, sr},
-+/*shlib */
-+ {shl, shl, shl, shl, shl, shl, shl, sr, shl, shlr},
-+/*catch_shlib */
-+ {shlr, shlr, shlr, shlr, shlr, shlr, shlr, sr, shlr, shlr}
-+ };
-+
-+#undef kc
-+#undef ss
-+#undef sn
-+#undef sgl
-+#undef slr
-+#undef clr
-+#undef clrs
-+#undef err
-+#undef sr
-+#undef ts
-+#undef shl
-+#undef shlr
-+ enum bpstat_what_main_action current_action = BPSTAT_WHAT_KEEP_CHECKING;
-+ struct bpstat_what retval;
-+
-+ retval.call_dummy = 0;
-+ for (; bs != NULL; bs = bs->next)
-+ {
-+ enum class bs_class = no_effect;
-+ if (bs->breakpoint_at == NULL)
-+ /* I suspect this can happen if it was a momentary breakpoint
-+ which has since been deleted. */
-+ continue;
-+ switch (bs->breakpoint_at->owner->type)
-+ {
-+ case bp_none:
-+ continue;
-+
-+ case bp_breakpoint:
-+ case bp_hardware_breakpoint:
-+ case bp_until:
-+ case bp_finish:
-+ if (bs->stop)
-+ {
-+ if (bs->print)
-+ bs_class = bp_noisy;
-+ else
-+ bs_class = bp_silent;
-+ }
-+ else
-+ bs_class = bp_nostop;
-+ break;
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ if (bs->stop)
-+ {
-+ if (bs->print)
-+ bs_class = wp_noisy;
-+ else
-+ bs_class = wp_silent;
-+ }
-+ else
-+ /* There was a watchpoint, but we're not stopping.
-+ This requires no further action. */
-+ bs_class = no_effect;
-+ break;
-+ case bp_longjmp:
-+ bs_class = long_jump;
-+ break;
-+ case bp_longjmp_resume:
-+ bs_class = long_resume;
-+ break;
-+ case bp_step_resume:
-+ if (bs->stop)
-+ {
-+ bs_class = step_resume;
-+ }
-+ else
-+ /* It is for the wrong frame. */
-+ bs_class = bp_nostop;
-+ break;
-+ case bp_watchpoint_scope:
-+ bs_class = bp_nostop;
-+ break;
-+ case bp_shlib_event:
-+ bs_class = shlib_event;
-+ break;
-+ case bp_thread_event:
-+ case bp_overlay_event:
-+ bs_class = bp_nostop;
-+ break;
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ /* Only if this catchpoint triggered should we cause the
-+ step-out-of-dld behaviour. Otherwise, we ignore this
-+ catchpoint. */
-+ if (bs->stop)
-+ bs_class = catch_shlib_event;
-+ else
-+ bs_class = no_effect;
-+ break;
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ case bp_catch_exec:
-+ if (bs->stop)
-+ {
-+ if (bs->print)
-+ bs_class = bp_noisy;
-+ else
-+ bs_class = bp_silent;
-+ }
-+ else
-+ /* There was a catchpoint, but we're not stopping.
-+ This requires no further action. */
-+ bs_class = no_effect;
-+ break;
-+ case bp_call_dummy:
-+ /* Make sure the action is stop (silent or noisy),
-+ so infrun.c pops the dummy frame. */
-+ bs_class = bp_silent;
-+ retval.call_dummy = 1;
-+ break;
-+ }
-+ current_action = table[(int) bs_class][(int) current_action];
-+ }
-+ retval.main_action = current_action;
-+ return retval;
-+}
-+
-+/* Nonzero if we should step constantly (e.g. watchpoints on machines
-+ without hardware support). This isn't related to a specific bpstat,
-+ just to things like whether watchpoints are set. */
-+
-+int
-+bpstat_should_step (void)
-+{
-+ struct breakpoint *b;
-+ ALL_BREAKPOINTS (b)
-+ if (breakpoint_enabled (b) && b->type == bp_watchpoint)
-+ return 1;
-+ return 0;
-+}
-+
-+
-+
-+/* Given a bpstat that records zero or more triggered eventpoints, this
-+ function returns another bpstat which contains only the catchpoints
-+ on that first list, if any. */
-+void
-+bpstat_get_triggered_catchpoints (bpstat ep_list, bpstat *cp_list)
-+{
-+ struct bpstats root_bs[1];
-+ bpstat bs = root_bs;
-+ struct breakpoint *ep;
-+ char *dll_pathname;
-+
-+ bpstat_clear (cp_list);
-+ root_bs->next = NULL;
-+
-+ for (; ep_list != NULL; ep_list = ep_list->next)
-+ {
-+ /* Is this eventpoint a catchpoint? If not, ignore it. */
-+ ep = ep_list->breakpoint_at->owner;
-+ if (ep == NULL)
-+ break;
-+ if ((ep->type != bp_catch_load) &&
-+ (ep->type != bp_catch_unload))
-+ /* pai: (temp) ADD fork/vfork here!! */
-+ continue;
-+
-+ /* Yes; add it to the list. */
-+ bs = bpstat_alloc (ep_list->breakpoint_at, bs);
-+ *bs = *ep_list;
-+ bs->next = NULL;
-+ bs = root_bs->next;
-+
-+#if defined(SOLIB_ADD)
-+ /* Also, for each triggered catchpoint, tag it with the name of
-+ the library that caused this trigger. (We copy the name now,
-+ because it's only guaranteed to be available NOW, when the
-+ catchpoint triggers. Clients who may wish to know the name
-+ later must get it from the catchpoint itself.) */
-+ if (ep->triggered_dll_pathname != NULL)
-+ xfree (ep->triggered_dll_pathname);
-+ if (ep->type == bp_catch_load)
-+ dll_pathname = SOLIB_LOADED_LIBRARY_PATHNAME (
-+ PIDGET (inferior_ptid));
-+ else
-+ dll_pathname = SOLIB_UNLOADED_LIBRARY_PATHNAME (
-+ PIDGET (inferior_ptid));
-+#else
-+ dll_pathname = NULL;
-+#endif
-+ if (dll_pathname)
-+ {
-+ ep->triggered_dll_pathname = (char *)
-+ xmalloc (strlen (dll_pathname) + 1);
-+ strcpy (ep->triggered_dll_pathname, dll_pathname);
-+ }
-+ else
-+ ep->triggered_dll_pathname = NULL;
-+ }
-+
-+ *cp_list = bs;
-+}
-+
-+static void print_breakpoint_location (struct breakpoint *b,
-+ struct bp_location *loc,
-+ char *wrap_indent,
-+ struct ui_stream *stb)
-+{
-+ if (b->source_file)
-+ {
-+ struct symbol *sym
-+ = find_pc_sect_function (loc->address, loc->section);
-+ if (sym)
-+ {
-+ ui_out_text (uiout, "in ");
-+ ui_out_field_string (uiout, "func",
-+ SYMBOL_PRINT_NAME (sym));
-+ ui_out_wrap_hint (uiout, wrap_indent);
-+ ui_out_text (uiout, " at ");
-+ }
-+ ui_out_field_string (uiout, "file", b->source_file);
-+ ui_out_text (uiout, ":");
-+
-+ if (ui_out_is_mi_like_p (uiout))
-+ {
-+ struct symtab_and_line sal = find_pc_line (loc->address, 0);
-+ char *fullname = symtab_to_fullname (sal.symtab);
-+
-+ if (fullname)
-+ ui_out_field_string (uiout, "fullname", fullname);
-+ }
-+
-+ ui_out_field_int (uiout, "line", b->line_number);
-+ }
-+ else if (!b->loc)
-+ {
-+ ui_out_field_string (uiout, "pending", b->addr_string);
-+ }
-+ else
-+ {
-+ print_address_symbolic (loc->address, stb->stream, demangle, "");
-+ ui_out_field_stream (uiout, "at", stb);
-+ }
-+}
-+
-+/* Print B to gdb_stdout. */
-+static void
-+print_one_breakpoint_location (struct breakpoint *b,
-+ struct bp_location *loc,
-+ int loc_number,
-+ CORE_ADDR *last_addr)
-+{
-+ struct command_line *l;
-+ struct symbol *sym;
-+ struct ep_type_description
-+ {
-+ enum bptype type;
-+ char *description;
-+ };
-+ static struct ep_type_description bptypes[] =
-+ {
-+ {bp_none, "?deleted?"},
-+ {bp_breakpoint, "breakpoint"},
-+ {bp_hardware_breakpoint, "hw breakpoint"},
-+ {bp_until, "until"},
-+ {bp_finish, "finish"},
-+ {bp_watchpoint, "watchpoint"},
-+ {bp_hardware_watchpoint, "hw watchpoint"},
-+ {bp_read_watchpoint, "read watchpoint"},
-+ {bp_access_watchpoint, "acc watchpoint"},
-+ {bp_longjmp, "longjmp"},
-+ {bp_longjmp_resume, "longjmp resume"},
-+ {bp_step_resume, "step resume"},
-+ {bp_watchpoint_scope, "watchpoint scope"},
-+ {bp_call_dummy, "call dummy"},
-+ {bp_shlib_event, "shlib events"},
-+ {bp_thread_event, "thread events"},
-+ {bp_overlay_event, "overlay events"},
-+ {bp_catch_load, "catch load"},
-+ {bp_catch_unload, "catch unload"},
-+ {bp_catch_fork, "catch fork"},
-+ {bp_catch_vfork, "catch vfork"},
-+ {bp_catch_exec, "catch exec"}
-+ };
-+
-+ static char *bpdisps[] =
-+ {"del", "dstp", "dis", "keep"};
-+ static char bpenables[] = "nynny";
-+ char wrap_indent[80];
-+ struct ui_stream *stb = ui_out_stream_new (uiout);
-+ struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
-+ struct cleanup *bkpt_chain;
-+
-+ int header_of_multiple = 0;
-+ int part_of_multiple = (loc != NULL);
-+
-+ gdb_assert (!loc || loc_number != 0);
-+ /* See comment in print_one_breakpoint concerning
-+ treatment of breakpoints with single disabled
-+ location. */
-+ if (loc == NULL
-+ && (b->loc != NULL
-+ && (b->loc->next != NULL || !b->loc->enabled)))
-+ header_of_multiple = 1;
-+ if (loc == NULL)
-+ loc = b->loc;
-+
-+ annotate_record ();
-+ bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "bkpt");
-+
-+ /* 1 */
-+ annotate_field (0);
-+ if (part_of_multiple)
-+ {
-+ char *formatted;
-+ formatted = xstrprintf ("%d.%d", b->number, loc_number);
-+ ui_out_field_string (uiout, "number", formatted);
-+ xfree (formatted);
-+ }
-+ else
-+ {
-+ ui_out_field_int (uiout, "number", b->number);
-+ }
-+
-+ /* 2 */
-+ annotate_field (1);
-+ if (part_of_multiple)
-+ ui_out_field_skip (uiout, "type");
-+ else
-+ {
-+ 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."),
-+ (int) b->type);
-+ ui_out_field_string (uiout, "type", bptypes[(int) b->type].description);
-+ }
-+
-+ /* 3 */
-+ annotate_field (2);
-+ if (part_of_multiple)
-+ ui_out_field_skip (uiout, "disp");
-+ else
-+ ui_out_field_string (uiout, "disp", bpdisps[(int) b->disposition]);
-+
-+
-+ /* 4 */
-+ annotate_field (3);
-+ if (part_of_multiple)
-+ ui_out_field_string (uiout, "enabled", loc->enabled ? "y" : "n");
-+ else
-+ ui_out_field_fmt (uiout, "enabled", "%c",
-+ bpenables[(int) b->enable_state]);
-+ ui_out_spaces (uiout, 2);
-+
-+
-+ /* 5 and 6 */
-+ strcpy (wrap_indent, " ");
-+ if (addressprint)
-+ {
-+ if (gdbarch_addr_bit (current_gdbarch) <= 32)
-+ strcat (wrap_indent, " ");
-+ else
-+ strcat (wrap_indent, " ");
-+ }
-+
-+ if (b->ops != NULL && b->ops->print_one != NULL)
-+ {
-+ /* Although the print_one can possibly print
-+ all locations, calling it here is not likely
-+ to get any nice result. So, make sure there's
-+ just one location. */
-+ gdb_assert (b->loc == NULL || b->loc->next == NULL);
-+ b->ops->print_one (b, last_addr);
-+ }
-+ else
-+ switch (b->type)
-+ {
-+ case bp_none:
-+ internal_error (__FILE__, __LINE__,
-+ _("print_one_breakpoint: bp_none encountered\n"));
-+ break;
-+
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ /* Field 4, the address, is omitted (which makes the columns
-+ not line up too nicely with the headers, but the effect
-+ is relatively readable). */
-+ if (addressprint)
-+ ui_out_field_skip (uiout, "addr");
-+ annotate_field (5);
-+ print_expression (b->exp, stb->stream);
-+ ui_out_field_stream (uiout, "what", stb);
-+ break;
-+
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ /* Field 4, the address, is omitted (which makes the columns
-+ not line up too nicely with the headers, but the effect
-+ is relatively readable). */
-+ if (addressprint)
-+ ui_out_field_skip (uiout, "addr");
-+ annotate_field (5);
-+ if (b->dll_pathname == NULL)
-+ {
-+ ui_out_field_string (uiout, "what", "<any library>");
-+ ui_out_spaces (uiout, 1);
-+ }
-+ else
-+ {
-+ ui_out_text (uiout, "library \"");
-+ ui_out_field_string (uiout, "what", b->dll_pathname);
-+ ui_out_text (uiout, "\" ");
-+ }
-+ break;
-+
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ /* Field 4, the address, is omitted (which makes the columns
-+ not line up too nicely with the headers, but the effect
-+ is relatively readable). */
-+ if (addressprint)
-+ ui_out_field_skip (uiout, "addr");
-+ annotate_field (5);
-+ if (b->forked_inferior_pid != 0)
-+ {
-+ ui_out_text (uiout, "process ");
-+ ui_out_field_int (uiout, "what", b->forked_inferior_pid);
-+ ui_out_spaces (uiout, 1);
-+ }
-+ break;
-+
-+ case bp_catch_exec:
-+ /* Field 4, the address, is omitted (which makes the columns
-+ not line up too nicely with the headers, but the effect
-+ is relatively readable). */
-+ if (addressprint)
-+ ui_out_field_skip (uiout, "addr");
-+ annotate_field (5);
-+ if (b->exec_pathname != NULL)
-+ {
-+ ui_out_text (uiout, "program \"");
-+ ui_out_field_string (uiout, "what", b->exec_pathname);
-+ ui_out_text (uiout, "\" ");
-+ }
-+ break;
-+
-+ case bp_breakpoint:
-+ case bp_hardware_breakpoint:
-+ case bp_until:
-+ case bp_finish:
-+ case bp_longjmp:
-+ case bp_longjmp_resume:
-+ case bp_step_resume:
-+ case bp_watchpoint_scope:
-+ case bp_call_dummy:
-+ case bp_shlib_event:
-+ case bp_thread_event:
-+ case bp_overlay_event:
-+ if (addressprint)
-+ {
-+ annotate_field (4);
-+ if (header_of_multiple)
-+ ui_out_field_string (uiout, "addr", "<MULTIPLE>");
-+ if (b->loc == NULL || loc->shlib_disabled)
-+ ui_out_field_string (uiout, "addr", "<PENDING>");
-+ else
-+ ui_out_field_core_addr (uiout, "addr", loc->address);
-+ }
-+ annotate_field (5);
-+ if (!header_of_multiple)
-+ print_breakpoint_location (b, loc, wrap_indent, stb);
-+ if (b->loc)
-+ *last_addr = b->loc->address;
-+ break;
-+ }
-+
-+ if (!part_of_multiple && b->thread != -1)
-+ {
-+ /* FIXME: This seems to be redundant and lost here; see the
-+ "stop only in" line a little further down. */
-+ ui_out_text (uiout, " thread ");
-+ ui_out_field_int (uiout, "thread", b->thread);
-+ }
-+
-+ ui_out_text (uiout, "\n");
-+
-+ if (part_of_multiple && frame_id_p (b->frame_id))
-+ {
-+ annotate_field (6);
-+ ui_out_text (uiout, "\tstop only in stack frame at ");
-+ /* FIXME: cagney/2002-12-01: Shouldn't be poeking around inside
-+ the frame ID. */
-+ ui_out_field_core_addr (uiout, "frame", b->frame_id.stack_addr);
-+ ui_out_text (uiout, "\n");
-+ }
-+
-+ if (!part_of_multiple && b->cond_string && !ada_exception_catchpoint_p (b))
-+ {
-+ /* We do not print the condition for Ada exception catchpoints
-+ because the condition is an internal implementation detail
-+ that we do not want to expose to the user. */
-+ annotate_field (7);
-+ ui_out_text (uiout, "\tstop only if ");
-+ ui_out_field_string (uiout, "cond", b->cond_string);
-+ ui_out_text (uiout, "\n");
-+ }
-+
-+ if (!part_of_multiple && b->thread != -1)
-+ {
-+ /* FIXME should make an annotation for this */
-+ ui_out_text (uiout, "\tstop only in thread ");
-+ ui_out_field_int (uiout, "thread", b->thread);
-+ ui_out_text (uiout, "\n");
-+ }
-+
-+ if (!part_of_multiple && show_breakpoint_hit_counts && b->hit_count)
-+ {
-+ /* FIXME should make an annotation for this */
-+ if (ep_is_catchpoint (b))
-+ ui_out_text (uiout, "\tcatchpoint");
-+ else
-+ ui_out_text (uiout, "\tbreakpoint");
-+ ui_out_text (uiout, " already hit ");
-+ ui_out_field_int (uiout, "times", b->hit_count);
-+ if (b->hit_count == 1)
-+ ui_out_text (uiout, " time\n");
-+ else
-+ ui_out_text (uiout, " times\n");
-+ }
-+
-+ /* Output the count also if it is zero, but only if this is
-+ mi. FIXME: Should have a better test for this. */
-+ if (ui_out_is_mi_like_p (uiout))
-+ if (!part_of_multiple && show_breakpoint_hit_counts && b->hit_count == 0)
-+ ui_out_field_int (uiout, "times", b->hit_count);
-+
-+ if (!part_of_multiple && b->ignore_count)
-+ {
-+ annotate_field (8);
-+ ui_out_text (uiout, "\tignore next ");
-+ ui_out_field_int (uiout, "ignore", b->ignore_count);
-+ ui_out_text (uiout, " hits\n");
-+ }
-+
-+ if (!part_of_multiple && (l = b->commands))
-+ {
-+ struct cleanup *script_chain;
-+
-+ annotate_field (9);
-+ script_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "script");
-+ print_command_lines (uiout, l, 4);
-+ do_cleanups (script_chain);
-+ }
-+ do_cleanups (bkpt_chain);
-+ do_cleanups (old_chain);
-+}
-+
-+static void
-+print_one_breakpoint (struct breakpoint *b,
-+ CORE_ADDR *last_addr)
-+{
-+ print_one_breakpoint_location (b, NULL, 0, last_addr);
-+
-+ /* If this breakpoint has custom print function,
-+ it's already printed. Otherwise, print individual
-+ locations, if any. */
-+ if (b->ops == NULL || b->ops->print_one == NULL)
-+ {
-+ /* If breakpoint has a single location that is
-+ disabled, we print it as if it had
-+ several locations, since otherwise it's hard to
-+ represent "breakpoint enabled, location disabled"
-+ situation.
-+ Note that while hardware watchpoints have
-+ several locations internally, that's no a property
-+ exposed to user. */
-+ if (b->loc
-+ && !is_hardware_watchpoint (b)
-+ && (b->loc->next || !b->loc->enabled)
-+ && !ui_out_is_mi_like_p (uiout))
-+ {
-+ struct bp_location *loc;
-+ int n = 1;
-+ for (loc = b->loc; loc; loc = loc->next, ++n)
-+ print_one_breakpoint_location (b, loc, n, last_addr);
-+ }
-+ }
-+}
-+
-+
-+struct captured_breakpoint_query_args
-+ {
-+ int bnum;
-+ };
-+
-+static int
-+do_captured_breakpoint_query (struct ui_out *uiout, void *data)
-+{
-+ struct captured_breakpoint_query_args *args = data;
-+ struct breakpoint *b;
-+ CORE_ADDR dummy_addr = 0;
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (args->bnum == b->number)
-+ {
-+ print_one_breakpoint (b, &dummy_addr);
-+ return GDB_RC_OK;
-+ }
-+ }
-+ return GDB_RC_NONE;
-+}
-+
-+enum gdb_rc
-+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. */
-+ if (catch_exceptions_with_msg (uiout, do_captured_breakpoint_query, &args,
-+ error_message, RETURN_MASK_ALL) < 0)
-+ return GDB_RC_FAIL;
-+ else
-+ return GDB_RC_OK;
-+}
-+
-+/* Return non-zero if B is user settable (breakpoints, watchpoints,
-+ catchpoints, et.al.). */
-+
-+static int
-+user_settable_breakpoint (const struct breakpoint *b)
-+{
-+ return (b->type == bp_breakpoint
-+ || b->type == bp_catch_load
-+ || b->type == bp_catch_unload
-+ || b->type == bp_catch_fork
-+ || b->type == bp_catch_vfork
-+ || b->type == bp_catch_exec
-+ || b->type == bp_hardware_breakpoint
-+ || b->type == bp_watchpoint
-+ || b->type == bp_read_watchpoint
-+ || b->type == bp_access_watchpoint
-+ || b->type == bp_hardware_watchpoint);
-+}
-+
-+/* Print information on user settable breakpoint (watchpoint, etc)
-+ number BNUM. If BNUM is -1 print all user settable breakpoints.
-+ If ALLFLAG is non-zero, include non- user settable breakpoints. */
-+
-+static void
-+breakpoint_1 (int bnum, int allflag)
-+{
-+ struct breakpoint *b;
-+ CORE_ADDR last_addr = (CORE_ADDR) -1;
-+ int nr_printable_breakpoints;
-+ struct cleanup *bkpttbl_chain;
-+
-+ /* Compute the number of rows in the table. */
-+ nr_printable_breakpoints = 0;
-+ ALL_BREAKPOINTS (b)
-+ if (bnum == -1
-+ || bnum == b->number)
-+ {
-+ if (allflag || user_settable_breakpoint (b))
-+ nr_printable_breakpoints++;
-+ }
-+
-+ if (addressprint)
-+ bkpttbl_chain
-+ = make_cleanup_ui_out_table_begin_end (uiout, 6, nr_printable_breakpoints,
-+ "BreakpointTable");
-+ else
-+ bkpttbl_chain
-+ = make_cleanup_ui_out_table_begin_end (uiout, 5, nr_printable_breakpoints,
-+ "BreakpointTable");
-+
-+ if (nr_printable_breakpoints > 0)
-+ annotate_breakpoints_headers ();
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (0);
-+ ui_out_table_header (uiout, 7, ui_left, "number", "Num"); /* 1 */
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (1);
-+ ui_out_table_header (uiout, 14, ui_left, "type", "Type"); /* 2 */
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (2);
-+ ui_out_table_header (uiout, 4, ui_left, "disp", "Disp"); /* 3 */
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (3);
-+ ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb"); /* 4 */
-+ if (addressprint)
-+ {
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (4);
-+ if (gdbarch_addr_bit (current_gdbarch) <= 32)
-+ ui_out_table_header (uiout, 10, ui_left, "addr", "Address");/* 5 */
-+ else
-+ ui_out_table_header (uiout, 18, ui_left, "addr", "Address");/* 5 */
-+ }
-+ if (nr_printable_breakpoints > 0)
-+ annotate_field (5);
-+ ui_out_table_header (uiout, 40, ui_noalign, "what", "What"); /* 6 */
-+ ui_out_table_body (uiout);
-+ if (nr_printable_breakpoints > 0)
-+ annotate_breakpoints_table ();
-+
-+ ALL_BREAKPOINTS (b)
-+ if (bnum == -1
-+ || bnum == b->number)
-+ {
-+ /* We only print out user settable breakpoints unless the
-+ allflag is set. */
-+ if (allflag || user_settable_breakpoint (b))
-+ print_one_breakpoint (b, &last_addr);
-+ }
-+
-+ do_cleanups (bkpttbl_chain);
-+
-+ if (nr_printable_breakpoints == 0)
-+ {
-+ if (bnum == -1)
-+ ui_out_message (uiout, 0, "No breakpoints or watchpoints.\n");
-+ else
-+ ui_out_message (uiout, 0, "No breakpoint or watchpoint number %d.\n",
-+ bnum);
-+ }
-+ else
-+ {
-+ /* Compare against (CORE_ADDR)-1 in case some compiler decides
-+ that a comparison of an unsigned with -1 is always false. */
-+ if (last_addr != (CORE_ADDR) -1 && !server_command)
-+ set_next_address (last_addr);
-+ }
-+
-+ /* FIXME? Should this be moved up so that it is only called when
-+ there have been breakpoints? */
-+ annotate_breakpoints_table_end ();
-+}
-+
-+static void
-+breakpoints_info (char *bnum_exp, int from_tty)
-+{
-+ int bnum = -1;
-+
-+ if (bnum_exp)
-+ bnum = parse_and_eval_long (bnum_exp);
-+
-+ breakpoint_1 (bnum, 0);
-+}
-+
-+static void
-+maintenance_info_breakpoints (char *bnum_exp, int from_tty)
-+{
-+ int bnum = -1;
-+
-+ if (bnum_exp)
-+ bnum = parse_and_eval_long (bnum_exp);
-+
-+ breakpoint_1 (bnum, 1);
-+}
-+
-+static int
-+breakpoint_has_pc (struct breakpoint *b, CORE_ADDR pc, asection *section)
-+{
-+ struct bp_location *bl = b->loc;
-+ for (; bl; bl = bl->next)
-+ {
-+ if (bl->address == pc
-+ && (!overlay_debugging || bl->section == section))
-+ return 1;
-+ }
-+ return 0;
-+}
-+
-+/* Print a message describing any breakpoints set at PC. */
-+
-+static void
-+describe_other_breakpoints (CORE_ADDR pc, asection *section, int thread)
-+{
-+ int others = 0;
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ others += breakpoint_has_pc (b, pc, section);
-+ if (others > 0)
-+ {
-+ if (others == 1)
-+ printf_filtered (_("Note: breakpoint "));
-+ else /* if (others == ???) */
-+ printf_filtered (_("Note: breakpoints "));
-+ ALL_BREAKPOINTS (b)
-+ if (breakpoint_has_pc (b, pc, section))
-+ {
-+ others--;
-+ printf_filtered ("%d", b->number);
-+ if (b->thread == -1 && thread != -1)
-+ printf_filtered (" (all threads)");
-+ else if (b->thread != -1)
-+ printf_filtered (" (thread %d)", b->thread);
-+ printf_filtered ("%s%s ",
-+ ((b->enable_state == bp_disabled ||
-+ b->enable_state == bp_call_disabled)
-+ ? " (disabled)"
-+ : b->enable_state == bp_permanent
-+ ? " (permanent)"
-+ : ""),
-+ (others > 1) ? ","
-+ : ((others == 1) ? " and" : ""));
-+ }
-+ printf_filtered (_("also set at pc "));
-+ fputs_filtered (paddress (pc), gdb_stdout);
-+ printf_filtered (".\n");
-+ }
-+}
-+
-+/* Set the default place to put a breakpoint
-+ for the `break' command with no arguments. */
-+
-+void
-+set_default_breakpoint (int valid, CORE_ADDR addr, struct symtab *symtab,
-+ int line)
-+{
-+ default_breakpoint_valid = valid;
-+ default_breakpoint_address = addr;
-+ default_breakpoint_symtab = symtab;
-+ default_breakpoint_line = line;
-+}
-+
-+/* Return true iff it is meaningful to use the address member of
-+ BPT. For some breakpoint types, the address member is irrelevant
-+ and it makes no sense to attempt to compare it to other addresses
-+ (or use it for any other purpose either).
-+
-+ More specifically, each of the following breakpoint types will always
-+ have a zero valued address and we don't want check_duplicates() to mark
-+ breakpoints of any of these types to be a duplicate of an actual
-+ breakpoint at address zero:
-+
-+ bp_watchpoint
-+ bp_hardware_watchpoint
-+ bp_read_watchpoint
-+ bp_access_watchpoint
-+ bp_catch_exec
-+ bp_longjmp_resume
-+ bp_catch_fork
-+ bp_catch_vork */
-+
-+static int
-+breakpoint_address_is_meaningful (struct breakpoint *bpt)
-+{
-+ enum bptype type = bpt->type;
-+
-+ return (type != bp_watchpoint
-+ && type != bp_hardware_watchpoint
-+ && type != bp_read_watchpoint
-+ && type != bp_access_watchpoint
-+ && type != bp_catch_exec
-+ && type != bp_longjmp_resume
-+ && type != bp_catch_fork
-+ && type != bp_catch_vfork);
-+}
-+
-+/* Rescan breakpoints at the same address and section as BPT,
-+ marking the first one as "first" and any others as "duplicates".
-+ This is so that the bpt instruction is only inserted once.
-+ If we have a permanent breakpoint at the same place as BPT, make
-+ that one the official one, and the rest as duplicates. */
-+
-+static void
-+check_duplicates_for (CORE_ADDR address, asection *section)
-+{
-+ struct bp_location *b;
-+ int count = 0;
-+ struct bp_location *perm_bp = 0;
-+
-+ ALL_BP_LOCATIONS (b)
-+ if (b->owner->enable_state != bp_disabled
-+ && b->owner->enable_state != bp_call_disabled
-+ && b->enabled
-+ && !b->shlib_disabled
-+ && b->address == address /* address / overlay match */
-+ && (!overlay_debugging || b->section == section)
-+ && breakpoint_address_is_meaningful (b->owner))
-+ {
-+ /* Have we found a permanent breakpoint? */
-+ if (b->owner->enable_state == bp_permanent)
-+ {
-+ perm_bp = b;
-+ break;
-+ }
-+
-+ count++;
-+ b->duplicate = count > 1;
-+ }
-+
-+ /* If we found a permanent breakpoint at this address, go over the
-+ list again and declare all the other breakpoints there to be the
-+ duplicates. */
-+ if (perm_bp)
-+ {
-+ perm_bp->duplicate = 0;
-+
-+ /* Permanent breakpoint should always be inserted. */
-+ if (! perm_bp->inserted)
-+ internal_error (__FILE__, __LINE__,
-+ _("allegedly permanent breakpoint is not "
-+ "actually inserted"));
-+
-+ ALL_BP_LOCATIONS (b)
-+ if (b != perm_bp)
-+ {
-+ if (b->owner->enable_state != bp_disabled
-+ && b->owner->enable_state != bp_call_disabled
-+ && b->enabled && !b->shlib_disabled
-+ && b->address == address /* address / overlay match */
-+ && (!overlay_debugging || b->section == section)
-+ && breakpoint_address_is_meaningful (b->owner))
-+ {
-+ if (b->inserted)
-+ internal_error (__FILE__, __LINE__,
-+ _("another breakpoint was inserted on top of "
-+ "a permanent breakpoint"));
-+
-+ b->duplicate = 1;
-+ }
-+ }
-+ }
-+}
-+
-+static void
-+check_duplicates (struct breakpoint *bpt)
-+{
-+ struct bp_location *bl = bpt->loc;
-+
-+ if (! breakpoint_address_is_meaningful (bpt))
-+ return;
-+
-+ for (; bl; bl = bl->next)
-+ check_duplicates_for (bl->address, bl->section);
-+}
-+
-+static void
-+breakpoint_adjustment_warning (CORE_ADDR from_addr, CORE_ADDR to_addr,
-+ int bnum, int have_bnum)
-+{
-+ char astr1[40];
-+ char astr2[40];
-+
-+ 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."),
-+ bnum, astr1, astr2);
-+ else
-+ warning (_("Breakpoint address adjusted from %s to %s."), astr1, astr2);
-+}
-+
-+/* Adjust a breakpoint's address to account for architectural constraints
-+ on breakpoint placement. Return the adjusted address. Note: Very
-+ few targets require this kind of adjustment. For most targets,
-+ this function is simply the identity function. */
-+
-+static CORE_ADDR
-+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;
-+
-+ /* Some targets have architectural constraints on the placement
-+ of breakpoint instructions. Obtain the adjusted address. */
-+ adjusted_bpaddr = gdbarch_adjust_breakpoint_address (current_gdbarch,
-+ bpaddr);
-+
-+ /* An adjusted breakpoint address can significantly alter
-+ a user's expectations. Print a warning if an adjustment
-+ is required. */
-+ if (adjusted_bpaddr != bpaddr)
-+ breakpoint_adjustment_warning (bpaddr, adjusted_bpaddr, 0, 0);
-+
-+ return adjusted_bpaddr;
-+ }
-+}
-+
-+/* Allocate a struct bp_location. */
-+
-+static struct bp_location *
-+allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type)
-+{
-+ struct bp_location *loc, *loc_p;
-+
-+ loc = xmalloc (sizeof (struct bp_location));
-+ memset (loc, 0, sizeof (*loc));
-+
-+ loc->owner = bpt;
-+ loc->cond = NULL;
-+ loc->shlib_disabled = 0;
-+ loc->enabled = 1;
-+
-+ switch (bp_type)
-+ {
-+ case bp_breakpoint:
-+ case bp_until:
-+ case bp_finish:
-+ case bp_longjmp:
-+ case bp_longjmp_resume:
-+ case bp_step_resume:
-+ case bp_watchpoint_scope:
-+ case bp_call_dummy:
-+ case bp_shlib_event:
-+ case bp_thread_event:
-+ case bp_overlay_event:
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ loc->loc_type = bp_loc_software_breakpoint;
-+ break;
-+ case bp_hardware_breakpoint:
-+ loc->loc_type = bp_loc_hardware_breakpoint;
-+ break;
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ loc->loc_type = bp_loc_hardware_watchpoint;
-+ break;
-+ case bp_watchpoint:
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ case bp_catch_exec:
-+ loc->loc_type = bp_loc_other;
-+ break;
-+ default:
-+ internal_error (__FILE__, __LINE__, _("unknown breakpoint type"));
-+ }
-+
-+ /* Add this breakpoint to the end of the chain. */
-+
-+ loc_p = bp_location_chain;
-+ if (loc_p == 0)
-+ bp_location_chain = loc;
-+ else
-+ {
-+ while (loc_p->global_next)
-+ loc_p = loc_p->global_next;
-+ loc_p->global_next = loc;
-+ }
-+
-+ return loc;
-+}
-+
-+static void free_bp_location (struct bp_location *loc)
-+{
-+ if (loc->cond)
-+ xfree (loc->cond);
-+ xfree (loc);
-+}
-+
-+/* Helper to set_raw_breakpoint below. Creates a breakpoint
-+ that has type BPTYPE and has no locations as yet. */
-+
-+static struct breakpoint *
-+set_raw_breakpoint_without_location (enum bptype bptype)
-+{
-+ struct breakpoint *b, *b1;
-+
-+ b = (struct breakpoint *) xmalloc (sizeof (struct breakpoint));
-+ memset (b, 0, sizeof (*b));
-+
-+ b->type = bptype;
-+ b->language = current_language->la_language;
-+ b->input_radix = input_radix;
-+ b->thread = -1;
-+ b->enable_state = bp_enabled;
-+ b->next = 0;
-+ b->silent = 0;
-+ b->ignore_count = 0;
-+ b->commands = NULL;
-+ b->frame_id = null_frame_id;
-+ b->dll_pathname = NULL;
-+ b->triggered_dll_pathname = NULL;
-+ b->forked_inferior_pid = 0;
-+ b->exec_pathname = NULL;
-+ b->ops = NULL;
-+ b->condition_not_parsed = 0;
-+
-+ /* Add this breakpoint to the end of the chain
-+ so that a list of breakpoints will come out in order
-+ of increasing numbers. */
-+
-+ b1 = breakpoint_chain;
-+ if (b1 == 0)
-+ breakpoint_chain = b;
-+ else
-+ {
-+ while (b1->next)
-+ b1 = b1->next;
-+ b1->next = b;
-+ }
-+ return b;
-+}
-+
-+/* Initialize loc->function_name. */
-+static void
-+set_breakpoint_location_function (struct bp_location *loc)
-+{
-+ if (loc->owner->type == bp_breakpoint
-+ || loc->owner->type == bp_hardware_breakpoint)
-+ {
-+ find_pc_partial_function (loc->address, &(loc->function_name),
-+ NULL, NULL);
-+ if (loc->function_name)
-+ loc->function_name = xstrdup (loc->function_name);
-+ }
-+}
-+
-+/* set_raw_breakpoint is a low level routine for allocating and
-+ partially initializing a breakpoint of type BPTYPE. The newly
-+ created breakpoint's address, section, source file name, and line
-+ number are provided by SAL. The newly created and partially
-+ initialized breakpoint is added to the breakpoint chain and
-+ is also returned as the value of this function.
-+
-+ It is expected that the caller will complete the initialization of
-+ the newly created breakpoint struct as well as output any status
-+ information regarding the creation of a new breakpoint. In
-+ particular, set_raw_breakpoint does NOT set the breakpoint
-+ number! Care should be taken to not allow an error to occur
-+ prior to completing the initialization of the breakpoint. If this
-+ should happen, a bogus breakpoint will be left on the chain. */
-+
-+struct breakpoint *
-+set_raw_breakpoint (struct symtab_and_line sal, enum bptype bptype)
-+{
-+ struct breakpoint *b = set_raw_breakpoint_without_location (bptype);
-+ CORE_ADDR adjusted_address;
-+
-+ /* Adjust the breakpoint's address prior to allocating a location.
-+ Once we call allocate_bp_location(), that mostly uninitialized
-+ location will be placed on the location chain. Adjustment of the
-+ breakpoint may cause read_memory_nobpt() to be called and we do
-+ not want its scan of the location chain to find a breakpoint and
-+ location that's only been partially initialized. */
-+ adjusted_address = adjust_breakpoint_address (sal.pc, bptype);
-+
-+ b->loc = allocate_bp_location (b, bptype);
-+ b->loc->requested_address = sal.pc;
-+ b->loc->address = adjusted_address;
-+
-+ if (sal.symtab == NULL)
-+ b->source_file = NULL;
-+ else
-+ b->source_file = savestring (sal.symtab->filename,
-+ strlen (sal.symtab->filename));
-+ b->loc->section = sal.section;
-+ b->line_number = sal.line;
-+
-+ set_breakpoint_location_function (b->loc);
-+
-+ check_duplicates (b);
-+ breakpoints_changed ();
-+
-+ return b;
-+}
-+
-+
-+/* Note that the breakpoint object B describes a permanent breakpoint
-+ instruction, hard-wired into the inferior's code. */
-+void
-+make_breakpoint_permanent (struct breakpoint *b)
-+{
-+ struct bp_location *bl;
-+ b->enable_state = bp_permanent;
-+
-+ /* By definition, permanent breakpoints are already present in the code.
-+ Mark all locations as inserted. For now, make_breakpoint_permanent
-+ is called in just one place, so it's hard to say if it's reasonable
-+ to have permanent breakpoint with multiple locations or not,
-+ but it's easy to implmement. */
-+ for (bl = b->loc; bl; bl = bl->next)
-+ bl->inserted = 1;
-+}
-+
-+static struct breakpoint *
-+create_internal_breakpoint (CORE_ADDR address, enum bptype type)
-+{
-+ static int internal_breakpoint_number = -1;
-+ struct symtab_and_line sal;
-+ struct breakpoint *b;
-+
-+ init_sal (&sal); /* initialize to zeroes */
-+
-+ sal.pc = address;
-+ sal.section = find_pc_overlay (sal.pc);
-+
-+ b = set_raw_breakpoint (sal, type);
-+ b->number = internal_breakpoint_number--;
-+ b->disposition = disp_donttouch;
-+
-+ return b;
-+}
-+
-+
-+static void
-+create_longjmp_breakpoint (char *func_name)
-+{
-+ struct breakpoint *b;
-+ struct minimal_symbol *m;
-+
-+ if (func_name == NULL)
-+ b = create_internal_breakpoint (0, bp_longjmp_resume);
-+ else
-+ {
-+ if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL)
-+ return;
-+
-+ b = create_internal_breakpoint (SYMBOL_VALUE_ADDRESS (m), bp_longjmp);
-+ }
-+
-+ b->enable_state = bp_disabled;
-+ b->silent = 1;
-+ if (func_name)
-+ b->addr_string = xstrdup (func_name);
-+}
-+
-+/* Call this routine when stepping and nexting to enable a breakpoint
-+ if we do a longjmp(). When we hit that breakpoint, call
-+ set_longjmp_resume_breakpoint() to figure out where we are going. */
-+
-+void
-+enable_longjmp_breakpoint (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_longjmp)
-+ {
-+ b->enable_state = bp_enabled;
-+ check_duplicates (b);
-+ }
-+}
-+
-+void
-+disable_longjmp_breakpoint (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_longjmp
-+ || b->type == bp_longjmp_resume)
-+ {
-+ b->enable_state = bp_disabled;
-+ check_duplicates (b);
-+ }
-+}
-+
-+static void
-+create_overlay_event_breakpoint (char *func_name)
-+{
-+ struct breakpoint *b;
-+ struct minimal_symbol *m;
-+
-+ if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL)
-+ return;
-+
-+ b = create_internal_breakpoint (SYMBOL_VALUE_ADDRESS (m),
-+ bp_overlay_event);
-+ b->addr_string = xstrdup (func_name);
-+
-+ if (overlay_debugging == ovly_auto)
-+ {
-+ b->enable_state = bp_enabled;
-+ overlay_events_enabled = 1;
-+ }
-+ else
-+ {
-+ b->enable_state = bp_disabled;
-+ overlay_events_enabled = 0;
-+ }
-+}
-+
-+void
-+enable_overlay_breakpoints (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_overlay_event)
-+ {
-+ b->enable_state = bp_enabled;
-+ check_duplicates (b);
-+ overlay_events_enabled = 1;
-+ }
-+}
-+
-+void
-+disable_overlay_breakpoints (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_overlay_event)
-+ {
-+ b->enable_state = bp_disabled;
-+ check_duplicates (b);
-+ overlay_events_enabled = 0;
-+ }
-+}
-+
-+struct breakpoint *
-+create_thread_event_breakpoint (CORE_ADDR address)
-+{
-+ struct breakpoint *b;
-+
-+ b = create_internal_breakpoint (address, bp_thread_event);
-+
-+ b->enable_state = bp_enabled;
-+ /* addr_string has to be used or breakpoint_re_set will delete me. */
-+ b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address));
-+
-+ return b;
-+}
-+
-+void
-+remove_thread_event_breakpoints (void)
-+{
-+ struct breakpoint *b, *temp;
-+
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ if (b->type == bp_thread_event)
-+ delete_breakpoint (b);
-+}
-+
-+struct captured_parse_breakpoint_args
-+ {
-+ char **arg_p;
-+ struct symtabs_and_lines *sals_p;
-+ char ***addr_string_p;
-+ int *not_found_ptr;
-+ };
-+
-+struct lang_and_radix
-+ {
-+ enum language lang;
-+ int radix;
-+ };
-+
-+
-+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 (void)
-+{
-+ struct bp_location *loc;
-+ int disabled_shlib_breaks = 0;
-+
-+ ALL_BP_LOCATIONS (loc)
-+ {
-+ struct breakpoint *b = loc->owner;
-+ /* We apply the check to all breakpoints, including disabled
-+ for those with loc->duplicate set. This is so that when breakpoint
-+ becomes enabled, or the duplicate is removed, gdb will try to insert
-+ all breakpoints. If we don't set shlib_disabled here, we'll try
-+ to insert those breakpoints and fail. */
-+ if (((b->type == bp_breakpoint) || (b->type == bp_hardware_breakpoint))
-+ && !loc->shlib_disabled
-+#ifdef PC_SOLIB
-+ && PC_SOLIB (loc->address)
-+#else
-+ && solib_address (loc->address)
-+#endif
-+ )
-+ {
-+ loc->shlib_disabled = 1;
-+ }
-+ }
-+}
-+
-+/* Disable any breakpoints that are in in an unloaded shared library. Only
-+ apply to enabled breakpoints, disabled ones can just stay disabled. */
-+
-+static void
-+disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
-+{
-+ struct bp_location *loc;
-+ int disabled_shlib_breaks = 0;
-+
-+ ALL_BP_LOCATIONS (loc)
-+ {
-+ struct breakpoint *b = loc->owner;
-+ if ((loc->loc_type == bp_loc_hardware_breakpoint
-+ || loc->loc_type == bp_loc_software_breakpoint)
-+ && !loc->shlib_disabled)
-+ {
-+#ifdef PC_SOLIB
-+ char *so_name = PC_SOLIB (loc->address);
-+#else
-+ char *so_name = solib_address (loc->address);
-+#endif
-+ if (so_name && !strcmp (so_name, solib->so_name))
-+ {
-+ loc->shlib_disabled = 1;
-+ /* 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. */
-+ 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;
-+ }
-+ }
-+ }
-+}
-+
-+static void
-+create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
-+ enum bptype bp_kind)
-+{
-+ struct symtab_and_line sal;
-+ struct breakpoint *b;
-+ int thread = -1; /* All threads. */
-+
-+ init_sal (&sal);
-+ sal.pc = 0;
-+ sal.symtab = NULL;
-+ sal.line = 0;
-+
-+ b = set_raw_breakpoint (sal, bp_kind);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->cond_string = (cond_string == NULL) ?
-+ NULL : savestring (cond_string, strlen (cond_string));
-+ b->thread = thread;
-+ b->addr_string = NULL;
-+ b->enable_state = bp_enabled;
-+ b->disposition = tempflag ? disp_del : disp_donttouch;
-+ b->forked_inferior_pid = 0;
-+
-+ mention (b);
-+}
-+
-+static void
-+create_fork_event_catchpoint (int tempflag, char *cond_string)
-+{
-+ create_fork_vfork_event_catchpoint (tempflag, cond_string, bp_catch_fork);
-+}
-+
-+static void
-+create_vfork_event_catchpoint (int tempflag, char *cond_string)
-+{
-+ create_fork_vfork_event_catchpoint (tempflag, cond_string, bp_catch_vfork);
-+}
-+
-+static void
-+create_exec_event_catchpoint (int tempflag, char *cond_string)
-+{
-+ struct symtab_and_line sal;
-+ struct breakpoint *b;
-+ int thread = -1; /* All threads. */
-+
-+ init_sal (&sal);
-+ sal.pc = 0;
-+ sal.symtab = NULL;
-+ sal.line = 0;
-+
-+ b = set_raw_breakpoint (sal, bp_catch_exec);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->cond_string = (cond_string == NULL) ?
-+ NULL : savestring (cond_string, strlen (cond_string));
-+ b->thread = thread;
-+ b->addr_string = NULL;
-+ b->enable_state = bp_enabled;
-+ b->disposition = tempflag ? disp_del : disp_donttouch;
-+
-+ mention (b);
-+}
-+
-+static int
-+hw_breakpoint_used_count (void)
-+{
-+ struct breakpoint *b;
-+ int i = 0;
-+
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (b->type == bp_hardware_breakpoint && b->enable_state == bp_enabled)
-+ i++;
-+ }
-+
-+ return i;
-+}
-+
-+static int
-+hw_watchpoint_used_count (enum bptype type, int *other_type_used)
-+{
-+ struct breakpoint *b;
-+ int i = 0;
-+
-+ *other_type_used = 0;
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (breakpoint_enabled (b))
-+ {
-+ if (b->type == type)
-+ i++;
-+ else if ((b->type == bp_hardware_watchpoint ||
-+ b->type == bp_read_watchpoint ||
-+ b->type == bp_access_watchpoint))
-+ *other_type_used = 1;
-+ }
-+ }
-+ return i;
-+}
-+
-+/* Call this after hitting the longjmp() breakpoint. Use this to set
-+ a new breakpoint at the target of the jmp_buf.
-+
-+ FIXME - This ought to be done by setting a temporary breakpoint
-+ that gets deleted automatically... */
-+
-+void
-+set_longjmp_resume_breakpoint (CORE_ADDR pc, struct frame_id frame_id)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->type == bp_longjmp_resume)
-+ {
-+ b->loc->requested_address = pc;
-+ 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);
-+ return;
-+ }
-+}
-+
-+void
-+disable_watchpoints_before_interactive_call_start (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (((b->type == bp_watchpoint)
-+ || (b->type == bp_hardware_watchpoint)
-+ || (b->type == bp_read_watchpoint)
-+ || (b->type == bp_access_watchpoint))
-+ && breakpoint_enabled (b))
-+ {
-+ b->enable_state = bp_call_disabled;
-+ check_duplicates (b);
-+ }
-+ }
-+}
-+
-+void
-+enable_watchpoints_after_interactive_call_stop (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (((b->type == bp_watchpoint)
-+ || (b->type == bp_hardware_watchpoint)
-+ || (b->type == bp_read_watchpoint)
-+ || (b->type == bp_access_watchpoint))
-+ && (b->enable_state == bp_call_disabled))
-+ {
-+ b->enable_state = bp_enabled;
-+ check_duplicates (b);
-+ }
-+ }
-+}
-+
-+
-+/* Set a breakpoint that will evaporate an end of command
-+ at address specified by SAL.
-+ Restrict it to frame FRAME if FRAME is nonzero. */
-+
-+struct breakpoint *
-+set_momentary_breakpoint (struct symtab_and_line sal, struct frame_id frame_id,
-+ enum bptype type)
-+{
-+ struct breakpoint *b;
-+ b = set_raw_breakpoint (sal, type);
-+ b->enable_state = bp_enabled;
-+ b->disposition = disp_donttouch;
-+ b->frame_id = frame_id;
-+
-+ /* If we're debugging a multi-threaded program, then we
-+ want momentary breakpoints to be active in only a
-+ single thread of control. */
-+ if (in_thread_list (inferior_ptid))
-+ b->thread = pid_to_thread_id (inferior_ptid);
-+
-+ return b;
-+}
-+
-+
-+/* Tell the user we have just set a breakpoint B. */
-+
-+static void
-+mention (struct breakpoint *b)
-+{
-+ int say_where = 0;
-+ struct cleanup *old_chain, *ui_out_chain;
-+ struct ui_stream *stb;
-+
-+ 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 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)
-+ b->ops->print_mention (b);
-+ else
-+ switch (b->type)
-+ {
-+ case bp_none:
-+ printf_filtered (_("(apparently deleted?) Eventpoint %d: "), b->number);
-+ break;
-+ case bp_watchpoint:
-+ ui_out_text (uiout, "Watchpoint ");
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
-+ ui_out_field_int (uiout, "number", b->number);
-+ ui_out_text (uiout, ": ");
-+ print_expression (b->exp, stb->stream);
-+ ui_out_field_stream (uiout, "exp", stb);
-+ do_cleanups (ui_out_chain);
-+ break;
-+ case bp_hardware_watchpoint:
-+ ui_out_text (uiout, "Hardware watchpoint ");
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "wpt");
-+ ui_out_field_int (uiout, "number", b->number);
-+ ui_out_text (uiout, ": ");
-+ print_expression (b->exp, stb->stream);
-+ ui_out_field_stream (uiout, "exp", stb);
-+ do_cleanups (ui_out_chain);
-+ break;
-+ case bp_read_watchpoint:
-+ ui_out_text (uiout, "Hardware read watchpoint ");
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-rwpt");
-+ ui_out_field_int (uiout, "number", b->number);
-+ ui_out_text (uiout, ": ");
-+ print_expression (b->exp, stb->stream);
-+ ui_out_field_stream (uiout, "exp", stb);
-+ do_cleanups (ui_out_chain);
-+ break;
-+ case bp_access_watchpoint:
-+ ui_out_text (uiout, "Hardware access (read/write) watchpoint ");
-+ ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "hw-awpt");
-+ ui_out_field_int (uiout, "number", b->number);
-+ ui_out_text (uiout, ": ");
-+ print_expression (b->exp, stb->stream);
-+ ui_out_field_stream (uiout, "exp", stb);
-+ do_cleanups (ui_out_chain);
-+ break;
-+ case bp_breakpoint:
-+ if (ui_out_is_mi_like_p (uiout))
-+ {
-+ say_where = 0;
-+ break;
-+ }
-+ printf_filtered (_("Breakpoint %d"), b->number);
-+ say_where = 1;
-+ break;
-+ case bp_hardware_breakpoint:
-+ if (ui_out_is_mi_like_p (uiout))
-+ {
-+ say_where = 0;
-+ break;
-+ }
-+ printf_filtered (_("Hardware assisted breakpoint %d"), b->number);
-+ say_where = 1;
-+ break;
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ printf_filtered (_("Catchpoint %d (%s %s)"),
-+ b->number,
-+ (b->type == bp_catch_load) ? "load" : "unload",
-+ (b->dll_pathname != NULL) ?
-+ b->dll_pathname : "<any library>");
-+ break;
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ printf_filtered (_("Catchpoint %d (%s)"),
-+ b->number,
-+ (b->type == bp_catch_fork) ? "fork" : "vfork");
-+ break;
-+ case bp_catch_exec:
-+ printf_filtered (_("Catchpoint %d (exec)"),
-+ b->number);
-+ break;
-+
-+ case bp_until:
-+ case bp_finish:
-+ case bp_longjmp:
-+ case bp_longjmp_resume:
-+ case bp_step_resume:
-+ case bp_call_dummy:
-+ case bp_watchpoint_scope:
-+ case bp_shlib_event:
-+ case bp_thread_event:
-+ case bp_overlay_event:
-+ break;
-+ }
-+
-+ if (say_where)
-+ {
-+ /* i18n: cagney/2005-02-11: Below needs to be merged into a
-+ single string. */
-+ if (b->loc == NULL)
-+ {
-+ printf_filtered (_(" (%s) pending."), b->addr_string);
-+ }
-+ else
-+ {
-+ if (addressprint || b->source_file == NULL)
-+ {
-+ printf_filtered (" at ");
-+ fputs_filtered (paddress (b->loc->address), gdb_stdout);
-+ }
-+ if (b->source_file)
-+ printf_filtered (": file %s, line %d.",
-+ b->source_file, b->line_number);
-+
-+ if (b->loc->next)
-+ {
-+ struct bp_location *loc = b->loc;
-+ int n = 0;
-+ for (; loc; loc = loc->next)
-+ ++n;
-+ printf_filtered (" (%d locations)", n);
-+ }
-+
-+ }
-+ }
-+ do_cleanups (old_chain);
-+ if (ui_out_is_mi_like_p (uiout))
-+ return;
-+ printf_filtered ("\n");
-+}
-+
-+
-+static struct bp_location *
-+add_location_to_breakpoint (struct breakpoint *b, enum bptype bptype,
-+ const struct symtab_and_line *sal)
-+{
-+ struct bp_location *loc, **tmp;
-+
-+ loc = allocate_bp_location (b, bptype);
-+ for (tmp = &(b->loc); *tmp != NULL; tmp = &((*tmp)->next))
-+ ;
-+ *tmp = loc;
-+ loc->requested_address = sal->pc;
-+ loc->address = adjust_breakpoint_address (loc->requested_address,
-+ bptype);
-+ loc->section = sal->section;
-+
-+ set_breakpoint_location_function (loc);
-+ return loc;
-+}
-+
-+/* Create a breakpoint with SAL as location. Use ADDR_STRING
-+ as textual description of the location, and COND_STRING
-+ as condition expression. */
-+
-+static void
-+create_breakpoint (struct symtabs_and_lines sals, char *addr_string,
-+ char *cond_string,
-+ enum bptype type, enum bpdisp disposition,
-+ int thread, int ignore_count, int from_tty)
-+{
-+ struct breakpoint *b = NULL;
-+ int i;
-+
-+ if (type == bp_hardware_breakpoint)
-+ {
-+ int i = hw_breakpoint_used_count ();
-+ int target_resources_ok =
-+ TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_hardware_breakpoint,
-+ i + 1, 0);
-+ if (target_resources_ok == 0)
-+ error (_("No hardware breakpoint support in the target."));
-+ else if (target_resources_ok < 0)
-+ error (_("Hardware breakpoints used exceeds limit."));
-+ }
-+
-+ for (i = 0; i < sals.nelts; ++i)
-+ {
-+ struct symtab_and_line sal = sals.sals[i];
-+ struct bp_location *loc;
-+
-+ if (from_tty)
-+ describe_other_breakpoints (sal.pc, sal.section, thread);
-+
-+ if (i == 0)
-+ {
-+ b = set_raw_breakpoint (sal, type);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->thread = thread;
-+
-+ b->cond_string = cond_string;
-+ b->ignore_count = ignore_count;
-+ b->enable_state = bp_enabled;
-+ b->disposition = disposition;
-+
-+ loc = b->loc;
-+ }
-+ else
-+ {
-+ loc = add_location_to_breakpoint (b, type, &sal);
-+ }
-+
-+ if (b->cond_string)
-+ {
-+ char *arg = b->cond_string;
-+ loc->cond = parse_exp_1 (&arg, block_for_pc (loc->address), 0);
-+ if (*arg)
-+ error (_("Garbage %s follows condition"), arg);
-+ }
-+ }
-+
-+ if (addr_string)
-+ b->addr_string = addr_string;
-+ else
-+ /* addr_string has to be used or breakpoint_re_set will delete
-+ me. */
-+ b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address));
-+
-+ mention (b);
-+}
-+
-+/* Remove element at INDEX_TO_REMOVE from SAL, shifting other
-+ elements to fill the void space. */
-+static void remove_sal (struct symtabs_and_lines *sal, int index_to_remove)
-+{
-+ int i = index_to_remove+1;
-+ int last_index = sal->nelts-1;
-+
-+ for (;i <= last_index; ++i)
-+ sal->sals[i-1] = sal->sals[i];
-+
-+ --(sal->nelts);
-+}
-+
-+/* If appropriate, obtains all sals that correspond
-+ to the same file and line as SAL. This is done
-+ only if SAL does not have explicit PC and has
-+ line and file information. If we got just a single
-+ expanded sal, return the original.
-+
-+ Otherwise, if SAL.explicit_line is not set, filter out
-+ all sals for which the name of enclosing function
-+ is different from SAL. This makes sure that if we have
-+ breakpoint originally set in template instantiation, say
-+ foo<int>(), we won't expand SAL to locations at the same
-+ line in all existing instantiations of 'foo'.
-+
-+*/
-+struct symtabs_and_lines
-+expand_line_sal_maybe (struct symtab_and_line sal)
-+{
-+ struct symtabs_and_lines expanded;
-+ CORE_ADDR original_pc = sal.pc;
-+ char *original_function = NULL;
-+ int found;
-+ int i;
-+
-+ /* If we have explicit pc, don't expand.
-+ If we have no line number, we can't expand. */
-+ if (sal.explicit_pc || sal.line == 0 || sal.symtab == NULL)
-+ {
-+ expanded.nelts = 1;
-+ expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-+ expanded.sals[0] = sal;
-+ return expanded;
-+ }
-+
-+ sal.pc = 0;
-+ find_pc_partial_function (original_pc, &original_function, NULL, NULL);
-+
-+ expanded = expand_line_sal (sal);
-+ if (expanded.nelts == 1)
-+ {
-+ /* We had one sal, we got one sal. Without futher
-+ processing, just return the original sal. */
-+ xfree (expanded.sals);
-+ expanded.nelts = 1;
-+ expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-+ sal.pc = original_pc;
-+ expanded.sals[0] = sal;
-+ return expanded;
-+ }
-+
-+ if (!sal.explicit_line)
-+ {
-+ CORE_ADDR func_addr, func_end;
-+ for (i = 0; i < expanded.nelts; ++i)
-+ {
-+ CORE_ADDR pc = expanded.sals[i].pc;
-+ char *this_function;
-+ if (find_pc_partial_function (pc, &this_function,
-+ &func_addr, &func_end))
-+ {
-+ if (this_function &&
-+ strcmp (this_function, original_function) != 0)
-+ {
-+ remove_sal (&expanded, i);
-+ --i;
-+ }
-+ else if (func_addr == pc)
-+ {
-+ /* We're at beginning of a function, and should
-+ skip prologue. */
-+ struct symbol *sym = find_pc_function (pc);
-+ if (sym)
-+ expanded.sals[i] = find_function_start_sal (sym, 1);
-+ else
-+ expanded.sals[i].pc
-+ = gdbarch_skip_prologue (current_gdbarch, pc);
-+ }
-+ }
-+ }
-+ }
-+
-+
-+ if (expanded.nelts <= 1)
-+ {
-+ /* This is un ugly workaround. If we get zero
-+ expanded sals then something is really wrong.
-+ Fix that by returnign the original sal. */
-+ xfree (expanded.sals);
-+ expanded.nelts = 1;
-+ expanded.sals = xmalloc (sizeof (struct symtab_and_line));
-+ sal.pc = original_pc;
-+ expanded.sals[0] = sal;
-+ return expanded;
-+ }
-+
-+ if (original_pc)
-+ {
-+ found = 0;
-+ for (i = 0; i < expanded.nelts; ++i)
-+ if (expanded.sals[i].pc == original_pc)
-+ {
-+ found = 1;
-+ break;
-+ }
-+ gdb_assert (found);
-+ }
-+
-+ return expanded;
-+}
-+
-+/* Add SALS.nelts breakpoints to the breakpoint table. For each
-+ SALS.sal[i] breakpoint, include the corresponding ADDR_STRING[i]
-+ value. COND_STRING, if not NULL, specified the condition to be
-+ used for all breakpoints. Essentially the only case where
-+ SALS.nelts is not 1 is when we set a breakpoint on an overloaded
-+ function. In that case, it's still not possible to specify
-+ separate conditions for different overloaded functions, so
-+ we take just a single condition string.
-+
-+ NOTE: If the function succeeds, the caller is expected to cleanup
-+ the arrays ADDR_STRING, COND_STRING, and SALS (but not the
-+ array contents). If the function fails (error() is called), the
-+ caller is expected to cleanups both the ADDR_STRING, COND_STRING,
-+ COND and SALS arrays and each of those arrays contents. */
-+
-+static void
-+create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
-+ char *cond_string,
-+ enum bptype type, enum bpdisp disposition,
-+ int thread, int ignore_count, int from_tty)
-+{
-+ int i;
-+ for (i = 0; i < sals.nelts; ++i)
-+ {
-+ struct symtabs_and_lines expanded =
-+ expand_line_sal_maybe (sals.sals[i]);
-+
-+ create_breakpoint (expanded, addr_string[i],
-+ cond_string, type, disposition,
-+ thread, ignore_count, from_tty);
-+ }
-+}
-+
-+/* Parse ARG which is assumed to be a SAL specification possibly
-+ followed by conditionals. On return, SALS contains an array of SAL
-+ addresses found. ADDR_STRING contains a vector of (canonical)
-+ address strings. ARG points to the end of the SAL. */
-+
-+static void
-+parse_breakpoint_sals (char **address,
-+ struct symtabs_and_lines *sals,
-+ char ***addr_string,
-+ int *not_found_ptr)
-+{
-+ char *addr_start = *address;
-+ *addr_string = NULL;
-+ /* If no arg given, or if first arg is 'if ', use the default
-+ breakpoint. */
-+ if ((*address) == NULL
-+ || (strncmp ((*address), "if", 2) == 0 && isspace ((*address)[2])))
-+ {
-+ if (default_breakpoint_valid)
-+ {
-+ struct symtab_and_line sal;
-+ init_sal (&sal); /* initialize to zeroes */
-+ sals->sals = (struct symtab_and_line *)
-+ xmalloc (sizeof (struct symtab_and_line));
-+ sal.pc = default_breakpoint_address;
-+ sal.line = default_breakpoint_line;
-+ sal.symtab = default_breakpoint_symtab;
-+ sal.section = find_pc_overlay (sal.pc);
-+ sals->sals[0] = sal;
-+ sals->nelts = 1;
-+ }
-+ else
-+ error (_("No default breakpoint address now."));
-+ }
-+ else
-+ {
-+ /* Force almost all breakpoints to be in terms of the
-+ current_source_symtab (which is decode_line_1's default). This
-+ should produce the results we want almost all of the time while
-+ leaving default_breakpoint_* alone.
-+ ObjC: However, don't match an Objective-C method name which
-+ may have a '+' or '-' succeeded by a '[' */
-+
-+ struct symtab_and_line cursal = get_current_source_symtab_and_line ();
-+
-+ if (default_breakpoint_valid
-+ && (!cursal.symtab
-+ || ((strchr ("+-", (*address)[0]) != NULL)
-+ && ((*address)[1] != '['))))
-+ *sals = decode_line_1 (address, 1, default_breakpoint_symtab,
-+ default_breakpoint_line, addr_string,
-+ not_found_ptr);
-+ else
-+ *sals = decode_line_1 (address, 1, (struct symtab *) NULL, 0,
-+ addr_string, not_found_ptr);
-+ }
-+ /* For any SAL that didn't have a canonical string, fill one in. */
-+ if (sals->nelts > 0 && *addr_string == NULL)
-+ *addr_string = xcalloc (sals->nelts, sizeof (char **));
-+ if (addr_start != (*address))
-+ {
-+ int i;
-+ for (i = 0; i < sals->nelts; i++)
-+ {
-+ /* Add the string if not present. */
-+ if ((*addr_string)[i] == NULL)
-+ (*addr_string)[i] = savestring (addr_start, (*address) - addr_start);
-+ }
-+ }
-+}
-+
-+
-+/* Convert each SAL into a real PC. Verify that the PC can be
-+ inserted as a breakpoint. If it can't throw an error. */
-+
-+static void
-+breakpoint_sals_to_pc (struct symtabs_and_lines *sals,
-+ char *address)
-+{
-+ int i;
-+ for (i = 0; i < sals->nelts; i++)
-+ resolve_sal_pc (&sals->sals[i]);
-+}
-+
-+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);
-+}
-+
-+/* Given TOK, a string specification of condition and thread, as
-+ accepted by the 'break' command, extract the condition
-+ string and thread number and set *COND_STRING and *THREAD.
-+ PC identifies the context at which the condition should be parsed.
-+ If no condition is found, *COND_STRING is set to NULL.
-+ If no thread is found, *THREAD is set to -1. */
-+static void
-+find_condition_and_thread (char *tok, CORE_ADDR pc,
-+ char **cond_string, int *thread)
-+{
-+ *cond_string = NULL;
-+ *thread = -1;
-+ while (tok && *tok)
-+ {
-+ char *end_tok;
-+ int toklen;
-+ char *cond_start = NULL;
-+ char *cond_end = NULL;
-+ while (*tok == ' ' || *tok == '\t')
-+ tok++;
-+
-+ end_tok = tok;
-+
-+ while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000')
-+ end_tok++;
-+
-+ toklen = end_tok - tok;
-+
-+ if (toklen >= 1 && strncmp (tok, "if", toklen) == 0)
-+ {
-+ tok = cond_start = end_tok + 1;
-+ parse_exp_1 (&tok, block_for_pc (pc), 0);
-+ cond_end = tok;
-+ *cond_string = savestring (cond_start,
-+ cond_end - cond_start);
-+ }
-+ else if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0)
-+ {
-+ char *tmptok;
-+
-+ tok = end_tok + 1;
-+ tmptok = tok;
-+ *thread = strtol (tok, &tok, 0);
-+ if (tok == tmptok)
-+ error (_("Junk after thread keyword."));
-+ if (!valid_thread_id (*thread))
-+ error (_("Unknown thread %d."), *thread);
-+ }
-+ else
-+ error (_("Junk at end of arguments."));
-+ }
-+}
-+
-+/* Set a breakpoint. This function is shared between
-+ CLI and MI functions for setting a breakpoint.
-+ This function has two major modes of operations,
-+ selected by the PARSE_CONDITION_AND_THREAD parameter.
-+ If non-zero, the function will parse arg, extracting
-+ breakpoint location, address and thread. Otherwise,
-+ ARG is just the location of breakpoint, with condition
-+ and thread specified by the COND_STRING and THREAD
-+ parameters. */
-+
-+static void
-+break_command_really (char *arg, char *cond_string, int thread,
-+ int parse_condition_and_thread,
-+ int tempflag, int hardwareflag,
-+ int ignore_count,
-+ enum auto_boolean pending_break_support,
-+ int from_tty)
-+{
-+ struct gdb_exception e;
-+ struct symtabs_and_lines sals;
-+ struct symtab_and_line pending_sal;
-+ char *copy_arg;
-+ char *err_msg;
-+ char *addr_start = arg;
-+ char **addr_string;
-+ struct cleanup *old_chain;
-+ struct cleanup *breakpoint_chain = NULL;
-+ struct captured_parse_breakpoint_args parse_args;
-+ int i;
-+ int pending = 0;
-+ int not_found = 0;
-+
-+ sals.sals = NULL;
-+ sals.nelts = 0;
-+ addr_string = NULL;
-+
-+ parse_args.arg_p = &arg;
-+ parse_args.sals_p = &sals;
-+ parse_args.addr_string_p = &addr_string;
-+ parse_args.not_found_ptr = &not_found;
-+
-+ e = catch_exception (uiout, do_captured_parse_breakpoint,
-+ &parse_args, RETURN_MASK_ALL);
-+
-+ /* If caller is interested in rc value from parse, set value. */
-+ switch (e.reason)
-+ {
-+ case RETURN_QUIT:
-+ throw_exception (e);
-+ case RETURN_ERROR:
-+ switch (e.error)
-+ {
-+ case NOT_FOUND_ERROR:
-+
-+ /* If pending breakpoint support is turned off, throw
-+ error. */
-+
-+ if (pending_break_support == AUTO_BOOLEAN_FALSE)
-+ throw_exception (e);
-+
-+ exception_print (gdb_stderr, e);
-+
-+ /* 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;
-+
-+ /* 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:
-+ throw_exception (e);
-+ }
-+ default:
-+ if (!sals.nelts)
-+ return;
-+ }
-+
-+ /* Create a chain of things that always need to be cleaned up. */
-+ old_chain = make_cleanup (null_cleanup, 0);
-+
-+ if (!pending)
-+ {
-+ /* Make sure that all storage allocated to SALS gets freed. */
-+ make_cleanup (xfree, sals.sals);
-+
-+ /* Cleanup the addr_string array but not its contents. */
-+ make_cleanup (xfree, addr_string);
-+ }
-+
-+ /* ----------------------------- SNIP -----------------------------
-+ Anything added to the cleanup chain beyond this point is assumed
-+ to be part of a breakpoint. If the breakpoint create succeeds
-+ then the memory is not reclaimed. */
-+ breakpoint_chain = make_cleanup (null_cleanup, 0);
-+
-+ /* Mark the contents of the addr_string for cleanup. These go on
-+ the breakpoint_chain and only occure if the breakpoint create
-+ fails. */
-+ for (i = 0; i < sals.nelts; i++)
-+ {
-+ if (addr_string[i] != NULL)
-+ make_cleanup (xfree, addr_string[i]);
-+ }
-+
-+ /* Resolve all line numbers to PC's and verify that the addresses
-+ are ok for the target. */
-+ if (!pending)
-+ breakpoint_sals_to_pc (&sals, addr_start);
-+
-+ /* Verify that condition can be parsed, before setting any
-+ breakpoints. Allocate a separate condition expression for each
-+ breakpoint. */
-+ if (!pending)
-+ {
-+ if (parse_condition_and_thread)
-+ {
-+ /* Here we only parse 'arg' to separate condition
-+ from thread number, so parsing in context of first
-+ sal is OK. When setting the breakpoint we'll
-+ re-parse it in context of each sal. */
-+ cond_string = NULL;
-+ thread = -1;
-+ find_condition_and_thread (arg, sals.sals[0].pc, &cond_string, &thread);
-+ if (cond_string)
-+ make_cleanup (xfree, cond_string);
-+ }
-+ else
-+ {
-+ /* Create a private copy of condition string. */
-+ if (cond_string)
-+ {
-+ cond_string = xstrdup (cond_string);
-+ make_cleanup (xfree, cond_string);
-+ }
-+ }
-+ create_breakpoints (sals, addr_string, cond_string,
-+ hardwareflag ? bp_hardware_breakpoint
-+ : bp_breakpoint,
-+ tempflag ? disp_del : disp_donttouch,
-+ thread, ignore_count, from_tty);
-+ }
-+ else
-+ {
-+ struct symtab_and_line sal = {0};
-+ struct breakpoint *b;
-+
-+ make_cleanup (xfree, copy_arg);
-+
-+ b = set_raw_breakpoint_without_location (hardwareflag
-+ ? bp_hardware_breakpoint
-+ : bp_breakpoint);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->thread = -1;
-+ b->addr_string = addr_string[0];
-+ b->cond_string = NULL;
-+ b->ignore_count = ignore_count;
-+ b->disposition = tempflag ? disp_del : disp_donttouch;
-+ b->condition_not_parsed = 1;
-+ mention (b);
-+ }
-+
-+ if (sals.nelts > 1)
-+ 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);
-+ /* But cleanup everything else. */
-+ do_cleanups (old_chain);
-+}
-+
-+/* Set a breakpoint.
-+ ARG is a string describing breakpoint address,
-+ condition, and thread.
-+ FLAG specifies if a breakpoint is hardware on,
-+ and if breakpoint is temporary, using BP_HARDWARE_FLAG
-+ and BP_TEMPFLAG. */
-+
-+static void
-+break_command_1 (char *arg, int flag, int from_tty)
-+{
-+ int hardwareflag = flag & BP_HARDWAREFLAG;
-+ int tempflag = flag & BP_TEMPFLAG;
-+
-+ break_command_really (arg,
-+ NULL, 0, 1 /* parse arg */,
-+ tempflag, hardwareflag,
-+ 0 /* Ignore count */,
-+ pending_break_support, from_tty);
-+}
-+
-+
-+void
-+set_breakpoint (char *address, char *condition,
-+ int hardwareflag, int tempflag,
-+ int thread, int ignore_count,
-+ int pending)
-+{
-+ break_command_really (address, condition, thread,
-+ 0 /* condition and thread are valid. */,
-+ tempflag, hardwareflag,
-+ ignore_count,
-+ pending
-+ ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE,
-+ 0);
-+}
-+
-+
-+/* Helper function for break_command_1 and disassemble_command. */
-+
-+void
-+resolve_sal_pc (struct symtab_and_line *sal)
-+{
-+ CORE_ADDR pc;
-+
-+ if (sal->pc == 0 && sal->symtab != NULL)
-+ {
-+ if (!find_line_pc (sal->symtab, sal->line, &pc))
-+ error (_("No line %d in file \"%s\"."),
-+ sal->line, sal->symtab->filename);
-+ sal->pc = pc;
-+ }
-+
-+ if (sal->section == 0 && sal->symtab != NULL)
-+ {
-+ struct blockvector *bv;
-+ struct block *b;
-+ struct symbol *sym;
-+
-+ bv = blockvector_for_pc_sect (sal->pc, 0, &b, sal->symtab);
-+ if (bv != NULL)
-+ {
-+ sym = block_function (b);
-+ if (sym != NULL)
-+ {
-+ fixup_symbol_section (sym, sal->symtab->objfile);
-+ sal->section = SYMBOL_BFD_SECTION (sym);
-+ }
-+ else
-+ {
-+ /* It really is worthwhile to have the section, so we'll just
-+ have to look harder. This case can be executed if we have
-+ line numbers but no functions (as can happen in assembly
-+ source). */
-+
-+ struct minimal_symbol *msym;
-+
-+ msym = lookup_minimal_symbol_by_pc (sal->pc);
-+ if (msym)
-+ sal->section = SYMBOL_BFD_SECTION (msym);
-+ }
-+ }
-+ }
-+}
-+
-+void
-+break_command (char *arg, int from_tty)
-+{
-+ break_command_1 (arg, 0, from_tty);
-+}
-+
-+void
-+tbreak_command (char *arg, int from_tty)
-+{
-+ break_command_1 (arg, BP_TEMPFLAG, from_tty);
-+}
-+
-+static void
-+hbreak_command (char *arg, int from_tty)
-+{
-+ break_command_1 (arg, BP_HARDWAREFLAG, from_tty);
-+}
-+
-+static void
-+thbreak_command (char *arg, int from_tty)
-+{
-+ break_command_1 (arg, (BP_TEMPFLAG | BP_HARDWAREFLAG), from_tty);
-+}
-+
-+static void
-+stop_command (char *arg, int from_tty)
-+{
-+ printf_filtered (_("Specify the type of breakpoint to set.\n\
-+Usage: stop in <function | address>\n\
-+ stop at <line>\n"));
-+}
-+
-+static void
-+stopin_command (char *arg, int from_tty)
-+{
-+ int badInput = 0;
-+
-+ if (arg == (char *) NULL)
-+ badInput = 1;
-+ else if (*arg != '*')
-+ {
-+ char *argptr = arg;
-+ int hasColon = 0;
-+
-+ /* look for a ':'. If this is a line number specification, then
-+ say it is bad, otherwise, it should be an address or
-+ function/method name */
-+ while (*argptr && !hasColon)
-+ {
-+ hasColon = (*argptr == ':');
-+ argptr++;
-+ }
-+
-+ if (hasColon)
-+ badInput = (*argptr != ':'); /* Not a class::method */
-+ else
-+ badInput = isdigit (*arg); /* a simple line number */
-+ }
-+
-+ if (badInput)
-+ printf_filtered (_("Usage: stop in <function | address>\n"));
-+ else
-+ break_command_1 (arg, 0, from_tty);
-+}
-+
-+static void
-+stopat_command (char *arg, int from_tty)
-+{
-+ int badInput = 0;
-+
-+ if (arg == (char *) NULL || *arg == '*') /* no line number */
-+ badInput = 1;
-+ else
-+ {
-+ char *argptr = arg;
-+ int hasColon = 0;
-+
-+ /* look for a ':'. If there is a '::' then get out, otherwise
-+ it is probably a line number. */
-+ while (*argptr && !hasColon)
-+ {
-+ hasColon = (*argptr == ':');
-+ argptr++;
-+ }
-+
-+ if (hasColon)
-+ badInput = (*argptr == ':'); /* we have class::method */
-+ else
-+ badInput = !isdigit (*arg); /* not a line number */
-+ }
-+
-+ if (badInput)
-+ printf_filtered (_("Usage: stop at <line>\n"));
-+ else
-+ break_command_1 (arg, 0, from_tty);
-+}
-+
-+/* accessflag: hw_write: watch write,
-+ hw_read: watch read,
-+ hw_access: watch access (read or write) */
-+static void
-+watch_command_1 (char *arg, int accessflag, int from_tty)
-+{
-+ struct breakpoint *b, *scope_breakpoint = NULL;
-+ struct symtab_and_line sal;
-+ struct expression *exp;
-+ struct block *exp_valid_block;
-+ struct value *val, *mark;
-+ struct frame_info *frame;
-+ struct frame_info *prev_frame = NULL;
-+ char *exp_start = NULL;
-+ char *exp_end = NULL;
-+ char *tok, *id_tok_start, *end_tok;
-+ int toklen;
-+ char *cond_start = NULL;
-+ char *cond_end = NULL;
-+ struct expression *cond = NULL;
-+ int i, other_type_used, target_resources_ok = 0;
-+ enum bptype bp_type;
-+ int mem_cnt = 0;
-+ int thread = -1;
-+
-+ init_sal (&sal); /* initialize to zeroes */
-+
-+ /* Make sure that we actually have parameters to parse. */
-+ if (arg != NULL && arg[0] != '\0')
-+ {
-+ toklen = strlen (arg); /* Size of argument list. */
-+
-+ /* Points tok to the end of the argument list. */
-+ tok = arg + toklen - 1;
-+
-+ /* Go backwards in the parameters list. Skip the last parameter.
-+ If we're expecting a 'thread <thread_num>' parameter, this should
-+ be the thread identifier. */
-+ while (tok > arg && (*tok == ' ' || *tok == '\t'))
-+ tok--;
-+ while (tok > arg && (*tok != ' ' && *tok != '\t'))
-+ tok--;
-+
-+ /* Points end_tok to the beginning of the last token. */
-+ id_tok_start = tok + 1;
-+
-+ /* Go backwards in the parameters list. Skip one more parameter.
-+ If we're expecting a 'thread <thread_num>' parameter, we should
-+ reach a "thread" token. */
-+ while (tok > arg && (*tok == ' ' || *tok == '\t'))
-+ tok--;
-+
-+ end_tok = tok;
-+
-+ while (tok > arg && (*tok != ' ' && *tok != '\t'))
-+ tok--;
-+
-+ /* Move the pointer forward to skip the whitespace and
-+ calculate the length of the token. */
-+ tok++;
-+ toklen = end_tok - tok;
-+
-+ if (toklen >= 1 && strncmp (tok, "thread", toklen) == 0)
-+ {
-+ /* At this point we've found a "thread" token, which means
-+ the user is trying to set a watchpoint that triggers
-+ only in a specific thread. */
-+ char *endp;
-+
-+ /* Extract the thread ID from the next token. */
-+ thread = strtol (id_tok_start, &endp, 0);
-+
-+ /* Check if the user provided a valid numeric value for the
-+ thread ID. */
-+ if (*endp != ' ' && *endp != '\t' && *endp != '\0')
-+ error (_("Invalid thread ID specification %s."), id_tok_start);
-+
-+ /* Check if the thread actually exists. */
-+ if (!valid_thread_id (thread))
-+ error (_("Unknown thread %d."), thread);
-+
-+ /* Truncate the string and get rid of the thread <thread_num>
-+ parameter before the parameter list is parsed by the
-+ evaluate_expression() function. */
-+ *tok = '\0';
-+ }
-+ }
-+
-+ /* Parse the rest of the arguments. */
-+ innermost_block = NULL;
-+ exp_start = arg;
-+ exp = parse_exp_1 (&arg, 0, 0);
-+ exp_end = arg;
-+ exp_valid_block = innermost_block;
-+ mark = value_mark ();
-+ val = evaluate_expression (exp);
-+ release_value (val);
-+ if (value_lazy (val))
-+ value_fetch_lazy (val);
-+
-+ tok = arg;
-+ while (*tok == ' ' || *tok == '\t')
-+ tok++;
-+ end_tok = tok;
-+
-+ while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000')
-+ end_tok++;
-+
-+ toklen = end_tok - tok;
-+ if (toklen >= 1 && strncmp (tok, "if", toklen) == 0)
-+ {
-+ tok = cond_start = end_tok + 1;
-+ cond = parse_exp_1 (&tok, 0, 0);
-+ cond_end = tok;
-+ }
-+ if (*tok)
-+ error (_("Junk at end of command."));
-+
-+ if (accessflag == hw_read)
-+ bp_type = bp_read_watchpoint;
-+ else if (accessflag == hw_access)
-+ bp_type = bp_access_watchpoint;
-+ else
-+ bp_type = bp_hardware_watchpoint;
-+
-+ 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."));
-+ if (mem_cnt != 0)
-+ {
-+ i = hw_watchpoint_used_count (bp_type, &other_type_used);
-+ target_resources_ok =
-+ 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."));
-+
-+ if (target_resources_ok < 0 && bp_type != bp_hardware_watchpoint)
-+ error (_("Target can only support one kind of HW watchpoint at a time."));
-+ }
-+
-+ /* Change the type of breakpoint to an ordinary watchpoint if a hardware
-+ watchpoint could not be set. */
-+ if (!mem_cnt || target_resources_ok <= 0)
-+ bp_type = bp_watchpoint;
-+
-+ frame = block_innermost_frame (exp_valid_block);
-+ if (frame)
-+ prev_frame = get_prev_frame (frame);
-+ else
-+ prev_frame = NULL;
-+
-+ /* If the expression is "local", then set up a "watchpoint scope"
-+ breakpoint at the point where we've left the scope of the watchpoint
-+ expression. Create the scope breakpoint before the watchpoint, so
-+ that we will encounter it first in bpstat_stop_status. */
-+ if (innermost_block && prev_frame)
-+ {
-+ scope_breakpoint = create_internal_breakpoint (get_frame_pc (prev_frame),
-+ bp_watchpoint_scope);
-+
-+ scope_breakpoint->enable_state = bp_enabled;
-+
-+ /* Automatically delete the breakpoint when it hits. */
-+ scope_breakpoint->disposition = disp_del;
-+
-+ /* Only break in the proper frame (help with recursion). */
-+ scope_breakpoint->frame_id = get_frame_id (prev_frame);
-+
-+ /* Set the address at which we will stop. */
-+ scope_breakpoint->loc->requested_address
-+ = get_frame_pc (prev_frame);
-+ scope_breakpoint->loc->address
-+ = adjust_breakpoint_address (scope_breakpoint->loc->requested_address,
-+ scope_breakpoint->type);
-+ }
-+
-+ /* Now set up the breakpoint. */
-+ b = set_raw_breakpoint (sal, bp_type);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->thread = thread;
-+ b->disposition = disp_donttouch;
-+ b->exp = exp;
-+ b->exp_valid_block = exp_valid_block;
-+ b->exp_string = savestring (exp_start, exp_end - exp_start);
-+ b->val = val;
-+ b->loc->cond = cond;
-+ if (cond_start)
-+ b->cond_string = savestring (cond_start, cond_end - cond_start);
-+ else
-+ b->cond_string = 0;
-+
-+ if (frame)
-+ b->watchpoint_frame = get_frame_id (frame);
-+ else
-+ b->watchpoint_frame = null_frame_id;
-+
-+ if (scope_breakpoint != NULL)
-+ {
-+ /* The scope breakpoint is related to the watchpoint. We will
-+ need to act on them together. */
-+ b->related_breakpoint = scope_breakpoint;
-+ scope_breakpoint->related_breakpoint = b;
-+ }
-+
-+ value_free_to_mark (mark);
-+ mention (b);
-+}
-+
-+/* Return count of locations need to be watched and can be handled
-+ in hardware. If the watchpoint can not be handled
-+ in hardware return zero. */
-+
-+static int
-+can_use_hardware_watchpoint (struct value *v)
-+{
-+ int found_memory_cnt = 0;
-+ struct value *head = v;
-+
-+ /* Did the user specifically forbid us to use hardware watchpoints? */
-+ if (!can_use_hw_watchpoints)
-+ return 0;
-+
-+ /* Make sure that the value of the expression depends only upon
-+ memory contents, and values computed from them within GDB. If we
-+ find any register references or function calls, we can't use a
-+ hardware watchpoint.
-+
-+ The idea here is that evaluating an expression generates a series
-+ of values, one holding the value of every subexpression. (The
-+ expression a*b+c has five subexpressions: a, b, a*b, c, and
-+ a*b+c.) GDB's values hold almost enough information to establish
-+ the criteria given above --- they identify memory lvalues,
-+ register lvalues, computed values, etcetera. So we can evaluate
-+ the expression, and then scan the chain of values that leaves
-+ behind to decide whether we can detect any possible change to the
-+ expression's final value using only hardware watchpoints.
-+
-+ However, I don't think that the values returned by inferior
-+ 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 = value_next (v))
-+ {
-+ if (VALUE_LVAL (v) == lval_memory)
-+ {
-+ 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'). */
-+ ;
-+ else
-+ {
-+ /* Ahh, memory we actually used! Check if we can cover
-+ it with hardware watchpoints. */
-+ 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
-+ middle of some value chain. */
-+ if (v == head
-+ || (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));
-+
-+ if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
-+ return 0;
-+ else
-+ found_memory_cnt++;
-+ }
-+ }
-+ }
-+ else if (VALUE_LVAL (v) != not_lval
-+ && deprecated_value_modifiable (v) == 0)
-+ return 0; /* ??? What does this represent? */
-+ else if (VALUE_LVAL (v) == lval_register)
-+ return 0; /* cannot watch a register with a HW watchpoint */
-+ }
-+
-+ /* The expression itself looks suitable for using a hardware
-+ watchpoint, but give the target machine a chance to reject it. */
-+ return found_memory_cnt;
-+}
-+
-+void
-+watch_command_wrapper (char *arg, int from_tty)
-+{
-+ watch_command (arg, from_tty);
-+}
-+
-+static void
-+watch_command (char *arg, int from_tty)
-+{
-+ watch_command_1 (arg, hw_write, from_tty);
-+}
-+
-+void
-+rwatch_command_wrapper (char *arg, int from_tty)
-+{
-+ rwatch_command (arg, from_tty);
-+}
-+
-+static void
-+rwatch_command (char *arg, int from_tty)
-+{
-+ watch_command_1 (arg, hw_read, from_tty);
-+}
-+
-+void
-+awatch_command_wrapper (char *arg, int from_tty)
-+{
-+ awatch_command (arg, from_tty);
-+}
-+
-+static void
-+awatch_command (char *arg, int from_tty)
-+{
-+ watch_command_1 (arg, hw_access, from_tty);
-+}
-+
-+
-+/* Helper routines for the until_command routine in infcmd.c. Here
-+ because it uses the mechanisms of breakpoints. */
-+
-+/* This function is called by fetch_inferior_event via the
-+ cmd_continuation pointer, to complete the until command. It takes
-+ care of cleaning up the temporary breakpoints set up by the until
-+ command. */
-+static void
-+until_break_command_continuation (struct continuation_arg *arg)
-+{
-+ struct cleanup *cleanups;
-+
-+ cleanups = (struct cleanup *) arg->data.pointer;
-+ do_exec_cleanups (cleanups);
-+}
-+
-+void
-+until_break_command (char *arg, int from_tty, int anywhere)
-+{
-+ struct symtabs_and_lines sals;
-+ struct symtab_and_line sal;
-+ struct frame_info *frame = get_selected_frame (NULL);
-+ struct frame_info *prev_frame = get_prev_frame (frame);
-+ struct breakpoint *breakpoint;
-+ struct cleanup *old_chain;
-+ struct continuation_arg *arg1;
-+
-+
-+ clear_proceed_status ();
-+
-+ /* Set a breakpoint where the user wants it and at return from
-+ this function */
-+
-+ if (default_breakpoint_valid)
-+ sals = decode_line_1 (&arg, 1, default_breakpoint_symtab,
-+ default_breakpoint_line, (char ***) NULL, NULL);
-+ else
-+ sals = decode_line_1 (&arg, 1, (struct symtab *) NULL,
-+ 0, (char ***) NULL, NULL);
-+
-+ if (sals.nelts != 1)
-+ 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."));
-+
-+ resolve_sal_pc (&sal);
-+
-+ if (anywhere)
-+ /* If the user told us to continue until a specified location,
-+ we don't specify a frame at which we need to stop. */
-+ breakpoint = set_momentary_breakpoint (sal, null_frame_id, bp_until);
-+ else
-+ /* Otherwise, specify the current frame, because we want to stop only
-+ at the very same frame. */
-+ breakpoint = set_momentary_breakpoint (sal, get_frame_id (frame),
-+ bp_until);
-+
-+ if (!target_can_async_p ())
-+ old_chain = make_cleanup_delete_breakpoint (breakpoint);
-+ else
-+ old_chain = make_exec_cleanup_delete_breakpoint (breakpoint);
-+
-+ /* If we are running asynchronously, and the target supports async
-+ execution, we are not waiting for the target to stop, in the call
-+ tp proceed, below. This means that we cannot delete the
-+ brekpoints until the target has actually stopped. The only place
-+ where we get a chance to do that is in fetch_inferior_event, so
-+ we must set things up for that. */
-+
-+ 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
-+ cleanups, because all the continuation does is the cleanups in
-+ the exec_cleanup_chain. */
-+ arg1 =
-+ (struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
-+ arg1->next = NULL;
-+ arg1->data.pointer = old_chain;
-+
-+ add_continuation (until_break_command_continuation, arg1);
-+ }
-+
-+ /* Keep within the current frame, or in frames called by the current
-+ one. */
-+ if (prev_frame)
-+ {
-+ sal = find_pc_line (get_frame_pc (prev_frame), 0);
-+ sal.pc = get_frame_pc (prev_frame);
-+ breakpoint = set_momentary_breakpoint (sal, get_frame_id (prev_frame),
-+ bp_until);
-+ if (!target_can_async_p ())
-+ make_cleanup_delete_breakpoint (breakpoint);
-+ else
-+ make_exec_cleanup_delete_breakpoint (breakpoint);
-+ }
-+
-+ 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 (!target_can_async_p ())
-+ do_cleanups (old_chain);
-+}
-+
-+static void
-+ep_skip_leading_whitespace (char **s)
-+{
-+ if ((s == NULL) || (*s == NULL))
-+ return;
-+ while (isspace (**s))
-+ *s += 1;
-+}
-+
-+/* This function examines a string, and attempts to find a token
-+ that might be an event name in the leading characters. If a
-+ possible match is found, a pointer to the last character of
-+ the token is returned. Else, NULL is returned. */
-+
-+static char *
-+ep_find_event_name_end (char *arg)
-+{
-+ char *s = arg;
-+ char *event_name_end = NULL;
-+
-+ /* If we could depend upon the presense of strrpbrk, we'd use that... */
-+ if (arg == NULL)
-+ return NULL;
-+
-+ /* We break out of the loop when we find a token delimiter.
-+ Basically, we're looking for alphanumerics and underscores;
-+ anything else delimites the token. */
-+ while (*s != '\0')
-+ {
-+ if (!isalnum (*s) && (*s != '_'))
-+ break;
-+ event_name_end = s;
-+ s++;
-+ }
-+
-+ return event_name_end;
-+}
-+
-+
-+/* This function attempts to parse an optional "if <cond>" clause
-+ from the arg string. If one is not found, it returns NULL.
-+
-+ Else, it returns a pointer to the condition string. (It does not
-+ attempt to evaluate the string against a particular block.) And,
-+ it updates arg to point to the first character following the parsed
-+ if clause in the arg string. */
-+
-+static char *
-+ep_parse_optional_if_clause (char **arg)
-+{
-+ char *cond_string;
-+
-+ if (((*arg)[0] != 'i') || ((*arg)[1] != 'f') || !isspace ((*arg)[2]))
-+ return NULL;
-+
-+ /* Skip the "if" keyword. */
-+ (*arg) += 2;
-+
-+ /* Skip any extra leading whitespace, and record the start of the
-+ condition string. */
-+ ep_skip_leading_whitespace (arg);
-+ cond_string = *arg;
-+
-+ /* Assume that the condition occupies the remainder of the arg string. */
-+ (*arg) += strlen (cond_string);
-+
-+ return cond_string;
-+}
-+
-+/* This function attempts to parse an optional filename from the arg
-+ string. If one is not found, it returns NULL.
-+
-+ Else, it returns a pointer to the parsed filename. (This function
-+ makes no attempt to verify that a file of that name exists, or is
-+ accessible.) And, it updates arg to point to the first character
-+ following the parsed filename in the arg string.
-+
-+ Note that clients needing to preserve the returned filename for
-+ future access should copy it to their own buffers. */
-+static char *
-+ep_parse_optional_filename (char **arg)
-+{
-+ static char filename[1024];
-+ char *arg_p = *arg;
-+ int i;
-+ char c;
-+
-+ if ((*arg_p == '\0') || isspace (*arg_p))
-+ return NULL;
-+
-+ for (i = 0;; i++)
-+ {
-+ c = *arg_p;
-+ if (isspace (c))
-+ c = '\0';
-+ filename[i] = c;
-+ if (c == '\0')
-+ break;
-+ arg_p++;
-+ }
-+ *arg = arg_p;
-+
-+ return filename;
-+}
-+
-+/* Commands to deal with catching events, such as signals, exceptions,
-+ process start/exit, etc. */
-+
-+typedef enum
-+{
-+ catch_fork, catch_vfork
-+}
-+catch_fork_kind;
-+
-+static void
-+catch_fork_command_1 (catch_fork_kind fork_kind, char *arg, int tempflag,
-+ int from_tty)
-+{
-+ char *cond_string = NULL;
-+
-+ ep_skip_leading_whitespace (&arg);
-+
-+ /* The allowed syntax is:
-+ catch [v]fork
-+ catch [v]fork if <cond>
-+
-+ First, check if there's an if clause. */
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+
-+ if ((*arg != '\0') && !isspace (*arg))
-+ error (_("Junk at end of arguments."));
-+
-+ /* If this target supports it, create a fork or vfork catchpoint
-+ and enable reporting of such events. */
-+ switch (fork_kind)
-+ {
-+ case catch_fork:
-+ create_fork_event_catchpoint (tempflag, cond_string);
-+ break;
-+ case catch_vfork:
-+ create_vfork_event_catchpoint (tempflag, cond_string);
-+ break;
-+ default:
-+ error (_("unsupported or unknown fork kind; cannot catch it"));
-+ break;
-+ }
-+}
-+
-+static void
-+catch_exec_command_1 (char *arg, int tempflag, int from_tty)
-+{
-+ char *cond_string = NULL;
-+
-+ ep_skip_leading_whitespace (&arg);
-+
-+ /* The allowed syntax is:
-+ catch exec
-+ catch exec if <cond>
-+
-+ First, check if there's an if clause. */
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+
-+ if ((*arg != '\0') && !isspace (*arg))
-+ error (_("Junk at end of arguments."));
-+
-+ /* If this target supports it, create an exec catchpoint
-+ and enable reporting of such events. */
-+ create_exec_event_catchpoint (tempflag, cond_string);
-+}
-+
-+static void
-+catch_load_command_1 (char *arg, int tempflag, int from_tty)
-+{
-+ char *dll_pathname = NULL;
-+ char *cond_string = NULL;
-+
-+ ep_skip_leading_whitespace (&arg);
-+
-+ /* The allowed syntax is:
-+ catch load
-+ catch load if <cond>
-+ catch load <filename>
-+ catch load <filename> if <cond>
-+
-+ The user is not allowed to specify the <filename> after an
-+ if clause.
-+
-+ We'll ignore the pathological case of a file named "if".
-+
-+ First, check if there's an if clause. If so, then there
-+ cannot be a filename. */
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+
-+ /* If there was an if clause, then there cannot be a filename.
-+ Else, there might be a filename and an if clause. */
-+ if (cond_string == NULL)
-+ {
-+ dll_pathname = ep_parse_optional_filename (&arg);
-+ ep_skip_leading_whitespace (&arg);
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+ }
-+
-+ if ((*arg != '\0') && !isspace (*arg))
-+ 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)
-+ occurs. */
-+ SOLIB_CREATE_CATCH_LOAD_HOOK (PIDGET (inferior_ptid), tempflag,
-+ dll_pathname, cond_string);
-+}
-+
-+static void
-+catch_unload_command_1 (char *arg, int tempflag, int from_tty)
-+{
-+ char *dll_pathname = NULL;
-+ char *cond_string = NULL;
-+
-+ ep_skip_leading_whitespace (&arg);
-+
-+ /* The allowed syntax is:
-+ catch unload
-+ catch unload if <cond>
-+ catch unload <filename>
-+ catch unload <filename> if <cond>
-+
-+ The user is not allowed to specify the <filename> after an
-+ if clause.
-+
-+ We'll ignore the pathological case of a file named "if".
-+
-+ First, check if there's an if clause. If so, then there
-+ cannot be a filename. */
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+
-+ /* If there was an if clause, then there cannot be a filename.
-+ Else, there might be a filename and an if clause. */
-+ if (cond_string == NULL)
-+ {
-+ dll_pathname = ep_parse_optional_filename (&arg);
-+ ep_skip_leading_whitespace (&arg);
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+ }
-+
-+ if ((*arg != '\0') && !isspace (*arg))
-+ 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)
-+ occurs. */
-+ SOLIB_CREATE_CATCH_UNLOAD_HOOK (PIDGET (inferior_ptid), tempflag,
-+ dll_pathname, cond_string);
-+}
-+
-+static enum print_stop_action
-+print_exception_catchpoint (struct breakpoint *b)
-+{
-+ annotate_catchpoint (b->number);
-+
-+ if (strstr (b->addr_string, "throw") != NULL)
-+ printf_filtered (_("\nCatchpoint %d (exception thrown)\n"),
-+ b->number);
-+ else
-+ printf_filtered (_("\nCatchpoint %d (exception caught)\n"),
-+ b->number);
-+
-+ return PRINT_SRC_AND_LOC;
-+}
-+
-+static void
-+print_one_exception_catchpoint (struct breakpoint *b, CORE_ADDR *last_addr)
-+{
-+ if (addressprint)
-+ {
-+ annotate_field (4);
-+ ui_out_field_core_addr (uiout, "addr", b->loc->address);
-+ }
-+ annotate_field (5);
-+ *last_addr = b->loc->address;
-+ if (strstr (b->addr_string, "throw") != NULL)
-+ ui_out_field_string (uiout, "what", "exception throw");
-+ else
-+ ui_out_field_string (uiout, "what", "exception catch");
-+}
-+
-+static void
-+print_mention_exception_catchpoint (struct breakpoint *b)
-+{
-+ if (strstr (b->addr_string, "throw") != NULL)
-+ printf_filtered (_("Catchpoint %d (throw)"), b->number);
-+ else
-+ printf_filtered (_("Catchpoint %d (catch)"), b->number);
-+}
-+
-+static struct breakpoint_ops gnu_v3_exception_catchpoint_ops = {
-+ print_exception_catchpoint,
-+ print_one_exception_catchpoint,
-+ print_mention_exception_catchpoint
-+};
-+
-+static int
-+handle_gnu_v3_exceptions (int tempflag, char *cond_string,
-+ enum exception_event_kind ex_event, int from_tty)
-+{
-+ char *trigger_func_name, *nameptr;
-+ struct symtabs_and_lines sals;
-+ struct breakpoint *b;
-+
-+ if (ex_event == EX_EVENT_CATCH)
-+ trigger_func_name = xstrdup ("__cxa_begin_catch");
-+ else
-+ trigger_func_name = xstrdup ("__cxa_throw");
-+
-+ nameptr = trigger_func_name;
-+ sals = decode_line_1 (&nameptr, 1, NULL, 0, NULL, NULL);
-+ if (sals.nelts == 0)
-+ {
-+ xfree (trigger_func_name);
-+ return 0;
-+ }
-+
-+ b = set_raw_breakpoint (sals.sals[0], bp_breakpoint);
-+ set_breakpoint_count (breakpoint_count + 1);
-+ b->number = breakpoint_count;
-+ b->cond_string = (cond_string == NULL) ?
-+ NULL : savestring (cond_string, strlen (cond_string));
-+ b->thread = -1;
-+ b->addr_string = trigger_func_name;
-+ b->enable_state = bp_enabled;
-+ b->disposition = tempflag ? disp_del : disp_donttouch;
-+ b->ops = &gnu_v3_exception_catchpoint_ops;
-+
-+ xfree (sals.sals);
-+ mention (b);
-+ return 1;
-+}
-+
-+/* Deal with "catch catch" and "catch throw" commands */
-+
-+static void
-+catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
-+ int tempflag, int from_tty)
-+{
-+ char *cond_string = NULL;
-+ struct symtab_and_line *sal = NULL;
-+
-+ ep_skip_leading_whitespace (&arg);
-+
-+ cond_string = ep_parse_optional_if_clause (&arg);
-+
-+ if ((*arg != '\0') && !isspace (*arg))
-+ 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"));
-+
-+ if (handle_gnu_v3_exceptions (tempflag, cond_string, ex_event, from_tty))
-+ return;
-+
-+ warning (_("Unsupported with this platform/compiler combination."));
-+}
-+
-+/* Create a breakpoint struct for Ada exception catchpoints. */
-+
-+static void
-+create_ada_exception_breakpoint (struct symtab_and_line sal,
-+ char *addr_string,
-+ char *exp_string,
-+ char *cond_string,
-+ struct expression *cond,
-+ struct breakpoint_ops *ops,
-+ int tempflag,
-+ int from_tty)
-+{
-+ struct breakpoint *b;
-+
-+ if (from_tty)
-+ {
-+ describe_other_breakpoints (sal.pc, sal.section, -1);
-+ /* FIXME: brobecker/2006-12-28: Actually, re-implement a special
-+ version for exception catchpoints, because two catchpoints
-+ used for different exception names will use the same address.
-+ In this case, a "breakpoint ... also set at..." warning is
-+ unproductive. Besides. the warning phrasing is also a bit
-+ inapropriate, we should use the word catchpoint, and tell
-+ the user what type of catchpoint it is. The above is good
-+ enough for now, though. */
-+ }
-+
-+ b = set_raw_breakpoint (sal, bp_breakpoint);
-+ set_breakpoint_count (breakpoint_count + 1);
-+
-+ b->enable_state = bp_enabled;
-+ b->disposition = tempflag ? disp_del : disp_donttouch;
-+ b->number = breakpoint_count;
-+ b->ignore_count = 0;
-+ b->loc->cond = cond;
-+ b->addr_string = addr_string;
-+ b->language = language_ada;
-+ b->cond_string = cond_string;
-+ b->exp_string = exp_string;
-+ b->thread = -1;
-+ b->ops = ops;
-+
-+ mention (b);
-+}
-+
-+/* Implement the "catch exception" command. */
-+
-+static void
-+catch_ada_exception_command (char *arg, int tempflag, int from_tty)
-+{
-+ struct symtab_and_line sal;
-+ enum bptype type;
-+ char *addr_string = NULL;
-+ char *exp_string = NULL;
-+ char *cond_string = NULL;
-+ struct expression *cond = NULL;
-+ struct breakpoint_ops *ops = NULL;
-+
-+ sal = ada_decode_exception_location (arg, &addr_string, &exp_string,
-+ &cond_string, &cond, &ops);
-+ create_ada_exception_breakpoint (sal, addr_string, exp_string,
-+ cond_string, cond, ops, tempflag,
-+ from_tty);
-+}
-+
-+/* Implement the "catch assert" command. */
-+
-+static void
-+catch_assert_command (char *arg, int tempflag, int from_tty)
-+{
-+ struct symtab_and_line sal;
-+ char *addr_string = NULL;
-+ struct breakpoint_ops *ops = NULL;
-+
-+ sal = ada_decode_assert_location (arg, &addr_string, &ops);
-+ create_ada_exception_breakpoint (sal, addr_string, NULL, NULL, NULL, ops,
-+ tempflag, from_tty);
-+}
-+
-+static void
-+catch_command_1 (char *arg, int tempflag, int from_tty)
-+{
-+
-+ /* The first argument may be an event name, such as "start" or "load".
-+ If so, then handle it as such. If it doesn't match an event name,
-+ then attempt to interpret it as an exception name. (This latter is
-+ the v4.16-and-earlier GDB meaning of the "catch" command.)
-+
-+ First, try to find the bounds of what might be an event name. */
-+ char *arg1_start = arg;
-+ char *arg1_end;
-+ int arg1_length;
-+
-+ if (arg1_start == NULL)
-+ {
-+ /* Old behaviour was to use pre-v-4.16 syntax */
-+ /* catch_throw_command_1 (arg1_start, tempflag, from_tty); */
-+ /* return; */
-+ /* Now, this is not allowed */
-+ error (_("Catch requires an event name."));
-+
-+ }
-+ arg1_end = ep_find_event_name_end (arg1_start);
-+ if (arg1_end == NULL)
-+ 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"));
-+ }
-+ else if (strncmp (arg1_start, "catch", arg1_length) == 0)
-+ {
-+ catch_exception_command_1 (EX_EVENT_CATCH, arg1_end + 1,
-+ tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "throw", arg1_length) == 0)
-+ {
-+ catch_exception_command_1 (EX_EVENT_THROW, arg1_end + 1,
-+ tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "thread_start", arg1_length) == 0)
-+ {
-+ 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"));
-+ }
-+ else if (strncmp (arg1_start, "thread_join", arg1_length) == 0)
-+ {
-+ error (_("Catch of thread_join not yet implemented"));
-+ }
-+ else if (strncmp (arg1_start, "start", arg1_length) == 0)
-+ {
-+ error (_("Catch of start not yet implemented"));
-+ }
-+ else if (strncmp (arg1_start, "exit", arg1_length) == 0)
-+ {
-+ error (_("Catch of exit not yet implemented"));
-+ }
-+ else if (strncmp (arg1_start, "fork", arg1_length) == 0)
-+ {
-+ catch_fork_command_1 (catch_fork, arg1_end + 1, tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "vfork", arg1_length) == 0)
-+ {
-+ catch_fork_command_1 (catch_vfork, arg1_end + 1, tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "exec", arg1_length) == 0)
-+ {
-+ catch_exec_command_1 (arg1_end + 1, tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "load", arg1_length) == 0)
-+ {
-+ catch_load_command_1 (arg1_end + 1, tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "unload", arg1_length) == 0)
-+ {
-+ catch_unload_command_1 (arg1_end + 1, tempflag, from_tty);
-+ }
-+ else if (strncmp (arg1_start, "stop", arg1_length) == 0)
-+ {
-+ error (_("Catch of stop not yet implemented"));
-+ }
-+ else if (strncmp (arg1_start, "exception", arg1_length) == 0)
-+ {
-+ catch_ada_exception_command (arg1_end + 1, tempflag, from_tty);
-+ }
-+
-+ else if (strncmp (arg1_start, "assert", arg1_length) == 0)
-+ {
-+ catch_assert_command (arg1_end + 1, tempflag, from_tty);
-+ }
-+
-+ /* This doesn't appear to be an event name */
-+
-+ else
-+ {
-+ /* Pre-v.4.16 behaviour was to treat the argument
-+ 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"));
-+
-+ }
-+}
-+
-+static void
-+catch_command (char *arg, int from_tty)
-+{
-+ catch_command_1 (arg, 0, from_tty);
-+}
-+
-+
-+static void
-+tcatch_command (char *arg, int from_tty)
-+{
-+ catch_command_1 (arg, 1, from_tty);
-+}
-+
-+/* Delete breakpoints by address or line. */
-+
-+static void
-+clear_command (char *arg, int from_tty)
-+{
-+ struct breakpoint *b;
-+ VEC(breakpoint_p) *found = 0;
-+ int ix;
-+ int default_match;
-+ struct symtabs_and_lines sals;
-+ struct symtab_and_line sal;
-+ int i;
-+
-+ if (arg)
-+ {
-+ sals = decode_line_spec (arg, 1);
-+ default_match = 0;
-+ }
-+ else
-+ {
-+ sals.sals = (struct symtab_and_line *)
-+ xmalloc (sizeof (struct symtab_and_line));
-+ make_cleanup (xfree, sals.sals);
-+ init_sal (&sal); /* initialize to zeroes */
-+ sal.line = default_breakpoint_line;
-+ sal.symtab = default_breakpoint_symtab;
-+ sal.pc = default_breakpoint_address;
-+ if (sal.symtab == 0)
-+ error (_("No source file specified."));
-+
-+ sals.sals[0] = sal;
-+ sals.nelts = 1;
-+
-+ default_match = 1;
-+ }
-+
-+ /* We don't call resolve_sal_pc here. That's not
-+ as bad as it seems, because all existing breakpoints
-+ typically have both file/line and pc set. So, if
-+ clear is given file/line, we can match this to existing
-+ breakpoint without obtaining pc at all.
-+
-+ We only support clearing given the address explicitly
-+ present in breakpoint table. Say, we've set breakpoint
-+ at file:line. There were several PC values for that file:line,
-+ due to optimization, all in one block.
-+ We've picked one PC value. If "clear" is issued with another
-+ PC corresponding to the same file:line, the breakpoint won't
-+ be cleared. We probably can still clear the breakpoint, but
-+ since the other PC value is never presented to user, user
-+ can only find it by guessing, and it does not seem important
-+ to support that. */
-+
-+ /* For each line spec given, delete bps which correspond
-+ to it. Do it in two passes, solely to preserve the current
-+ behavior that from_tty is forced true if we delete more than
-+ one breakpoint. */
-+
-+ found = NULL;
-+ for (i = 0; i < sals.nelts; i++)
-+ {
-+ /* If exact pc given, clear bpts at that pc.
-+ If line given (pc == 0), clear all bpts on specified line.
-+ If defaulting, clear all bpts on default line
-+ or at default pc.
-+
-+ defaulting sal.pc != 0 tests to do
-+
-+ 0 1 pc
-+ 1 1 pc _and_ line
-+ 0 0 line
-+ 1 0 <can't happen> */
-+
-+ sal = sals.sals[i];
-+
-+ /* Find all matching breakpoints and add them to
-+ 'found'. */
-+ ALL_BREAKPOINTS (b)
-+ {
-+ int match = 0;
-+ /* Are we going to delete b? */
-+ if (b->type != bp_none
-+ && b->type != bp_watchpoint
-+ && b->type != bp_hardware_watchpoint
-+ && b->type != bp_read_watchpoint
-+ && b->type != bp_access_watchpoint)
-+ {
-+ struct bp_location *loc = b->loc;
-+ for (; loc; loc = loc->next)
-+ {
-+ int pc_match = sal.pc
-+ && (loc->address == sal.pc)
-+ && (!section_is_overlay (loc->section)
-+ || loc->section == sal.section);
-+ int line_match = ((default_match || (0 == sal.pc))
-+ && b->source_file != NULL
-+ && sal.symtab != NULL
-+ && strcmp (b->source_file, sal.symtab->filename) == 0
-+ && b->line_number == sal.line);
-+ if (pc_match || line_match)
-+ {
-+ match = 1;
-+ break;
-+ }
-+ }
-+ }
-+
-+ if (match)
-+ VEC_safe_push(breakpoint_p, found, b);
-+ }
-+ }
-+ /* Now go thru the 'found' chain and delete them. */
-+ if (VEC_empty(breakpoint_p, found))
-+ {
-+ if (arg)
-+ error (_("No breakpoint at %s."), arg);
-+ else
-+ error (_("No breakpoint at this line."));
-+ }
-+
-+ if (VEC_length(breakpoint_p, found) > 1)
-+ from_tty = 1; /* Always report if deleted more than one */
-+ if (from_tty)
-+ {
-+ if (VEC_length(breakpoint_p, found) == 1)
-+ printf_unfiltered (_("Deleted breakpoint "));
-+ else
-+ printf_unfiltered (_("Deleted breakpoints "));
-+ }
-+ breakpoints_changed ();
-+
-+ for (ix = 0; VEC_iterate(breakpoint_p, found, ix, b); ix++)
-+ {
-+ if (from_tty)
-+ printf_unfiltered ("%d ", b->number);
-+ delete_breakpoint (b);
-+ }
-+ if (from_tty)
-+ putchar_unfiltered ('\n');
-+}
-+
-+/* Delete breakpoint in BS if they are `delete' breakpoints and
-+ all breakpoints that are marked for deletion, whether hit or not.
-+ This is called after any breakpoint is hit, or after errors. */
-+
-+void
-+breakpoint_auto_delete (bpstat bs)
-+{
-+ struct breakpoint *b, *temp;
-+
-+ for (; bs; bs = bs->next)
-+ if (bs->breakpoint_at && bs->breakpoint_at->owner->disposition == disp_del
-+ && bs->stop)
-+ delete_breakpoint (bs->breakpoint_at->owner);
-+
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ {
-+ if (b->disposition == disp_del_at_next_stop)
-+ delete_breakpoint (b);
-+ }
-+}
-+
-+/* Remove locations of breakpoint BPT from
-+ the global list of breakpoint locations. */
-+
-+static void
-+unlink_locations_from_global_list (struct breakpoint *bpt)
-+{
-+ /* This code assumes that the locations
-+ of a breakpoint are found in the global list
-+ in the same order, but not necessary adjacent. */
-+ struct bp_location **tmp = &bp_location_chain;
-+ struct bp_location *here = bpt->loc;
-+
-+ if (here == NULL)
-+ return;
-+
-+ for (; *tmp && here;)
-+ {
-+ if (*tmp == here)
-+ {
-+ *tmp = here->global_next;
-+ here = here->next;
-+ }
-+ else
-+ {
-+ tmp = &((*tmp)->global_next);
-+ }
-+ }
-+}
-+
-+/* Delete a breakpoint and clean up all traces of it in the data
-+ structures. */
-+
-+void
-+delete_breakpoint (struct breakpoint *bpt)
-+{
-+ struct breakpoint *b;
-+ bpstat bs;
-+ struct bp_location *loc;
-+
-+ 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.
-+
-+ One example of this happening is a watchpoint's scope bp. When the
-+ scope bp triggers, we notice that the watchpoint is out of scope, and
-+ delete it. We also delete its scope bp. But the scope bp is marked
-+ "auto-deleting", and is already on a bpstat. That bpstat is then
-+ checked for auto-deleting bp's, which are deleted.
-+
-+ 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. */
-+ if (bpt->type == bp_none)
-+ return;
-+
-+ if (deprecated_delete_breakpoint_hook)
-+ deprecated_delete_breakpoint_hook (bpt);
-+ breakpoint_delete_event (bpt->number);
-+
-+ for (loc = bpt->loc; loc; loc = loc->next)
-+ {
-+ if (loc->inserted)
-+ remove_breakpoint (loc, mark_inserted);
-+
-+ if (loc->cond)
-+ xfree (loc->cond);
-+
-+ if (loc->function_name)
-+ xfree (loc->function_name);
-+ }
-+
-+ if (breakpoint_chain == bpt)
-+ breakpoint_chain = bpt->next;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->next == bpt)
-+ {
-+ b->next = bpt->next;
-+ break;
-+ }
-+
-+ unlink_locations_from_global_list (bpt);
-+
-+ check_duplicates (bpt);
-+
-+ if (bpt->type != bp_hardware_watchpoint
-+ && bpt->type != bp_read_watchpoint
-+ && bpt->type != bp_access_watchpoint
-+ && bpt->type != bp_catch_fork
-+ && bpt->type != bp_catch_vfork
-+ && bpt->type != bp_catch_exec)
-+ for (loc = bpt->loc; loc; loc = loc->next)
-+ {
-+ /* If this breakpoint location was inserted, and there is
-+ another breakpoint at the same address, we need to
-+ insert the other breakpoint. */
-+ if (loc->inserted)
-+ {
-+ struct bp_location *loc2;
-+ ALL_BP_LOCATIONS (loc2)
-+ if (loc2->address == loc->address
-+ && loc2->section == loc->section
-+ && !loc->duplicate
-+ && loc2->owner->enable_state != bp_disabled
-+ && loc2->enabled
-+ && !loc2->shlib_disabled
-+ && loc2->owner->enable_state != bp_call_disabled)
-+ {
-+ int val;
-+
-+ /* We should never reach this point if there is a permanent
-+ breakpoint at the same address as the one being deleted.
-+ If there is a permanent breakpoint somewhere, it should
-+ always be the only one inserted. */
-+ if (loc2->owner->enable_state == bp_permanent)
-+ internal_error (__FILE__, __LINE__,
-+ _("another breakpoint was inserted on top of "
-+ "a permanent breakpoint"));
-+
-+ memset (&loc2->target_info, 0, sizeof (loc2->target_info));
-+ loc2->target_info.placed_address = loc2->address;
-+ if (b->type == bp_hardware_breakpoint)
-+ val = target_insert_hw_breakpoint (&loc2->target_info);
-+ else
-+ val = target_insert_breakpoint (&loc2->target_info);
-+
-+ /* If there was an error in the insert, print a message, then stop execution. */
-+ if (val != 0)
-+ {
-+ struct ui_file *tmp_error_stream = mem_fileopen ();
-+ make_cleanup_ui_file_delete (tmp_error_stream);
-+
-+
-+ if (b->type == bp_hardware_breakpoint)
-+ {
-+ fprintf_unfiltered (tmp_error_stream,
-+ "Cannot insert hardware breakpoint %d.\n"
-+ "You may have requested too many hardware breakpoints.\n",
-+ b->number);
-+ }
-+ else
-+ {
-+ fprintf_unfiltered (tmp_error_stream, "Cannot insert breakpoint %d.\n", b->number);
-+ fprintf_filtered (tmp_error_stream, "Error accessing memory address ");
-+ fputs_filtered (paddress (loc2->address),
-+ tmp_error_stream);
-+ fprintf_filtered (tmp_error_stream, ": %s.\n",
-+ safe_strerror (val));
-+ }
-+
-+ fprintf_unfiltered (tmp_error_stream,"The same program may be running in another process.");
-+ target_terminal_ours_for_output ();
-+ error_stream(tmp_error_stream);
-+ }
-+ else
-+ loc2->inserted = 1;
-+ }
-+ }
-+ }
-+
-+ free_command_lines (&bpt->commands);
-+ if (bpt->cond_string != NULL)
-+ xfree (bpt->cond_string);
-+ if (bpt->addr_string != NULL)
-+ xfree (bpt->addr_string);
-+ if (bpt->exp != NULL)
-+ xfree (bpt->exp);
-+ if (bpt->exp_string != NULL)
-+ xfree (bpt->exp_string);
-+ if (bpt->val != NULL)
-+ value_free (bpt->val);
-+ if (bpt->source_file != NULL)
-+ xfree (bpt->source_file);
-+ if (bpt->dll_pathname != NULL)
-+ xfree (bpt->dll_pathname);
-+ if (bpt->triggered_dll_pathname != NULL)
-+ xfree (bpt->triggered_dll_pathname);
-+ if (bpt->exec_pathname != NULL)
-+ xfree (bpt->exec_pathname);
-+
-+ /* Be sure no bpstat's are pointing at it after it's been freed. */
-+ /* FIXME, how can we find all bpstat's?
-+ We just check stop_bpstat for now. Note that we cannot just
-+ remove bpstats pointing at bpt from the stop_bpstat list
-+ entirely, as breakpoint commands are associated with the bpstat;
-+ if we remove it here, then the later call to
-+ bpstat_do_actions (&stop_bpstat);
-+ in event-top.c won't do anything, and temporary breakpoints
-+ with commands won't work. */
-+ for (bs = stop_bpstat; bs; bs = bs->next)
-+ if (bs->breakpoint_at && bs->breakpoint_at->owner == bpt)
-+ {
-+ bs->breakpoint_at = NULL;
-+ bs->old_val = NULL;
-+ /* bs->commands will be freed later. */
-+ }
-+ /* On the chance that someone will soon try again to delete this same
-+ bp, we mark it as deleted before freeing its storage. */
-+ bpt->type = bp_none;
-+
-+ for (loc = bpt->loc; loc;)
-+ {
-+ struct bp_location *loc_next = loc->next;
-+ xfree (loc);
-+ loc = loc_next;
-+ }
-+ xfree (bpt);
-+}
-+
-+static void
-+do_delete_breakpoint_cleanup (void *b)
-+{
-+ delete_breakpoint (b);
-+}
-+
-+struct cleanup *
-+make_cleanup_delete_breakpoint (struct breakpoint *b)
-+{
-+ return make_cleanup (do_delete_breakpoint_cleanup, b);
-+}
-+
-+struct cleanup *
-+make_exec_cleanup_delete_breakpoint (struct breakpoint *b)
-+{
-+ return make_exec_cleanup (do_delete_breakpoint_cleanup, b);
-+}
-+
-+void
-+delete_command (char *arg, int from_tty)
-+{
-+ struct breakpoint *b, *temp;
-+
-+ dont_repeat ();
-+
-+ if (arg == 0)
-+ {
-+ int breaks_to_delete = 0;
-+
-+ /* Delete all breakpoints if no argument.
-+ Do not delete internal or call-dummy breakpoints, these
-+ have to be deleted with an explicit breakpoint number argument. */
-+ ALL_BREAKPOINTS (b)
-+ {
-+ if (b->type != bp_call_dummy &&
-+ b->type != bp_shlib_event &&
-+ b->type != bp_thread_event &&
-+ b->type != bp_overlay_event &&
-+ b->number >= 0)
-+ {
-+ breaks_to_delete = 1;
-+ break;
-+ }
-+ }
-+
-+ /* Ask user only if there are some breakpoints to delete. */
-+ if (!from_tty
-+ || (breaks_to_delete && query (_("Delete all breakpoints? "))))
-+ {
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ {
-+ if (b->type != bp_call_dummy &&
-+ b->type != bp_shlib_event &&
-+ b->type != bp_thread_event &&
-+ b->type != bp_overlay_event &&
-+ b->number >= 0)
-+ delete_breakpoint (b);
-+ }
-+ }
-+ }
-+ else
-+ map_breakpoint_numbers (arg, delete_breakpoint);
-+}
-+
-+static int
-+all_locations_are_pending (struct bp_location *loc)
-+{
-+ for (; loc; loc = loc->next)
-+ if (!loc->shlib_disabled)
-+ return 0;
-+ return 1;
-+}
-+
-+/* Subroutine of update_breakpoint_locations to simplify it.
-+ Return non-zero if multiple fns in list LOC have the same name.
-+ Null names are ignored. */
-+
-+static int
-+ambiguous_names_p (struct bp_location *loc)
-+{
-+ struct bp_location *l;
-+ htab_t htab = htab_create_alloc (13, htab_hash_string,
-+ (int (*) (const void *, const void *)) streq,
-+ NULL, xcalloc, xfree);
-+
-+ for (l = loc; l != NULL; l = l->next)
-+ {
-+ const char **slot;
-+ const char *name = l->function_name;
-+
-+ /* Allow for some names to be NULL, ignore them. */
-+ if (name == NULL)
-+ continue;
-+
-+ slot = (const char **) htab_find_slot (htab, (const void *) name,
-+ INSERT);
-+ /* NOTE: We can assume slot != NULL here because xcalloc never returns
-+ NULL. */
-+ if (*slot != NULL)
-+ {
-+ htab_delete (htab);
-+ return 1;
-+ }
-+ *slot = name;
-+ }
-+
-+ htab_delete (htab);
-+ return 0;
-+}
-+
-+static void
-+update_breakpoint_locations (struct breakpoint *b,
-+ struct symtabs_and_lines sals)
-+{
-+ int i;
-+ char *s;
-+ struct bp_location *existing_locations = b->loc;
-+
-+ /* If there's no new locations, and all existing locations
-+ are pending, don't do anything. This optimizes
-+ the common case where all locations are in the same
-+ shared library, that was unloaded. We'd like to
-+ retain the location, so that when the library
-+ is loaded again, we don't loose the enabled/disabled
-+ status of the individual locations. */
-+ if (all_locations_are_pending (existing_locations) && sals.nelts == 0)
-+ return;
-+
-+ unlink_locations_from_global_list (b);
-+ b->loc = NULL;
-+
-+ for (i = 0; i < sals.nelts; ++i)
-+ {
-+ struct bp_location *new_loc =
-+ add_location_to_breakpoint (b, b->type, &(sals.sals[i]));
-+
-+ /* Reparse conditions, they might contain references to the
-+ old symtab. */
-+ if (b->cond_string != NULL)
-+ {
-+ struct gdb_exception e;
-+
-+ s = b->cond_string;
-+ TRY_CATCH (e, RETURN_MASK_ERROR)
-+ {
-+ new_loc->cond = parse_exp_1 (&s, block_for_pc (sals.sals[i].pc),
-+ 0);
-+ }
-+ if (e.reason < 0)
-+ {
-+ warning (_("failed to reevaluate condition for breakpoint %d: %s"),
-+ b->number, e.message);
-+ new_loc->enabled = 0;
-+ }
-+ }
-+
-+ if (b->source_file != NULL)
-+ xfree (b->source_file);
-+ if (sals.sals[i].symtab == NULL)
-+ b->source_file = NULL;
-+ else
-+ b->source_file =
-+ savestring (sals.sals[i].symtab->filename,
-+ strlen (sals.sals[i].symtab->filename));
-+
-+ if (b->line_number == 0)
-+ b->line_number = sals.sals[i].line;
-+ }
-+
-+ /* If possible, carry over 'disable' status from existing breakpoints. */
-+ {
-+ struct bp_location *e = existing_locations;
-+ /* If there are multiple breakpoints with the same function name,
-+ e.g. for inline functions, comparing function names won't work.
-+ Instead compare pc addresses; this is just a heuristic as things
-+ may have moved, but in practice it gives the correct answer
-+ often enough until a better solution is found. */
-+ int have_ambiguous_names = ambiguous_names_p (b->loc);
-+
-+ for (; e; e = e->next)
-+ {
-+ if (!e->enabled && e->function_name)
-+ {
-+ struct bp_location *l = b->loc;
-+ if (have_ambiguous_names)
-+ {
-+ for (; l; l = l->next)
-+ if (e->address == l->address)
-+ {
-+ l->enabled = 0;
-+ break;
-+ }
-+ }
-+ else
-+ {
-+ for (; l; l = l->next)
-+ if (l->function_name
-+ && strcmp (e->function_name, l->function_name) == 0)
-+ {
-+ l->enabled = 0;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+ }
-+
-+ while (existing_locations)
-+ {
-+ struct bp_location *next = existing_locations->next;
-+ free_bp_location (existing_locations);
-+ existing_locations = next;
-+ }
-+}
-+
-+
-+/* Reset a breakpoint given it's struct breakpoint * BINT.
-+ The value we return ends up being the return value from catch_errors.
-+ Unused in this case. */
-+
-+static int
-+breakpoint_re_set_one (void *bint)
-+{
-+ /* get past catch_errs */
-+ struct breakpoint *b = (struct breakpoint *) bint;
-+ struct value *mark;
-+ int i;
-+ int not_found = 0;
-+ int *not_found_ptr = &not_found;
-+ struct symtabs_and_lines sals = {};
-+ struct symtabs_and_lines expanded;
-+ char *s;
-+ enum enable_state save_enable;
-+ struct gdb_exception e;
-+
-+
-+ switch (b->type)
-+ {
-+ case bp_none:
-+ warning (_("attempted to reset apparently deleted breakpoint #%d?"),
-+ b->number);
-+ return 0;
-+ case bp_breakpoint:
-+ case bp_hardware_breakpoint:
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ if (b->addr_string == NULL)
-+ {
-+ /* Anything without a string can't be re-set. */
-+ delete_breakpoint (b);
-+ return 0;
-+ }
-+
-+ set_language (b->language);
-+ input_radix = b->input_radix;
-+ s = b->addr_string;
-+ TRY_CATCH (e, RETURN_MASK_ERROR)
-+ {
-+ sals = decode_line_1 (&s, 1, (struct symtab *) NULL, 0, (char ***) NULL,
-+ not_found_ptr);
-+ }
-+ if (e.reason < 0)
-+ {
-+ int not_found_and_ok = 0;
-+ /* For pending breakpoints, it's expected that parsing
-+ will fail until the right shared library is loaded.
-+ User has already told to create pending breakpoints and
-+ don't need extra messages. If breakpoint is in bp_shlib_disabled
-+ state, then user already saw the message about that breakpoint
-+ being disabled, and don't want to see more errors. */
-+ if (not_found
-+ && (b->condition_not_parsed
-+ || (b->loc && b->loc->shlib_disabled)
-+ || b->enable_state == bp_disabled))
-+ not_found_and_ok = 1;
-+
-+ if (!not_found_and_ok)
-+ {
-+ /* We surely don't want to warn about the same breakpoint
-+ 10 times. One solution, implemented here, is disable
-+ the breakpoint on error. Another solution would be to
-+ have separate 'warning emitted' flag. Since this
-+ happens only when a binary has changed, I don't know
-+ which approach is better. */
-+ b->enable_state = bp_disabled;
-+ throw_exception (e);
-+ }
-+ }
-+
-+ if (not_found)
-+ break;
-+
-+ gdb_assert (sals.nelts == 1);
-+ resolve_sal_pc (&sals.sals[0]);
-+ if (b->condition_not_parsed && s && s[0])
-+ {
-+ char *cond_string = 0;
-+ int thread = -1;
-+ find_condition_and_thread (s, sals.sals[0].pc,
-+ &cond_string, &thread);
-+ if (cond_string)
-+ b->cond_string = cond_string;
-+ b->thread = thread;
-+ b->condition_not_parsed = 0;
-+ }
-+ expanded = expand_line_sal_maybe (sals.sals[0]);
-+ update_breakpoint_locations (b, expanded);
-+
-+ /* Now that this is re-enabled, check_duplicates
-+ can be used. */
-+ check_duplicates (b);
-+
-+ xfree (sals.sals);
-+ break;
-+
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ /* Watchpoint can be either on expression using entirely global variables,
-+ or it can be on local variables.
-+
-+ Watchpoints of the first kind are never auto-deleted, and even persist
-+ across program restarts. Since they can use variables from shared
-+ libraries, we need to reparse expression as libraries are loaded
-+ and unloaded.
-+
-+ Watchpoints on local variables can also change meaning as result
-+ of solib event. For example, if a watchpoint uses both a local and
-+ a global variables in expression, it's a local watchpoint, but
-+ unloading of a shared library will make the expression invalid.
-+ This is not a very common use case, but we still re-evaluate
-+ expression, to avoid surprises to the user.
-+
-+ Note that for local watchpoints, we re-evaluate it only if
-+ watchpoints frame id is still valid. If it's not, it means
-+ the watchpoint is out of scope and will be deleted soon. In fact,
-+ I'm not sure we'll ever be called in this case.
-+
-+ If a local watchpoint's frame id is still valid, then
-+ b->exp_valid_block is likewise valid, and we can safely use it.
-+
-+ Don't do anything about disabled watchpoints, since they will
-+ be reevaluated again when enabled. */
-+ update_watchpoint (b, 1 /* reparse */);
-+ break;
-+ /* We needn't really do anything to reset these, since the mask
-+ that requests them is unaffected by e.g., new libraries being
-+ loaded. */
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ case bp_catch_exec:
-+ break;
-+
-+ default:
-+ 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. */
-+ case bp_longjmp:
-+ case bp_longjmp_resume:
-+ case bp_overlay_event:
-+ delete_breakpoint (b);
-+ break;
-+
-+ /* This breakpoint is special, it's set up when the inferior
-+ starts and we really don't want to touch it. */
-+ case bp_shlib_event:
-+
-+ /* Like bp_shlib_event, this breakpoint type is special.
-+ Once it is set up, we do not want to touch it. */
-+ case bp_thread_event:
-+
-+ /* Keep temporary breakpoints, which can be encountered when we step
-+ over a dlopen call and SOLIB_ADD is resetting the breakpoints.
-+ Otherwise these should have been blown away via the cleanup chain
-+ or by breakpoint_init_inferior when we rerun the executable. */
-+ case bp_until:
-+ case bp_finish:
-+ case bp_watchpoint_scope:
-+ case bp_call_dummy:
-+ case bp_step_resume:
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+/* Re-set all breakpoints after symbols have been re-loaded. */
-+void
-+breakpoint_re_set (void)
-+{
-+ struct breakpoint *b, *temp;
-+ enum language save_language;
-+ int save_input_radix;
-+
-+ save_language = current_language->la_language;
-+ save_input_radix = input_radix;
-+ ALL_BREAKPOINTS_SAFE (b, temp)
-+ {
-+ /* Format possible error msg */
-+ char *message = xstrprintf ("Error in re-setting breakpoint %d: ",
-+ b->number);
-+ struct cleanup *cleanups = make_cleanup (xfree, message);
-+ catch_errors (breakpoint_re_set_one, b, message, RETURN_MASK_ALL);
-+ do_cleanups (cleanups);
-+ }
-+ set_language (save_language);
-+ input_radix = save_input_radix;
-+
-+ if (gdbarch_get_longjmp_target_p (current_gdbarch))
-+ {
-+ create_longjmp_breakpoint ("longjmp");
-+ create_longjmp_breakpoint ("_longjmp");
-+ create_longjmp_breakpoint ("siglongjmp");
-+ create_longjmp_breakpoint ("_siglongjmp");
-+ create_longjmp_breakpoint (NULL);
-+ }
-+
-+ create_overlay_event_breakpoint ("_ovly_debug_event");
-+}
-+
-+/* Reset the thread number of this breakpoint:
-+
-+ - If the breakpoint is for all threads, leave it as-is.
-+ - Else, reset it to the current thread for inferior_ptid. */
-+void
-+breakpoint_re_set_thread (struct breakpoint *b)
-+{
-+ if (b->thread != -1)
-+ {
-+ if (in_thread_list (inferior_ptid))
-+ b->thread = pid_to_thread_id (inferior_ptid);
-+ }
-+}
-+
-+/* Set ignore-count of breakpoint number BPTNUM to COUNT.
-+ If from_tty is nonzero, it prints a message to that effect,
-+ which ends with a period (no newline). */
-+
-+void
-+set_ignore_count (int bptnum, int count, int from_tty)
-+{
-+ struct breakpoint *b;
-+
-+ if (count < 0)
-+ count = 0;
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->number == bptnum)
-+ {
-+ b->ignore_count = count;
-+ if (from_tty)
-+ {
-+ if (count == 0)
-+ printf_filtered (_("Will stop next time breakpoint %d is reached."),
-+ bptnum);
-+ else if (count == 1)
-+ printf_filtered (_("Will ignore next crossing of breakpoint %d."),
-+ bptnum);
-+ else
-+ printf_filtered (_("Will ignore next %d crossings of breakpoint %d."),
-+ count, bptnum);
-+ }
-+ breakpoints_changed ();
-+ breakpoint_modify_event (b->number);
-+ return;
-+ }
-+
-+ error (_("No breakpoint number %d."), bptnum);
-+}
-+
-+/* Clear the ignore counts of all breakpoints. */
-+void
-+breakpoint_clear_ignore_counts (void)
-+{
-+ struct breakpoint *b;
-+
-+ ALL_BREAKPOINTS (b)
-+ b->ignore_count = 0;
-+}
-+
-+/* Command to set ignore-count of breakpoint N to COUNT. */
-+
-+static void
-+ignore_command (char *args, int from_tty)
-+{
-+ char *p = args;
-+ int num;
-+
-+ if (p == 0)
-+ error_no_arg (_("a breakpoint number"));
-+
-+ num = get_number (&p);
-+ if (num == 0)
-+ error (_("bad breakpoint number: '%s'"), args);
-+ if (*p == 0)
-+ error (_("Second argument (specified ignore-count) is missing."));
-+
-+ set_ignore_count (num,
-+ longest_to_int (value_as_long (parse_and_eval (p))),
-+ from_tty);
-+ if (from_tty)
-+ printf_filtered ("\n");
-+}
-+
-+/* Call FUNCTION on each of the breakpoints
-+ whose numbers are given in ARGS. */
-+
-+static void
-+map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *))
-+{
-+ char *p = args;
-+ char *p1;
-+ int num;
-+ struct breakpoint *b, *tmp;
-+ int match;
-+
-+ if (p == 0)
-+ error_no_arg (_("one or more breakpoint numbers"));
-+
-+ while (*p)
-+ {
-+ match = 0;
-+ p1 = p;
-+
-+ num = get_number_or_range (&p1);
-+ if (num == 0)
-+ {
-+ warning (_("bad breakpoint number at or near '%s'"), p);
-+ }
-+ else
-+ {
-+ ALL_BREAKPOINTS_SAFE (b, tmp)
-+ if (b->number == num)
-+ {
-+ struct breakpoint *related_breakpoint = b->related_breakpoint;
-+ match = 1;
-+ function (b);
-+ if (related_breakpoint)
-+ function (related_breakpoint);
-+ break;
-+ }
-+ if (match == 0)
-+ printf_unfiltered (_("No breakpoint number %d.\n"), num);
-+ }
-+ p = p1;
-+ }
-+}
-+
-+static struct bp_location *
-+find_location_by_number (char *number)
-+{
-+ char *dot = strchr (number, '.');
-+ char *p1;
-+ int bp_num;
-+ int loc_num;
-+ struct breakpoint *b;
-+ struct bp_location *loc;
-+
-+ *dot = '\0';
-+
-+ p1 = number;
-+ bp_num = get_number_or_range (&p1);
-+ if (bp_num == 0)
-+ error (_("Bad breakpoint number '%s'"), number);
-+
-+ ALL_BREAKPOINTS (b)
-+ if (b->number == bp_num)
-+ {
-+ break;
-+ }
-+
-+ if (!b || b->number != bp_num)
-+ error (_("Bad breakpoint number '%s'"), number);
-+
-+ p1 = dot+1;
-+ loc_num = get_number_or_range (&p1);
-+ if (loc_num == 0)
-+ error (_("Bad breakpoint location number '%s'"), number);
-+
-+ --loc_num;
-+ loc = b->loc;
-+ for (;loc_num && loc; --loc_num, loc = loc->next)
-+ ;
-+ if (!loc)
-+ error (_("Bad breakpoint location number '%s'"), dot+1);
-+
-+ return loc;
-+}
-+
-+
-+/* Set ignore-count of breakpoint number BPTNUM to COUNT.
-+ If from_tty is nonzero, it prints a message to that effect,
-+ which ends with a period (no newline). */
-+
-+void
-+disable_breakpoint (struct breakpoint *bpt)
-+{
-+ /* Never disable a watchpoint scope breakpoint; we want to
-+ hit them when we leave scope so we can delete both the
-+ watchpoint and its scope breakpoint at that time. */
-+ if (bpt->type == bp_watchpoint_scope)
-+ return;
-+
-+ /* You can't disable permanent breakpoints. */
-+ if (bpt->enable_state == bp_permanent)
-+ return;
-+
-+ bpt->enable_state = bp_disabled;
-+
-+ check_duplicates (bpt);
-+
-+ if (deprecated_modify_breakpoint_hook)
-+ deprecated_modify_breakpoint_hook (bpt);
-+ breakpoint_modify_event (bpt->number);
-+}
-+
-+static void
-+disable_command (char *args, int from_tty)
-+{
-+ struct breakpoint *bpt;
-+ if (args == 0)
-+ ALL_BREAKPOINTS (bpt)
-+ switch (bpt->type)
-+ {
-+ case bp_none:
-+ warning (_("attempted to disable apparently deleted breakpoint #%d?"),
-+ bpt->number);
-+ continue;
-+ case bp_breakpoint:
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ case bp_catch_exec:
-+ case bp_hardware_breakpoint:
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ disable_breakpoint (bpt);
-+ default:
-+ continue;
-+ }
-+ else if (strchr (args, '.'))
-+ {
-+ struct bp_location *loc = find_location_by_number (args);
-+ if (loc)
-+ loc->enabled = 0;
-+ check_duplicates (loc->owner);
-+ }
-+ else
-+ map_breakpoint_numbers (args, disable_breakpoint);
-+}
-+
-+static void
-+do_enable_breakpoint (struct breakpoint *bpt, enum bpdisp disposition)
-+{
-+ int target_resources_ok, other_type_used;
-+ struct value *mark;
-+
-+ if (bpt->type == bp_hardware_breakpoint)
-+ {
-+ int i;
-+ i = hw_breakpoint_used_count ();
-+ target_resources_ok =
-+ TARGET_CAN_USE_HARDWARE_WATCHPOINT (bp_hardware_breakpoint,
-+ i + 1, 0);
-+ if (target_resources_ok == 0)
-+ error (_("No hardware breakpoint support in the target."));
-+ else if (target_resources_ok < 0)
-+ error (_("Hardware breakpoints used exceeds limit."));
-+ }
-+
-+ if (bpt->type == bp_watchpoint ||
-+ bpt->type == bp_hardware_watchpoint ||
-+ 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 (_("\
-+Cannot enable watchpoint %d because the block in which its expression\n\
-+is valid is not currently in scope.\n"), bpt->number);
-+ return;
-+ }
-+ select_frame (fr);
-+ }
-+
-+ if (bpt->val)
-+ value_free (bpt->val);
-+ mark = value_mark ();
-+ bpt->val = evaluate_expression (bpt->exp);
-+ release_value (bpt->val);
-+ if (value_lazy (bpt->val))
-+ value_fetch_lazy (bpt->val);
-+
-+ if (bpt->type == bp_hardware_watchpoint ||
-+ bpt->type == bp_read_watchpoint ||
-+ bpt->type == bp_access_watchpoint)
-+ {
-+ int i = hw_watchpoint_used_count (bpt->type, &other_type_used);
-+ int mem_cnt = can_use_hardware_watchpoint (bpt->val);
-+
-+ /* Hack around 'unused var' error for some targets here */
-+ (void) mem_cnt, (void) i;
-+ target_resources_ok = TARGET_CAN_USE_HARDWARE_WATCHPOINT (
-+ bpt->type, i + mem_cnt, other_type_used);
-+ /* we can consider of type is bp_hardware_watchpoint, convert to
-+ bp_watchpoint in the following condition */
-+ if (target_resources_ok < 0)
-+ {
-+ printf_filtered (_("\
-+Cannot enable watchpoint %d because target watch resources\n\
-+have been allocated for other watchpoints.\n"), bpt->number);
-+ value_free_to_mark (mark);
-+ return;
-+ }
-+ }
-+
-+ select_frame (frame_find_by_id (saved_frame_id));
-+ value_free_to_mark (mark);
-+ }
-+
-+ if (bpt->enable_state != bp_permanent)
-+ bpt->enable_state = bp_enabled;
-+ bpt->disposition = disposition;
-+ check_duplicates (bpt);
-+ breakpoints_changed ();
-+
-+ if (deprecated_modify_breakpoint_hook)
-+ deprecated_modify_breakpoint_hook (bpt);
-+ breakpoint_modify_event (bpt->number);
-+}
-+
-+
-+void
-+enable_breakpoint (struct breakpoint *bpt)
-+{
-+ do_enable_breakpoint (bpt, bpt->disposition);
-+}
-+
-+/* 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. */
-+
-+static void
-+enable_command (char *args, int from_tty)
-+{
-+ struct breakpoint *bpt;
-+ if (args == 0)
-+ ALL_BREAKPOINTS (bpt)
-+ switch (bpt->type)
-+ {
-+ case bp_none:
-+ warning (_("attempted to enable apparently deleted breakpoint #%d?"),
-+ bpt->number);
-+ continue;
-+ case bp_breakpoint:
-+ case bp_catch_load:
-+ case bp_catch_unload:
-+ case bp_catch_fork:
-+ case bp_catch_vfork:
-+ case bp_catch_exec:
-+ case bp_hardware_breakpoint:
-+ case bp_watchpoint:
-+ case bp_hardware_watchpoint:
-+ case bp_read_watchpoint:
-+ case bp_access_watchpoint:
-+ enable_breakpoint (bpt);
-+ default:
-+ continue;
-+ }
-+ else if (strchr (args, '.'))
-+ {
-+ struct bp_location *loc = find_location_by_number (args);
-+ if (loc)
-+ loc->enabled = 1;
-+ check_duplicates (loc->owner);
-+ }
-+ else
-+ map_breakpoint_numbers (args, enable_breakpoint);
-+}
-+
-+static void
-+enable_once_breakpoint (struct breakpoint *bpt)
-+{
-+ do_enable_breakpoint (bpt, disp_disable);
-+}
-+
-+static void
-+enable_once_command (char *args, int from_tty)
-+{
-+ map_breakpoint_numbers (args, enable_once_breakpoint);
-+}
-+
-+static void
-+enable_delete_breakpoint (struct breakpoint *bpt)
-+{
-+ do_enable_breakpoint (bpt, disp_del);
-+}
-+
-+static void
-+enable_delete_command (char *args, int from_tty)
-+{
-+ map_breakpoint_numbers (args, enable_delete_breakpoint);
-+}
-+
-+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
-+decode_line_spec_1 (char *string, int funfirstline)
-+{
-+ struct symtabs_and_lines sals;
-+ if (string == 0)
-+ error (_("Empty line specification."));
-+ if (default_breakpoint_valid)
-+ sals = decode_line_1 (&string, funfirstline,
-+ default_breakpoint_symtab,
-+ default_breakpoint_line,
-+ (char ***) NULL, NULL);
-+ else
-+ sals = decode_line_1 (&string, funfirstline,
-+ (struct symtab *) NULL, 0, (char ***) NULL, NULL);
-+ if (*string)
-+ error (_("Junk at end of line specification: %s"), string);
-+ return sals;
-+}
-+
-+/* Create and insert a raw software breakpoint at PC. Return an
-+ identifier, which should be used to remove the breakpoint later.
-+ In general, places which call this should be using something on the
-+ breakpoint chain instead; this function should be eliminated
-+ someday. */
-+
-+void *
-+deprecated_insert_raw_breakpoint (CORE_ADDR pc)
-+{
-+ struct bp_target_info *bp_tgt;
-+
-+ bp_tgt = xmalloc (sizeof (struct bp_target_info));
-+ memset (bp_tgt, 0, sizeof (struct bp_target_info));
-+
-+ bp_tgt->placed_address = pc;
-+ if (target_insert_breakpoint (bp_tgt) != 0)
-+ {
-+ /* Could not insert the breakpoint. */
-+ xfree (bp_tgt);
-+ return NULL;
-+ }
-+
-+ return bp_tgt;
-+}
-+
-+/* Remove a breakpoint BP inserted by deprecated_insert_raw_breakpoint. */
-+
-+int
-+deprecated_remove_raw_breakpoint (void *bp)
-+{
-+ struct bp_target_info *bp_tgt = bp;
-+ int ret;
-+
-+ ret = target_remove_breakpoint (bp_tgt);
-+ xfree (bp_tgt);
-+
-+ return ret;
-+}
-+
-+/* One (or perhaps two) breakpoints used for software single stepping. */
-+
-+static void *single_step_breakpoints[2];
-+
-+/* Create and insert a breakpoint for software single step. */
-+
-+void
-+insert_single_step_breakpoint (CORE_ADDR next_pc)
-+{
-+ void **bpt_p;
-+
-+ if (single_step_breakpoints[0] == NULL)
-+ bpt_p = &single_step_breakpoints[0];
-+ else
-+ {
-+ gdb_assert (single_step_breakpoints[1] == NULL);
-+ bpt_p = &single_step_breakpoints[1];
-+ }
-+
-+ /* NOTE drow/2006-04-11: A future improvement to this function would be
-+ to only create the breakpoints once, and actually put them on the
-+ breakpoint chain. That would let us use set_raw_breakpoint. We could
-+ adjust the addresses each time they were needed. Doing this requires
-+ corresponding changes elsewhere where single step breakpoints are
-+ handled, however. So, for now, we use this. */
-+
-+ *bpt_p = deprecated_insert_raw_breakpoint (next_pc);
-+ if (*bpt_p == NULL)
-+ error (_("Could not insert single-step breakpoint at 0x%s"),
-+ paddr_nz (next_pc));
-+}
-+
-+/* Remove and delete any breakpoints used for software single step. */
-+
-+void
-+remove_single_step_breakpoints (void)
-+{
-+ gdb_assert (single_step_breakpoints[0] != NULL);
-+
-+ /* See insert_single_step_breakpoint for more about this deprecated
-+ call. */
-+ deprecated_remove_raw_breakpoint (single_step_breakpoints[0]);
-+ single_step_breakpoints[0] = NULL;
-+
-+ if (single_step_breakpoints[1] != NULL)
-+ {
-+ deprecated_remove_raw_breakpoint (single_step_breakpoints[1]);
-+ single_step_breakpoints[1] = NULL;
-+ }
-+}
-+
-+/* Check whether a software single-step breakpoint is inserted at PC. */
-+
-+static int
-+single_step_breakpoint_inserted_here_p (CORE_ADDR pc)
-+{
-+ int i;
-+
-+ for (i = 0; i < 2; i++)
-+ {
-+ struct bp_target_info *bp_tgt = single_step_breakpoints[i];
-+ if (bp_tgt && bp_tgt->placed_address == pc)
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/* This help string is used for the break, hbreak, tbreak and thbreak commands.
-+ It is defined as a macro to prevent duplication.
-+ COMMAND should be a string constant containing the name of the command. */
-+#define BREAK_ARGS_HELP(command) \
-+command" [LOCATION] [thread THREADNUM] [if CONDITION]\n\
-+LOCATION may be a line number, function name, or \"*\" and an address.\n\
-+If a line number is specified, break at start of code for that line.\n\
-+If a function is specified, break at start of code for that function.\n\
-+If an address is specified, break at that exact address.\n\
-+With no LOCATION, uses current execution address of selected stack frame.\n\
-+This is useful for breaking on return to a stack frame.\n\
-+\n\
-+THREADNUM is the number from \"info threads\".\n\
-+CONDITION is a boolean expression.\n\
-+\n\
-+Multiple breakpoints at one place are permitted, and useful if conditional.\n\
-+\n\
-+Do \"help breakpoints\" for info on other commands dealing with breakpoints."
-+
-+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;
-+
-+ observer_attach_solib_unloaded (disable_breakpoints_in_unloaded_shlib);
-+
-+ breakpoint_chain = 0;
-+ /* Don't bother to call set_breakpoint_count. $bpnum isn't useful
-+ before a breakpoint is set. */
-+ breakpoint_count = 0;
-+
-+ add_com ("ignore", class_breakpoint, ignore_command, _("\
-+Set ignore-count of breakpoint number N to COUNT.\n\
-+Usage is `ignore N COUNT'."));
-+ if (xdb_commands)
-+ add_com_alias ("bc", "ignore", class_breakpoint, 1);
-+
-+ add_com ("commands", class_breakpoint, commands_command, _("\
-+Set commands to be executed when a breakpoint is hit.\n\
-+Give breakpoint number as argument after \"commands\".\n\
-+With no argument, the targeted breakpoint is the last one set.\n\
-+The commands themselves follow starting on the next line.\n\
-+Type a line containing \"end\" to indicate the end of them.\n\
-+Give \"silent\" as the first line to make the breakpoint silent;\n\
-+then no output is printed when it is hit, except what the commands print."));
-+
-+ add_com ("condition", class_breakpoint, condition_command, _("\
-+Specify breakpoint number N to break only if COND is true.\n\
-+Usage is `condition N COND', where N is an integer and COND is an\n\
-+expression to be evaluated whenever breakpoint N is reached."));
-+
-+ c = add_com ("tbreak", class_breakpoint, tbreak_command, _("\
-+Set a temporary breakpoint.\n\
-+Like \"break\" except the breakpoint is only temporary,\n\
-+so it will be deleted when hit. Equivalent to \"break\" followed\n\
-+by using \"enable delete\" on the breakpoint number.\n\
-+\n"
-+BREAK_ARGS_HELP ("tbreak")));
-+ set_cmd_completer (c, location_completer);
-+
-+ c = add_com ("hbreak", class_breakpoint, hbreak_command, _("\
-+Set a hardware assisted breakpoint.\n\
-+Like \"break\" except the breakpoint requires hardware support,\n\
-+some target hardware may not have this support.\n\
-+\n"
-+BREAK_ARGS_HELP ("hbreak")));
-+ set_cmd_completer (c, location_completer);
-+
-+ c = add_com ("thbreak", class_breakpoint, thbreak_command, _("\
-+Set a temporary hardware assisted breakpoint.\n\
-+Like \"hbreak\" except the breakpoint is only temporary,\n\
-+so it will be deleted when hit.\n\
-+\n"
-+BREAK_ARGS_HELP ("thbreak")));
-+ set_cmd_completer (c, location_completer);
-+
-+ add_prefix_cmd ("enable", class_breakpoint, enable_command, _("\
-+Enable some breakpoints.\n\
-+Give breakpoint numbers (separated by spaces) as arguments.\n\
-+With no subcommand, breakpoints are enabled until you command otherwise.\n\
-+This is used to cancel the effect of the \"disable\" command.\n\
-+With a subcommand you can enable temporarily."),
-+ &enablelist, "enable ", 1, &cmdlist);
-+ if (xdb_commands)
-+ add_com ("ab", class_breakpoint, enable_command, _("\
-+Enable some breakpoints.\n\
-+Give breakpoint numbers (separated by spaces) as arguments.\n\
-+With no subcommand, breakpoints are enabled until you command otherwise.\n\
-+This is used to cancel the effect of the \"disable\" command.\n\
-+With a subcommand you can enable temporarily."));
-+
-+ add_com_alias ("en", "enable", class_breakpoint, 1);
-+
-+ add_abbrev_prefix_cmd ("breakpoints", class_breakpoint, enable_command, _("\
-+Enable some breakpoints.\n\
-+Give breakpoint numbers (separated by spaces) as arguments.\n\
-+This is used to cancel the effect of the \"disable\" command.\n\
-+May be abbreviated to simply \"enable\".\n"),
-+ &enablebreaklist, "enable breakpoints ", 1, &enablelist);
-+
-+ add_cmd ("once", no_class, enable_once_command, _("\
-+Enable breakpoints for one hit. Give breakpoint numbers.\n\
-+If a breakpoint is hit while enabled in this fashion, it becomes disabled."),
-+ &enablebreaklist);
-+
-+ add_cmd ("delete", no_class, enable_delete_command, _("\
-+Enable breakpoints and delete when hit. Give breakpoint numbers.\n\
-+If a breakpoint is hit while enabled in this fashion, it is deleted."),
-+ &enablebreaklist);
-+
-+ add_cmd ("delete", no_class, enable_delete_command, _("\
-+Enable breakpoints and delete when hit. Give breakpoint numbers.\n\
-+If a breakpoint is hit while enabled in this fashion, it is deleted."),
-+ &enablelist);
-+
-+ add_cmd ("once", no_class, enable_once_command, _("\
-+Enable breakpoints for one hit. Give breakpoint numbers.\n\
-+If a breakpoint is hit while enabled in this fashion, it becomes disabled."),
-+ &enablelist);
-+
-+ add_prefix_cmd ("disable", class_breakpoint, disable_command, _("\
-+Disable some breakpoints.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To disable all breakpoints, give no argument.\n\
-+A disabled breakpoint is not forgotten, but has no effect until reenabled."),
-+ &disablelist, "disable ", 1, &cmdlist);
-+ add_com_alias ("dis", "disable", class_breakpoint, 1);
-+ add_com_alias ("disa", "disable", class_breakpoint, 1);
-+ if (xdb_commands)
-+ add_com ("sb", class_breakpoint, disable_command, _("\
-+Disable some breakpoints.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To disable all breakpoints, give no argument.\n\
-+A disabled breakpoint is not forgotten, but has no effect until reenabled."));
-+
-+ add_cmd ("breakpoints", class_alias, disable_command, _("\
-+Disable some breakpoints.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To disable all breakpoints, give no argument.\n\
-+A disabled breakpoint is not forgotten, but has no effect until reenabled.\n\
-+This command may be abbreviated \"disable\"."),
-+ &disablelist);
-+
-+ add_prefix_cmd ("delete", class_breakpoint, delete_command, _("\
-+Delete some breakpoints or auto-display expressions.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To delete all breakpoints, give no argument.\n\
-+\n\
-+Also a prefix command for deletion of other GDB objects.\n\
-+The \"unset\" command is also an alias for \"delete\"."),
-+ &deletelist, "delete ", 1, &cmdlist);
-+ add_com_alias ("d", "delete", class_breakpoint, 1);
-+ add_com_alias ("del", "delete", class_breakpoint, 1);
-+ if (xdb_commands)
-+ add_com ("db", class_breakpoint, delete_command, _("\
-+Delete some breakpoints.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To delete all breakpoints, give no argument.\n"));
-+
-+ add_cmd ("breakpoints", class_alias, delete_command, _("\
-+Delete some breakpoints or auto-display expressions.\n\
-+Arguments are breakpoint numbers with spaces in between.\n\
-+To delete all breakpoints, give no argument.\n\
-+This command may be abbreviated \"delete\"."),
-+ &deletelist);
-+
-+ add_com ("clear", class_breakpoint, clear_command, _("\
-+Clear breakpoint at specified line or function.\n\
-+Argument may be line number, function name, or \"*\" and an address.\n\
-+If line number is specified, all breakpoints in that line are cleared.\n\
-+If function is specified, breakpoints at beginning of function are cleared.\n\
-+If an address is specified, breakpoints at that address are cleared.\n\
-+\n\
-+With no argument, clears all breakpoints in the line that the selected frame\n\
-+is executing in.\n\
-+\n\
-+See also the \"delete\" command which clears breakpoints by number."));
-+
-+ c = add_com ("break", class_breakpoint, break_command, _("\
-+Set breakpoint at specified line or function.\n"
-+BREAK_ARGS_HELP ("break")));
-+ set_cmd_completer (c, location_completer);
-+
-+ add_com_alias ("b", "break", class_run, 1);
-+ add_com_alias ("br", "break", class_run, 1);
-+ add_com_alias ("bre", "break", class_run, 1);
-+ add_com_alias ("brea", "break", class_run, 1);
-+
-+ if (xdb_commands)
-+ {
-+ add_com_alias ("ba", "break", class_breakpoint, 1);
-+ add_com_alias ("bu", "ubreak", class_breakpoint, 1);
-+ }
-+
-+ if (dbx_commands)
-+ {
-+ add_abbrev_prefix_cmd ("stop", class_breakpoint, stop_command, _("\
-+Break in function/address or break at a line in the current file."),
-+ &stoplist, "stop ", 1, &cmdlist);
-+ add_cmd ("in", class_breakpoint, stopin_command,
-+ _("Break in function or address."), &stoplist);
-+ add_cmd ("at", class_breakpoint, stopat_command,
-+ _("Break at a line in the current file."), &stoplist);
-+ add_com ("status", class_info, breakpoints_info, _("\
-+Status of user-settable breakpoints, or breakpoint number NUMBER.\n\
-+The \"Type\" column indicates one of:\n\
-+\tbreakpoint - normal breakpoint\n\
-+\twatchpoint - watchpoint\n\
-+The \"Disp\" column contains one of \"keep\", \"del\", or \"dis\" to indicate\n\
-+the disposition of the breakpoint after it gets hit. \"dis\" means that the\n\
-+breakpoint will be disabled. The \"Address\" and \"What\" columns indicate the\n\
-+address and file/line number respectively.\n\
-+\n\
-+Convenience variable \"$_\" and default examine address for \"x\"\n\
-+are set to the address of the last breakpoint listed unless the command\n\
-+is prefixed with \"server \".\n\n\
-+Convenience variable \"$bpnum\" contains the number of the last\n\
-+breakpoint set."));
-+ }
-+
-+ add_info ("breakpoints", breakpoints_info, _("\
-+Status of user-settable breakpoints, or breakpoint number NUMBER.\n\
-+The \"Type\" column indicates one of:\n\
-+\tbreakpoint - normal breakpoint\n\
-+\twatchpoint - watchpoint\n\
-+The \"Disp\" column contains one of \"keep\", \"del\", or \"dis\" to indicate\n\
-+the disposition of the breakpoint after it gets hit. \"dis\" means that the\n\
-+breakpoint will be disabled. The \"Address\" and \"What\" columns indicate the\n\
-+address and file/line number respectively.\n\
-+\n\
-+Convenience variable \"$_\" and default examine address for \"x\"\n\
-+are set to the address of the last breakpoint listed unless the command\n\
-+is prefixed with \"server \".\n\n\
-+Convenience variable \"$bpnum\" contains the number of the last\n\
-+breakpoint set."));
-+
-+ if (xdb_commands)
-+ add_com ("lb", class_breakpoint, breakpoints_info, _("\
-+Status of user-settable breakpoints, or breakpoint number NUMBER.\n\
-+The \"Type\" column indicates one of:\n\
-+\tbreakpoint - normal breakpoint\n\
-+\twatchpoint - watchpoint\n\
-+The \"Disp\" column contains one of \"keep\", \"del\", or \"dis\" to indicate\n\
-+the disposition of the breakpoint after it gets hit. \"dis\" means that the\n\
-+breakpoint will be disabled. The \"Address\" and \"What\" columns indicate the\n\
-+address and file/line number respectively.\n\
-+\n\
-+Convenience variable \"$_\" and default examine address for \"x\"\n\
-+are set to the address of the last breakpoint listed unless the command\n\
-+is prefixed with \"server \".\n\n\
-+Convenience variable \"$bpnum\" contains the number of the last\n\
-+breakpoint set."));
-+
-+ add_cmd ("breakpoints", class_maintenance, maintenance_info_breakpoints, _("\
-+Status of all breakpoints, or breakpoint number NUMBER.\n\
-+The \"Type\" column indicates one of:\n\
-+\tbreakpoint - normal breakpoint\n\
-+\twatchpoint - watchpoint\n\
-+\tlongjmp - internal breakpoint used to step through longjmp()\n\
-+\tlongjmp resume - internal breakpoint at the target of longjmp()\n\
-+\tuntil - internal breakpoint used by the \"until\" command\n\
-+\tfinish - internal breakpoint used by the \"finish\" command\n\
-+The \"Disp\" column contains one of \"keep\", \"del\", or \"dis\" to indicate\n\
-+the disposition of the breakpoint after it gets hit. \"dis\" means that the\n\
-+breakpoint will be disabled. The \"Address\" and \"What\" columns indicate the\n\
-+address and file/line number respectively.\n\
-+\n\
-+Convenience variable \"$_\" and default examine address for \"x\"\n\
-+are set to the address of the last breakpoint listed unless the command\n\
-+is prefixed with \"server \".\n\n\
-+Convenience variable \"$bpnum\" contains the number of the last\n\
-+breakpoint set."),
-+ &maintenanceinfolist);
-+
-+ add_com ("catch", class_breakpoint, catch_command, _("\
-+Set catchpoints to catch events.\n\
-+Raised signals may be caught:\n\
-+\tcatch signal - all signals\n\
-+\tcatch signal <signame> - a particular signal\n\
-+Raised exceptions may be caught:\n\
-+\tcatch throw - all exceptions, when thrown\n\
-+\tcatch throw <exceptname> - a particular exception, when thrown\n\
-+\tcatch catch - all exceptions, when caught\n\
-+\tcatch catch <exceptname> - a particular exception, when caught\n\
-+Thread or process events may be caught:\n\
-+\tcatch thread_start - any threads, just after creation\n\
-+\tcatch thread_exit - any threads, just before expiration\n\
-+\tcatch thread_join - any threads, just after joins\n\
-+Process events may be caught:\n\
-+\tcatch start - any processes, just after creation\n\
-+\tcatch exit - any processes, just before expiration\n\
-+\tcatch fork - calls to fork()\n\
-+\tcatch vfork - calls to vfork()\n\
-+\tcatch exec - calls to exec()\n\
-+Dynamically-linked library events may be caught:\n\
-+\tcatch load - loads of any library\n\
-+\tcatch load <libname> - loads of a particular library\n\
-+\tcatch unload - unloads of any library\n\
-+\tcatch unload <libname> - unloads of a particular library\n\
-+The act of your program's execution stopping may also be caught:\n\
-+\tcatch stop\n\n\
-+C++ exceptions may be caught:\n\
-+\tcatch throw - all exceptions, when thrown\n\
-+\tcatch catch - all exceptions, when caught\n\
-+Ada exceptions may be caught:\n\
-+\tcatch exception - all exceptions, when raised\n\
-+\tcatch exception <name> - a particular exception, when raised\n\
-+\tcatch exception unhandled - all unhandled exceptions, when raised\n\
-+\tcatch assert - all failed assertions, when raised\n\
-+\n\
-+Do \"help set follow-fork-mode\" for info on debugging your program\n\
-+after a fork or vfork is caught.\n\n\
-+Do \"help breakpoints\" for info on other commands dealing with breakpoints."));
-+
-+ add_com ("tcatch", class_breakpoint, tcatch_command, _("\
-+Set temporary catchpoints to catch events.\n\
-+Args like \"catch\" command.\n\
-+Like \"catch\" except the catchpoint is only temporary,\n\
-+so it will be deleted when hit. Equivalent to \"catch\" followed\n\
-+by using \"enable delete\" on the catchpoint number."));
-+
-+ c = add_com ("watch", class_breakpoint, watch_command, _("\
-+Set a watchpoint for an expression.\n\
-+A watchpoint stops execution of your program whenever the value of\n\
-+an expression changes."));
-+ set_cmd_completer (c, location_completer);
-+
-+ c = add_com ("rwatch", class_breakpoint, rwatch_command, _("\
-+Set a read watchpoint for an expression.\n\
-+A watchpoint stops execution of your program whenever the value of\n\
-+an expression is read."));
-+ set_cmd_completer (c, location_completer);
-+
-+ c = add_com ("awatch", class_breakpoint, awatch_command, _("\
-+Set a watchpoint for an expression.\n\
-+A watchpoint stops execution of your program whenever the value of\n\
-+an expression is either read or written."));
-+ set_cmd_completer (c, location_completer);
-+
-+ add_info ("watchpoints", breakpoints_info,
-+ _("Synonym for ``info breakpoints''."));
-+
-+
-+ /* XXX: cagney/2005-02-23: This should be a boolean, and should
-+ respond to changes - contrary to the description. */
-+ add_setshow_zinteger_cmd ("can-use-hw-watchpoints", class_support,
-+ &can_use_hw_watchpoints, _("\
-+Set debugger's willingness to use watchpoint hardware."), _("\
-+Show debugger's willingness to use watchpoint hardware."), _("\
-+If zero, gdb will not use hardware for new watchpoints, even if\n\
-+such is available. (However, any hardware watchpoints that were\n\
-+created before setting this to nonzero, will continue to use watchpoint\n\
-+hardware.)"),
-+ NULL,
-+ show_can_use_hw_watchpoints,
-+ &setlist, &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,
-+ show_pending_break_support,
-+ &breakpoint_set_cmdlist,
-+ &breakpoint_show_cmdlist);
-+
-+ pending_break_support = AUTO_BOOLEAN_AUTO;
-+
-+ add_setshow_boolean_cmd ("auto-hw", no_class,
-+ &automatic_hardware_breakpoints, _("\
-+Set automatic usage of hardware breakpoints."), _("\
-+Show automatic usage of hardware breakpoints."), _("\
-+If set, the debugger will automatically use hardware breakpoints for\n\
-+breakpoints set with \"break\" but falling in read-only memory. If not set,\n\
-+a warning will be emitted for such breakpoints."),
-+ NULL,
-+ show_automatic_hardware_breakpoints,
-+ &breakpoint_set_cmdlist,
-+ &breakpoint_show_cmdlist);
-+
-+ automatic_hardware_breakpoints = 1;
-+}
diff -Naur gdb-6.8.orig/gdb/breakpoint.h gdb-6.8/gdb/breakpoint.h
--- gdb-6.8.orig/gdb/breakpoint.h 2008-02-01 17:24:46.000000000 +0100
+++ gdb-6.8/gdb/breakpoint.h 2008-09-17 16:32:32.000000000 +0200
@@ -8717,3259 +356,6 @@ diff -Naur gdb-6.8.orig/gdb/NEWS gdb-6.8/gdb/NEWS
*** Changes in GDB 6.8
* New native configurations
-diff -Naur gdb-6.8.orig/gdb/NEWS.orig gdb-6.8/gdb/NEWS.orig
---- gdb-6.8.orig/gdb/NEWS.orig 1970-01-01 01:00:00.000000000 +0100
-+++ gdb-6.8/gdb/NEWS.orig 2008-03-27 19:14:10.000000000 +0100
-@@ -0,0 +1,3249 @@
-+ What has changed in GDB?
-+ (Organized release by release)
-+
-+*** Changes in GDB 6.8
-+
-+* New native configurations
-+
-+NetBSD/hppa hppa*-*netbsd*
-+Xtensa GNU/Linux xtensa*-*-linux*
-+
-+* New targets
-+
-+NetBSD/hppa hppa*-*-netbsd*
-+Xtensa GNU/Lunux xtensa*-*-linux*
-+
-+* Change in command line behavior -- corefiles vs. process ids.
-+
-+ When the '-p NUMBER' or '--pid NUMBER' options are used, and
-+ attaching to process NUMBER fails, GDB no longer attempts to open a
-+ core file named NUMBER. Attaching to a program using the -c option
-+ is no longer supported. Instead, use the '-p' or '--pid' options.
-+
-+* GDB can now be built as a native debugger for debugging Windows x86
-+(mingw32) Portable Executable (PE) programs.
-+
-+* Pending breakpoints no longer change their number when their address
-+is resolved.
-+
-+* GDB now supports breakpoints with multiple locations,
-+including breakpoints on C++ constructors, inside C++ templates,
-+and in inlined functions.
-+
-+* GDB's ability to debug optimized code has been improved. GDB more
-+accurately identifies function bodies and lexical blocks that occupy
-+more than one contiguous range of addresses.
-+
-+* Target descriptions can now describe registers for PowerPC.
-+
-+* The GDB remote stub, gdbserver, now supports the AltiVec and SPE
-+registers on PowerPC targets.
-+
-+* The GDB remote stub, gdbserver, now supports thread debugging on GNU/Linux
-+targets even when the libthread_db library is not available.
-+
-+* The GDB remote stub, gdbserver, now supports the new file transfer
-+commands (remote put, remote get, and remote delete).
-+
-+* The GDB remote stub, gdbserver, now supports run and attach in
-+extended-remote mode.
-+
-+* hppa*64*-*-hpux11* target broken
-+ The debugger is unable to start a program and fails with the following
-+ error: "Error trying to get information about dynamic linker".
-+ The gdb-6.7 release is also affected.
-+
-+* GDB now supports the --enable-targets= configure option to allow
-+building a single GDB executable that supports multiple remote
-+target architectures.
-+
-+* GDB now supports debugging C and C++ programs which use the
-+Decimal Floating Point extension. In addition, the PowerPC target
-+now has a set of pseudo-registers to inspect decimal float values
-+stored in two consecutive float registers.
-+
-+* The -break-insert MI command can optionally create pending
-+breakpoints now.
-+
-+* Improved support for debugging Ada
-+ Many improvements to the Ada language support have been made. These
-+ include:
-+ - Better support for Ada2005 interface types
-+ - Improved handling of arrays and slices in general
-+ - Better support for Taft-amendment types
-+ - The '{type} ADDRESS' expression is now allowed on the left hand-side
-+ of an assignment
-+ - Improved command completion in Ada
-+ - Several bug fixes
-+
-+* New commands
-+
-+set print frame-arguments (all|scalars|none)
-+show print frame-arguments
-+ The value of this variable can be changed to control which argument
-+ values should be printed by the debugger when displaying a frame.
-+
-+remote put
-+remote get
-+remote delete
-+ Transfer files to and from a remote target, and delete remote files.
-+
-+* New MI commands
-+
-+-target-file-put
-+-target-file-get
-+-target-file-delete
-+ Transfer files to and from a remote target, and delete remote files.
-+
-+* New remote packets
-+
-+vFile:open:
-+vFile:close:
-+vFile:pread:
-+vFile:pwrite:
-+vFile:unlink:
-+ Open, close, read, write, and delete files on the remote system.
-+
-+* GDB on GNU/Linux and HP/UX can now debug through "exec" of a new
-+process.
-+
-+vAttach
-+ Attach to an existing process on the remote system, in extended-remote
-+ mode.
-+
-+vRun
-+ Run a new process on the remote system, in extended-remote mode.
-+
-+*** Changes in GDB 6.7
-+
-+* Resolved 101 resource leaks, null pointer dereferences, etc. in gdb,
-+bfd, libiberty and opcodes, as revealed by static analysis donated by
-+Coverity, Inc. (http://scan.coverity.com).
-+
-+* When looking up multiply-defined global symbols, GDB will now prefer the
-+symbol definition in the current shared library if it was built using the
-+-Bsymbolic linker option.
-+
-+* When the Text User Interface (TUI) is not configured, GDB will now
-+recognize the -tui command-line option and print a message that the TUI
-+is not supported.
-+
-+* The GDB remote stub, gdbserver, now has lower overhead for high
-+frequency signals (e.g. SIGALRM) via the QPassSignals packet.
-+
-+* GDB for MIPS targets now autodetects whether a remote target provides
-+32-bit or 64-bit register values.
-+
-+* Support for C++ member pointers has been improved.
-+
-+* GDB now understands XML target descriptions, which specify the
-+target's overall architecture. GDB can read a description from
-+a local file or over the remote serial protocol.
-+
-+* Vectors of single-byte data use a new integer type which is not
-+automatically displayed as character or string data.
-+
-+* The /s format now works with the print command. It displays
-+arrays of single-byte integers and pointers to single-byte integers
-+as strings.
-+
-+* Target descriptions can now describe target-specific registers,
-+for architectures which have implemented the support (currently
-+only ARM, M68K, and MIPS).
-+
-+* GDB and the GDB remote stub, gdbserver, now support the XScale
-+iWMMXt coprocessor.
-+
-+* The GDB remote stub, gdbserver, has been updated to support
-+ARM Windows CE (mingw32ce) debugging, and GDB Windows CE support
-+has been rewritten to use the standard GDB remote protocol.
-+
-+* GDB can now step into C++ functions which are called through thunks.
-+
-+* GDB for the Cell/B.E. SPU now supports overlay debugging.
-+
-+* The GDB remote protocol "qOffsets" packet can now honor ELF segment
-+layout. It also supports a TextSeg= and DataSeg= response when only
-+segment base addresses (rather than offsets) are available.
-+
-+* The /i format now outputs any trailing branch delay slot instructions
-+immediately following the last instruction within the count specified.
-+
-+* The GDB remote protocol "T" stop reply packet now supports a
-+"library" response. Combined with the new "qXfer:libraries:read"
-+packet, this response allows GDB to debug shared libraries on targets
-+where the operating system manages the list of loaded libraries (e.g.
-+Windows and SymbianOS).
-+
-+* The GDB remote stub, gdbserver, now supports dynamic link libraries
-+(DLLs) on Windows and Windows CE targets.
-+
-+* GDB now supports a faster verification that a .debug file matches its binary
-+according to its build-id signature, if the signature is present.
-+
-+* New commands
-+
-+set remoteflow
-+show remoteflow
-+ Enable or disable hardware flow control (RTS/CTS) on the serial port
-+ when debugging using remote targets.
-+
-+set mem inaccessible-by-default
-+show mem inaccessible-by-default
-+ If the target supplies a memory map, for instance via the remote
-+ protocol's "qXfer:memory-map:read" packet, setting this variable
-+ prevents GDB from accessing memory outside the memory map. This
-+ is useful for targets with memory mapped registers or which react
-+ badly to accesses of unmapped address space.
-+
-+set breakpoint auto-hw
-+show breakpoint auto-hw
-+ If the target supplies a memory map, for instance via the remote
-+ protocol's "qXfer:memory-map:read" packet, setting this variable
-+ lets GDB use hardware breakpoints automatically for memory regions
-+ where it can not use software breakpoints. This covers both the
-+ "break" command and internal breakpoints used for other commands
-+ including "next" and "finish".
-+
-+catch exception
-+catch exception unhandled
-+ Stop the program execution when Ada exceptions are raised.
-+
-+catch assert
-+ Stop the program execution when an Ada assertion failed.
-+
-+set sysroot
-+show sysroot
-+ Set an alternate system root for target files. This is a more
-+ general version of "set solib-absolute-prefix", which is now
-+ an alias to "set sysroot".
-+
-+info spu
-+ Provide extended SPU facility status information. This set of
-+ commands is available only when debugging the Cell/B.E. SPU
-+ architecture.
-+
-+* New native configurations
-+
-+OpenBSD/sh sh*-*openbsd*
-+
-+set tdesc filename
-+unset tdesc filename
-+show tdesc filename
-+ Use the specified local file as an XML target description, and do
-+ not query the target for its built-in description.
-+
-+* New targets
-+
-+OpenBSD/sh sh*-*-openbsd*
-+MIPS64 GNU/Linux (gdbserver) mips64-linux-gnu
-+Toshiba Media Processor mep-elf
-+
-+* New remote packets
-+
-+QPassSignals:
-+ Ignore the specified signals; pass them directly to the debugged program
-+ without stopping other threads or reporting them to GDB.
-+
-+qXfer:features:read:
-+ Read an XML target description from the target, which describes its
-+ features.
-+
-+qXfer:spu:read:
-+qXfer:spu:write:
-+ Read or write contents of an spufs file on the target system. These
-+ packets are available only on the Cell/B.E. SPU architecture.
-+
-+qXfer:libraries:read:
-+ Report the loaded shared libraries. Combined with new "T" packet
-+ response, this packet allows GDB to debug shared libraries on
-+ targets where the operating system manages the list of loaded
-+ libraries (e.g. Windows and SymbianOS).
-+
-+* Removed targets
-+
-+Support for these obsolete configurations has been removed.
-+
-+alpha*-*-osf1*
-+alpha*-*-osf2*
-+d10v-*-*
-+hppa*-*-hiux*
-+i[34567]86-ncr-*
-+i[34567]86-*-dgux*
-+i[34567]86-*-lynxos*
-+i[34567]86-*-netware*
-+i[34567]86-*-sco3.2v5*
-+i[34567]86-*-sco3.2v4*
-+i[34567]86-*-sco*
-+i[34567]86-*-sysv4.2*
-+i[34567]86-*-sysv4*
-+i[34567]86-*-sysv5*
-+i[34567]86-*-unixware2*
-+i[34567]86-*-unixware*
-+i[34567]86-*-sysv*
-+i[34567]86-*-isc*
-+m68*-cisco*-*
-+m68*-tandem-*
-+mips*-*-pe
-+rs6000-*-lynxos*
-+sh*-*-pe
-+
-+* Other removed features
-+
-+target abug
-+target cpu32bug
-+target est
-+target rom68k
-+
-+ Various m68k-only ROM monitors.
-+
-+target hms
-+target e7000
-+target sh3
-+target sh3e
-+
-+ Various Renesas ROM monitors and debugging interfaces for SH and
-+ H8/300.
-+
-+target ocd
-+
-+ Support for a Macraigor serial interface to on-chip debugging.
-+ GDB does not directly support the newer parallel or USB
-+ interfaces.
-+
-+DWARF 1 support
-+
-+ A debug information format. The predecessor to DWARF 2 and
-+ DWARF 3, which are still supported.
-+
-+Support for the HP aCC compiler on HP-UX/PA-RISC
-+
-+ SOM-encapsulated symbolic debugging information, automatic
-+ invocation of pxdb, and the aCC custom C++ ABI. This does not
-+ affect HP-UX for Itanium or GCC for HP-UX/PA-RISC. Code compiled
-+ with aCC can still be debugged on an assembly level.
-+
-+MIPS ".pdr" sections
-+
-+ A MIPS-specific format used to describe stack frame layout
-+ in debugging information.
-+
-+Scheme support
-+
-+ GDB could work with an older version of Guile to debug
-+ the interpreter and Scheme programs running in it.
-+
-+set mips stack-arg-size
-+set mips saved-gpreg-size
-+
-+ Use "set mips abi" to control parameter passing for MIPS.
-+
-+*** Changes in GDB 6.6
-+
-+* New targets
-+
-+Xtensa xtensa-elf
-+Cell Broadband Engine SPU spu-elf
-+
-+* GDB can now be configured as a cross-debugger targeting native Windows
-+(mingw32) or Cygwin. It can communicate with a remote debugging stub
-+running on a Windows system over TCP/IP to debug Windows programs.
-+
-+* The GDB remote stub, gdbserver, has been updated to support Windows and
-+Cygwin debugging. Both single-threaded and multi-threaded programs are
-+supported.
-+
-+* The "set trust-readonly-sections" command works again. This command was
-+broken in GDB 6.3, 6.4, and 6.5.
-+
-+* The "load" command now supports writing to flash memory, if the remote
-+stub provides the required support.
-+
-+* Support for GNU/Linux Thread Local Storage (TLS, per-thread variables) no
-+longer requires symbolic debug information (e.g. DWARF-2).
-+
-+* New commands
-+
-+set substitute-path
-+unset substitute-path
-+show substitute-path
-+ Manage a list of substitution rules that GDB uses to rewrite the name
-+ of the directories where the sources are located. This can be useful
-+ for instance when the sources were moved to a different location
-+ between compilation and debugging.
-+
-+set trace-commands
-+show trace-commands
-+ Print each CLI command as it is executed. Each command is prefixed with
-+ a number of `+' symbols representing the nesting depth.
-+ The source command now has a `-v' option to enable the same feature.
-+
-+* REMOVED features
-+
-+The ARM Demon monitor support (RDP protocol, "target rdp").
-+
-+Kernel Object Display, an embedded debugging feature which only worked with
-+an obsolete version of Cisco IOS.
-+
-+The 'set download-write-size' and 'show download-write-size' commands.
-+
-+* New remote packets
-+
-+qSupported:
-+ Tell a stub about GDB client features, and request remote target features.
-+ The first feature implemented is PacketSize, which allows the target to
-+ specify the size of packets it can handle - to minimize the number of
-+ packets required and improve performance when connected to a remote
-+ target.
-+
-+qXfer:auxv:read:
-+ Fetch an OS auxilliary vector from the remote stub. This packet is a
-+ more efficient replacement for qPart:auxv:read.
-+
-+qXfer:memory-map:read:
-+ Fetch a memory map from the remote stub, including information about
-+ RAM, ROM, and flash memory devices.
-+
-+vFlashErase:
-+vFlashWrite:
-+vFlashDone:
-+ Erase and program a flash memory device.
-+
-+* Removed remote packets
-+
-+qPart:auxv:read:
-+ This packet has been replaced by qXfer:auxv:read. Only GDB 6.4 and 6.5
-+ used it, and only gdbserver implemented it.
-+
-+*** Changes in GDB 6.5
-+
-+* New targets
-+
-+Renesas M32C/M16C m32c-elf
-+
-+Morpho Technologies ms1 ms1-elf
-+
-+* New commands
-+
-+init-if-undefined Initialize a convenience variable, but
-+ only if it doesn't already have a value.
-+
-+The following commands are presently only implemented for native GNU/Linux:
-+
-+checkpoint Save a snapshot of the program state.
-+
-+restart <n> Return the program state to a
-+ previously saved state.
-+
-+info checkpoints List currently saved checkpoints.
-+
-+delete-checkpoint <n> Delete a previously saved checkpoint.
-+
-+set|show detach-on-fork Tell gdb whether to detach from a newly
-+ forked process, or to keep debugging it.
-+
-+info forks List forks of the user program that
-+ are available to be debugged.
-+
-+fork <n> Switch to debugging one of several
-+ forks of the user program that are
-+ available to be debugged.
-+
-+delete-fork <n> Delete a fork from the list of forks
-+ that are available to be debugged (and
-+ kill the forked process).
-+
-+detach-fork <n> Delete a fork from the list of forks
-+ that are available to be debugged (and
-+ allow the process to continue).
-+
-+* New architecture
-+
-+Morpho Technologies ms2 ms1-elf
-+
-+* Improved Windows host support
-+
-+GDB now builds as a cross debugger hosted on i686-mingw32, including
-+native console support, and remote communications using either
-+network sockets or serial ports.
-+
-+* Improved Modula-2 language support
-+
-+GDB can now print most types in the Modula-2 syntax. This includes:
-+basic types, set types, record types, enumerated types, range types,
-+pointer types and ARRAY types. Procedure var parameters are correctly
-+printed and hexadecimal addresses and character constants are also
-+written in the Modula-2 syntax. Best results can be obtained by using
-+GNU Modula-2 together with the -gdwarf-2 command line option.
-+
-+* REMOVED features
-+
-+The ARM rdi-share module.
-+
-+The Netware NLM debug server.
-+
-+*** Changes in GDB 6.4
-+
-+* New native configurations
-+
-+OpenBSD/arm arm*-*-openbsd*
-+OpenBSD/mips64 mips64-*-openbsd*
-+
-+* New targets
-+
-+Morpho Technologies ms1 ms1-elf
-+
-+* New command line options
-+
-+--batch-silent As for --batch, but totally silent.
-+--return-child-result The debugger will exist with the same value
-+ the child (debugged) program exited with.
-+--eval-command COMMAND, -ex COMMAND
-+ Execute a single GDB CLI command. This may be
-+ specified multiple times and in conjunction
-+ with the --command (-x) option.
-+
-+* Deprecated commands removed
-+
-+The following commands, that were deprecated in 2000, have been
-+removed:
-+
-+ Command Replacement
-+ set|show arm disassembly-flavor set|show arm disassembler
-+ othernames set arm disassembler
-+ set|show remotedebug set|show debug remote
-+ set|show archdebug set|show debug arch
-+ set|show eventdebug set|show debug event
-+ regs info registers
-+
-+* New BSD user-level threads support
-+
-+It is now possible to debug programs using the user-level threads
-+library on OpenBSD and FreeBSD. Currently supported (target)
-+configurations are:
-+
-+FreeBSD/amd64 x86_64-*-freebsd*
-+FreeBSD/i386 i386-*-freebsd*
-+OpenBSD/i386 i386-*-openbsd*
-+
-+Note that the new kernel threads libraries introduced in FreeBSD 5.x
-+are not yet supported.
-+
-+* New support for Matsushita MN10300 w/sim added
-+(Work in progress). mn10300-elf.
-+
-+* REMOVED configurations and files
-+
-+VxWorks and the XDR protocol *-*-vxworks
-+Motorola MCORE mcore-*-*
-+National Semiconductor NS32000 ns32k-*-*
-+
-+* New "set print array-indexes" command
-+
-+After turning this setting "on", GDB prints the index of each element
-+when displaying arrays. The default is "off" to preserve the previous
-+behavior.
-+
-+* VAX floating point support
-+
-+GDB now supports the not-quite-ieee VAX F and D floating point formats.
-+
-+* User-defined command support
-+
-+In addition to using $arg0..$arg9 for argument passing, it is now possible
-+to use $argc to determine now many arguments have been passed. See the
-+section on user-defined commands in the user manual for more information.
-+
-+*** Changes in GDB 6.3:
-+
-+* New command line option
-+
-+GDB now accepts -l followed by a number to set the timeout for remote
-+debugging.
-+
-+* GDB works with GCC -feliminate-dwarf2-dups
-+
-+GDB now supports a more compact representation of DWARF-2 debug
-+information using DW_FORM_ref_addr references. These are produced
-+by GCC with the option -feliminate-dwarf2-dups and also by some
-+proprietary compilers. With GCC, you must use GCC 3.3.4 or later
-+to use -feliminate-dwarf2-dups.
-+
-+* Internationalization
-+
-+When supported by the host system, GDB will be built with
-+internationalization (libintl). The task of marking up the sources is
-+continued, we're looking forward to our first translation.
-+
-+* Ada
-+
-+Initial support for debugging programs compiled with the GNAT
-+implementation of the Ada programming language has been integrated
-+into GDB. In this release, support is limited to expression evaluation.
-+
-+* New native configurations
-+
-+GNU/Linux/m32r m32r-*-linux-gnu
-+
-+* Remote 'p' packet
-+
-+GDB's remote protocol now includes support for the 'p' packet. This
-+packet is used to fetch individual registers from a remote inferior.
-+
-+* END-OF-LIFE registers[] compatibility module
-+
-+GDB's internal register infrastructure has been completely rewritten.
-+The new infrastructure making possible the implementation of key new
-+features including 32x64 (e.g., 64-bit amd64 GDB debugging a 32-bit
-+i386 application).
-+
-+GDB 6.3 will be the last release to include the the registers[]
-+compatibility module that allowed out-of-date configurations to
-+continue to work. This change directly impacts the following
-+configurations:
-+
-+hppa-*-hpux
-+ia64-*-aix
-+mips-*-irix*
-+*-*-lynx
-+mips-*-linux-gnu
-+sds protocol
-+xdr protocol
-+powerpc bdm protocol
-+
-+Unless there is activity to revive these configurations, they will be
-+made OBSOLETE in GDB 6.4, and REMOVED from GDB 6.5.
-+
-+* OBSOLETE configurations and files
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+h8300-*-*
-+mcore-*-*
-+mn10300-*-*
-+ns32k-*-*
-+sh64-*-*
-+v850-*-*
-+
-+*** Changes in GDB 6.2.1:
-+
-+* MIPS `break main; run' gave an heuristic-fence-post warning
-+
-+When attempting to run even a simple program, a warning about
-+heuristic-fence-post being hit would be reported. This problem has
-+been fixed.
-+
-+* MIPS IRIX 'long double' crashed GDB
-+
-+When examining a long double variable, GDB would get a segmentation
-+fault. The crash has been fixed (but GDB 6.2 cannot correctly examine
-+IRIX long double values).
-+
-+* VAX and "next"
-+
-+A bug in the VAX stack code was causing problems with the "next"
-+command. This problem has been fixed.
-+
-+*** Changes in GDB 6.2:
-+
-+* Fix for ``many threads''
-+
-+On GNU/Linux systems that use the NPTL threads library, a program
-+rapidly creating and deleting threads would confuse GDB leading to the
-+error message:
-+
-+ ptrace: No such process.
-+ thread_db_get_info: cannot get thread info: generic error
-+
-+This problem has been fixed.
-+
-+* "-async" and "-noasync" options removed.
-+
-+Support for the broken "-noasync" option has been removed (it caused
-+GDB to dump core).
-+
-+* New ``start'' command.
-+
-+This command runs the program until the begining of the main procedure.
-+
-+* New BSD Kernel Data Access Library (libkvm) interface
-+
-+Using ``target kvm'' it is now possible to debug kernel core dumps and
-+live kernel memory images on various FreeBSD, NetBSD and OpenBSD
-+platforms. Currently supported (native-only) configurations are:
-+
-+FreeBSD/amd64 x86_64-*-freebsd*
-+FreeBSD/i386 i?86-*-freebsd*
-+NetBSD/i386 i?86-*-netbsd*
-+NetBSD/m68k m68*-*-netbsd*
-+NetBSD/sparc sparc-*-netbsd*
-+OpenBSD/amd64 x86_64-*-openbsd*
-+OpenBSD/i386 i?86-*-openbsd*
-+OpenBSD/m68k m68*-openbsd*
-+OpenBSD/sparc sparc-*-openbsd*
-+
-+* Signal trampoline code overhauled
-+
-+Many generic problems with GDB's signal handling code have been fixed.
-+These include: backtraces through non-contiguous stacks; recognition
-+of sa_sigaction signal trampolines; backtrace from a NULL pointer
-+call; backtrace through a signal trampoline; step into and out of
-+signal handlers; and single-stepping in the signal trampoline.
-+
-+Please note that kernel bugs are a limiting factor here. These
-+features have been shown to work on an s390 GNU/Linux system that
-+include a 2.6.8-rc1 kernel. Ref PR breakpoints/1702.
-+
-+* Cygwin support for DWARF 2 added.
-+
-+* New native configurations
-+
-+GNU/Linux/hppa hppa*-*-linux*
-+OpenBSD/hppa hppa*-*-openbsd*
-+OpenBSD/m68k m68*-*-openbsd*
-+OpenBSD/m88k m88*-*-openbsd*
-+OpenBSD/powerpc powerpc-*-openbsd*
-+NetBSD/vax vax-*-netbsd*
-+OpenBSD/vax vax-*-openbsd*
-+
-+* END-OF-LIFE frame compatibility module
-+
-+GDB's internal frame infrastructure has been completely rewritten.
-+The new infrastructure making it possible to support key new features
-+including DWARF 2 Call Frame Information. To aid in the task of
-+migrating old configurations to this new infrastructure, a
-+compatibility module, that allowed old configurations to continue to
-+work, was also included.
-+
-+GDB 6.2 will be the last release to include this frame compatibility
-+module. This change directly impacts the following configurations:
-+
-+h8300-*-*
-+mcore-*-*
-+mn10300-*-*
-+ns32k-*-*
-+sh64-*-*
-+v850-*-*
-+xstormy16-*-*
-+
-+Unless there is activity to revive these configurations, they will be
-+made OBSOLETE in GDB 6.3, and REMOVED from GDB 6.4.
-+
-+* REMOVED configurations and files
-+
-+Sun 3, running SunOS 3 m68*-*-sunos3*
-+Sun 3, running SunOS 4 m68*-*-sunos4*
-+Sun 2, running SunOS 3 m68000-*-sunos3*
-+Sun 2, running SunOS 4 m68000-*-sunos4*
-+Motorola 680x0 running LynxOS m68*-*-lynxos*
-+AT&T 3b1/Unix pc m68*-att-*
-+Bull DPX2 (68k, System V release 3) m68*-bull-sysv*
-+decstation mips-dec-* mips-little-*
-+riscos mips-*-riscos* mips-*-sysv*
-+sonymips mips-sony-*
-+sysv mips*-*-sysv4* (IRIX 5/6 not included)
-+
-+*** Changes in GDB 6.1.1:
-+
-+* TUI (Text-mode User Interface) built-in (also included in GDB 6.1)
-+
-+The TUI (Text-mode User Interface) is now built as part of a default
-+GDB configuration. It is enabled by either selecting the TUI with the
-+command line option "-i=tui" or by running the separate "gdbtui"
-+program. For more information on the TUI, see the manual "Debugging
-+with GDB".
-+
-+* Pending breakpoint support (also included in GDB 6.1)
-+
-+Support has been added to allow you to specify breakpoints in shared
-+libraries that have not yet been loaded. If a breakpoint location
-+cannot be found, and the "breakpoint pending" option is set to auto,
-+GDB queries you if you wish to make the breakpoint pending on a future
-+shared-library load. If and when GDB resolves the breakpoint symbol,
-+the pending breakpoint is removed as one or more regular breakpoints
-+are created.
-+
-+Pending breakpoints are very useful for GCJ Java debugging.
-+
-+* Fixed ISO-C build problems
-+
-+The files bfd/elf-bfd.h, gdb/dictionary.c and gdb/types.c contained
-+non ISO-C code that stopped them being built using a more strict ISO-C
-+compiler (e.g., IBM's C compiler).
-+
-+* Fixed build problem on IRIX 5
-+
-+Due to header problems with <sys/proc.h>, the file gdb/proc-api.c
-+wasn't able to compile compile on an IRIX 5 system.
-+
-+* Added execute permission to gdb/gdbserver/configure
-+
-+The shell script gdb/testsuite/gdb.stabs/configure lacked execute
-+permission. This bug would cause configure to fail on a number of
-+systems (Solaris, IRIX). Ref: server/519.
-+
-+* Fixed build problem on hpux2.0w-hp-hpux11.00 using the HP ANSI C compiler
-+
-+Older HPUX ANSI C compilers did not accept variable array sizes. somsolib.c
-+has been updated to use constant array sizes.
-+
-+* Fixed a panic in the DWARF Call Frame Info code on Solaris 2.7
-+
-+GCC 3.3.2, on Solaris 2.7, includes the DW_EH_PE_funcrel encoding in
-+its generated DWARF Call Frame Info. This encoding was causing GDB to
-+panic, that panic has been fixed. Ref: gdb/1628.
-+
-+* Fixed a problem when examining parameters in shared library code.
-+
-+When examining parameters in optimized shared library code generated
-+by a mainline GCC, GDB would incorrectly report ``Variable "..." is
-+not available''. GDB now correctly displays the variable's value.
-+
-+*** Changes in GDB 6.1:
-+
-+* Removed --with-mmalloc
-+
-+Support for the mmalloc memory manager has been removed, as it
-+conflicted with the internal gdb byte cache.
-+
-+* Changes in AMD64 configurations
-+
-+The AMD64 target now includes the %cs and %ss registers. As a result
-+the AMD64 remote protocol has changed; this affects the floating-point
-+and SSE registers. If you rely on those registers for your debugging,
-+you should upgrade gdbserver on the remote side.
-+
-+* Revised SPARC target
-+
-+The SPARC target has been completely revised, incorporating the
-+FreeBSD/sparc64 support that was added for GDB 6.0. As a result
-+support for LynxOS and SunOS 4 has been dropped. Calling functions
-+from within GDB on operating systems with a non-executable stack
-+(Solaris, OpenBSD) now works.
-+
-+* New C++ demangler
-+
-+GDB has a new C++ demangler which does a better job on the mangled
-+names generated by current versions of g++. It also runs faster, so
-+with this and other changes gdb should now start faster on large C++
-+programs.
-+
-+* DWARF 2 Location Expressions
-+
-+GDB support for location expressions has been extended to support function
-+arguments and frame bases. Older versions of GDB could crash when they
-+encountered these.
-+
-+* C++ nested types and namespaces
-+
-+GDB's support for nested types and namespaces in C++ has been
-+improved, especially if you use the DWARF 2 debugging format. (This
-+is the default for recent versions of GCC on most platforms.)
-+Specifically, if you have a class "Inner" defined within a class or
-+namespace "Outer", then GDB realizes that the class's name is
-+"Outer::Inner", not simply "Inner". This should greatly reduce the
-+frequency of complaints about not finding RTTI symbols. In addition,
-+if you are stopped at inside of a function defined within a namespace,
-+GDB modifies its name lookup accordingly.
-+
-+* New native configurations
-+
-+NetBSD/amd64 x86_64-*-netbsd*
-+OpenBSD/amd64 x86_64-*-openbsd*
-+OpenBSD/alpha alpha*-*-openbsd*
-+OpenBSD/sparc sparc-*-openbsd*
-+OpenBSD/sparc64 sparc64-*-openbsd*
-+
-+* New debugging protocols
-+
-+M32R with SDI protocol m32r-*-elf*
-+
-+* "set prompt-escape-char" command deleted.
-+
-+The command "set prompt-escape-char" has been deleted. This command,
-+and its very obscure effet on GDB's prompt, was never documented,
-+tested, nor mentioned in the NEWS file.
-+
-+* OBSOLETE configurations and files
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+Sun 3, running SunOS 3 m68*-*-sunos3*
-+Sun 3, running SunOS 4 m68*-*-sunos4*
-+Sun 2, running SunOS 3 m68000-*-sunos3*
-+Sun 2, running SunOS 4 m68000-*-sunos4*
-+Motorola 680x0 running LynxOS m68*-*-lynxos*
-+AT&T 3b1/Unix pc m68*-att-*
-+Bull DPX2 (68k, System V release 3) m68*-bull-sysv*
-+decstation mips-dec-* mips-little-*
-+riscos mips-*-riscos* mips-*-sysv*
-+sonymips mips-sony-*
-+sysv mips*-*-sysv4* (IRIX 5/6 not included)
-+
-+* REMOVED configurations and files
-+
-+SGI Irix-4.x mips-sgi-irix4 or iris4
-+SGI Iris (MIPS) running Irix V3: mips-sgi-irix or iris
-+Z8000 simulator z8k-zilog-none or z8ksim
-+Matsushita MN10200 w/simulator mn10200-*-*
-+H8/500 simulator h8500-hitachi-hms or h8500hms
-+HP/PA running BSD hppa*-*-bsd*
-+HP/PA running OSF/1 hppa*-*-osf*
-+HP/PA Pro target hppa*-*-pro*
-+PMAX (MIPS) running Mach 3.0 mips*-*-mach3*
-+386BSD i[3456]86-*-bsd*
-+Sequent family i[3456]86-sequent-sysv4*
-+ i[3456]86-sequent-sysv*
-+ i[3456]86-sequent-bsd*
-+SPARC running LynxOS sparc-*-lynxos*
-+SPARC running SunOS 4 sparc-*-sunos4*
-+Tsqware Sparclet sparclet-*-*
-+Fujitsu SPARClite sparclite-fujitsu-none or sparclite
-+
-+*** Changes in GDB 6.0:
-+
-+* Objective-C
-+
-+Support for debugging the Objective-C programming language has been
-+integrated into GDB.
-+
-+* New backtrace mechanism (includes DWARF 2 Call Frame Information).
-+
-+DWARF 2's Call Frame Information makes available compiler generated
-+information that more exactly describes the program's run-time stack.
-+By using this information, GDB is able to provide more robust stack
-+backtraces.
-+
-+The i386, amd64 (nee, x86-64), Alpha, m68hc11, ia64, and m32r targets
-+have been updated to use a new backtrace mechanism which includes
-+DWARF 2 CFI support.
-+
-+* Hosted file I/O.
-+
-+GDB's remote protocol has been extended to include support for hosted
-+file I/O (where the remote target uses GDB's file system). See GDB's
-+remote protocol documentation for details.
-+
-+* All targets using the new architecture framework.
-+
-+All of GDB's targets have been updated to use the new internal
-+architecture framework. The way is now open for future GDB releases
-+to include cross-architecture native debugging support (i386 on amd64,
-+ppc32 on ppc64).
-+
-+* GNU/Linux's Thread Local Storage (TLS)
-+
-+GDB now includes support for for the GNU/Linux implementation of
-+per-thread variables.
-+
-+* GNU/Linux's Native POSIX Thread Library (NPTL)
-+
-+GDB's thread code has been updated to work with either the new
-+GNU/Linux NPTL thread library or the older "LinuxThreads" library.
-+
-+* Separate debug info.
-+
-+GDB, in conjunction with BINUTILS, now supports a mechanism for
-+automatically loading debug information from a separate file. Instead
-+of shipping full debug and non-debug versions of system libraries,
-+system integrators can now instead ship just the stripped libraries
-+and optional debug files.
-+
-+* DWARF 2 Location Expressions
-+
-+DWARF 2 Location Expressions allow the compiler to more completely
-+describe the location of variables (even in optimized code) to the
-+debugger.
-+
-+GDB now includes preliminary support for location expressions (support
-+for DW_OP_piece is still missing).
-+
-+* Java
-+
-+A number of long standing bugs that caused GDB to die while starting a
-+Java application have been fixed. GDB's Java support is now
-+considered "useable".
-+
-+* GNU/Linux support for fork, vfork, and exec.
-+
-+The "catch fork", "catch exec", "catch vfork", and "set follow-fork-mode"
-+commands are now implemented for GNU/Linux. They require a 2.5.x or later
-+kernel.
-+
-+* GDB supports logging output to a file
-+
-+There are two new commands, "set logging" and "show logging", which can be
-+used to capture GDB's output to a file.
-+
-+* The meaning of "detach" has changed for gdbserver
-+
-+The "detach" command will now resume the application, as documented. To
-+disconnect from gdbserver and leave it stopped, use the new "disconnect"
-+command.
-+
-+* d10v, m68hc11 `regs' command deprecated
-+
-+The `info registers' command has been updated so that it displays the
-+registers using a format identical to the old `regs' command.
-+
-+* Profiling support
-+
-+A new command, "maint set profile on/off", has been added. This command can
-+be used to enable or disable profiling while running GDB, to profile a
-+session or a set of commands. In addition there is a new configure switch,
-+"--enable-profiling", which will cause GDB to be compiled with profiling
-+data, for more informative profiling results.
-+
-+* Default MI syntax changed to "mi2".
-+
-+The default MI (machine interface) syntax, enabled by the command line
-+option "-i=mi", has been changed to "mi2". The previous MI syntax,
-+"mi1", can be enabled by specifying the option "-i=mi1".
-+
-+Support for the original "mi0" syntax (included in GDB 5.0) has been
-+removed.
-+
-+Fix for gdb/192: removed extraneous space when displaying frame level.
-+Fix for gdb/672: update changelist is now output in mi list format.
-+Fix for gdb/702: a -var-assign that updates the value now shows up
-+ in a subsequent -var-update.
-+
-+* New native configurations.
-+
-+FreeBSD/amd64 x86_64-*-freebsd*
-+
-+* Multi-arched targets.
-+
-+HP/PA HPUX11 hppa*-*-hpux*
-+Renesas M32R/D w/simulator m32r-*-elf*
-+
-+* OBSOLETE configurations and files
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+Z8000 simulator z8k-zilog-none or z8ksim
-+Matsushita MN10200 w/simulator mn10200-*-*
-+H8/500 simulator h8500-hitachi-hms or h8500hms
-+HP/PA running BSD hppa*-*-bsd*
-+HP/PA running OSF/1 hppa*-*-osf*
-+HP/PA Pro target hppa*-*-pro*
-+PMAX (MIPS) running Mach 3.0 mips*-*-mach3*
-+Sequent family i[3456]86-sequent-sysv4*
-+ i[3456]86-sequent-sysv*
-+ i[3456]86-sequent-bsd*
-+Tsqware Sparclet sparclet-*-*
-+Fujitsu SPARClite sparclite-fujitsu-none or sparclite
-+
-+* REMOVED configurations and files
-+
-+V850EA ISA
-+Motorola Delta 88000 running Sys V m88k-motorola-sysv or delta88
-+IBM AIX PS/2 i[3456]86-*-aix
-+i386 running Mach 3.0 i[3456]86-*-mach3*
-+i386 running Mach i[3456]86-*-mach*
-+i386 running OSF/1 i[3456]86-*osf1mk*
-+HP/Apollo 68k Family m68*-apollo*-sysv*,
-+ m68*-apollo*-bsd*,
-+ m68*-hp-bsd*, m68*-hp-hpux*
-+Argonaut Risc Chip (ARC) arc-*-*
-+Mitsubishi D30V d30v-*-*
-+Fujitsu FR30 fr30-*-elf*
-+OS/9000 i[34]86-*-os9k
-+I960 with MON960 i960-*-coff
-+
-+* MIPS $fp behavior changed
-+
-+The convenience variable $fp, for the MIPS, now consistently returns
-+the address of the current frame's base. Previously, depending on the
-+context, $fp could refer to either $sp or the current frame's base
-+address. See ``8.10 Registers'' in the manual ``Debugging with GDB:
-+The GNU Source-Level Debugger''.
-+
-+*** Changes in GDB 5.3:
-+
-+* GNU/Linux shared library multi-threaded performance improved.
-+
-+When debugging a multi-threaded application on GNU/Linux, GDB now uses
-+`/proc', in preference to `ptrace' for memory reads. This may result
-+in an improvement in the start-up time of multi-threaded, shared
-+library applications when run under GDB. One GDB user writes: ``loads
-+shared libs like mad''.
-+
-+* ``gdbserver'' now supports multi-threaded applications on some targets
-+
-+Support for debugging multi-threaded applications which use
-+the GNU/Linux LinuxThreads package has been added for
-+arm*-*-linux*-gnu*, i[3456]86-*-linux*-gnu*, mips*-*-linux*-gnu*,
-+powerpc*-*-linux*-gnu*, and sh*-*-linux*-gnu*.
-+
-+* GDB now supports C/C++ preprocessor macros.
-+
-+GDB now expands preprocessor macro invocations in C/C++ expressions,
-+and provides various commands for showing macro definitions and how
-+they expand.
-+
-+The new command `macro expand EXPRESSION' expands any macro
-+invocations in expression, and shows the result.
-+
-+The new command `show macro MACRO-NAME' shows the definition of the
-+macro named MACRO-NAME, and where it was defined.
-+
-+Most compilers don't include information about macros in the debugging
-+information by default. In GCC 3.1, for example, you need to compile
-+your program with the options `-gdwarf-2 -g3'. If the macro
-+information is present in the executable, GDB will read it.
-+
-+* Multi-arched targets.
-+
-+DEC Alpha (partial) alpha*-*-*
-+DEC VAX (partial) vax-*-*
-+NEC V850 v850-*-*
-+National Semiconductor NS32000 (partial) ns32k-*-*
-+Motorola 68000 (partial) m68k-*-*
-+Motorola MCORE mcore-*-*
-+
-+* New targets.
-+
-+Fujitsu FRV architecture added by Red Hat frv*-*-*
-+
-+
-+* New native configurations
-+
-+Alpha NetBSD alpha*-*-netbsd*
-+SH NetBSD sh*-*-netbsdelf*
-+MIPS NetBSD mips*-*-netbsd*
-+UltraSPARC NetBSD sparc64-*-netbsd*
-+
-+* OBSOLETE configurations and files
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+Mitsubishi D30V d30v-*-*
-+OS/9000 i[34]86-*-os9k
-+IBM AIX PS/2 i[3456]86-*-aix
-+Fujitsu FR30 fr30-*-elf*
-+Motorola Delta 88000 running Sys V m88k-motorola-sysv or delta88
-+Argonaut Risc Chip (ARC) arc-*-*
-+i386 running Mach 3.0 i[3456]86-*-mach3*
-+i386 running Mach i[3456]86-*-mach*
-+i386 running OSF/1 i[3456]86-*osf1mk*
-+HP/Apollo 68k Family m68*-apollo*-sysv*,
-+ m68*-apollo*-bsd*,
-+ m68*-hp-bsd*, m68*-hp-hpux*
-+I960 with MON960 i960-*-coff
-+
-+* OBSOLETE languages
-+
-+CHILL, a Pascal like language used by telecommunications companies.
-+
-+* REMOVED configurations and files
-+
-+AMD 29k family via UDI a29k-amd-udi, udi29k
-+A29K VxWorks a29k-*-vxworks
-+AMD 29000 embedded, using EBMON a29k-none-none
-+AMD 29000 embedded with COFF a29k-none-coff
-+AMD 29000 embedded with a.out a29k-none-aout
-+
-+testsuite/gdb.hp/gdb.threads-hp/ directory
-+
-+* New command "set max-user-call-depth <nnn>"
-+
-+This command allows the user to limit the call depth of user-defined
-+commands. The default is 1024.
-+
-+* Changes in FreeBSD/i386 native debugging.
-+
-+Support for the "generate-core-file" has been added.
-+
-+* New commands "dump", "append", and "restore".
-+
-+These commands allow data to be copied from target memory
-+to a bfd-format or binary file (dump and append), and back
-+from a file into memory (restore).
-+
-+* Improved "next/step" support on multi-processor Alpha Tru64.
-+
-+The previous single-step mechanism could cause unpredictable problems,
-+including the random appearance of SIGSEGV or SIGTRAP signals. The use
-+of a software single-step mechanism prevents this.
-+
-+*** Changes in GDB 5.2.1:
-+
-+* New targets.
-+
-+Atmel AVR avr*-*-*
-+
-+* Bug fixes
-+
-+gdb/182: gdb/323: gdb/237: On alpha, gdb was reporting:
-+mdebugread.c:2443: gdb-internal-error: sect_index_data not initialized
-+Fix, by Joel Brobecker imported from mainline.
-+
-+gdb/439: gdb/291: On some ELF object files, gdb was reporting:
-+dwarf2read.c:1072: gdb-internal-error: sect_index_text not initialize
-+Fix, by Fred Fish, imported from mainline.
-+
-+Dwarf2 .debug_frame & .eh_frame handler improved in many ways.
-+Surprisingly enough, it works now.
-+By Michal Ludvig, imported from mainline.
-+
-+i386 hardware watchpoint support:
-+avoid misses on second run for some targets.
-+By Pierre Muller, imported from mainline.
-+
-+*** Changes in GDB 5.2:
-+
-+* New command "set trust-readonly-sections on[off]".
-+
-+This command is a hint that tells gdb that read-only sections
-+really are read-only (ie. that their contents will not change).
-+In this mode, gdb will go to the object file rather than the
-+target to read memory from read-only sections (such as ".text").
-+This can be a significant performance improvement on some
-+(notably embedded) targets.
-+
-+* New command "generate-core-file" (or "gcore").
-+
-+This new gdb command allows the user to drop a core file of the child
-+process state at any time. So far it's been implemented only for
-+GNU/Linux and Solaris, but should be relatively easily ported to other
-+hosts. Argument is core file name (defaults to core.<pid>).
-+
-+* New command line option
-+
-+GDB now accepts --pid or -p followed by a process id.
-+
-+* Change in command line behavior -- corefiles vs. process ids.
-+
-+There is a subtle behavior in the way in which GDB handles
-+command line arguments. The first non-flag argument is always
-+a program to debug, but the second non-flag argument may either
-+be a corefile or a process id. Previously, GDB would attempt to
-+open the second argument as a corefile, and if that failed, would
-+issue a superfluous error message and then attempt to attach it as
-+a process. Now, if the second argument begins with a non-digit,
-+it will be treated as a corefile. If it begins with a digit,
-+GDB will attempt to attach it as a process, and if no such process
-+is found, will then attempt to open it as a corefile.
-+
-+* Changes in ARM configurations.
-+
-+Multi-arch support is enabled for all ARM configurations. The ARM/NetBSD
-+configuration is fully multi-arch.
-+
-+* New native configurations
-+
-+ARM NetBSD arm*-*-netbsd*
-+x86 OpenBSD i[3456]86-*-openbsd*
-+AMD x86-64 running GNU/Linux x86_64-*-linux-*
-+Sparc64 running FreeBSD sparc64-*-freebsd*
-+
-+* New targets
-+
-+Sanyo XStormy16 xstormy16-elf
-+
-+* OBSOLETE configurations and files
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+AMD 29k family via UDI a29k-amd-udi, udi29k
-+A29K VxWorks a29k-*-vxworks
-+AMD 29000 embedded, using EBMON a29k-none-none
-+AMD 29000 embedded with COFF a29k-none-coff
-+AMD 29000 embedded with a.out a29k-none-aout
-+
-+testsuite/gdb.hp/gdb.threads-hp/ directory
-+
-+* REMOVED configurations and files
-+
-+TI TMS320C80 tic80-*-*
-+WDC 65816 w65-*-*
-+PowerPC Solaris powerpcle-*-solaris*
-+PowerPC Windows NT powerpcle-*-cygwin32
-+PowerPC Netware powerpc-*-netware*
-+Harris/CXUX m88k m88*-harris-cxux*
-+Most ns32k hosts and targets ns32k-*-mach3* ns32k-umax-*
-+ ns32k-utek-sysv* ns32k-utek-*
-+SunOS 4.0.Xi on i386 i[3456]86-*-sunos*
-+Ultracomputer (29K) running Sym1 a29k-nyu-sym1 a29k-*-kern*
-+Sony NEWS (68K) running NEWSOS 3.x m68*-sony-sysv news
-+ISI Optimum V (3.05) under 4.3bsd. m68*-isi-*
-+Apple Macintosh (MPW) host and target N/A host, powerpc-*-macos*
-+
-+* Changes to command line processing
-+
-+The new `--args' feature can be used to specify command-line arguments
-+for the inferior from gdb's command line.
-+
-+* Changes to key bindings
-+
-+There is a new `operate-and-get-next' function bound to `C-o'.
-+
-+*** Changes in GDB 5.1.1
-+
-+Fix compile problem on DJGPP.
-+
-+Fix a problem with floating-point registers on the i386 being
-+corrupted.
-+
-+Fix to stop GDB crashing on .debug_str debug info.
-+
-+Numerous documentation fixes.
-+
-+Numerous testsuite fixes.
-+
-+*** Changes in GDB 5.1:
-+
-+* New native configurations
-+
-+Alpha FreeBSD alpha*-*-freebsd*
-+x86 FreeBSD 3.x and 4.x i[3456]86*-freebsd[34]*
-+MIPS GNU/Linux mips*-*-linux*
-+MIPS SGI Irix 6.x mips*-sgi-irix6*
-+ia64 AIX ia64-*-aix*
-+s390 and s390x GNU/Linux {s390,s390x}-*-linux*
-+
-+* New targets
-+
-+Motorola 68HC11 and 68HC12 m68hc11-elf
-+CRIS cris-axis
-+UltraSparc running GNU/Linux sparc64-*-linux*
-+
-+* OBSOLETE configurations and files
-+
-+x86 FreeBSD before 2.2 i[3456]86*-freebsd{1,2.[01]}*,
-+Harris/CXUX m88k m88*-harris-cxux*
-+Most ns32k hosts and targets ns32k-*-mach3* ns32k-umax-*
-+ ns32k-utek-sysv* ns32k-utek-*
-+TI TMS320C80 tic80-*-*
-+WDC 65816 w65-*-*
-+Ultracomputer (29K) running Sym1 a29k-nyu-sym1 a29k-*-kern*
-+PowerPC Solaris powerpcle-*-solaris*
-+PowerPC Windows NT powerpcle-*-cygwin32
-+PowerPC Netware powerpc-*-netware*
-+SunOS 4.0.Xi on i386 i[3456]86-*-sunos*
-+Sony NEWS (68K) running NEWSOS 3.x m68*-sony-sysv news
-+ISI Optimum V (3.05) under 4.3bsd. m68*-isi-*
-+Apple Macintosh (MPW) host N/A
-+
-+stuff.c (Program to stuff files into a specially prepared space in kdb)
-+kdb-start.c (Main loop for the standalone kernel debugger)
-+
-+Configurations that have been declared obsolete in this release have
-+been commented out. Unless there is activity to revive these
-+configurations, the next release of GDB will have their sources
-+permanently REMOVED.
-+
-+* REMOVED configurations and files
-+
-+Altos 3068 m68*-altos-*
-+Convex c1-*-*, c2-*-*
-+Pyramid pyramid-*-*
-+ARM RISCix arm-*-* (as host)
-+Tahoe tahoe-*-*
-+ser-ocd.c *-*-*
-+
-+* GDB has been converted to ISO C.
-+
-+GDB's source code has been converted to ISO C. In particular, the
-+sources are fully protoized, and rely on standard headers being
-+present.
-+
-+* Other news:
-+
-+* "info symbol" works on platforms which use COFF, ECOFF, XCOFF, and NLM.
-+
-+* The MI enabled by default.
-+
-+The new machine oriented interface (MI) introduced in GDB 5.0 has been
-+revised and enabled by default. Packages which use GDB as a debugging
-+engine behind a UI or another front end are encouraged to switch to
-+using the GDB/MI interface, instead of the old annotations interface
-+which is now deprecated.
-+
-+* Support for debugging Pascal programs.
-+
-+GDB now includes support for debugging Pascal programs. The following
-+main features are supported:
-+
-+ - Pascal-specific data types such as sets;
-+
-+ - automatic recognition of Pascal sources based on file-name
-+ extension;
-+
-+ - Pascal-style display of data types, variables, and functions;
-+
-+ - a Pascal expression parser.
-+
-+However, some important features are not yet supported.
-+
-+ - Pascal string operations are not supported at all;
-+
-+ - there are some problems with boolean types;
-+
-+ - Pascal type hexadecimal constants are not supported
-+ because they conflict with the internal variables format;
-+
-+ - support for Pascal objects and classes is not full yet;
-+
-+ - unlike Pascal, GDB is case-sensitive for symbol names.
-+
-+* Changes in completion.
-+
-+Commands such as `shell', `run' and `set args', which pass arguments
-+to inferior programs, now complete on file names, similar to what
-+users expect at the shell prompt.
-+
-+Commands which accept locations, such as `disassemble', `print',
-+`breakpoint', `until', etc. now complete on filenames as well as
-+program symbols. Thus, if you type "break foob TAB", and the source
-+files linked into the programs include `foobar.c', that file name will
-+be one of the candidates for completion. However, file names are not
-+considered for completion after you typed a colon that delimits a file
-+name from a name of a function in that file, as in "break foo.c:bar".
-+
-+`set demangle-style' completes on available demangling styles.
-+
-+* New platform-independent commands:
-+
-+It is now possible to define a post-hook for a command as well as a
-+hook that runs before the command. For more details, see the
-+documentation of `hookpost' in the GDB manual.
-+
-+* Changes in GNU/Linux native debugging.
-+
-+Support for debugging multi-threaded programs has been completely
-+revised for all platforms except m68k and sparc. You can now debug as
-+many threads as your system allows you to have.
-+
-+Attach/detach is supported for multi-threaded programs.
-+
-+Support for SSE registers was added for x86. This doesn't work for
-+multi-threaded programs though.
-+
-+* Changes in MIPS configurations.
-+
-+Multi-arch support is enabled for all MIPS configurations.
-+
-+GDB can now be built as native debugger on SGI Irix 6.x systems for
-+debugging n32 executables. (Debugging 64-bit executables is not yet
-+supported.)
-+
-+* Unified support for hardware watchpoints in all x86 configurations.
-+
-+Most (if not all) native x86 configurations support hardware-assisted
-+breakpoints and watchpoints in a unified manner. This support
-+implements debug register sharing between watchpoints, which allows to
-+put a virtually infinite number of watchpoints on the same address,
-+and also supports watching regions up to 16 bytes with several debug
-+registers.
-+
-+The new maintenance command `maintenance show-debug-regs' toggles
-+debugging print-outs in functions that insert, remove, and test
-+watchpoints and hardware breakpoints.
-+
-+* Changes in the DJGPP native configuration.
-+
-+New command ``info dos sysinfo'' displays assorted information about
-+the CPU, OS, memory, and DPMI server.
-+
-+New commands ``info dos gdt'', ``info dos ldt'', and ``info dos idt''
-+display information about segment descriptors stored in GDT, LDT, and
-+IDT.
-+
-+New commands ``info dos pde'' and ``info dos pte'' display entries
-+from Page Directory and Page Tables (for now works with CWSDPMI only).
-+New command ``info dos address-pte'' displays the Page Table entry for
-+a given linear address.
-+
-+GDB can now pass command lines longer than 126 characters to the
-+program being debugged (requires an update to the libdbg.a library
-+which is part of the DJGPP development kit).
-+
-+DWARF2 debug info is now supported.
-+
-+It is now possible to `step' and `next' through calls to `longjmp'.
-+
-+* Changes in documentation.
-+
-+All GDB documentation was converted to GFDL, the GNU Free
-+Documentation License.
-+
-+Tracepoints-related commands are now fully documented in the GDB
-+manual.
-+
-+TUI, the Text-mode User Interface, is now documented in the manual.
-+
-+Tracepoints-related commands are now fully documented in the GDB
-+manual.
-+
-+The "GDB Internals" manual now has an index. It also includes
-+documentation of `ui_out' functions, GDB coding standards, x86
-+hardware watchpoints, and memory region attributes.
-+
-+* GDB's version number moved to ``version.in''
-+
-+The Makefile variable VERSION has been replaced by the file
-+``version.in''. People creating GDB distributions should update the
-+contents of this file.
-+
-+* gdba.el deleted
-+
-+GUD support is now a standard part of the EMACS distribution.
-+
-+*** Changes in GDB 5.0:
-+
-+* Improved support for debugging FP programs on x86 targets
-+
-+Unified and much-improved support for debugging floating-point
-+programs on all x86 targets. In particular, ``info float'' now
-+displays the FP registers in the same format on all x86 targets, with
-+greater level of detail.
-+
-+* Improvements and bugfixes in hardware-assisted watchpoints
-+
-+It is now possible to watch array elements, struct members, and
-+bitfields with hardware-assisted watchpoints. Data-read watchpoints
-+on x86 targets no longer erroneously trigger when the address is
-+written.
-+
-+* Improvements in the native DJGPP version of GDB
-+
-+The distribution now includes all the scripts and auxiliary files
-+necessary to build the native DJGPP version on MS-DOS/MS-Windows
-+machines ``out of the box''.
-+
-+The DJGPP version can now debug programs that use signals. It is
-+possible to catch signals that happened in the debuggee, deliver
-+signals to it, interrupt it with Ctrl-C, etc. (Previously, a signal
-+would kill the program being debugged.) Programs that hook hardware
-+interrupts (keyboard, timer, etc.) can also be debugged.
-+
-+It is now possible to debug DJGPP programs that redirect their
-+standard handles or switch them to raw (as opposed to cooked) mode, or
-+even close them. The command ``run < foo > bar'' works as expected,
-+and ``info terminal'' reports useful information about the debuggee's
-+terminal, including raw/cooked mode, redirection, etc.
-+
-+The DJGPP version now uses termios functions for console I/O, which
-+enables debugging graphics programs. Interrupting GDB with Ctrl-C
-+also works.
-+
-+DOS-style file names with drive letters are now fully supported by
-+GDB.
-+
-+It is now possible to debug DJGPP programs that switch their working
-+directory. It is also possible to rerun the debuggee any number of
-+times without restarting GDB; thus, you can use the same setup,
-+breakpoints, etc. for many debugging sessions.
-+
-+* New native configurations
-+
-+ARM GNU/Linux arm*-*-linux*
-+PowerPC GNU/Linux powerpc-*-linux*
-+
-+* New targets
-+
-+Motorola MCore mcore-*-*
-+x86 VxWorks i[3456]86-*-vxworks*
-+PowerPC VxWorks powerpc-*-vxworks*
-+TI TMS320C80 tic80-*-*
-+
-+* OBSOLETE configurations
-+
-+Altos 3068 m68*-altos-*
-+Convex c1-*-*, c2-*-*
-+Pyramid pyramid-*-*
-+ARM RISCix arm-*-* (as host)
-+Tahoe tahoe-*-*
-+
-+Configurations that have been declared obsolete will be commented out,
-+but the code will be left in place. If there is no activity to revive
-+these configurations before the next release of GDB, the sources will
-+be permanently REMOVED.
-+
-+* Gould support removed
-+
-+Support for the Gould PowerNode and NP1 has been removed.
-+
-+* New features for SVR4
-+
-+On SVR4 native platforms (such as Solaris), if you attach to a process
-+without first loading a symbol file, GDB will now attempt to locate and
-+load symbols from the running process's executable file.
-+
-+* Many C++ enhancements
-+
-+C++ support has been greatly improved. Overload resolution now works properly
-+in almost all cases. RTTI support is on the way.
-+
-+* Remote targets can connect to a sub-program
-+
-+A popen(3) style serial-device has been added. This device starts a
-+sub-process (such as a stand-alone simulator) and then communicates
-+with that. The sub-program to run is specified using the syntax
-+``|<program> <args>'' vis:
-+
-+ (gdb) set remotedebug 1
-+ (gdb) target extended-remote |mn10300-elf-sim program-args
-+
-+* MIPS 64 remote protocol
-+
-+A long standing bug in the mips64 remote protocol where by GDB
-+expected certain 32 bit registers (ex SR) to be transfered as 32
-+instead of 64 bits has been fixed.
-+
-+The command ``set remote-mips64-transfers-32bit-regs on'' has been
-+added to provide backward compatibility with older versions of GDB.
-+
-+* ``set remotebinarydownload'' replaced by ``set remote X-packet''
-+
-+The command ``set remotebinarydownload'' command has been replaced by
-+``set remote X-packet''. Other commands in ``set remote'' family
-+include ``set remote P-packet''.
-+
-+* Breakpoint commands accept ranges.
-+
-+The breakpoint commands ``enable'', ``disable'', and ``delete'' now
-+accept a range of breakpoints, e.g. ``5-7''. The tracepoint command
-+``tracepoint passcount'' also accepts a range of tracepoints.
-+
-+* ``apropos'' command added.
-+
-+The ``apropos'' command searches through command names and
-+documentation strings, printing out matches, making it much easier to
-+try to find a command that does what you are looking for.
-+
-+* New MI interface
-+
-+A new machine oriented interface (MI) has been added to GDB. This
-+interface is designed for debug environments running GDB as a separate
-+process. This is part of the long term libGDB project. See the
-+"GDB/MI" chapter of the GDB manual for further information. It can be
-+enabled by configuring with:
-+
-+ .../configure --enable-gdbmi
-+
-+*** Changes in GDB-4.18:
-+
-+* New native configurations
-+
-+HP-UX 10.20 hppa*-*-hpux10.20
-+HP-UX 11.x hppa*-*-hpux11.0*
-+M68K GNU/Linux m68*-*-linux*
-+
-+* New targets
-+
-+Fujitsu FR30 fr30-*-elf*
-+Intel StrongARM strongarm-*-*
-+Mitsubishi D30V d30v-*-*
-+
-+* OBSOLETE configurations
-+
-+Gould PowerNode, NP1 np1-*-*, pn-*-*
-+
-+Configurations that have been declared obsolete will be commented out,
-+but the code will be left in place. If there is no activity to revive
-+these configurations before the next release of GDB, the sources will
-+be permanently REMOVED.
-+
-+* ANSI/ISO C
-+
-+As a compatibility experiment, GDB's source files buildsym.h and
-+buildsym.c have been converted to pure standard C, no longer
-+containing any K&R compatibility code. We believe that all systems in
-+use today either come with a standard C compiler, or have a GCC port
-+available. If this is not true, please report the affected
-+configuration to bug-gdb@gnu.org immediately. See the README file for
-+information about getting a standard C compiler if you don't have one
-+already.
-+
-+* Readline 2.2
-+
-+GDB now uses readline 2.2.
-+
-+* set extension-language
-+
-+You can now control the mapping between filename extensions and source
-+languages by using the `set extension-language' command. For instance,
-+you can ask GDB to treat .c files as C++ by saying
-+ set extension-language .c c++
-+The command `info extensions' lists all of the recognized extensions
-+and their associated languages.
-+
-+* Setting processor type for PowerPC and RS/6000
-+
-+When GDB is configured for a powerpc*-*-* or an rs6000*-*-* target,
-+you can use the `set processor' command to specify what variant of the
-+PowerPC family you are debugging. The command
-+
-+ set processor NAME
-+
-+sets the PowerPC/RS6000 variant to NAME. GDB knows about the
-+following PowerPC and RS6000 variants:
-+
-+ ppc-uisa PowerPC UISA - a PPC processor as viewed by user-level code
-+ rs6000 IBM RS6000 ("POWER") architecture, user-level view
-+ 403 IBM PowerPC 403
-+ 403GC IBM PowerPC 403GC
-+ 505 Motorola PowerPC 505
-+ 860 Motorola PowerPC 860 or 850
-+ 601 Motorola PowerPC 601
-+ 602 Motorola PowerPC 602
-+ 603 Motorola/IBM PowerPC 603 or 603e
-+ 604 Motorola PowerPC 604 or 604e
-+ 750 Motorola/IBM PowerPC 750 or 750
-+
-+At the moment, this command just tells GDB what to name the
-+special-purpose processor registers. Since almost all the affected
-+registers are inaccessible to user-level programs, this command is
-+only useful for remote debugging in its present form.
-+
-+* HP-UX support
-+
-+Thanks to a major code donation from Hewlett-Packard, GDB now has much
-+more extensive support for HP-UX. Added features include shared
-+library support, kernel threads and hardware watchpoints for 11.00,
-+support for HP's ANSI C and C++ compilers, and a compatibility mode
-+for xdb and dbx commands.
-+
-+* Catchpoints
-+
-+HP's donation includes the new concept of catchpoints, which is a
-+generalization of the old catch command. On HP-UX, it is now possible
-+to catch exec, fork, and vfork, as well as library loading.
-+
-+This means that the existing catch command has changed; its first
-+argument now specifies the type of catch to be set up. See the
-+output of "help catch" for a list of catchpoint types.
-+
-+* Debugging across forks
-+
-+On HP-UX, you can choose which process to debug when a fork() happens
-+in the inferior.
-+
-+* TUI
-+
-+HP has donated a curses-based terminal user interface (TUI). To get
-+it, build with --enable-tui. Although this can be enabled for any
-+configuration, at present it only works for native HP debugging.
-+
-+* GDB remote protocol additions
-+
-+A new protocol packet 'X' that writes binary data is now available.
-+Default behavior is to try 'X', then drop back to 'M' if the stub
-+fails to respond. The settable variable `remotebinarydownload'
-+allows explicit control over the use of 'X'.
-+
-+For 64-bit targets, the memory packets ('M' and 'm') can now contain a
-+full 64-bit address. The command
-+
-+ set remoteaddresssize 32
-+
-+can be used to revert to the old behaviour. For existing remote stubs
-+the change should not be noticed, as the additional address information
-+will be discarded.
-+
-+In order to assist in debugging stubs, you may use the maintenance
-+command `packet' to send any text string to the stub. For instance,
-+
-+ maint packet heythere
-+
-+sends the packet "$heythere#<checksum>". Note that it is very easy to
-+disrupt a debugging session by sending the wrong packet at the wrong
-+time.
-+
-+The compare-sections command allows you to compare section data on the
-+target to what is in the executable file without uploading or
-+downloading, by comparing CRC checksums.
-+
-+* Tracing can collect general expressions
-+
-+You may now collect general expressions at tracepoints. This requires
-+further additions to the target-side stub; see tracepoint.c and
-+doc/agentexpr.texi for further details.
-+
-+* mask-address variable for Mips
-+
-+For Mips targets, you may control the zeroing of the upper 32 bits of
-+a 64-bit address by entering `set mask-address on'. This is mainly
-+of interest to users of embedded R4xxx and R5xxx processors.
-+
-+* Higher serial baud rates
-+
-+GDB's serial code now allows you to specify baud rates 57600, 115200,
-+230400, and 460800 baud. (Note that your host system may not be able
-+to achieve all of these rates.)
-+
-+* i960 simulator
-+
-+The i960 configuration now includes an initial implementation of a
-+builtin simulator, contributed by Jim Wilson.
-+
-+
-+*** Changes in GDB-4.17:
-+
-+* New native configurations
-+
-+Alpha GNU/Linux alpha*-*-linux*
-+Unixware 2.x i[3456]86-unixware2*
-+Irix 6.x mips*-sgi-irix6*
-+PowerPC GNU/Linux powerpc-*-linux*
-+PowerPC Solaris powerpcle-*-solaris*
-+Sparc GNU/Linux sparc-*-linux*
-+Motorola sysV68 R3V7.1 m68k-motorola-sysv
-+
-+* New targets
-+
-+Argonaut Risc Chip (ARC) arc-*-*
-+Hitachi H8/300S h8300*-*-*
-+Matsushita MN10200 w/simulator mn10200-*-*
-+Matsushita MN10300 w/simulator mn10300-*-*
-+MIPS NEC VR4100 mips64*vr4100*{,el}-*-elf*
-+MIPS NEC VR5000 mips64*vr5000*{,el}-*-elf*
-+MIPS Toshiba TX39 mips64*tx39*{,el}-*-elf*
-+Mitsubishi D10V w/simulator d10v-*-*
-+Mitsubishi M32R/D w/simulator m32r-*-elf*
-+Tsqware Sparclet sparclet-*-*
-+NEC V850 w/simulator v850-*-*
-+
-+* New debugging protocols
-+
-+ARM with RDI protocol arm*-*-*
-+M68K with dBUG monitor m68*-*-{aout,coff,elf}
-+DDB and LSI variants of PMON protocol mips*-*-*
-+PowerPC with DINK32 monitor powerpc{,le}-*-eabi
-+PowerPC with SDS protocol powerpc{,le}-*-eabi
-+Macraigor OCD (Wiggler) devices powerpc{,le}-*-eabi
-+
-+* DWARF 2
-+
-+All configurations can now understand and use the DWARF 2 debugging
-+format. The choice is automatic, if the symbol file contains DWARF 2
-+information.
-+
-+* Java frontend
-+
-+GDB now includes basic Java language support. This support is
-+only useful with Java compilers that produce native machine code.
-+
-+* solib-absolute-prefix and solib-search-path
-+
-+For SunOS and SVR4 shared libraries, you may now set the prefix for
-+loading absolute shared library symbol files, and the search path for
-+locating non-absolute shared library symbol files.
-+
-+* Live range splitting
-+
-+GDB can now effectively debug code for which GCC has performed live
-+range splitting as part of its optimization. See gdb/doc/LRS for
-+more details on the expected format of the stabs information.
-+
-+* Hurd support
-+
-+GDB's support for the GNU Hurd, including thread debugging, has been
-+updated to work with current versions of the Hurd.
-+
-+* ARM Thumb support
-+
-+GDB's ARM target configuration now handles the ARM7T (Thumb) 16-bit
-+instruction set. ARM GDB automatically detects when Thumb
-+instructions are in use, and adjusts disassembly and backtracing
-+accordingly.
-+
-+* MIPS16 support
-+
-+GDB's MIPS target configurations now handle the MIP16 16-bit
-+instruction set.
-+
-+* Overlay support
-+
-+GDB now includes support for overlays; if an executable has been
-+linked such that multiple sections are based at the same address, GDB
-+will decide which section to use for symbolic info. You can choose to
-+control the decision manually, using overlay commands, or implement
-+additional target-side support and use "overlay load-target" to bring
-+in the overlay mapping. Do "help overlay" for more detail.
-+
-+* info symbol
-+
-+The command "info symbol <address>" displays information about
-+the symbol at the specified address.
-+
-+* Trace support
-+
-+The standard remote protocol now includes an extension that allows
-+asynchronous collection and display of trace data. This requires
-+extensive support in the target-side debugging stub. Tracing mode
-+includes a new interaction mode in GDB and new commands: see the
-+file tracepoint.c for more details.
-+
-+* MIPS simulator
-+
-+Configurations for embedded MIPS now include a simulator contributed
-+by Cygnus Solutions. The simulator supports the instruction sets
-+of most MIPS variants.
-+
-+* Sparc simulator
-+
-+Sparc configurations may now include the ERC32 simulator contributed
-+by the European Space Agency. The simulator is not built into
-+Sparc targets by default; configure with --enable-sim to include it.
-+
-+* set architecture
-+
-+For target configurations that may include multiple variants of a
-+basic architecture (such as MIPS and SH), you may now set the
-+architecture explicitly. "set arch" sets, "info arch" lists
-+the possible architectures.
-+
-+*** Changes in GDB-4.16:
-+
-+* New native configurations
-+
-+Windows 95, x86 Windows NT i[345]86-*-cygwin32
-+M68K NetBSD m68k-*-netbsd*
-+PowerPC AIX 4.x powerpc-*-aix*
-+PowerPC MacOS powerpc-*-macos*
-+PowerPC Windows NT powerpcle-*-cygwin32
-+RS/6000 AIX 4.x rs6000-*-aix4*
-+
-+* New targets
-+
-+ARM with RDP protocol arm-*-*
-+I960 with MON960 i960-*-coff
-+MIPS VxWorks mips*-*-vxworks*
-+MIPS VR4300 with PMON mips64*vr4300{,el}-*-elf*
-+PowerPC with PPCBUG monitor powerpc{,le}-*-eabi*
-+Hitachi SH3 sh-*-*
-+Matra Sparclet sparclet-*-*
-+
-+* PowerPC simulator
-+
-+The powerpc-eabi configuration now includes the PSIM simulator,
-+contributed by Andrew Cagney, with assistance from Mike Meissner.
-+PSIM is a very elaborate model of the PowerPC, including not only
-+basic instruction set execution, but also details of execution unit
-+performance and I/O hardware. See sim/ppc/README for more details.
-+
-+* Solaris 2.5
-+
-+GDB now works with Solaris 2.5.
-+
-+* Windows 95/NT native
-+
-+GDB will now work as a native debugger on Windows 95 and Windows NT.
-+To build it from source, you must use the "gnu-win32" environment,
-+which uses a DLL to emulate enough of Unix to run the GNU tools.
-+Further information, binaries, and sources are available at
-+ftp.cygnus.com, under pub/gnu-win32.
-+
-+* dont-repeat command
-+
-+If a user-defined command includes the command `dont-repeat', then the
-+command will not be repeated if the user just types return. This is
-+useful if the command is time-consuming to run, so that accidental
-+extra keystrokes don't run the same command many times.
-+
-+* Send break instead of ^C
-+
-+The standard remote protocol now includes an option to send a break
-+rather than a ^C to the target in order to interrupt it. By default,
-+GDB will send ^C; to send a break, set the variable `remotebreak' to 1.
-+
-+* Remote protocol timeout
-+
-+The standard remote protocol includes a new variable `remotetimeout'
-+that allows you to set the number of seconds before GDB gives up trying
-+to read from the target. The default value is 2.
-+
-+* Automatic tracking of dynamic object loading (HPUX and Solaris only)
-+
-+By default GDB will automatically keep track of objects as they are
-+loaded and unloaded by the dynamic linker. By using the command `set
-+stop-on-solib-events 1' you can arrange for GDB to stop the inferior
-+when shared library events occur, thus allowing you to set breakpoints
-+in shared libraries which are explicitly loaded by the inferior.
-+
-+Note this feature does not work on hpux8. On hpux9 you must link
-+/usr/lib/end.o into your program. This feature should work
-+automatically on hpux10.
-+
-+* Irix 5.x hardware watchpoint support
-+
-+Irix 5 configurations now support the use of hardware watchpoints.
-+
-+* Mips protocol "SYN garbage limit"
-+
-+When debugging a Mips target using the `target mips' protocol, you
-+may set the number of characters that GDB will ignore by setting
-+the `syn-garbage-limit'. A value of -1 means that GDB will ignore
-+every character. The default value is 1050.
-+
-+* Recording and replaying remote debug sessions
-+
-+If you set `remotelogfile' to the name of a file, gdb will write to it
-+a recording of a remote debug session. This recording may then be
-+replayed back to gdb using "gdbreplay". See gdbserver/README for
-+details. This is useful when you have a problem with GDB while doing
-+remote debugging; you can make a recording of the session and send it
-+to someone else, who can then recreate the problem.
-+
-+* Speedups for remote debugging
-+
-+GDB includes speedups for downloading and stepping MIPS systems using
-+the IDT monitor, fast downloads to the Hitachi SH E7000 emulator,
-+and more efficient S-record downloading.
-+
-+* Memory use reductions and statistics collection
-+
-+GDB now uses less memory and reports statistics about memory usage.
-+Try the `maint print statistics' command, for example.
-+
-+*** Changes in GDB-4.15:
-+
-+* Psymtabs for XCOFF
-+
-+The symbol reader for AIX GDB now uses partial symbol tables. This
-+can greatly improve startup time, especially for large executables.
-+
-+* Remote targets use caching
-+
-+Remote targets now use a data cache to speed up communication with the
-+remote side. The data cache could lead to incorrect results because
-+it doesn't know about volatile variables, thus making it impossible to
-+debug targets which use memory mapped I/O devices. `set remotecache
-+off' turns the the data cache off.
-+
-+* Remote targets may have threads
-+
-+The standard remote protocol now includes support for multiple threads
-+in the target system, using new protocol commands 'H' and 'T'. See
-+gdb/remote.c for details.
-+
-+* NetROM support
-+
-+If GDB is configured with `--enable-netrom', then it will include
-+support for the NetROM ROM emulator from XLNT Designs. The NetROM
-+acts as though it is a bank of ROM on the target board, but you can
-+write into it over the network. GDB's support consists only of
-+support for fast loading into the emulated ROM; to debug, you must use
-+another protocol, such as standard remote protocol. The usual
-+sequence is something like
-+
-+ target nrom <netrom-hostname>
-+ load <prog>
-+ target remote <netrom-hostname>:1235
-+
-+* Macintosh host
-+
-+GDB now includes support for the Apple Macintosh, as a host only. It
-+may be run as either an MPW tool or as a standalone application, and
-+it can debug through the serial port. All the usual GDB commands are
-+available, but to the target command, you must supply "serial" as the
-+device type instead of "/dev/ttyXX". See mpw-README in the main
-+directory for more information on how to build. The MPW configuration
-+scripts */mpw-config.in support only a few targets, and only the
-+mips-idt-ecoff target has been tested.
-+
-+* Autoconf
-+
-+GDB configuration now uses autoconf. This is not user-visible,
-+but does simplify configuration and building.
-+
-+* hpux10
-+
-+GDB now supports hpux10.
-+
-+*** Changes in GDB-4.14:
-+
-+* New native configurations
-+
-+x86 FreeBSD i[345]86-*-freebsd
-+x86 NetBSD i[345]86-*-netbsd
-+NS32k NetBSD ns32k-*-netbsd
-+Sparc NetBSD sparc-*-netbsd
-+
-+* New targets
-+
-+A29K VxWorks a29k-*-vxworks
-+HP PA PRO embedded (WinBond W89K & Oki OP50N) hppa*-*-pro*
-+CPU32 EST-300 emulator m68*-*-est*
-+PowerPC ELF powerpc-*-elf
-+WDC 65816 w65-*-*
-+
-+* Alpha OSF/1 support for procfs
-+
-+GDB now supports procfs under OSF/1-2.x and higher, which makes it
-+possible to attach to running processes. As the mounting of the /proc
-+filesystem is optional on the Alpha, GDB automatically determines
-+the availability of /proc during startup. This can lead to problems
-+if /proc is unmounted after GDB has been started.
-+
-+* Arguments to user-defined commands
-+
-+User commands may accept up to 10 arguments separated by whitespace.
-+Arguments are accessed within the user command via $arg0..$arg9. A
-+trivial example:
-+define adder
-+ print $arg0 + $arg1 + $arg2
-+
-+To execute the command use:
-+adder 1 2 3
-+
-+Defines the command "adder" which prints the sum of its three arguments.
-+Note the arguments are text substitutions, so they may reference variables,
-+use complex expressions, or even perform inferior function calls.
-+
-+* New `if' and `while' commands
-+
-+This makes it possible to write more sophisticated user-defined
-+commands. Both commands take a single argument, which is the
-+expression to evaluate, and must be followed by the commands to
-+execute, one per line, if the expression is nonzero, the list being
-+terminated by the word `end'. The `if' command list may include an
-+`else' word, which causes the following commands to be executed only
-+if the expression is zero.
-+
-+* Fortran source language mode
-+
-+GDB now includes partial support for Fortran 77. It will recognize
-+Fortran programs and can evaluate a subset of Fortran expressions, but
-+variables and functions may not be handled correctly. GDB will work
-+with G77, but does not yet know much about symbols emitted by other
-+Fortran compilers.
-+
-+* Better HPUX support
-+
-+Most debugging facilities now work on dynamic executables for HPPAs
-+running hpux9 or later. You can attach to running dynamically linked
-+processes, but by default the dynamic libraries will be read-only, so
-+for instance you won't be able to put breakpoints in them. To change
-+that behavior do the following before running the program:
-+
-+ adb -w a.out
-+ __dld_flags?W 0x5
-+ control-d
-+
-+This will cause the libraries to be mapped private and read-write.
-+To revert to the normal behavior, do this:
-+
-+ adb -w a.out
-+ __dld_flags?W 0x4
-+ control-d
-+
-+You cannot set breakpoints or examine data in the library until after
-+the library is loaded if the function/data symbols do not have
-+external linkage.
-+
-+GDB can now also read debug symbols produced by the HP C compiler on
-+HPPAs (sorry, no C++, Fortran or 68k support).
-+
-+* Target byte order now dynamically selectable
-+
-+You can choose which byte order to use with a target system, via the
-+commands "set endian big" and "set endian little", and you can see the
-+current setting by using "show endian". You can also give the command
-+"set endian auto", in which case GDB will use the byte order
-+associated with the executable. Currently, only embedded MIPS
-+configurations support dynamic selection of target byte order.
-+
-+* New DOS host serial code
-+
-+This version uses DPMI interrupts to handle buffered I/O, so you
-+no longer need to run asynctsr when debugging boards connected to
-+a PC's serial port.
-+
-+*** Changes in GDB-4.13:
-+
-+* New "complete" command
-+
-+This lists all the possible completions for the rest of the line, if it
-+were to be given as a command itself. This is intended for use by emacs.
-+
-+* Trailing space optional in prompt
-+
-+"set prompt" no longer adds a space for you after the prompt you set. This
-+allows you to set a prompt which ends in a space or one that does not.
-+
-+* Breakpoint hit counts
-+
-+"info break" now displays a count of the number of times the breakpoint
-+has been hit. This is especially useful in conjunction with "ignore"; you
-+can ignore a large number of breakpoint hits, look at the breakpoint info
-+to see how many times the breakpoint was hit, then run again, ignoring one
-+less than that number, and this will get you quickly to the last hit of
-+that breakpoint.
-+
-+* Ability to stop printing at NULL character
-+
-+"set print null-stop" will cause GDB to stop printing the characters of
-+an array when the first NULL is encountered. This is useful when large
-+arrays actually contain only short strings.
-+
-+* Shared library breakpoints
-+
-+In SunOS 4.x, SVR4, and Alpha OSF/1 configurations, you can now set
-+breakpoints in shared libraries before the executable is run.
-+
-+* Hardware watchpoints
-+
-+There is a new hardware breakpoint for the watch command for sparclite
-+targets. See gdb/sparclite/hw_breakpoint.note.
-+
-+Hardware watchpoints are also now supported under GNU/Linux.
-+
-+* Annotations
-+
-+Annotations have been added. These are for use with graphical interfaces,
-+and are still experimental. Currently only gdba.el uses these.
-+
-+* Improved Irix 5 support
-+
-+GDB now works properly with Irix 5.2.
-+
-+* Improved HPPA support
-+
-+GDB now works properly with the latest GCC and GAS.
-+
-+* New native configurations
-+
-+Sequent PTX4 i[34]86-sequent-ptx4
-+HPPA running OSF/1 hppa*-*-osf*
-+Atari TT running SVR4 m68*-*-sysv4*
-+RS/6000 LynxOS rs6000-*-lynxos*
-+
-+* New targets
-+
-+OS/9000 i[34]86-*-os9k
-+MIPS R4000 mips64*{,el}-*-{ecoff,elf}
-+Sparc64 sparc64-*-*
-+
-+* Hitachi SH7000 and E7000-PC ICE support
-+
-+There is now support for communicating with the Hitachi E7000-PC ICE.
-+This is available automatically when GDB is configured for the SH.
-+
-+* Fixes
-+
-+As usual, a variety of small fixes and improvements, both generic
-+and configuration-specific. See the ChangeLog for more detail.
-+
-+*** Changes in GDB-4.12:
-+
-+* Irix 5 is now supported
-+
-+* HPPA support
-+
-+GDB-4.12 on the HPPA has a number of changes which make it unable
-+to debug the output from the currently released versions of GCC and
-+GAS (GCC 2.5.8 and GAS-2.2 or PAGAS-1.36). Until the next major release
-+of GCC and GAS, versions of these tools designed to work with GDB-4.12
-+can be retrieved via anonymous ftp from jaguar.cs.utah.edu:/dist.
-+
-+
-+*** Changes in GDB-4.11:
-+
-+* User visible changes:
-+
-+* Remote Debugging
-+
-+The "set remotedebug" option is now consistent between the mips remote
-+target, remote targets using the gdb-specific protocol, UDI (AMD's
-+debug protocol for the 29k) and the 88k bug monitor. It is now an
-+integer specifying a debug level (normally 0 or 1, but 2 means more
-+debugging info for the mips target).
-+
-+* DEC Alpha native support
-+
-+GDB now works on the DEC Alpha. GCC 2.4.5 does not produce usable
-+debug info, but GDB works fairly well with the DEC compiler and should
-+work with a future GCC release. See the README file for a few
-+Alpha-specific notes.
-+
-+* Preliminary thread implementation
-+
-+GDB now has preliminary thread support for both SGI/Irix and LynxOS.
-+
-+* LynxOS native and target support for 386
-+
-+This release has been hosted on LynxOS 2.2, and also can be configured
-+to remotely debug programs running under LynxOS (see gdb/gdbserver/README
-+for details).
-+
-+* Improvements in C++ mangling/demangling.
-+
-+This release has much better g++ debugging, specifically in name
-+mangling/demangling, virtual function calls, print virtual table,
-+call methods, ...etc.
-+
-+*** Changes in GDB-4.10:
-+
-+ * User visible changes:
-+
-+Remote debugging using the GDB-specific (`target remote') protocol now
-+supports the `load' command. This is only useful if you have some
-+other way of getting the stub to the target system, and you can put it
-+somewhere in memory where it won't get clobbered by the download.
-+
-+Filename completion now works.
-+
-+When run under emacs mode, the "info line" command now causes the
-+arrow to point to the line specified. Also, "info line" prints
-+addresses in symbolic form (as well as hex).
-+
-+All vxworks based targets now support a user settable option, called
-+vxworks-timeout. This option represents the number of seconds gdb
-+should wait for responses to rpc's. You might want to use this if
-+your vxworks target is, perhaps, a slow software simulator or happens
-+to be on the far side of a thin network line.
-+
-+ * DEC alpha support
-+
-+This release contains support for using a DEC alpha as a GDB host for
-+cross debugging. Native alpha debugging is not supported yet.
-+
-+
-+*** Changes in GDB-4.9:
-+
-+ * Testsuite
-+
-+This is the first GDB release which is accompanied by a matching testsuite.
-+The testsuite requires installation of dejagnu, which should be available
-+via ftp from most sites that carry GNU software.
-+
-+ * C++ demangling
-+
-+'Cfront' style demangling has had its name changed to 'ARM' style, to
-+emphasize that it was written from the specifications in the C++ Annotated
-+Reference Manual, not necessarily to be compatible with AT&T cfront. Despite
-+disclaimers, it still generated too much confusion with users attempting to
-+use gdb with AT&T cfront.
-+
-+ * Simulators
-+
-+GDB now uses a standard remote interface to a simulator library.
-+So far, the library contains simulators for the Zilog Z8001/2, the
-+Hitachi H8/300, H8/500 and Super-H.
-+
-+ * New targets supported
-+
-+H8/300 simulator h8300-hitachi-hms or h8300hms
-+H8/500 simulator h8500-hitachi-hms or h8500hms
-+SH simulator sh-hitachi-hms or sh
-+Z8000 simulator z8k-zilog-none or z8ksim
-+IDT MIPS board over serial line mips-idt-ecoff
-+
-+Cross-debugging to GO32 targets is supported. It requires a custom
-+version of the i386-stub.c module which is integrated with the
-+GO32 memory extender.
-+
-+ * New remote protocols
-+
-+MIPS remote debugging protocol.
-+
-+ * New source languages supported
-+
-+This version includes preliminary support for Chill, a Pascal like language
-+used by telecommunications companies. Chill support is also being integrated
-+into the GNU compiler, but we don't know when it will be publically available.
-+
-+
-+*** Changes in GDB-4.8:
-+
-+ * HP Precision Architecture supported
-+
-+GDB now supports HP PA-RISC machines running HPUX. A preliminary
-+version of this support was available as a set of patches from the
-+University of Utah. GDB does not support debugging of programs
-+compiled with the HP compiler, because HP will not document their file
-+format. Instead, you must use GCC (version 2.3.2 or later) and PA-GAS
-+(as available from jaguar.cs.utah.edu:/dist/pa-gas.u4.tar.Z).
-+
-+Many problems in the preliminary version have been fixed.
-+
-+ * Faster and better demangling
-+
-+We have improved template demangling and fixed numerous bugs in the GNU style
-+demangler. It can now handle type modifiers such as `static' or `const'. Wide
-+character types (wchar_t) are now supported. Demangling of each symbol is now
-+only done once, and is cached when the symbol table for a file is read in.
-+This results in a small increase in memory usage for C programs, a moderate
-+increase in memory usage for C++ programs, and a fantastic speedup in
-+symbol lookups.
-+
-+`Cfront' style demangling still doesn't work with AT&T cfront. It was written
-+from the specifications in the Annotated Reference Manual, which AT&T's
-+compiler does not actually implement.
-+
-+ * G++ multiple inheritance compiler problem
-+
-+In the 2.3.2 release of gcc/g++, how the compiler resolves multiple
-+inheritance lattices was reworked to properly discover ambiguities. We
-+recently found an example which causes this new algorithm to fail in a
-+very subtle way, producing bad debug information for those classes.
-+The file 'gcc.patch' (in this directory) can be applied to gcc to
-+circumvent the problem. A future GCC release will contain a complete
-+fix.
-+
-+The previous G++ debug info problem (mentioned below for the gdb-4.7
-+release) is fixed in gcc version 2.3.2.
-+
-+ * Improved configure script
-+
-+The `configure' script will now attempt to guess your system type if
-+you don't supply a host system type. The old scheme of supplying a
-+host system triplet is preferable over using this. All the magic is
-+done in the new `config.guess' script. Examine it for details.
-+
-+We have also brought our configure script much more in line with the FSF's
-+version. It now supports the --with-xxx options. In particular,
-+`--with-minimal-bfd' can be used to make the GDB binary image smaller.
-+The resulting GDB will not be able to read arbitrary object file formats --
-+only the format ``expected'' to be used on the configured target system.
-+We hope to make this the default in a future release.
-+
-+ * Documentation improvements
-+
-+There's new internal documentation on how to modify GDB, and how to
-+produce clean changes to the code. We implore people to read it
-+before submitting changes.
-+
-+The GDB manual uses new, sexy Texinfo conditionals, rather than arcane
-+M4 macros. The new texinfo.tex is provided in this release. Pre-built
-+`info' files are also provided. To build `info' files from scratch,
-+you will need the latest `makeinfo' release, which will be available in
-+a future texinfo-X.Y release.
-+
-+*NOTE* The new texinfo.tex can cause old versions of TeX to hang.
-+We're not sure exactly which versions have this problem, but it has
-+been seen in 3.0. We highly recommend upgrading to TeX version 3.141
-+or better. If that isn't possible, there is a patch in
-+`texinfo/tex3patch' that will modify `texinfo/texinfo.tex' to work
-+around this problem.
-+
-+ * New features
-+
-+GDB now supports array constants that can be used in expressions typed in by
-+the user. The syntax is `{element, element, ...}'. Ie: you can now type
-+`print {1, 2, 3}', and it will build up an array in memory malloc'd in
-+the target program.
-+
-+The new directory `gdb/sparclite' contains a program that demonstrates
-+how the sparc-stub.c remote stub runs on a Fujitsu SPARClite processor.
-+
-+ * New native hosts supported
-+
-+HP/PA-RISC under HPUX using GNU tools hppa1.1-hp-hpux
-+386 CPUs running SCO Unix 3.2v4 i386-unknown-sco3.2v4
-+
-+ * New targets supported
-+
-+AMD 29k family via UDI a29k-amd-udi or udi29k
-+
-+ * New file formats supported
-+
-+BFD now supports reading HP/PA-RISC executables (SOM file format?),
-+HPUX core files, and SCO 3.2v2 core files.
-+
-+ * Major bug fixes
-+
-+Attaching to processes now works again; thanks for the many bug reports.
-+
-+We have also stomped on a bunch of core dumps caused by
-+printf_filtered("%s") problems.
-+
-+We eliminated a copyright problem on the rpc and ptrace header files
-+for VxWorks, which was discovered at the last minute during the 4.7
-+release. You should now be able to build a VxWorks GDB.
-+
-+You can now interrupt gdb while an attached process is running. This
-+will cause the attached process to stop, and give control back to GDB.
-+
-+We fixed problems caused by using too many file descriptors
-+for reading symbols from object files and libraries. This was
-+especially a problem for programs that used many (~100) shared
-+libraries.
-+
-+The `step' command now only enters a subroutine if there is line number
-+information for the subroutine. Otherwise it acts like the `next'
-+command. Previously, `step' would enter subroutines if there was
-+any debugging information about the routine. This avoids problems
-+when using `cc -g1' on MIPS machines.
-+
-+ * Internal improvements
-+
-+GDB's internal interfaces have been improved to make it easier to support
-+debugging of multiple languages in the future.
-+
-+GDB now uses a common structure for symbol information internally.
-+Minimal symbols (derived from linkage symbols in object files), partial
-+symbols (from a quick scan of debug information), and full symbols
-+contain a common subset of information, making it easier to write
-+shared code that handles any of them.
-+
-+ * New command line options
-+
-+We now accept --silent as an alias for --quiet.
-+
-+ * Mmalloc licensing
-+
-+The memory-mapped-malloc library is now licensed under the GNU Library
-+General Public License.
-+
-+*** Changes in GDB-4.7:
-+
-+ * Host/native/target split
-+
-+GDB has had some major internal surgery to untangle the support for
-+hosts and remote targets. Now, when you configure GDB for a remote
-+target, it will no longer load in all of the support for debugging
-+local programs on the host. When fully completed and tested, this will
-+ensure that arbitrary host/target combinations are possible.
-+
-+The primary conceptual shift is to separate the non-portable code in
-+GDB into three categories. Host specific code is required any time GDB
-+is compiled on that host, regardless of the target. Target specific
-+code relates to the peculiarities of the target, but can be compiled on
-+any host. Native specific code is everything else: it can only be
-+built when the host and target are the same system. Child process
-+handling and core file support are two common `native' examples.
-+
-+GDB's use of /proc for controlling Unix child processes is now cleaner.
-+It has been split out into a single module under the `target_ops' vector,
-+plus two native-dependent functions for each system that uses /proc.
-+
-+ * New hosts supported
-+
-+HP/Apollo 68k (under the BSD domain) m68k-apollo-bsd or apollo68bsd
-+386 CPUs running various BSD ports i386-unknown-bsd or 386bsd
-+386 CPUs running SCO Unix i386-unknown-scosysv322 or i386sco
-+
-+ * New targets supported
-+
-+Fujitsu SPARClite sparclite-fujitsu-none or sparclite
-+68030 and CPU32 m68030-*-*, m68332-*-*
-+
-+ * New native hosts supported
-+
-+386 CPUs running various BSD ports i386-unknown-bsd or 386bsd
-+ (386bsd is not well tested yet)
-+386 CPUs running SCO Unix i386-unknown-scosysv322 or sco
-+
-+ * New file formats supported
-+
-+BFD now supports COFF files for the Zilog Z8000 microprocessor. It
-+supports reading of `a.out.adobe' object files, which are an a.out
-+format extended with minimal information about multiple sections.
-+
-+ * New commands
-+
-+`show copying' is the same as the old `info copying'.
-+`show warranty' is the same as `info warrantee'.
-+These were renamed for consistency. The old commands continue to work.
-+
-+`info handle' is a new alias for `info signals'.
-+
-+You can now define pre-command hooks, which attach arbitrary command
-+scripts to any command. The commands in the hook will be executed
-+prior to the user's command. You can also create a hook which will be
-+executed whenever the program stops. See gdb.texinfo.
-+
-+ * C++ improvements
-+
-+We now deal with Cfront style name mangling, and can even extract type
-+info from mangled symbols. GDB can automatically figure out which
-+symbol mangling style your C++ compiler uses.
-+
-+Calling of methods and virtual functions has been improved as well.
-+
-+ * Major bug fixes
-+
-+The crash that occured when debugging Sun Ansi-C compiled binaries is
-+fixed. This was due to mishandling of the extra N_SO stabs output
-+by the compiler.
-+
-+We also finally got Ultrix 4.2 running in house, and fixed core file
-+support, with help from a dozen people on the net.
-+
-+John M. Farrell discovered that the reason that single-stepping was so
-+slow on all of the Mips based platforms (primarily SGI and DEC) was
-+that we were trying to demangle and lookup a symbol used for internal
-+purposes on every instruction that was being stepped through. Changing
-+the name of that symbol so that it couldn't be mistaken for a C++
-+mangled symbol sped things up a great deal.
-+
-+Rich Pixley sped up symbol lookups in general by getting much smarter
-+about when C++ symbol mangling is necessary. This should make symbol
-+completion (TAB on the command line) much faster. It's not as fast as
-+we'd like, but it's significantly faster than gdb-4.6.
-+
-+ * AMD 29k support
-+
-+A new user controllable variable 'call_scratch_address' can
-+specify the location of a scratch area to be used when GDB
-+calls a function in the target. This is necessary because the
-+usual method of putting the scratch area on the stack does not work
-+in systems that have separate instruction and data spaces.
-+
-+We integrated changes to support the 29k UDI (Universal Debugger
-+Interface), but discovered at the last minute that we didn't have all
-+of the appropriate copyright paperwork. We are working with AMD to
-+resolve this, and hope to have it available soon.
-+
-+ * Remote interfaces
-+
-+We have sped up the remote serial line protocol, especially for targets
-+with lots of registers. It now supports a new `expedited status' ('T')
-+message which can be used in place of the existing 'S' status message.
-+This allows the remote stub to send only the registers that GDB
-+needs to make a quick decision about single-stepping or conditional
-+breakpoints, eliminating the need to fetch the entire register set for
-+each instruction being stepped through.
-+
-+The GDB remote serial protocol now implements a write-through cache for
-+registers, only re-reading the registers if the target has run.
-+
-+There is also a new remote serial stub for SPARC processors. You can
-+find it in gdb-4.7/gdb/sparc-stub.c. This was written to support the
-+Fujitsu SPARClite processor, but will run on any stand-alone SPARC
-+processor with a serial port.
-+
-+ * Configuration
-+
-+Configure.in files have become much easier to read and modify. A new
-+`table driven' format makes it more obvious what configurations are
-+supported, and what files each one uses.
-+
-+ * Library changes
-+
-+There is a new opcodes library which will eventually contain all of the
-+disassembly routines and opcode tables. At present, it only contains
-+Sparc and Z8000 routines. This will allow the assembler, debugger, and
-+disassembler (binutils/objdump) to share these routines.
-+
-+The libiberty library is now copylefted under the GNU Library General
-+Public License. This allows more liberal use, and was done so libg++
-+can use it. This makes no difference to GDB, since the Library License
-+grants all the rights from the General Public License.
-+
-+ * Documentation
-+
-+The file gdb-4.7/gdb/doc/stabs.texinfo is a (relatively) complete
-+reference to the stabs symbol info used by the debugger. It is (as far
-+as we know) the only published document on this fascinating topic. We
-+encourage you to read it, compare it to the stabs information on your
-+system, and send improvements on the document in general (to
-+bug-gdb@prep.ai.mit.edu).
-+
-+And, of course, many bugs have been fixed.
-+
-+
-+*** Changes in GDB-4.6:
-+
-+ * Better support for C++ function names
-+
-+GDB now accepts as input the "demangled form" of C++ overloaded function
-+names and member function names, and can do command completion on such names
-+(using TAB, TAB-TAB, and ESC-?). The names have to be quoted with a pair of
-+single quotes. Examples are 'func (int, long)' and 'obj::operator==(obj&)'.
-+Make use of command completion, it is your friend.
-+
-+GDB also now accepts a variety of C++ mangled symbol formats. They are
-+the GNU g++ style, the Cfront (ARM) style, and the Lucid (lcc) style.
-+You can tell GDB which format to use by doing a 'set demangle-style {gnu,
-+lucid, cfront, auto}'. 'gnu' is the default. Do a 'set demangle-style foo'
-+for the list of formats.
-+
-+ * G++ symbol mangling problem
-+
-+Recent versions of gcc have a bug in how they emit debugging information for
-+C++ methods (when using dbx-style stabs). The file 'gcc.patch' (in this
-+directory) can be applied to gcc to fix the problem. Alternatively, if you
-+can't fix gcc, you can #define GCC_MANGLE_BUG when compling gdb/symtab.c. The
-+usual symptom is difficulty with setting breakpoints on methods. GDB complains
-+about the method being non-existent. (We believe that version 2.2.2 of GCC has
-+this problem.)
-+
-+ * New 'maintenance' command
-+
-+All of the commands related to hacking GDB internals have been moved out of
-+the main command set, and now live behind the 'maintenance' command. This
-+can also be abbreviated as 'mt'. The following changes were made:
-+
-+ dump-me -> maintenance dump-me
-+ info all-breakpoints -> maintenance info breakpoints
-+ printmsyms -> maintenance print msyms
-+ printobjfiles -> maintenance print objfiles
-+ printpsyms -> maintenance print psymbols
-+ printsyms -> maintenance print symbols
-+
-+The following commands are new:
-+
-+ maintenance demangle Call internal GDB demangler routine to
-+ demangle a C++ link name and prints the result.
-+ maintenance print type Print a type chain for a given symbol
-+
-+ * Change to .gdbinit file processing
-+
-+We now read the $HOME/.gdbinit file before processing the argv arguments
-+(e.g. reading symbol files or core files). This allows global parameters to
-+be set, which will apply during the symbol reading. The ./.gdbinit is still
-+read after argv processing.
-+
-+ * New hosts supported
-+
-+Solaris-2.0 !!! sparc-sun-solaris2 or sun4sol2
-+
-+GNU/Linux support i386-unknown-linux or linux
-+
-+We are also including code to support the HP/PA running BSD and HPUX. This
-+is almost guaranteed not to work, as we didn't have time to test or build it
-+for this release. We are including it so that the more adventurous (or
-+masochistic) of you can play with it. We also had major problems with the
-+fact that the compiler that we got from HP doesn't support the -g option.
-+It costs extra.
-+
-+ * New targets supported
-+
-+Hitachi H8/300 h8300-hitachi-hms or h8300hms
-+
-+ * More smarts about finding #include files
-+
-+GDB now remembers the compilation directory for all include files, and for
-+all files from which C is generated (like yacc and lex sources). This
-+greatly improves GDB's ability to find yacc/lex sources, and include files,
-+especially if you are debugging your program from a directory different from
-+the one that contains your sources.
-+
-+We also fixed a bug which caused difficulty with listing and setting
-+breakpoints in include files which contain C code. (In the past, you had to
-+try twice in order to list an include file that you hadn't looked at before.)
-+
-+ * Interesting infernals change
-+
-+GDB now deals with arbitrary numbers of sections, where the symbols for each
-+section must be relocated relative to that section's landing place in the
-+target's address space. This work was needed to support ELF with embedded
-+stabs used by Solaris-2.0.
-+
-+ * Bug fixes (of course!)
-+
-+There have been loads of fixes for the following things:
-+ mips, rs6000, 29k/udi, m68k, g++, type handling, elf/dwarf, m88k,
-+ i960, stabs, DOS(GO32), procfs, etc...
-+
-+See the ChangeLog for details.
-+
-+*** Changes in GDB-4.5:
-+
-+ * New machines supported (host and target)
-+
-+IBM RS6000 running AIX rs6000-ibm-aix or rs6000
-+
-+SGI Irix-4.x mips-sgi-irix4 or iris4
-+
-+ * New malloc package
-+
-+GDB now uses a new memory manager called mmalloc, based on gmalloc.
-+Mmalloc is capable of handling mutiple heaps of memory. It is also
-+capable of saving a heap to a file, and then mapping it back in later.
-+This can be used to greatly speedup the startup of GDB by using a
-+pre-parsed symbol table which lives in a mmalloc managed heap. For
-+more details, please read mmalloc/mmalloc.texi.
-+
-+ * info proc
-+
-+The 'info proc' command (SVR4 only) has been enhanced quite a bit. See
-+'help info proc' for details.
-+
-+ * MIPS ecoff symbol table format
-+
-+The code that reads MIPS symbol table format is now supported on all hosts.
-+Thanks to MIPS for releasing the sym.h and symconst.h files to make this
-+possible.
-+
-+ * File name changes for MS-DOS
-+
-+Many files in the config directories have been renamed to make it easier to
-+support GDB on MS-DOSe systems (which have very restrictive file name
-+conventions :-( ). MS-DOSe host support (under DJ Delorie's GO32
-+environment) is close to working but has some remaining problems. Note
-+that debugging of DOS programs is not supported, due to limitations
-+in the ``operating system'', but it can be used to host cross-debugging.
-+
-+ * Cross byte order fixes
-+
-+Many fixes have been made to support cross debugging of Sparc and MIPS
-+targets from hosts whose byte order differs.
-+
-+ * New -mapped and -readnow options
-+
-+If memory-mapped files are available on your system through the 'mmap'
-+system call, you can use the -mapped option on the `file' or
-+`symbol-file' commands to cause GDB to write the symbols from your
-+program into a reusable file. If the program you are debugging is
-+called `/path/fred', the mapped symbol file will be `./fred.syms'.
-+Future GDB debugging sessions will notice the presence of this file,
-+and will quickly map in symbol information from it, rather than reading
-+the symbol table from the executable program. Using the '-mapped'
-+option in a GDB `file' or `symbol-file' command has the same effect as
-+starting GDB with the '-mapped' command-line option.
-+
-+You can cause GDB to read the entire symbol table immediately by using
-+the '-readnow' option with any of the commands that load symbol table
-+information (or on the GDB command line). This makes the command
-+slower, but makes future operations faster.
-+
-+The -mapped and -readnow options are typically combined in order to
-+build a `fred.syms' file that contains complete symbol information.
-+A simple GDB invocation to do nothing but build a `.syms' file for future
-+use is:
-+
-+ gdb -batch -nx -mapped -readnow programname
-+
-+The `.syms' file is specific to the host machine on which GDB is run.
-+It holds an exact image of GDB's internal symbol table. It cannot be
-+shared across multiple host platforms.
-+
-+ * longjmp() handling
-+
-+GDB is now capable of stepping and nexting over longjmp(), _longjmp(), and
-+siglongjmp() without losing control. This feature has not yet been ported to
-+all systems. It currently works on many 386 platforms, all MIPS-based
-+platforms (SGI, DECstation, etc), and Sun3/4.
-+
-+ * Solaris 2.0
-+
-+Preliminary work has been put in to support the new Solaris OS from Sun. At
-+this time, it can control and debug processes, but it is not capable of
-+reading symbols.
-+
-+ * Bug fixes
-+
-+As always, many many bug fixes. The major areas were with g++, and mipsread.
-+People using the MIPS-based platforms should experience fewer mysterious
-+crashes and trashed symbol tables.
-+
-+*** Changes in GDB-4.4:
-+
-+ * New machines supported (host and target)
-+
-+SCO Unix on i386 IBM PC clones i386-sco-sysv or i386sco
-+ (except core files)
-+BSD Reno on Vax vax-dec-bsd
-+Ultrix on Vax vax-dec-ultrix
-+
-+ * New machines supported (target)
-+
-+AMD 29000 embedded, using EBMON a29k-none-none
-+
-+ * C++ support
-+
-+GDB continues to improve its handling of C++. `References' work better.
-+The demangler has also been improved, and now deals with symbols mangled as
-+per the Annotated C++ Reference Guide.
-+
-+GDB also now handles `stabs' symbol information embedded in MIPS
-+`ecoff' symbol tables. Since the ecoff format was not easily
-+extensible to handle new languages such as C++, this appeared to be a
-+good way to put C++ debugging info into MIPS binaries. This option
-+will be supported in the GNU C compiler, version 2, when it is
-+released.
-+
-+ * New features for SVR4
-+
-+GDB now handles SVR4 shared libraries, in the same fashion as SunOS
-+shared libraries. Debugging dynamically linked programs should present
-+only minor differences from debugging statically linked programs.
-+
-+The `info proc' command will print out information about any process
-+on an SVR4 system (including the one you are debugging). At the moment,
-+it prints the address mappings of the process.
-+
-+If you bring up GDB on another SVR4 system, please send mail to
-+bug-gdb@prep.ai.mit.edu to let us know what changes were reqired (if any).
-+
-+ * Better dynamic linking support in SunOS
-+
-+Reading symbols from shared libraries which contain debugging symbols
-+now works properly. However, there remain issues such as automatic
-+skipping of `transfer vector' code during function calls, which
-+make it harder to debug code in a shared library, than to debug the
-+same code linked statically.
-+
-+ * New Getopt
-+
-+GDB is now using the latest `getopt' routines from the FSF. This
-+version accepts the -- prefix for options with long names. GDB will
-+continue to accept the old forms (-option and +option) as well.
-+Various single letter abbreviations for options have been explicity
-+added to the option table so that they won't get overshadowed in the
-+future by other options that begin with the same letter.
-+
-+ * Bugs fixed
-+
-+The `cleanup_undefined_types' bug that many of you noticed has been squashed.
-+Many assorted bugs have been handled. Many more remain to be handled.
-+See the various ChangeLog files (primarily in gdb and bfd) for details.
-+
-+
-+*** Changes in GDB-4.3:
-+
-+ * New machines supported (host and target)
-+
-+Amiga 3000 running Amix m68k-cbm-svr4 or amix
-+NCR 3000 386 running SVR4 i386-ncr-svr4 or ncr3000
-+Motorola Delta 88000 running Sys V m88k-motorola-sysv or delta88
-+
-+ * Almost SCO Unix support
-+
-+We had hoped to support:
-+SCO Unix on i386 IBM PC clones i386-sco-sysv or i386sco
-+(except for core file support), but we discovered very late in the release
-+that it has problems with process groups that render gdb unusable. Sorry
-+about that. I encourage people to fix it and post the fixes.
-+
-+ * Preliminary ELF and DWARF support
-+
-+GDB can read ELF object files on System V Release 4, and can handle
-+debugging records for C, in DWARF format, in ELF files. This support
-+is preliminary. If you bring up GDB on another SVR4 system, please
-+send mail to bug-gdb@prep.ai.mit.edu to let us know what changes were
-+reqired (if any).
-+
-+ * New Readline
-+
-+GDB now uses the latest `readline' library. One user-visible change
-+is that two tabs will list possible command completions, which previously
-+required typing M-? (meta-question mark, or ESC ?).
-+
-+ * Bugs fixed
-+
-+The `stepi' bug that many of you noticed has been squashed.
-+Many bugs in C++ have been handled. Many more remain to be handled.
-+See the various ChangeLog files (primarily in gdb and bfd) for details.
-+
-+ * State of the MIPS world (in case you wondered):
-+
-+GDB can understand the symbol tables emitted by the compilers
-+supplied by most vendors of MIPS-based machines, including DEC. These
-+symbol tables are in a format that essentially nobody else uses.
-+
-+Some versions of gcc come with an assembler post-processor called
-+mips-tfile. This program is required if you want to do source-level
-+debugging of gcc-compiled programs. I believe FSF does not ship
-+mips-tfile with gcc version 1, but it will eventually come with gcc
-+version 2.
-+
-+Debugging of g++ output remains a problem. g++ version 1.xx does not
-+really support it at all. (If you're lucky, you should be able to get
-+line numbers and stack traces to work, but no parameters or local
-+variables.) With some work it should be possible to improve the
-+situation somewhat.
-+
-+When gcc version 2 is released, you will have somewhat better luck.
-+However, even then you will get confusing results for inheritance and
-+methods.
-+
-+We will eventually provide full debugging of g++ output on
-+DECstations. This will probably involve some kind of stabs-in-ecoff
-+encapulation, but the details have not been worked out yet.
-+
-+
-+*** Changes in GDB-4.2:
-+
-+ * Improved configuration
-+
-+Only one copy of `configure' exists now, and it is not self-modifying.
-+Porting BFD is simpler.
-+
-+ * Stepping improved
-+
-+The `step' and `next' commands now only stop at the first instruction
-+of a source line. This prevents the multiple stops that used to occur
-+in switch statements, for-loops, etc. `Step' continues to stop if a
-+function that has debugging information is called within the line.
-+
-+ * Bug fixing
-+
-+Lots of small bugs fixed. More remain.
-+
-+ * New host supported (not target)
-+
-+Intel 386 PC clone running Mach i386-none-mach
-+
-+
-+*** Changes in GDB-4.1:
-+
-+ * Multiple source language support
-+
-+GDB now has internal scaffolding to handle several source languages.
-+It determines the type of each source file from its filename extension,
-+and will switch expression parsing and number formatting to match the
-+language of the function in the currently selected stack frame.
-+You can also specifically set the language to be used, with
-+`set language c' or `set language modula-2'.
-+
-+ * GDB and Modula-2
-+
-+GDB now has preliminary support for the GNU Modula-2 compiler,
-+currently under development at the State University of New York at
-+Buffalo. Development of both GDB and the GNU Modula-2 compiler will
-+continue through the fall of 1991 and into 1992.
-+
-+Other Modula-2 compilers are currently not supported, and attempting to
-+debug programs compiled with them will likely result in an error as the
-+symbol table is read. Feel free to work on it, though!
-+
-+There are hooks in GDB for strict type checking and range checking,
-+in the `Modula-2 philosophy', but they do not currently work.
-+
-+ * set write on/off
-+
-+GDB can now write to executable and core files (e.g. patch
-+a variable's value). You must turn this switch on, specify
-+the file ("exec foo" or "core foo"), *then* modify it, e.g.
-+by assigning a new value to a variable. Modifications take
-+effect immediately.
-+
-+ * Automatic SunOS shared library reading
-+
-+When you run your program, GDB automatically determines where its
-+shared libraries (if any) have been loaded, and reads their symbols.
-+The `share' command is no longer needed. This also works when
-+examining core files.
-+
-+ * set listsize
-+
-+You can specify the number of lines that the `list' command shows.
-+The default is 10.
-+
-+ * New machines supported (host and target)
-+
-+SGI Iris (MIPS) running Irix V3: mips-sgi-irix or iris
-+Sony NEWS (68K) running NEWSOS 3.x: m68k-sony-sysv or news
-+Ultracomputer (29K) running Sym1: a29k-nyu-sym1 or ultra3
-+
-+ * New hosts supported (not targets)
-+
-+IBM RT/PC: romp-ibm-aix or rtpc
-+
-+ * New targets supported (not hosts)
-+
-+AMD 29000 embedded with COFF a29k-none-coff
-+AMD 29000 embedded with a.out a29k-none-aout
-+Ultracomputer remote kernel debug a29k-nyu-kern
-+
-+ * New remote interfaces
-+
-+AMD 29000 Adapt
-+AMD 29000 Minimon
-+
-+
-+*** Changes in GDB-4.0:
-+
-+ * New Facilities
-+
-+Wide output is wrapped at good places to make the output more readable.
-+
-+Gdb now supports cross-debugging from a host machine of one type to a
-+target machine of another type. Communication with the target system
-+is over serial lines. The ``target'' command handles connecting to the
-+remote system; the ``load'' command will download a program into the
-+remote system. Serial stubs for the m68k and i386 are provided. Gdb
-+also supports debugging of realtime processes running under VxWorks,
-+using SunRPC Remote Procedure Calls over TCP/IP to talk to a debugger
-+stub on the target system.
-+
-+New CPUs supported include the AMD 29000 and Intel 960.
-+
-+GDB now reads object files and symbol tables via a ``binary file''
-+library, which allows a single copy of GDB to debug programs of multiple
-+object file types such as a.out and coff.
-+
-+There is now a GDB reference card in "doc/refcard.tex". (Make targets
-+refcard.dvi and refcard.ps are available to format it).
-+
-+
-+ * Control-Variable user interface simplified
-+
-+All variables that control the operation of the debugger can be set
-+by the ``set'' command, and displayed by the ``show'' command.
-+
-+For example, ``set prompt new-gdb=>'' will change your prompt to new-gdb=>.
-+``Show prompt'' produces the response:
-+Gdb's prompt is new-gdb=>.
-+
-+What follows are the NEW set commands. The command ``help set'' will
-+print a complete list of old and new set commands. ``help set FOO''
-+will give a longer description of the variable FOO. ``show'' will show
-+all of the variable descriptions and their current settings.
-+
-+confirm on/off: Enables warning questions for operations that are
-+ hard to recover from, e.g. rerunning the program while
-+ it is already running. Default is ON.
-+
-+editing on/off: Enables EMACS style command line editing
-+ of input. Previous lines can be recalled with
-+ control-P, the current line can be edited with control-B,
-+ you can search for commands with control-R, etc.
-+ Default is ON.
-+
-+history filename NAME: NAME is where the gdb command history
-+ will be stored. The default is .gdb_history,
-+ or the value of the environment variable
-+ GDBHISTFILE.
-+
-+history size N: The size, in commands, of the command history. The
-+ default is 256, or the value of the environment variable
-+ HISTSIZE.
-+
-+history save on/off: If this value is set to ON, the history file will
-+ be saved after exiting gdb. If set to OFF, the
-+ file will not be saved. The default is OFF.
-+
-+history expansion on/off: If this value is set to ON, then csh-like
-+ history expansion will be performed on
-+ command line input. The default is OFF.
-+
-+radix N: Sets the default radix for input and output. It can be set
-+ to 8, 10, or 16. Note that the argument to "radix" is interpreted
-+ in the current radix, so "set radix 10" is always a no-op.
-+
-+height N: This integer value is the number of lines on a page. Default
-+ is 24, the current `stty rows'' setting, or the ``li#''
-+ setting from the termcap entry matching the environment
-+ variable TERM.
-+
-+width N: This integer value is the number of characters on a line.
-+ Default is 80, the current `stty cols'' setting, or the ``co#''
-+ setting from the termcap entry matching the environment
-+ variable TERM.
-+
-+Note: ``set screensize'' is obsolete. Use ``set height'' and
-+``set width'' instead.
-+
-+print address on/off: Print memory addresses in various command displays,
-+ such as stack traces and structure values. Gdb looks
-+ more ``symbolic'' if you turn this off; it looks more
-+ ``machine level'' with it on. Default is ON.
-+
-+print array on/off: Prettyprint arrays. New convenient format! Default
-+ is OFF.
-+
-+print demangle on/off: Print C++ symbols in "source" form if on,
-+ "raw" form if off.
-+
-+print asm-demangle on/off: Same, for assembler level printouts
-+ like instructions.
-+
-+print vtbl on/off: Prettyprint C++ virtual function tables. Default is OFF.
-+
-+
-+ * Support for Epoch Environment.
-+
-+The epoch environment is a version of Emacs v18 with windowing. One
-+new command, ``inspect'', is identical to ``print'', except that if you
-+are running in the epoch environment, the value is printed in its own
-+window.
-+
-+
-+ * Support for Shared Libraries
-+
-+GDB can now debug programs and core files that use SunOS shared libraries.
-+Symbols from a shared library cannot be referenced
-+before the shared library has been linked with the program (this
-+happens after you type ``run'' and before the function main() is entered).
-+At any time after this linking (including when examining core files
-+from dynamically linked programs), gdb reads the symbols from each
-+shared library when you type the ``sharedlibrary'' command.
-+It can be abbreviated ``share''.
-+
-+sharedlibrary REGEXP: Load shared object library symbols for files
-+ matching a unix regular expression. No argument
-+ indicates to load symbols for all shared libraries.
-+
-+info sharedlibrary: Status of loaded shared libraries.
-+
-+
-+ * Watchpoints
-+
-+A watchpoint stops execution of a program whenever the value of an
-+expression changes. Checking for this slows down execution
-+tremendously whenever you are in the scope of the expression, but is
-+quite useful for catching tough ``bit-spreader'' or pointer misuse
-+problems. Some machines such as the 386 have hardware for doing this
-+more quickly, and future versions of gdb will use this hardware.
-+
-+watch EXP: Set a watchpoint (breakpoint) for an expression.
-+
-+info watchpoints: Information about your watchpoints.
-+
-+delete N: Deletes watchpoint number N (same as breakpoints).
-+disable N: Temporarily turns off watchpoint number N (same as breakpoints).
-+enable N: Re-enables watchpoint number N (same as breakpoints).
-+
-+
-+ * C++ multiple inheritance
-+
-+When used with a GCC version 2 compiler, GDB supports multiple inheritance
-+for C++ programs.
-+
-+ * C++ exception handling
-+
-+Gdb now supports limited C++ exception handling. Besides the existing
-+ability to breakpoint on an exception handler, gdb can breakpoint on
-+the raising of an exception (before the stack is peeled back to the
-+handler's context).
-+
-+catch FOO: If there is a FOO exception handler in the dynamic scope,
-+ set a breakpoint to catch exceptions which may be raised there.
-+ Multiple exceptions (``catch foo bar baz'') may be caught.
-+
-+info catch: Lists all exceptions which may be caught in the
-+ current stack frame.
-+
-+
-+ * Minor command changes
-+
-+The command ``call func (arg, arg, ...)'' now acts like the print
-+command, except it does not print or save a value if the function's result
-+is void. This is similar to dbx usage.
-+
-+The ``up'' and ``down'' commands now always print the frame they end up
-+at; ``up-silently'' and `down-silently'' can be used in scripts to change
-+frames without printing.
-+
-+ * New directory command
-+
-+'dir' now adds directories to the FRONT of the source search path.
-+The path starts off empty. Source files that contain debug information
-+about the directory in which they were compiled can be found even
-+with an empty path; Sun CC and GCC include this information. If GDB can't
-+find your source file in the current directory, type "dir .".
-+
-+ * Configuring GDB for compilation
-+
-+For normal use, type ``./configure host''. See README or gdb.texinfo
-+for more details.
-+
-+GDB now handles cross debugging. If you are remotely debugging between
-+two different machines, type ``./configure host -target=targ''.
-+Host is the machine where GDB will run; targ is the machine
-+where the program that you are debugging will run.
diff -Naur gdb-6.8.orig/gdb/testsuite/gdb.base/watchpoint.c gdb-6.8/gdb/testsuite/gdb.base/watchpoint.c
--- gdb-6.8.orig/gdb/testsuite/gdb.base/watchpoint.c 2003-03-17 20:51:58.000000000 +0100
+++ gdb-6.8/gdb/testsuite/gdb.base/watchpoint.c 2008-09-17 16:32:32.000000000 +0200