		What has changed in GDB?
	     (Organized release by release)

*** Changes since GDB 12

* GDB now supports dumping memory tag data for AArch64 MTE.  It also supports
  reading memory tag data for AArch64 MTE from core files generated by
  the gcore command or the Linux kernel.

  When a process uses memory-mapped pages protected by memory tags (for
  example, AArch64 MTE), this additional information will be recorded in
  the core file in the event of a crash or if GDB generates a core file
  from the current process state.  GDB will show this additional information
  automatically, or through one of the memory-tag subcommands.

* "info breakpoints" now displays enabled breakpoint locations of
  disabled breakpoints as in the "y-" state.  For example:

   (gdb) info breakpoints
   Num     Type           Disp Enb Address            What
   1       breakpoint     keep n   <MULTIPLE>
   1.1                         y-  0x00000000000011b6 in ...
   1.2                         y-  0x00000000000011c2 in ...
   1.3                         n   0x00000000000011ce in ...

* Support for Thread Local Storage (TLS) variables on FreeBSD arm and
  aarch64 architectures.

* GDB now supports hardware watchpoints on FreeBSD/Aarch64.

* Remove support for building against Python 2, it is now only possible to
  build GDB against Python 3.

* DBX mode has been removed.

* GDB now honours the DWARF prologue_end line-table entry flag the compiler can
  emit to indicate where a breakpoint should be placed to break in a function
  past its prologue.

* Completion now also offers "NUMBER" for "set" commands that accept
  a numeric argument and the "unlimited" keyword.  For example:

   (gdb) set width <TAB>
   NUMBER     unlimited

  and consequently:

   (gdb) complete set width
   set width NUMBER
   set width unlimited

* Disassembler styling using libopcodes.  GDB now supports
  disassembler styling using libopcodes.  This is only available for
  some targets (currently x86 and RISC-V).  For unsupported targets
  Python Pygments is still used.  For supported targets, libopcodes
  styling is used by default.

* New commands

maintenance set ignore-prologue-end-flag on|off
maintenance show ignore-prologue-end-flag
  This setting, which is off by default, controls whether GDB ignores the
  PROLOGUE-END flag from the line-table when skipping prologue.  This can be
  used to force GDB to use prologue analyzers if the line-table is constructed
  from erroneous debug information.

set print nibbles [on|off]
show print nibbles
  This controls whether the 'print/t' command will display binary values
  in groups of four bits, known as "nibbles".  The default is 'off'.

maintenance set libopcodes-styling on|off
maintenance show libopcodes-styling
  These can be used to force off libopcodes based styling, the Python
  Pygments styling will then be used instead.

set style disassembler comment
show style disassembler comment
set style disassembler immediate
show style disassembler immediate
set style disassembler mnemonic
show style disassembler mnemonic
set style disassembler register
show style disassembler register
set style disassembler address
show style disassembler address
set style disassembler symbol
show style disassembler symbol
  For targets that support libopcodes based styling, these settings
  control how various aspects of the disassembler output are styled.
  The 'disassembler address' and 'disassembler symbol' styles are
  aliases for the 'address' and 'function' styles respectively.

* Changed commands

maintenance info line-table
  Add a PROLOGUE-END column to the output which indicates that an
  entry corresponds to an address where a breakpoint should be placed
  to be at the first instruction past a function's prologue.

* New targets

GNU/Linux/LoongArch (gdbserver)	loongarch*-*-linux*

* Python API

  ** GDB will now reformat the doc string for gdb.Command and
     gdb.Parameter sub-classes to remove unnecessary leading
     whitespace from each line before using the string as the help
     output.

  ** New function gdb.format_address(ADDRESS, PROGSPACE, ARCHITECTURE),
     that formats ADDRESS as 'address <symbol+offset>', where symbol is
     looked up in PROGSPACE, and ARCHITECTURE is used to format address.
     This is the same format that GDB uses when printing address, symbol,
     and offset information from the disassembler.

  ** New function gdb.current_language that returns the name of the
     current language.  Unlike gdb.parameter('language'), this will
     never return 'auto'.

  ** New method gdb.Frame.language that returns the name of the
     frame's language.

  ** New Python API for wrapping GDB's disassembler:

     - gdb.disassembler.register_disassembler(DISASSEMBLER, ARCH).
       DISASSEMBLER is a sub-class of gdb.disassembler.Disassembler.
       ARCH is either None or a string containing a bfd architecture
       name.  DISASSEMBLER is registered as a disassembler for
       architecture ARCH, or for all architectures if ARCH is None.
       The previous disassembler registered for ARCH is returned, this
       can be None if no previous disassembler was registered.

     - gdb.disassembler.Disassembler is the class from which all
       disassemblers should inherit.  Its constructor takes a string,
       a name for the disassembler, which is currently only used in
       some debug output.  Sub-classes should override the __call__
       method to perform disassembly, invoking __call__ on this base
       class will raise an exception.

     - gdb.disassembler.DisassembleInfo is the class used to describe
       a single disassembly request from GDB.  An instance of this
       class is passed to the __call__ method of
       gdb.disassembler.Disassembler and has the following read-only
       attributes: 'address', and 'architecture', as well as the
       following method: 'read_memory'.

     - gdb.disassembler.builtin_disassemble(INFO, MEMORY_SOURCE),
       calls GDB's builtin disassembler on INFO, which is a
       gdb.disassembler.DisassembleInfo object.  MEMORY_SOURCE is
       optional, its default value is None.  If MEMORY_SOURCE is not
       None then it must be an object that has a 'read_memory' method.

     - gdb.disassembler.DisassemblerResult is a class that can be used
       to wrap the result of a call to a Disassembler.  It has
       read-only attributes 'length' and 'string'.

  ** gdb.Objfile now has an attribute named "is_file".  This is True
     if the objfile comes from a file, and False otherwise.

  ** New function gdb.print_options that returns a dictionary of the
     prevailing print options, in the form accepted by
     gdb.Value.format_string.

  ** gdb.Value.format_string now uses the format provided by 'print',
     if it is called during a 'print' or other similar operation.

  ** gdb.Value.format_string now accepts the 'summary' keyword.  This
     can be used to request a shorter representation of a value, the
     way that 'set print frame-arguments scalars' does.

  ** New Python type gdb.BreakpointLocation.
     The new attribute 'locations' of gdb.Breakpoint returns a list of
     gdb.BreakpointLocation objects specifying the locations where the
     breakpoint is inserted into the debuggee.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on LoongArch GNU/Linux.

* LoongArch floating-point support

GDB now supports floating-point on LoongArch GNU/Linux.

*** Changes in GDB 12

* DBX mode is deprecated, and will be removed in GDB 13

* GDB 12 is the last release of GDB that will support building against
  Python 2.  From GDB 13, it will only be possible to build GDB itself
  with Python 3 support.

* The disable-randomization setting now works on Windows.

* Improved C++ template support

  GDB now treats functions/types involving C++ templates like it does function
  overloads.  Users may omit parameter lists to set breakpoints on families of
  template functions, including types/functions composed of multiple template types:

  (gdb) break template_func(template_1, int)

  The above will set breakpoints at every function `template_func' where
  the first function parameter is any template type named `template_1' and
  the second function parameter is `int'.

  TAB completion also gains similar improvements.

* The FreeBSD native target now supports async mode.

* Configure changes

--enable-threading

  Enable or disable multithreaded symbol loading.  This is enabled
  by default, but passing --disable-threading or --enable-threading=no
  to configure will disable it.

  Disabling this can cause a performance penalty when there are a lot of
  symbols to load, but is useful for debugging purposes.

* New commands

maint set backtrace-on-fatal-signal on|off
maint show backtrace-on-fatal-signal
  This setting is 'on' by default.  When 'on' GDB will print a limited
  backtrace to stderr in the situation where GDB terminates with a
  fatal signal.  This only supported on some platforms where the
  backtrace and backtrace_symbols_fd functions are available.

set source open on|off
show source open
  This setting, which is on by default, controls whether GDB will try
  to open source code files.  Switching this off will stop GDB trying
  to open and read source code files, which can be useful if the files
  are located over a slow network connection.

set varsize-limit
show varsize-limit
  These are now deprecated aliases for "set max-value-size" and
  "show max-value-size".

task apply [all | TASK-IDS...] [FLAG]... COMMAND
  Like "thread apply", but applies COMMAND to Ada tasks.

watch [...] task ID
  Watchpoints can now be restricted to a specific Ada task.

maint set internal-error backtrace on|off
maint show internal-error backtrace
maint set internal-warning backtrace on|off
maint show internal-warning backtrace
  GDB can now print a backtrace of itself when it encounters either an
  internal-error, or an internal-warning.  This is on by default for
  internal-error and off by default for internal-warning.

set logging on|off
  Deprecated and replaced by "set logging enabled on|off".

set logging enabled on|off
show logging enabled
  These commands set or show whether logging is enabled or disabled.

exit
  You can now exit GDB by using the new command "exit", in addition to
  the existing "quit" command.

set debug threads on|off
show debug threads
  Print additional debug messages about thread creation and deletion.

set debug linux-nat on|off
show debug linux-nat
  These new commands replaced the old 'set debug lin-lwp' and 'show
  debug lin-lwp' respectively.  Turning this setting on prints debug
  messages relating to GDB's handling of native Linux inferiors.

maint flush source-cache
  Flush the contents of the source code cache.

maint set gnu-source-highlight enabled on|off
maint show gnu-source-highlight enabled
  Whether GDB should use the GNU Source Highlight library for adding
  styling to source code.  When off, the library will not be used, even
  when available.  When GNU Source Highlight isn't used, or can't add
  styling to a particular source file, then the Python Pygments
  library will be used instead.

set suppress-cli-notifications (on|off)
show suppress-cli-notifications
  This controls whether printing the notifications is suppressed for CLI.
  CLI notifications occur when you change the selected context
  (i.e., the current inferior, thread and/or the frame), or when
  the program being debugged stops (e.g., because of hitting a
  breakpoint, completing source-stepping, an interrupt, etc.).

set style disassembler enabled on|off
show style disassembler enabled
  If GDB is compiled with Python support, and the Python Pygments
  package is available, then, when this setting is on, disassembler
  output will have styling applied.

set ada source-charset
show ada source-charset
  Set the character set encoding that is assumed for Ada symbols.  Valid
  values for this follow the values that can be passed to the GNAT
  compiler via the '-gnati' option.  The default is ISO-8859-1.

tui layout
tui focus
tui refresh
tui window height
  These are the new names for the old 'layout', 'focus', 'refresh',
  and 'winheight' tui commands respectively.  The old names still
  exist as aliases to these new commands.

tui window width
winwidth
  The new command 'tui window width', and the alias 'winwidth' allow
  the width of a tui window to be adjusted when windows are laid out
  in horizontal mode.

set debug tui on|off
show debug tui
  Control the display of debug output about GDB's tui.

* Changed commands

print
  Printing of floating-point values with base-modifying formats like
  /x has been changed to display the underlying bytes of the value in
  the desired base.  This was GDB's documented behavior, but was never
  implemented correctly.

maint packet
  This command can now print a reply, if the reply includes
  non-printable characters.  Any non-printable characters are printed
  as escaped hex, e.g. \x?? where '??' is replaces with the value of
  the non-printable character.

clone-inferior
  The clone-inferior command now ensures that the TTY, CMD and ARGS
  settings are copied from the original inferior to the new one.
  All modifications to the environment variables done using the 'set
  environment' or 'unset environment' commands are also copied to the new
  inferior.

set debug lin-lwp on|off
show debug lin-lwp
  These commands have been removed from GDB.  The new command 'set
  debug linux-nat' and 'show debug linux-nat' should be used
  instead.

info win
  This command now includes information about the width of the tui
  windows in its output.

layout
focus
refresh
winheight
  These commands are now aliases for the 'tui layout', 'tui focus',
  'tui refresh', and 'tui window height' commands respectively.

* GDB's Ada parser now supports an extension for specifying the exact
  byte contents of a floating-point literal.  This can be useful for
  setting floating-point registers to a precise value without loss of
  precision.  The syntax is an extension of the based literal syntax.
  Use, e.g., "16lf#0123abcd#" -- the number of "l"s controls the width
  of the floating-point type, and the "f" is the marker for floating
  point.

* MI changes

 ** The '-add-inferior' with no option flags now inherits the
    connection of the current inferior, this restores the behaviour of
    GDB as it was prior to GDB 10.

 ** The '-add-inferior' command now accepts a '--no-connection'
    option, which causes the new inferior to start without a
    connection.

* New targets

GNU/Linux/LoongArch		loongarch*-*-linux*

* Removed targets

S+core				score-*-*

* Python API

  ** New function gdb.add_history(), which takes a gdb.Value object
     and adds the value it represents to GDB's history list.  An
     integer, the index of the new item in the history list, is
     returned.

  ** New function gdb.history_count(), which returns the number of
     values in GDB's value history.

  ** New gdb.events.gdb_exiting event.  This event is called with a
     gdb.GdbExitingEvent object which has the read-only attribute
     'exit_code', which contains the value of the GDB exit code.  This
     event is triggered once GDB decides it is going to exit, but
     before GDB starts to clean up its internal state.

  ** New function gdb.architecture_names(), which returns a list
     containing all of the possible Architecture.name() values.  Each
     entry is a string.

  ** New function gdb.Architecture.integer_type(), which returns an
     integer type given a size and a signed-ness.

  ** New gdb.TargetConnection object type that represents a connection
     (as displayed by the 'info connections' command).  A sub-class,
     gdb.RemoteTargetConnection, is used to represent 'remote' and
     'extended-remote' connections.

  ** The gdb.Inferior type now has a 'connection' property which is an
     instance of gdb.TargetConnection, the connection used by this
     inferior.  This can be None if the inferior has no connection.

  ** New 'gdb.events.connection_removed' event registry, which emits a
     'gdb.ConnectionEvent' when a connection is removed from GDB.
     This event has a 'connection' property, a gdb.TargetConnection
     object for the connection being removed.

  ** New gdb.connections() function that returns a list of all
     currently active connections.

  ** New gdb.RemoteTargetConnection.send_packet(PACKET) method.  This
     is equivalent to the existing 'maint packet' CLI command; it
     allows a user specified packet to be sent to the remote target.

  ** New function gdb.host_charset(), returns a string, which is the
     name of the current host charset.

  ** New gdb.set_parameter(NAME, VALUE).  This sets the gdb parameter
     NAME to VALUE.

  ** New gdb.with_parameter(NAME, VALUE).  This returns a context
     manager that temporarily sets the gdb parameter NAME to VALUE,
     then resets it when the context is exited.

  ** The gdb.Value.format_string method now takes a 'styling'
     argument, which is a boolean.  When true, the returned string can
     include escape sequences to apply styling.  The styling will only
     be present if styling is otherwise turned on in GDB (see 'help
     set styling').  When false, which is the default if the argument
     is not given, then no styling is applied to the returned string.

  ** New read-only attribute gdb.InferiorThread.details, which is
     either a string, containing additional, target specific thread
     state information, or None, if there is no such additional
     information.

  ** New read-only attribute gdb.Type.is_scalar, which is True for
     scalar types, and False for all other types.

  ** New read-only attribute gdb.Type.is_signed.  This attribute
     should only be read when Type.is_scalar is True, and will be True
     for signed types, and False for all other types.  Attempting to
     read this attribute for non-scalar types will raise a ValueError.

  ** It is now possible to add GDB/MI commands implemented in Python.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on OpenRISC GNU/Linux.

* New native configurations

GNU/Linux/OpenRISC		or1k*-*-linux*

*** Changes in GDB 11

* The 'set disassembler-options' command now supports specifying options
  for the ARC target.

* GDB now supports general memory tagging functionality if the underlying
  architecture supports the proper primitives and hooks.  Currently this is
  enabled only for AArch64 MTE.

  This includes:

  - Additional information when the inferior crashes with a SIGSEGV caused by
    a memory tag violation.

  - A new modifier 'm' for the "x" command, which displays allocation tags for a
    particular memory range.

  - Display of memory tag mismatches by "print", for addresses and
    pointers, if memory tagging is supported by the architecture.

* Building GDB now requires GMP (The GNU Multiple Precision Arithmetic
  Library).

* MI changes

 ** '-break-insert --qualified' and '-dprintf-insert --qualified'

    The MI -break-insert and -dprintf-insert commands now support a
    new "--qualified" option that makes GDB interpret a specified
    function name as a complete fully-qualified name.  This is the
    equivalent of the CLI's "break -qualified" and "dprintf
    -qualified".

 ** '-break-insert --force-condition' and '-dprintf-insert --force-condition'

    The MI -break-insert and -dprintf-insert commands now support a
    '--force-condition' flag to forcibly define a condition even when
    the condition is invalid at all locations of the breakpoint.  This
    is equivalent to the '-force-condition' flag of the CLI's "break"
    command.

 ** '-break-condition --force'

    The MI -break-condition command now supports a '--force' flag to
    forcibly define a condition even when the condition is invalid at
    all locations of the selected breakpoint.  This is equivalent to
    the '-force' flag of the CLI's "cond" command.

 ** '-file-list-exec-source-files [--group-by-objfile]
 	                          [--basename | --dirname]
                                  [--] [REGEXP]'

    The existing -file-list-exec-source-files command now takes an
    optional REGEXP which is used to filter the source files that are
    included in the results.

    By default REGEXP is matched against the full filename of the
    source file. When one of --basename or --dirname is given then
    REGEXP is only matched against the specified part of the full
    source filename.

    When the optional --group-by-objfile flag is used the output
    format is changed, the results are now a list of object files
    (executable and libraries) with the source files that are
    associated with each object file.

    The results from -file-list-exec-source-files now include a
    'debug-fully-read' field which takes the value 'true' or 'false'.
    A 'true' value indicates the source file is from a compilation
    unit that has had its debug information fully read in by GDB, a
    value of 'false' indicates GDB has only performed a partial scan
    of the debug information so far.

* GDB now supports core file debugging for x86_64 Cygwin programs.

* GDB will now look for the .gdbinit file in a config directory before
  looking for ~/.gdbinit.  The file is searched for in the following
  locations: $XDG_CONFIG_HOME/gdb/gdbinit, $HOME/.config/gdb/gdbinit,
  $HOME/.gdbinit.  On Apple hosts the search order is instead:
  $HOME/Library/Preferences/gdb/gdbinit, $HOME/.gdbinit.

* GDB now supports fixed point types which are described in DWARF
  as base types with a fixed-point encoding.  Additionally, support
  for the DW_AT_GNU_numerator and DW_AT_GNU_denominator has also
  been added.

  For Ada, this allows support for fixed point types without requiring
  the use of the GNAT encoding (based on information added to the type's
  name following a GNAT-specific format).

* GDB will now load and process commands from ~/.config/gdb/gdbearlyinit
  or ~/.gdbearlyinit if these files are present.  These files are
  processed earlier than any of the other initialization files and
  can affect parts of GDB's startup that previously had already been
  completed before the initialization files were read, for example
  styling of the initial GDB greeting.

* GDB now has two new options "--early-init-command" and
  "--early-init-eval-command" with corresponding short options "-eix"
  and "-eiex" that allow options (that would normally appear in a
  gdbearlyinit file) to be passed on the command line.

* For RISC-V targets, the target feature "org.gnu.gdb.riscv.vector" is
  now understood by GDB, and can be used to describe the vector
  registers of a target.  The precise requirements of this register
  feature are documented in the GDB manual.

* For ARM targets, the "org.gnu.gdb.arm.m-profile-mve" feature is now
  supported by GDB and describes a new VPR register from the ARM MVE
  (Helium) extension. See the GDB manual for more information.

* TUI improvements

  ** TUI windows now support mouse actions.  The mouse wheel scrolls
     the appropriate window.

  ** Key combinations that do not have a specific action on the
     focused window are passed to GDB.  For example, you now can use
     Ctrl-Left/Ctrl-Right to move between words in the command window
     regardless of which window is in focus.  Previously you would
     need to focus on the command window for such key combinations to
     work.

* New commands

set debug event-loop
show debug event-loop
  Control the display of debug output about GDB's event loop.

set print memory-tag-violations
show print memory-tag-violations
  Control whether to display additional information about memory tag violations
  when printing pointers and addresses.  Architecture support for memory
  tagging is required for this option to have an effect.

maintenance flush symbol-cache
maintenance flush register-cache
  These new commands are equivalent to the already existing commands
  'maintenance flush-symbol-cache' and 'flushregs' respectively.

maintenance flush dcache
  A new command to flush the dcache.

maintenance info target-sections
  Print GDB's internal target sections table.

maintenance info jit
  Print the JIT code objects in the inferior known to GDB.

memory-tag show-logical-tag POINTER
  Print the logical tag for POINTER.
memory-tag with-logical-tag POINTER TAG
  Print POINTER with logical tag TAG.
memory-tag show-allocation-tag ADDRESS
  Print the allocation tag for ADDRESS.
memory-tag set-allocation-tag ADDRESS LENGTH TAGS
  Set the allocation tag for [ADDRESS, ADDRESS + LENGTH) to TAGS.
memory-tag check POINTER
  Validate that POINTER's logical tag matches the allocation tag.

set startup-quietly on|off
show startup-quietly
  When 'on', this causes GDB to act as if "-silent" were passed on the
  command line.  This command needs to be added to an early
  initialization file (e.g. ~/.config/gdb/gdbearlyinit) in order to
  affect GDB.

set print type hex on|off
show print type hex
  When 'on', the 'ptype' command uses hexadecimal notation to print sizes
  and offsets of struct members.  When 'off', decimal notation is used.

set python ignore-environment on|off
show python ignore-environment
  When 'on', this causes GDB's builtin Python to ignore any
  environment variables that would otherwise affect how Python
  behaves.  This command needs to be added to an early initialization
  file (e.g. ~/.config/gdb/gdbearlyinit) in order to affect GDB.

set python dont-write-bytecode auto|on|off
show python dont-write-bytecode
  When 'on', this causes GDB's builtin Python to not write any
  byte-code (.pyc files) to disk.  This command needs to be added to
  an early initialization file (e.g. ~/.config/gdb/gdbearlyinit) in
  order to affect GDB.  When 'off' byte-code will always be written.
  When set to 'auto' (the default) Python will check the
  PYTHONDONTWRITEBYTECODE environment variable.

* Changed commands

break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
      [-force-condition] [if CONDITION]
  This command would previously refuse setting a breakpoint if the
  CONDITION expression is invalid at a location.  It now accepts and
  defines the breakpoint if there is at least one location at which
  the CONDITION is valid.  The locations for which the CONDITION is
  invalid, are automatically disabled.  If CONDITION is invalid at all
  of the locations, setting the breakpoint is still rejected.  However,
  the '-force-condition' flag can be used in this case for forcing GDB to
  define the breakpoint, making all the current locations automatically
  disabled.  This may be useful if the user knows the condition will
  become meaningful at a future location, e.g. due to a shared library
  load.

condition [-force] N COND
  The behavior of this command is changed the same way for the 'break'
  command as explained above.  The '-force' flag can be used to force
  GDB into defining the condition even when COND is invalid for all the
  current locations of breakpoint N.

flushregs
maintenance flush-symbol-cache
  These commands are deprecated in favor of the new commands
  'maintenance flush register-cache' and 'maintenance flush
  symbol-cache' respectively.

set style version foreground COLOR
set style version background COLOR
set style version intensity VALUE
  Control the styling of GDB's version number text.

inferior [ID]
  When the ID parameter is omitted, then this command prints information
  about the current inferior.  When the ID parameter is present, the
  behavior of the command is unchanged and have the inferior ID become
  the current inferior.

maintenance info sections
  The ALLOBJ keyword has been replaced with an -all-objects command
  line flag.  It is now possible to filter which sections are printed
  even when -all-objects is passed.

ptype[/FLAGS] TYPE | EXPRESSION
  The 'ptype' command has two new flags.  When '/x' is set, hexadecimal
  notation is used when printing sizes and offsets of struct members.
  When '/d' is set, decimal notation is used when printing sizes and
  offsets of struct members.  Default behavior is given by 'show print
  type hex'.

info sources
  The info sources command output has been restructured.  The results
  are now based around a list of objfiles (executable and libraries),
  and for each objfile the source files that are part of that objfile
  are listed.

* Removed targets and native configurations

ARM Symbian			arm*-*-symbianelf*

* New remote packets

qMemTags
  Request the remote to send allocation tags for a particular memory range.
QMemTags
  Request the remote to store the specified allocation tags to the requested
  memory range.

* Guile API

  ** Improved support for rvalue reference values:
     TYPE_CODE_RVALUE_REF is now exported as part of the API and the
     value-referenced-value procedure now handles rvalue reference
     values.

  ** New procedures for obtaining value variants:
     value-reference-value, value-rvalue-reference-value and
     value-const-value.

  ** Temporary breakpoints can now be created with make-breakpoint and
     tested for using breakpoint-temporary?.

* Python API

  ** Inferior objects now contain a read-only 'connection_num' attribute that
     gives the connection number as seen in 'info connections' and
     'info inferiors'.

  ** New method gdb.Frame.level() which returns the stack level of the
     frame object.

  ** New method gdb.PendingFrame.level() which returns the stack level
     of the frame object.

  ** When hitting a catchpoint, the Python API will now emit a
     gdb.BreakpointEvent rather than a gdb.StopEvent.  The
     gdb.Breakpoint attached to the event will have type BP_CATCHPOINT.

  ** Python TUI windows can now receive mouse click events.  If the
     Window object implements the click method, it is called for each
     mouse click event in this window.

*** Changes in GDB 10

* There are new feature names for ARC targets: "org.gnu.gdb.arc.core"
  and "org.gnu.gdb.arc.aux".  The old names are still supported but
  must be considered obsolete.  They will be deprecated after some
  grace period.

* Help and apropos commands will now show the documentation of a
  command only once, even if that command has one or more aliases.
  These commands now show the command name, then all of its aliases,
  and finally the description of the command.

* 'help aliases' now shows only the user defined aliases.  GDB predefined
  aliases are shown together with their aliased command.

* GDB now supports debuginfod, an HTTP server for distributing ELF/DWARF
  debugging information as well as source code.

  When built with debuginfod, GDB can automatically query debuginfod
  servers for the separate debug files and source code of the executable
  being debugged.

  To build GDB with debuginfod, pass --with-debuginfod to configure (this
  requires libdebuginfod, the debuginfod client library).

  debuginfod is distributed with elfutils, starting with version 0.178.

  You can get the latest version from https://sourceware.org/elfutils.

* Multi-target debugging support

  GDB now supports debugging multiple target connections
  simultaneously.  For example, you can now have each inferior
  connected to different remote servers running in different machines,
  or have one inferior debugging a local native process, an inferior
  debugging a core dump, etc.

  This support is experimental and comes with some limitations -- you
  can only resume multiple targets simultaneously if all targets
  support non-stop mode, and all remote stubs or servers must support
  the same set of remote protocol features exactly.  See also "info
  connections" and "add-inferior -no-connection" below, and "maint set
  target-non-stop" in the user manual.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on ARC GNU/Linux.

  ** GDBserver is now supported on RISC-V GNU/Linux.

  ** GDBserver no longer supports these host triplets:

    i[34567]86-*-lynxos*
    powerpc-*-lynxos*
    i[34567]86-*-nto*
    bfin-*-*linux*
    crisv32-*-linux*
    cris-*-linux*
    m32r*-*-linux*
    tilegx-*-linux*
    arm*-*-mingw32ce*
    i[34567]86-*-mingw32ce*

* Debugging MS-Windows processes now sets $_exitsignal when the
  inferior is terminated by a signal, instead of setting $_exitcode.

* Multithreaded symbol loading has now been enabled by default on systems
  that support it (see entry for GDB 9, below), providing faster
  performance for programs with many symbols.

* The $_siginfo convenience variable now also works on Windows targets,
  and will display the EXCEPTION_RECORD of the last handled exception.

* TUI windows can now be arranged horizontally.

* The command history filename can now be set to the empty string
  either using 'set history filename' or by setting 'GDBHISTFILE=' in
  the environment.  The effect of setting this filename to the empty
  string is that GDB will not try to load any previous command
  history.

* On Windows targets, it is now possible to debug 32-bit programs with a
  64-bit GDB.

* New commands

set exec-file-mismatch -- Set exec-file-mismatch handling (ask|warn|off).
show exec-file-mismatch -- Show exec-file-mismatch handling (ask|warn|off).
  Set or show the option 'exec-file-mismatch'.  When GDB attaches to a
  running process, this new option indicates whether to detect
  a mismatch between the current executable file loaded by GDB and the
  executable file used to start the process.  If 'ask', the default,
  display a warning and ask the user whether to load the process
  executable file; if 'warn', just display a warning; if 'off', don't
  attempt to detect a mismatch.

tui new-layout NAME WINDOW WEIGHT [WINDOW WEIGHT]...
  Define a new TUI layout, specifying its name and the windows that
  will be displayed.

maintenance print xml-tdesc [FILE]
  Prints the current target description as an XML document.  If the
  optional FILE is provided (which is an XML target description) then
  the target description is read from FILE into GDB, and then
  reprinted.

maintenance print core-file-backed-mappings
  Prints file-backed mappings loaded from a core file's note section.
  Output is expected to be similar to that of "info proc mappings".

set debug fortran-array-slicing on|off
show debug fortran-array-slicing
  Print debugging when taking slices of Fortran arrays.

set fortran repack-array-slices on|off
show fortran repack-array-slices
  When taking slices from Fortran arrays and strings, if the slice is
  non-contiguous within the original value then, when this option is
  on, the new value will be repacked into a single contiguous value.
  When this option is off, then the value returned will consist of a
  descriptor that describes the slice within the memory of the
  original parent value.

* Changed commands

alias [-a] [--] ALIAS = COMMAND [DEFAULT-ARGS...]
  The alias command can now specify default args for an alias.
  GDB automatically prepends the alias default args to the argument list
  provided explicitly by the user.
  For example, to have a backtrace with full details, you can define
  an alias 'bt_ALL' as
  'alias bt_ALL = backtrace -entry-values both -frame-arg all
     -past-main -past-entry -full'.
  Alias default arguments can also use a set of nested 'with' commands,
  e.g. 'alias pp10 = with print pretty -- with print elem 10 -- print'
  defines the alias pp10 that will pretty print a maximum of 10 elements
  of the given expression (if the expression is an array).

* New targets

GNU/Linux/RISC-V (gdbserver)	riscv*-*-linux*
BPF				bpf-unknown-none
Z80				z80-unknown-*

* Python API

  ** gdb.register_window_type can be used to implement new TUI windows
     in Python.

  ** Dynamic types can now be queried.  gdb.Type has a new attribute,
     "dynamic", and gdb.Type.sizeof can be None for a dynamic type.  A
     field of a dynamic type may have None for its "bitpos" attribute
     as well.

  ** Commands written in Python can be in the "TUI" help class by
     registering with the new constant gdb.COMMAND_TUI.

  ** New method gdb.PendingFrame.architecture () to retrieve the
     architecture of the pending frame.

  ** New gdb.Architecture.registers method that returns a
     gdb.RegisterDescriptorIterator object, an iterator that returns
     gdb.RegisterDescriptor objects.  The new RegisterDescriptor is a
     way to query the registers available for an architecture.

  ** New gdb.Architecture.register_groups method that returns a
     gdb.RegisterGroupIterator object, an iterator that returns
     gdb.RegisterGroup objects.  The new RegisterGroup is a way to
     discover the available register groups.

* Guile API

  ** GDB can now be built with GNU Guile 3.0 and 2.2 in addition to 2.0.

  ** Procedures 'memory-port-read-buffer-size',
     'set-memory-port-read-buffer-size!', 'memory-port-write-buffer-size',
     and 'set-memory-port-write-buffer-size!' are deprecated.  When
     using Guile 2.2 and later, users who need to control the size of
     a memory port's internal buffer can use the 'setvbuf' procedure.

*** Changes in GDB 9

* 'thread-exited' event is now available in the annotations interface.

* New built-in convenience variables $_gdb_major and $_gdb_minor
  provide the GDB version.  They are handy for conditionally using
  features available only in or since specific GDB versions, in
  scripts that should work error-free with many different versions,
  such as in system-wide init files.

* New built-in convenience functions $_gdb_setting, $_gdb_setting_str,
  $_gdb_maint_setting and $_gdb_maint_setting_str provide access to values
  of the GDB settings and the GDB maintenance settings.  They are handy
  for changing the logic of user defined commands depending on the
  current GDB settings.

* GDB now supports Thread Local Storage (TLS) variables on several
  FreeBSD architectures (amd64, i386, powerpc, riscv).  Other
  architectures require kernel changes.  TLS is not yet supported for
  amd64 and i386 process core dumps.

* Support for Pointer Authentication (PAC) on AArch64 Linux.  Return
  addresses that required unmasking are shown in the backtrace with the
  postfix [PAC].

* Two new convenience functions $_cimag and $_creal that extract the
  imaginary and real parts respectively from complex numbers.

* New built-in convenience variables $_shell_exitcode and $_shell_exitsignal
  provide the exitcode or exit status of the shell commands launched by
  GDB commands such as "shell", "pipe" and "make".

* The command define-prefix can now define user defined prefix commands.
  User defined commands can now be defined using these user defined prefix
  commands.

* Command names can now use the . character.

* The RX port now supports XML target descriptions.

* GDB now shows the Ada task names at more places, e.g. in task switching
  messages.

* GDB can now be compiled with Python 3 on Windows.

* New convenience variable $_ada_exception holds the address of the
  Ada exception being thrown.  This is set by Ada-related catchpoints.

* GDB can now place breakpoints on nested functions and subroutines in
  Fortran code.  The '::' operator can be used between parent and
  child scopes when placing breakpoints, for example:

    (gdb) break outer_function::inner_function

  The 'outer_function::' prefix is only needed if 'inner_function' is
  not visible in the current scope.

* In addition to the system-wide gdbinit file, if configured with
 --with-system-gdbinit-dir, GDB will now also load files in that directory
 as system gdbinit files, unless the -nx or -n flag is provided.  Files
 with extensions .gdb, .py and .scm are supported as long as GDB was
 compiled with support for that language.

* GDB now supports multithreaded symbol loading for higher performance.
  This feature is still in testing, so it is disabled by default.  You
  can turn it on using 'maint set worker-threads unlimited'.

* Python API

  ** The gdb.Value type has a new method 'format_string' which returns a
     string representing the value.  The formatting is controlled by the
     optional keyword arguments: 'raw', 'pretty_arrays', 'pretty_structs',
     'array_indexes', 'symbols', 'unions', 'deref_refs', 'actual_objects',
     'static_members', 'max_elements', 'repeat_threshold', and 'format'.

  ** gdb.Type has a new property 'objfile' which returns the objfile the
     type was defined in.

  ** The frame information printed by the python frame filtering code
     is now consistent with what the 'backtrace' command prints when
     there are no filters, or when the 'backtrace' '-no-filters' option
     is given.

  ** The new function gdb.lookup_static_symbol can be used to look up
     symbols with static linkage.

  ** The new function gdb.lookup_static_symbols can be used to look up
     all static symbols with static linkage.

  ** gdb.Objfile has new methods 'lookup_global_symbol' and
     'lookup_static_symbol' to lookup a symbol from this objfile only.

  ** gdb.Block now supports the dictionary syntax for accessing symbols in
     this block (e.g. block['local_variable']).

* New commands

| [COMMAND] | SHELL_COMMAND
| -d DELIM COMMAND DELIM SHELL_COMMAND
pipe [COMMAND] | SHELL_COMMAND
pipe -d DELIM COMMAND DELIM SHELL_COMMAND
  Executes COMMAND and sends its output to SHELL_COMMAND.
  With no COMMAND, repeat the last executed command
  and send its output to SHELL_COMMAND.

define-prefix COMMAND
  Define or mark a command as a user-defined prefix command.
  
with SETTING [VALUE] [-- COMMAND]
w SETTING [VALUE] [-- COMMAND]
  Temporarily set SETTING, run COMMAND, and restore SETTING.
  Usage: with SETTING -- COMMAND
  With no COMMAND, repeats the last executed command.
  SETTING is any GDB setting you can change with the "set"
  subcommands.  For example, 'with language c -- print someobj'
  temporarily switches to the C language in order to print someobj.
  Settings can be combined: 'w lang c -- w print elements unlimited --
  usercmd' switches to the C language and runs usercmd with no limit
  of array elements to print.

maint with SETTING [VALUE] [-- COMMAND]
  Like "with", but works with "maintenance set" settings.

set may-call-functions [on|off]
show may-call-functions
  This controls whether GDB will attempt to call functions in
  the program, such as with expressions in the print command.  It
  defaults to on.  Calling functions in the program being debugged
  can have undesired side effects.  It is now possible to forbid
  such function calls.  If function calls are forbidden, GDB will throw
  an error when a command (such as print expression) calls a function
  in the program.

set print finish [on|off]
show print finish
  This controls whether the `finish' command will display the value
  that is returned by the current function.  When `off', the value is
  still entered into the value history, but it is not printed.  The
  default is `on'.

set print max-depth
show print max-depth
  Allows deeply nested structures to be simplified when printing by
  replacing deeply nested parts (beyond the max-depth) with ellipses.
  The default max-depth is 20, but this can be set to unlimited to get
  the old behavior back.

set print raw-values [on|off]
show print raw-values
  By default, GDB applies the enabled pretty printers when printing a
  value.  This allows to ignore the enabled pretty printers for a series
  of commands.  The default is 'off'.

set logging debugredirect [on|off]
  By default, GDB debug output will go to both the terminal and the logfile.
  Set if you want debug output to go only to the log file.

set style title foreground COLOR
set style title background COLOR
set style title intensity VALUE
  Control the styling of titles.

set style highlight foreground COLOR
set style highlight background COLOR
set style highlight intensity VALUE
  Control the styling of highlightings.

maint set worker-threads
maint show worker-threads
  Control the number of worker threads that can be used by GDB.  The
  default is 0.  "unlimited" lets GDB choose a number that is
  reasonable.  Currently worker threads are only used when demangling
  the names of linker symbols.

set style tui-border foreground COLOR
set style tui-border background COLOR
  Control the styling of TUI borders.

set style tui-active-border foreground COLOR
set style tui-active-border background COLOR
  Control the styling of the active TUI border.

maint set test-settings KIND
maint show test-settings KIND
  A set of commands used by the testsuite for exercising the settings
  infrastructure.

maint set tui-resize-message [on|off]
maint show tui-resize-message
  Control whether GDB prints a message each time the terminal is
  resized when in TUI mode.  This is primarily useful for testing the
  TUI.

set print frame-info [short-location|location|location-and-address
                        |source-and-location|source-line|auto]
show print frame-info
  This controls what frame information is printed by the commands printing
  a frame.  This setting will e.g. influence the behaviour of 'backtrace',
  'frame', 'stepi'.  The python frame filtering also respect this setting.
  The 'backtrace' '-frame-info' option can override this global setting.

set tui compact-source
show tui compact-source

  Enable the "compact" display mode for the TUI source window.  The
  compact display uses only as much space as is needed for the line
  numbers in the current file, and only a single space to separate the
  line numbers from the source.

info modules [-q] [REGEXP]
  Return a list of Fortran modules matching REGEXP, or all modules if
  no REGEXP is given.

info module functions [-q] [-m MODULE_REGEXP] [-t TYPE_REGEXP] [REGEXP]
  Return a list of functions within all modules, grouped by module.
  The list of functions can be restricted with the optional regular
  expressions.  MODULE_REGEXP matches against the module name,
  TYPE_REGEXP matches against the function type signature, and REGEXP
  matches against the function name.

info module variables [-q] [-m MODULE_REGEXP] [-t TYPE_REGEXP] [REGEXP]
  Return a list of variables within all modules, grouped by module.
  The list of variables can be restricted with the optional regular
  expressions.  MODULE_REGEXP matches against the module name,
  TYPE_REGEXP matches against the variable type, and REGEXP matches
  against the variable name.

set debug remote-packet-max-chars
show debug remote-packet-max-chars
  Controls the number of characters to output in a remote packet when using
  "set debug remote".
  The default is 512 bytes.

info connections
  Lists the target connections currently in use.

* Changed commands

help
  The "help" command uses the title style to enhance the
  readibility of its output by styling the classes and
  command names.

apropos [-v] REGEXP
  Similarly to "help", the "apropos" command also uses the
  title style for the command names.  "apropos" accepts now
  a flag "-v" (verbose) to show the full documentation
  of matching commands and to use the highlight style to mark
  the documentation parts matching REGEXP.

printf
eval
  The GDB printf and eval commands can now print C-style and Ada-style
  string convenience variables without calling functions in the program.
  This allows to do formatted printing of strings without having
  a running inferior, or when debugging a core dump.

info sources [-dirname | -basename] [--] [REGEXP]
  This command has now optional arguments to only print the files
  whose names match REGEXP.  The arguments -dirname and -basename
  allow to restrict matching respectively to the dirname and basename
  parts of the files.

show style
  The "show style" and its subcommands are now styling
  a style name in their output using its own style, to help
  the user visualize the different styles.

set print frame-arguments
  The new value 'presence' indicates to only indicate the presence of
  arguments using ..., instead of printing argument names and values.

set print raw-frame-arguments
show print raw-frame-arguments

  These commands replace the similarly-named "set/show print raw
  frame-arguments" commands (now with a dash instead of a space).  The
  old commands are now deprecated and may be removed in a future
  release.

add-inferior [-no-connection]
  The add-inferior command now supports a "-no-connection" flag that
  makes the new inferior start with no target connection associated.
  By default, the new inferior inherits the target connection of the
  current inferior.  See also "info connections".

info inferior
  This command's output now includes a new "Connection" column
  indicating which target connection an inferior is bound to.  See
  "info connections" above.

maint test-options require-delimiter
maint test-options unknown-is-error
maint test-options unknown-is-operand
maint show test-options-completion-result
  Commands used by the testsuite to validate the command options
  framework.

focus, winheight, +, -, >, <
  These commands are now case-sensitive.

* New command options, command completion

  GDB now has a standard infrastructure to support dash-style command
  options ('-OPT').  One benefit is that commands that use it can
  easily support completion of command line arguments.  Try "CMD
  -[TAB]" or "help CMD" to find options supported by a command.  Over
  time, we intend to migrate most commands to this infrastructure.  A
  number of commands got support for new command options in this
  release:

  ** The "print" and "compile print" commands now support a number of
     options that allow overriding relevant global print settings as
     set by "set print" subcommands:

      -address [on|off]
      -array [on|off]
      -array-indexes [on|off]
      -elements NUMBER|unlimited
      -null-stop [on|off]
      -object [on|off]
      -pretty [on|off]
      -raw-values [on|off]
      -repeats NUMBER|unlimited
      -static-members [on|off]
      -symbol [on|off]
      -union [on|off]
      -vtbl [on|off]

     Note that because the "print"/"compile print" commands accept
     arbitrary expressions which may look like options (including
     abbreviations), if you specify any command option, then you must
     use a double dash ("--") to mark the end of argument processing.

  ** The "backtrace" command now supports a number of options that
     allow overriding relevant global print settings as set by "set
     backtrace" and "set print" subcommands:

      -entry-values no|only|preferred|if-needed|both|compact|default
      -frame-arguments all|scalars|none
      -raw-frame-arguments [on|off]
      -frame-info auto|source-line|location|source-and-location
           |location-and-address|short-location
      -past-main [on|off]
      -past-entry [on|off]

     In addition, the full/no-filters/hide qualifiers are now also
     exposed as command options too:

      -full
      -no-filters
      -hide

  ** The "frame apply", "tfaas" and "faas" commands similarly now
     support the following options:

      -past-main [on|off]
      -past-entry [on|off]

  ** The new "info sources" options -dirname and -basename options
     are using the standard '-OPT' infrastructure.

   All options above can also be abbreviated.  The argument of boolean
   (on/off) options can be 0/1 too, and also the argument is assumed
   "on" if omitted.  This allows writing compact command invocations,
   like for example:

    (gdb) p -ra -p -o 0 -- *myptr

   The above is equivalent to:

    (gdb) print -raw-values -pretty -object off -- *myptr

  ** The "info types" command now supports the '-q' flag to disable
     printing of some header information in a similar fashion to "info
     variables" and "info functions".

  ** The "info variables", "info functions", and "whereis" commands
     now take a '-n' flag that excludes non-debug symbols (symbols
     from the symbol table, not from the debug info such as DWARF)
     from the results.

* Completion improvements

  ** GDB can now complete the options of the "thread apply all" and
     "taas" commands, and their "-ascending" option can now be
     abbreviated.

  ** GDB can now complete the options of the "info threads", "info
     functions", "info variables", "info locals", and "info args"
     commands.

  ** GDB can now complete the options of the "compile file" and
     "compile code" commands.  The "compile file" command now
     completes on filenames.

  ** GDB can now complete the backtrace command's
     "full/no-filters/hide" qualifiers.

* In settings, you can now abbreviate "unlimited".

  E.g., "set print elements u" is now equivalent to "set print
  elements unlimited".

* New MI commands

-complete
  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 MI
  frontends in cases when separate CLI and MI channels cannot be used.

-catch-throw, -catch-rethrow, and -catch-catch
  These can be used to catch C++ exceptions in a similar fashion to
  the CLI commands 'catch throw', 'catch rethrow', and 'catch catch'.

-symbol-info-functions, -symbol-info-types, and -symbol-info-variables
  These commands are the MI equivalent of the CLI commands 'info
  functions', 'info types', and 'info variables' respectively.

-symbol-info-modules, this is the MI equivalent of the CLI 'info
  modules' command.

-symbol-info-module-functions and -symbol-info-module-variables.
  These commands are the MI equivalent of the CLI commands 'info
  module functions' and 'info module variables'.

* Other MI changes

 ** The default version of the MI interpreter is now 3 (-i=mi3).

  ** The output of information about multi-location breakpoints (which is
     syntactically incorrect in MI 2) has changed in MI 3.  This affects
     the following commands and events:

	- -break-insert
	- -break-info
	- =breakpoint-created
	- =breakpoint-modified

     The -fix-multi-location-breakpoint-output command can be used to enable
     this behavior with previous MI versions.

 ** Backtraces and frames include a new optional field addr_flags which is
    given after the addr field.  On AArch64 this contains PAC if the address
    has been masked in the frame.  On all other targets the field is not
    present.

* Testsuite

  The testsuite now creates the files gdb.cmd (containing the arguments
  used to launch GDB) and gdb.in (containing all the commands sent to
  GDB) in the output directory for each test script.  Multiple invocations
  are appended with .1, .2, .3 etc.

* Building GDB and GDBserver now requires GNU make >= 3.82.

  Using another implementation of the make program or an earlier version of
  GNU make to build GDB or GDBserver is not supported.

* Building GDB now requires GNU readline >= 7.0.

  GDB now bundles GNU readline 8.0, but if you choose to use
  --with-system-readline, only readline >= 7.0 can be used.

* The TUI SingleKey keymap is now named "SingleKey".  This can be used
  from .inputrc to bind keys in this keymap.  This feature is only
  available when gdb is built against GNU readline 8.0 or later.

* Removed targets and native configurations

  GDB no longer supports debugging the Cell Broadband Engine.  This includes
  both debugging standalone Cell/B.E. SPU applications and integrated debugging
  of Cell/B.E. applications that use both the PPU and SPU architectures.

* New Simulators

TI PRU					pru-*-elf

* Removed targets and native configurations

Solaris 10			i?86-*-solaris2.10, x86_64-*-solaris2.10,
				sparc*-*-solaris2.10

*** Changes in GDB 8.3

* GDB and GDBserver now support access to additional registers on
  PowerPC GNU/Linux targets: PPR, DSCR, TAR, EBB/PMU registers, and
  HTM registers.

* GDB now has experimental support for the compilation and injection of
  C++ source code into the inferior.  This beta release does not include
  support for several language features, such as templates, constructors,
  and operators.

  This feature requires GCC 7.1 or higher built with libcp1.so
  (the C++ plug-in).

* GDB and GDBserver now support IPv6 connections.  IPv6 addresses
  can be passed using the '[ADDRESS]:PORT' notation, or the regular
  'ADDRESS:PORT' method.

* DWARF index cache: GDB can now automatically save indices of DWARF
  symbols on disk to speed up further loading of the same binaries.

* Ada task switching is now supported on aarch64-elf targets when
  debugging a program using the Ravenscar Profile.  For more information,
  see the "Tasking Support when using the Ravenscar Profile" section
  in the GDB user manual.

* GDB in batch mode now exits with status 1 if the last command to be
  executed failed.

* The RISC-V target now supports target descriptions.

* System call catchpoints now support system call aliases on FreeBSD.
  When the ABI of a system call changes in FreeBSD, this is
  implemented by leaving a compatibility system call using the old ABI
  at the existing number and allocating a new system call number for
  the new ABI.  For example, FreeBSD 12 altered the layout of 'struct
  kevent' used by the 'kevent' system call.  As a result, FreeBSD 12
  kernels ship with both 'kevent' and 'freebsd11_kevent' system calls.
  The 'freebsd11_kevent' system call is assigned an alias of 'kevent'
  so that a system call catchpoint for the 'kevent' system call will
  catch invocations of both the 'kevent' and 'freebsd11_kevent'
  binaries.  This ensures that 'kevent' system calls are caught for
  binaries using either the old or new ABIs.

* Terminal styling is now available for the CLI and the TUI.  GNU
  Source Highlight can additionally be used to provide styling of
  source code snippets.  See the "set style" commands, below, for more
  information.

* Removed support for old demangling styles arm, edg, gnu, hp and
  lucid.

* New commands

set debug compile-cplus-types
show debug compile-cplus-types
  Control the display of debug output about type conversion in the
  C++ compile feature.  Commands have no effect while compiling
  for other languages.

set debug skip
show debug skip
  Control whether debug output about files/functions skipping is
  displayed.

frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND
  Apply a command to some frames.
  FLAG arguments allow to control what output to produce and how to handle
  errors raised when applying COMMAND to a frame.

taas COMMAND
  Apply a command to all threads (ignoring errors and empty output).
  Shortcut for 'thread apply all -s COMMAND'.

faas COMMAND
  Apply a command to all frames (ignoring errors and empty output).
  Shortcut for 'frame apply all -s COMMAND'.

tfaas COMMAND
  Apply a command to all frames of all threads (ignoring errors and empty
  output).
  Shortcut for 'thread apply all -s frame apply all -s COMMAND'.

maint set dwarf unwinders (on|off)
maint show dwarf unwinders
  Control whether DWARF unwinders can be used.

info proc files
  Display a list of open files for a process.

* Changed commands

Changes to the "frame", "select-frame", and "info frame" CLI commands.
  These commands all now take a frame specification which
  is either a frame level, or one of the keywords 'level', 'address',
  'function', or 'view' followed by a parameter.  Selecting a frame by
  address, or viewing a frame outside the current backtrace now
  requires the use of a keyword.  Selecting a frame by level is
  unchanged.  The MI comment "-stack-select-frame" is unchanged.

target remote FILENAME
target extended-remote FILENAME
  If FILENAME is a Unix domain socket, GDB will attempt to connect
  to this socket instead of opening FILENAME as a character device.

info args [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info functions [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info locals [-q] [-t TYPEREGEXP] [NAMEREGEXP]
info variables [-q] [-t TYPEREGEXP] [NAMEREGEXP]
  These commands can now print only the searched entities
  matching the provided regexp(s), giving a condition
  on the entity names or entity types.  The flag -q disables
  printing headers or informations messages.

info functions
info types
info variables
rbreak
  These commands now determine the syntax for the shown entities
  according to the language chosen by `set language'.  In particular,
  `set language auto' means to automatically choose the language of
  the shown entities.

thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
  The 'thread apply' command accepts new FLAG arguments.
  FLAG arguments allow to control what output to produce and how to handle
  errors raised when applying COMMAND to a thread.

set tui tab-width NCHARS
show tui tab-width NCHARS
  "set tui tab-width" replaces the "tabset" command, which has been deprecated.

set style enabled [on|off]
show style enabled
  Enable or disable terminal styling.  Styling is enabled by default
  on most hosts, but disabled by default when in batch mode.

set style sources [on|off]
show style sources
  Enable or disable source code styling.  Source code styling is
  enabled by default, but only takes effect if styling in general is
  enabled, and if GDB was linked with GNU Source Highlight.

set style filename foreground COLOR
set style filename background COLOR
set style filename intensity VALUE
  Control the styling of file names.

set style function foreground COLOR
set style function background COLOR
set style function intensity VALUE
  Control the styling of function names.

set style variable foreground COLOR
set style variable background COLOR
set style variable intensity VALUE
  Control the styling of variable names.

set style address foreground COLOR
set style address background COLOR
set style address intensity VALUE
  Control the styling of addresses.

* MI changes

  ** The '-data-disassemble' MI command now accepts an '-a' option to
     disassemble the whole function surrounding the given program
     counter value or function name.  Support for this feature can be
     verified by using the "-list-features" command, which should
     contain "data-disassemble-a-option".

  ** Command responses and notifications that include a frame now include
     the frame's architecture in a new "arch" attribute.

* New native configurations

GNU/Linux/RISC-V		riscv*-*-linux*
FreeBSD/riscv			riscv*-*-freebsd*

* New targets

GNU/Linux/RISC-V		riscv*-*-linux*
CSKY ELF			csky*-*-elf
CSKY GNU/LINUX			csky*-*-linux
FreeBSD/riscv			riscv*-*-freebsd*
NXP S12Z			s12z-*-elf
GNU/Linux/OpenRISC		or1k*-*-linux*

* Removed targets

GDB no longer supports native debugging on versions of MS-Windows
before Windows XP.

* Python API

  ** GDB no longer supports Python versions less than 2.6.

  ** The gdb.Inferior type has a new 'progspace' property, which is the program
     space associated to that inferior.

  ** The gdb.Progspace type has a new 'objfiles' method, which returns the list
     of objfiles associated to that program space.

  ** gdb.SYMBOL_LOC_COMMON_BLOCK, gdb.SYMBOL_MODULE_DOMAIN, and
     gdb.SYMBOL_COMMON_BLOCK_DOMAIN were added to reflect changes to
     the gdb core.

  ** gdb.SYMBOL_VARIABLES_DOMAIN, gdb.SYMBOL_FUNCTIONS_DOMAIN, and
     gdb.SYMBOL_TYPES_DOMAIN are now deprecated.  These were never
     correct and did not work properly.

  ** The gdb.Value type has a new constructor, which is used to construct a
     gdb.Value from a Python buffer object and a gdb.Type.

* Configure changes

--enable-ubsan

  Enable or disable the undefined behavior sanitizer.  This is
  disabled by default, but passing --enable-ubsan=yes or
  --enable-ubsan=auto to configure will enable it.  Enabling this can
  cause a performance penalty.  The undefined behavior sanitizer was
  first introduced in GCC 4.9.

*** Changes in GDB 8.2

* The 'set disassembler-options' command now supports specifying options
  for the MIPS target.

* The 'symbol-file' command now accepts an '-o' option to add a relative
  offset to all sections.

* Similarly, the 'add-symbol-file' command also accepts an '-o' option to add
  a relative offset to all sections, but it allows to override the load
  address of individual sections using '-s'.

* The 'add-symbol-file' command no longer requires the second argument
  (address of the text section).

* The endianness used with the 'set endian auto' mode in the absence of
  an executable selected for debugging is now the last endianness chosen
  either by one of the 'set endian big' and 'set endian little' commands
  or by inferring from the last executable used, rather than the startup
  default.

* The pager now allows a "c" response, meaning to disable the pager
  for the rest of the current command.

* The commands 'info variables/functions/types' now show the source line
  numbers of symbol definitions when available.

* 'info proc' now works on running processes on FreeBSD systems and core
  files created on FreeBSD systems.

* C expressions can now use _Alignof, and C++ expressions can now use
  alignof.

* Support for SVE on AArch64 Linux.  Note that GDB does not detect changes to
  the vector length while the process is running.

* New commands

set debug fbsd-nat
show debug fbsd-nat
  Control display of debugging info regarding the FreeBSD native target.

set|show varsize-limit
  This new setting allows the user to control the maximum size of Ada
  objects being printed when those objects have a variable type,
  instead of that maximum size being hardcoded to 65536 bytes.

set|show record btrace cpu
  Controls the processor to be used for enabling errata workarounds for
  branch trace decode.

maint check libthread-db
  Run integrity checks on the current inferior's thread debugging
  library

maint set check-libthread-db (on|off)
maint show check-libthread-db
  Control whether to run integrity checks on inferior specific thread
  debugging libraries as they are loaded.  The default is not to
  perform such checks.

* Python API

  ** Type alignment is now exposed via the "align" attribute of a gdb.Type.

  ** The commands attached to a breakpoint can be set by assigning to
     the breakpoint's "commands" field.

  ** gdb.execute can now execute multi-line gdb commands.

  ** The new functions gdb.convenience_variable and
     gdb.set_convenience_variable can be used to get and set the value
     of convenience variables.

  ** A gdb.Parameter will no longer print the "set" help text on an
     ordinary "set"; instead by default a "set" will be silent unless
     the get_set_string method returns a non-empty string.

* New targets

RiscV ELF			riscv*-*-elf

* Removed targets and native configurations

m88k running OpenBSD  		m88*-*-openbsd*
SH-5/SH64 ELF			sh64-*-elf*, SH-5/SH64 support in sh*
SH-5/SH64 running GNU/Linux	SH-5/SH64 support in sh*-*-linux*
SH-5/SH64 running OpenBSD 	SH-5/SH64 support in sh*-*-openbsd*

* Aarch64/Linux hardware watchpoints improvements

  Hardware watchpoints on unaligned addresses are now properly
  supported when running Linux kernel 4.10 or higher: read and access
  watchpoints are no longer spuriously missed, and all watchpoints
  lengths between 1 and 8 bytes are supported.  On older kernels,
  watchpoints set on unaligned addresses are no longer missed, with
  the tradeoff that there is a possibility of false hits being
  reported.

* Configure changes

--enable-codesign=CERT
  This can be used to invoke "codesign -s CERT" after building gdb.
  This option is useful on macOS, where code signing is required for
  gdb to work properly.

--disable-gdbcli has been removed
  This is now silently accepted, but does nothing.

*** Changes in GDB 8.1

* GDB now supports dynamically creating arbitrary register groups specified
  in XML target descriptions.  This allows for finer grain grouping of
  registers on systems with a large amount of registers.

* The 'ptype' command now accepts a '/o' flag, which prints the
  offsets and sizes of fields in a struct, like the pahole(1) tool.

* New "--readnever" command line option instructs GDB to not read each
  symbol file's symbolic debug information.  This makes startup faster
  but at the expense of not being able to perform symbolic debugging.
  This option is intended for use cases where symbolic debugging will
  not be used, e.g., when you only need to dump the debuggee's core.

* GDB now uses the GNU MPFR library, if available, to emulate target
  floating-point arithmetic during expression evaluation when the target
  uses different floating-point formats than the host.  At least version
  3.1 of GNU MPFR is required.

* GDB now supports access to the guarded-storage-control registers and the
  software-based guarded-storage broadcast control registers on IBM z14.

* On Unix systems, GDB now supports transmitting environment variables
  that are to be set or unset to GDBserver.  These variables will
  affect the environment to be passed to the remote inferior.

  To inform GDB of environment variables that are to be transmitted to
  GDBserver, use the "set environment" command.  Only user set
  environment variables are sent to GDBserver.

  To inform GDB of environment variables that are to be unset before
  the remote inferior is started by the GDBserver, use the "unset
  environment" command.

* Completion improvements

  ** GDB can now complete function parameters in linespecs and
     explicit locations without quoting.  When setting breakpoints,
     quoting around functions names to help with TAB-completion is
     generally no longer necessary.  For example, this now completes
     correctly:

      (gdb) b function(in[TAB]
      (gdb) b function(int)

     Related, GDB is no longer confused with completing functions in
     C++ anonymous namespaces:

      (gdb) b (anon[TAB]
      (gdb) b (anonymous namespace)::[TAB][TAB]
      (anonymous namespace)::a_function()
      (anonymous namespace)::b_function()

  ** GDB now has much improved linespec and explicit locations TAB
     completion support, that better understands what you're
     completing and offers better suggestions.  For example, GDB no
     longer offers data symbols as possible completions when you're
     setting a breakpoint.

  ** GDB now TAB-completes label symbol names.

  ** The "complete" command now mimics TAB completion accurately.

* New command line options (gcore)

-a
  Dump all memory mappings.

* Breakpoints on C++ functions are now set on all scopes by default

  By default, breakpoints on functions/methods are now interpreted as
  specifying all functions with the given name ignoring missing
  leading scopes (namespaces and classes).

  For example, assuming a C++ program with symbols named:

    A::B::func()
    B::func()

  both commands "break func()" and "break B::func()" set a breakpoint
  on both symbols.

  You can use the new flag "-qualified" to override this.  This makes
  GDB interpret the specified function name as a complete
  fully-qualified name instead.  For example, using the same C++
  program, the "break -q B::func" command sets a breakpoint on
  "B::func", only.  A parameter has been added to the Python
  gdb.Breakpoint constructor to achieve the same result when creating
  a breakpoint from Python.

* Breakpoints on functions marked with C++ ABI tags

  GDB can now set breakpoints on functions marked with C++ ABI tags
  (e.g., [abi:cxx11]).  See here for a description of ABI tags:
  https://developers.redhat.com/blog/2015/02/05/gcc5-and-the-c11-abi/

  Functions with a C++11 abi tag are demangled/displayed like this:

    function[abi:cxx11](int)
            ^^^^^^^^^^^

  You can now set a breakpoint on such functions simply as if they had
  no tag, like:

    (gdb) b function(int)

  Or if you need to disambiguate between tags, like:

    (gdb) b function[abi:other_tag](int)

  Tab completion was adjusted accordingly as well.

* Python Scripting

  ** New events gdb.new_inferior, gdb.inferior_deleted, and
     gdb.new_thread are emitted.  See the manual for further
     description of these.

  ** A new function, "gdb.rbreak" has been added to the Python API.
     This function allows the setting of a large number of breakpoints
     via a regex pattern in Python.  See the manual for further details.

  ** Python breakpoints can now accept explicit locations.  See the
     manual for a further description of this feature.


* New features in the GDB remote stub, GDBserver

  ** GDBserver is now able to start inferior processes with a
     specified initial working directory.

     The user can set the desired working directory to be used from
     GDB using the new "set cwd" command.

  ** New "--selftest" command line option runs some GDBserver self
     tests.  These self tests are disabled in releases.

  ** On Unix systems, GDBserver now does globbing expansion and variable
     substitution in inferior command line arguments.

     This is done by starting inferiors using a shell, like GDB does.
     See "set startup-with-shell" in the user manual for how to disable
     this from GDB when using "target extended-remote".  When using
     "target remote", you can disable the startup with shell by using the
     new "--no-startup-with-shell" GDBserver command line option.

  ** On Unix systems, GDBserver now supports receiving environment
     variables that are to be set or unset from GDB.  These variables
     will affect the environment to be passed to the inferior.

* When catching an Ada exception raised with a message, GDB now prints
  the message in the catchpoint hit notification. In GDB/MI mode, that
  information is provided as an extra field named "exception-message"
  in the *stopped notification.

* Trait objects can now be inspected When debugging Rust code.  This
  requires compiler support which will appear in Rust 1.24.

* New remote packets

QEnvironmentHexEncoded
  Inform GDBserver of an environment variable that is to be passed to
  the inferior when starting it.

QEnvironmentUnset
  Inform GDBserver of an environment variable that is to be unset
  before starting the remote inferior.

QEnvironmentReset
  Inform GDBserver that the environment should be reset (i.e.,
  user-set environment variables should be unset).

QStartupWithShell
  Indicates whether the inferior must be started with a shell or not.

QSetWorkingDir
  Tell GDBserver that the inferior to be started should use a specific
  working directory.

* The "maintenance print c-tdesc" command now takes an optional
  argument which is the file name of XML target description.

* The "maintenance selftest" command now takes an optional argument to
  filter the tests to be run.

* The "enable", and "disable" commands now accept a range of
  breakpoint locations, e.g. "enable 1.3-5".

* New commands

set|show cwd
  Set and show the current working directory for the inferior.

set|show compile-gcc
  Set and show compilation command used for compiling and injecting code
  with the 'compile' commands.

set debug separate-debug-file
show debug separate-debug-file
  Control the display of debug output about separate debug file search.

set dump-excluded-mappings
show dump-excluded-mappings
  Control whether mappings marked with the VM_DONTDUMP flag should be
  dumped when generating a core file.

maint info selftests
  List the registered selftests.

starti
  Start the debugged program stopping at the first instruction.

set|show debug or1k
  Control display of debugging messages related to OpenRISC targets.

set|show print type nested-type-limit
  Set and show the limit of nesting level for nested types that the
  type printer will show.

* TUI Single-Key mode now supports two new shortcut keys: `i' for stepi and
  `o' for nexti.

* Safer/improved support for debugging with no debug info

  GDB no longer assumes functions with no debug information return
  'int'.

  This means that GDB now refuses to call such functions unless you
  tell it the function's type, by either casting the call to the
  declared return type, or by casting the function to a function
  pointer of the right type, and calling that:

    (gdb) p getenv ("PATH")
    'getenv' has unknown return type; cast the call to its declared return type
    (gdb) p (char *) getenv ("PATH")
    $1 = 0x7fffffffe "/usr/local/bin:/"...
    (gdb) p ((char * (*) (const char *)) getenv) ("PATH")
    $2 = 0x7fffffffe "/usr/local/bin:/"...

  Similarly, GDB no longer assumes that global variables with no debug
  info have type 'int', and refuses to print the variable's value
  unless you tell it the variable's type:

    (gdb) p var
    'var' has unknown type; cast it to its declared type
    (gdb) p (float) var
    $3 = 3.14

* New native configurations

FreeBSD/aarch64			aarch64*-*-freebsd*
FreeBSD/arm			arm*-*-freebsd*

* New targets

FreeBSD/aarch64			aarch64*-*-freebsd*
FreeBSD/arm			arm*-*-freebsd*
OpenRISC ELF 			or1k*-*-elf

* Removed targets and native configurations

Solaris 2.0-9			i?86-*-solaris2.[0-9], sparc*-*-solaris2.[0-9]

*** Changes in GDB 8.0

* GDB now supports access to the PKU register on GNU/Linux. The register is
  added by the Memory Protection Keys for Userspace feature which will be
  available in future Intel CPUs.

* GDB now supports C++11 rvalue references.

* Python Scripting

  ** New functions to start, stop and access a running btrace recording.
  ** Rvalue references are now supported in gdb.Type.

* GDB now supports recording and replaying rdrand and rdseed Intel 64
  instructions.

* Building GDB and GDBserver now requires a C++11 compiler.

  For example, GCC 4.8 or later.

  It is no longer possible to build GDB or GDBserver with a C
  compiler.  The --disable-build-with-cxx configure option has been
  removed.

* Building GDB and GDBserver now requires GNU make >= 3.81.

  It is no longer supported to build GDB or GDBserver with another
  implementation of the make program or an earlier version of GNU make.

* Native debugging on MS-Windows supports command-line redirection

  Command-line arguments used for starting programs on MS-Windows can
  now include redirection symbols supported by native Windows shells,
  such as '<', '>', '>>', '2>&1', etc.  This affects GDB commands such
  as "run", "start", and "set args", as well as the corresponding MI
  features.

* Support for thread names on MS-Windows.

  GDB now catches and handles the special exception that programs
  running on MS-Windows use to assign names to threads in the
  debugger.

* Support for Java programs compiled with gcj has been removed.

* User commands now accept an unlimited number of arguments.
  Previously, only up to 10 was accepted.

* The "eval" command now expands user-defined command arguments.

  This makes it easier to process a variable number of arguments:

   define mycommand
     set $i = 0
     while $i < $argc
       eval "print $arg%d", $i
       set $i = $i + 1
     end
   end

* Target descriptions can now describe registers for sparc32 and sparc64.

* GDB now supports DWARF version 5 (debug information format).
  Its .debug_names index is not yet supported.

* New native configurations

FreeBSD/mips			mips*-*-freebsd

* New targets

Synopsys ARC			arc*-*-elf32
FreeBSD/mips			mips*-*-freebsd

* Removed targets and native configurations

Alpha running FreeBSD         alpha*-*-freebsd*
Alpha running GNU/kFreeBSD    alpha*-*-kfreebsd*-gnu

* New commands

flash-erase
  Erases all the flash memory regions reported by the target.

maint print arc arc-instruction address
  Print internal disassembler information about instruction at a given address.

* New options

set disassembler-options
show disassembler-options
  Controls the passing of target specific information to the disassembler.
  If it is necessary to specify more than one disassembler option then
  multiple options can be placed together into a comma separated list.
  The default value is the empty string.  Currently, the only supported
  targets are ARM, PowerPC and S/390.

* New MI commands

-target-flash-erase
  Erases all the flash memory regions reported by the target.  This is
  equivalent to the CLI command flash-erase.

-file-list-shared-libraries
  List the shared libraries in the program.  This is
  equivalent to the CLI command "info shared".

-catch-handlers
  Catchpoints stopping the program when Ada exceptions are
  handled.  This is equivalent to the CLI command "catch handlers".

*** Changes in GDB 7.12

* GDB and GDBserver now build with a C++ compiler by default.

  The --enable-build-with-cxx configure option is now enabled by
  default.  One must now explicitly configure with
  --disable-build-with-cxx in order to build with a C compiler.  This
  option will be removed in a future release.

* GDBserver now supports recording btrace without maintaining an active
  GDB connection.

* GDB now supports a negative repeat count in the 'x' command to examine
  memory backward from the given address.  For example:

    (gdb) bt
    #0  Func1 (n=42, p=0x40061c "hogehoge") at main.cpp:4
    #1  0x400580 in main (argc=1, argv=0x7fffffffe5c8) at main.cpp:8
    (gdb) x/-5i 0x0000000000400580
       0x40056a <main(int, char**)+8>:      mov    %edi,-0x4(%rbp)
       0x40056d <main(int, char**)+11>:     mov    %rsi,-0x10(%rbp)
       0x400571 <main(int, char**)+15>:     mov    $0x40061c,%esi
       0x400576 <main(int, char**)+20>:     mov    $0x2a,%edi
       0x40057b <main(int, char**)+25>:
        callq  0x400536 <Func1(int, char const*)>

* Fortran: Support structures with fields of dynamic types and 
  arrays of dynamic types.

* The symbol dumping maintenance commands have new syntax.
maint print symbols [-pc address] [--] [filename]
maint print symbols [-objfile objfile] [-source source] [--] [filename]
maint print psymbols [-objfile objfile] [-pc address] [--] [filename]
maint print psymbols [-objfile objfile] [-source source] [--] [filename]
maint print msymbols [-objfile objfile] [--] [filename]

* GDB now supports multibit bitfields and enums in target register
  descriptions.

* New Python-based convenience function $_as_string(val), which returns
  the textual representation of a value.  This function is especially
  useful to obtain the text label of an enum value.

* Intel MPX bound violation handling.

   Segmentation faults caused by a Intel MPX boundary violation
   now display the kind of violation (upper or lower), the memory
   address accessed and the memory bounds, along with the usual
   signal received and code location.

   For example:

   Program received signal SIGSEGV, Segmentation fault
   Upper bound violation while accessing address 0x7fffffffc3b3
   Bounds: [lower = 0x7fffffffc390, upper = 0x7fffffffc3a3]
   0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68

* Rust language support.
  GDB now supports debugging programs written in the Rust programming
  language.  See https://www.rust-lang.org/ for more information about
  Rust.

* Support for running interpreters on specified input/output devices

  GDB now supports a new mechanism that allows frontends to provide
  fully featured GDB console views, as a better alternative to
  building such views on top of the "-interpreter-exec console"
  command.  See the new "new-ui" command below.  With that command,
  frontends can now start GDB in the traditional command-line mode
  running in an embedded terminal emulator widget, and create a
  separate MI interpreter running on a specified i/o device.  In this
  way, GDB handles line editing, history, tab completion, etc. in the
  console all by itself, and the GUI uses the separate MI interpreter
  for its own control and synchronization, invisible to the command
  line.

* The "catch syscall" command catches groups of related syscalls.

  The "catch syscall" command now supports catching a group of related
  syscalls using the 'group:' or 'g:' prefix.

* New commands

skip -file file
skip -gfile file-glob-pattern
skip -function function
skip -rfunction regular-expression
  A generalized form of the skip command, with new support for
  glob-style file names and regular expressions for function names.
  Additionally, a file spec and a function spec may now be combined.

maint info line-table REGEXP
  Display the contents of GDB's internal line table data structure.

maint selftest
  Run any GDB unit tests that were compiled in.

new-ui INTERP TTY
  Start a new user interface instance running INTERP as interpreter,
  using the TTY file for input/output.

* Python Scripting

  ** gdb.Breakpoint objects have a new attribute "pending", which
     indicates whether the breakpoint is pending.
  ** Three new breakpoint-related events have been added:
     gdb.breakpoint_created, gdb.breakpoint_modified, and
     gdb.breakpoint_deleted.

signal-event EVENTID
  Signal ("set") the given MS-Windows event object.  This is used in
  conjunction with the Windows JIT debugging (AeDebug) support, where
  the OS suspends a crashing process until a debugger can attach to
  it.  Resuming the crashing process, in order to debug it, is done by
  signalling an event.

* Support for tracepoints and fast tracepoints on s390-linux and s390x-linux
  was added in GDBserver, including JIT compiling fast tracepoint's
  conditional expression bytecode into native code.

* Support for various remote target protocols and ROM monitors has
  been removed:

  target m32rsdi	Remote M32R debugging over SDI
  target mips		MIPS remote debugging protocol
  target pmon		PMON ROM monitor
  target ddb		NEC's DDB variant of PMON for Vr4300
  target rockhopper	NEC RockHopper variant of PMON
  target lsi		LSI variant of PMO

* Support for tracepoints and fast tracepoints on powerpc-linux,
  powerpc64-linux, and powerpc64le-linux was added in GDBserver,
  including JIT compiling fast tracepoint's conditional expression
  bytecode into native code.

* MI async record =record-started now includes the method and format used for
  recording.  For example:

    =record-started,thread-group="i1",method="btrace",format="bts"

* MI async record =thread-selected now includes the frame field.  For example:

     =thread-selected,id="3",frame={level="0",addr="0x00000000004007c0"}

* New targets

Andes NDS32			nds32*-*-elf

*** Changes in GDB 7.11

* GDB now supports debugging kernel-based threads on FreeBSD.

* Per-inferior thread numbers

  Thread numbers are now per inferior instead of global.  If you're
  debugging multiple inferiors, GDB displays thread IDs using a
  qualified INF_NUM.THR_NUM form.  For example:

     (gdb) info threads
       Id   Target Id         Frame
       1.1  Thread 0x7ffff7fc2740 (LWP 8155) (running)
       1.2  Thread 0x7ffff7fc1700 (LWP 8168) (running)
     * 2.1  Thread 0x7ffff7fc2740 (LWP 8157) (running)
       2.2  Thread 0x7ffff7fc1700 (LWP 8190) (running)

  As consequence, thread numbers as visible in the $_thread
  convenience variable and in Python's InferiorThread.num attribute
  are no longer unique between inferiors.

  GDB now maintains a second thread ID per thread, referred to as the
  global thread ID, which is the new equivalent of thread numbers in
  previous releases.  See also $_gthread below.

  For backwards compatibility, MI's thread IDs always refer to global
  IDs.

* Commands that accept thread IDs now accept the qualified
  INF_NUM.THR_NUM form as well.  For example:

     (gdb) thread 2.1
     [Switching to thread 2.1 (Thread 0x7ffff7fc2740 (LWP 8157))] (running)
     (gdb)

* In commands that accept a list of thread IDs, you can now refer to
  all threads of an inferior using a star wildcard.  GDB accepts
  "INF_NUM.*", to refer to all threads of inferior INF_NUM, and "*" to
  refer to all threads of the current inferior.  For example, "info
  threads 2.*".

* You can use "info threads -gid" to display the global thread ID of
  all threads.

* The new convenience variable $_gthread holds the global number of
  the current thread.

* The new convenience variable $_inferior holds the number of the
  current inferior.

* GDB now displays the ID and name of the thread that hit a breakpoint
  or received a signal, if your program is multi-threaded.  For
  example:

   Thread 3 "bar" hit Breakpoint 1 at 0x40087a: file program.c, line 20.
   Thread 1 "main" received signal SIGINT, Interrupt.

* Record btrace now supports non-stop mode.

* Support for tracepoints on aarch64-linux was added in GDBserver.

* The 'record instruction-history' command now indicates speculative execution
  when using the Intel Processor Trace recording format.

* GDB now allows users to specify explicit locations, bypassing
  the linespec parser.  This feature is also available to GDB/MI
  clients.

* Multi-architecture debugging is supported on AArch64 GNU/Linux.
  GDB now is able to debug both AArch64 applications and ARM applications
  at the same time.

* Support for fast tracepoints on aarch64-linux was added in GDBserver,
  including JIT compiling fast tracepoint's conditional expression bytecode
  into native code.

* GDB now supports displaced stepping on AArch64 GNU/Linux.

* "info threads", "info inferiors", "info display", "info checkpoints"
  and "maint info program-spaces" now list the corresponding items in
  ascending ID order, for consistency with all other "info" commands.

* In Ada, the overloads selection menu has been enhanced to display the
  parameter types and the return types for the matching overloaded subprograms.

* New commands

maint set target-non-stop (on|off|auto)
maint show target-non-stop
  Control whether GDB targets always operate in non-stop mode even if
  "set non-stop" is "off".  The default is "auto", meaning non-stop
  mode is enabled if supported by the target.

maint set bfd-sharing
maint show bfd-sharing
  Control the reuse of bfd objects.

set debug bfd-cache
show debug bfd-cache
  Control display of debugging info regarding bfd caching.

set debug fbsd-lwp
show debug fbsd-lwp
  Control display of debugging info regarding FreeBSD threads.

set remote multiprocess-extensions-packet
show remote multiprocess-extensions-packet
  Set/show the use of the remote protocol multiprocess extensions.

set remote thread-events
show remote thread-events
  Set/show the use of thread create/exit events.

set ada print-signatures on|off
show ada print-signatures"
  Control whether parameter types and return types are displayed in overloads
  selection menus.  It is activated (@code{on}) by default.

set max-value-size
show max-value-size
  Controls the maximum size of memory, in bytes, that GDB will
  allocate for value contents.  Prevents incorrect programs from
  causing GDB to allocate overly large buffers.  Default is 64k.

* The "disassemble" command accepts a new modifier: /s.
  It prints mixed source+disassembly like /m with two differences:
  - disassembled instructions are now printed in program order, and
  - and source for all relevant files is now printed.
  The "/m" option is now considered deprecated: its "source-centric"
  output hasn't proved useful in practice.

* The "record instruction-history" command accepts a new modifier: /s.
  It behaves exactly like /m and prints mixed source+disassembly.

* The "set scheduler-locking" command supports a new mode "replay".
  It behaves like "off" in record mode and like "on" in replay mode.

* Support for various ROM monitors has been removed:

  target dbug		dBUG ROM monitor for Motorola ColdFire
  target picobug	Motorola picobug monitor
  target dink32		DINK32 ROM monitor for PowerPC
  target m32r		Renesas M32R/D ROM monitor
  target mon2000	mon2000 ROM monitor
  target ppcbug		PPCBUG ROM monitor for PowerPC

* Support for reading/writing memory and extracting values on architectures
  whose memory is addressable in units of any integral multiple of 8 bits.

catch handlers
  Allows to break when an Ada exception is handled.

* New remote packets

exec stop reason
  Indicates that an exec system call was executed.

exec-events feature in qSupported
  The qSupported packet allows GDB to request support for exec
  events using the new 'gdbfeature' exec-event, and the qSupported
  response can contain the corresponding 'stubfeature'.  Set and
  show commands can be used to display whether these features are enabled.

vCtrlC
  Equivalent to interrupting with the ^C character, but works in
  non-stop mode.

thread created stop reason (T05 create:...)
  Indicates that the thread was just created and is stopped at entry.

thread exit stop reply (w exitcode;tid)
  Indicates that the thread has terminated.

QThreadEvents
  Enables/disables thread create and exit event reporting.  For
  example, this is used in non-stop mode when GDB stops a set of
  threads and synchronously waits for the their corresponding stop
  replies.  Without exit events, if one of the threads exits, GDB
  would hang forever not knowing that it should no longer expect a
  stop for that same thread.

N stop reply
  Indicates that there are no resumed threads left in the target (all
  threads are stopped).  The remote stub reports support for this stop
  reply to GDB's qSupported query.

QCatchSyscalls
  Enables/disables catching syscalls from the inferior process.
  The remote stub reports support for this packet to GDB's qSupported query.

syscall_entry stop reason
  Indicates that a syscall was just called.

syscall_return stop reason
  Indicates that a syscall just returned.

* Extended-remote exec events

  ** GDB now has support for exec events on extended-remote Linux targets.
     For such targets with Linux kernels 2.5.46 and later, this enables
     follow-exec-mode and exec catchpoints.

set remote exec-event-feature-packet
show remote exec-event-feature-packet
  Set/show the use of the remote exec event feature.

 * Thread names in remote protocol

   The reply to qXfer:threads:read may now include a name attribute for each
   thread.

* Target remote mode fork and exec events

  ** GDB now has support for fork and exec events on target remote mode
     Linux targets.  For such targets with Linux kernels 2.5.46 and later,
     this enables follow-fork-mode, detach-on-fork, follow-exec-mode, and
     fork and exec catchpoints.

* Remote syscall events

  ** GDB now has support for catch syscall on remote Linux targets,
     currently enabled on x86/x86_64 architectures.

set remote catch-syscall-packet
show remote catch-syscall-packet
  Set/show the use of the remote catch syscall feature.

* MI changes

  ** The -var-set-format command now accepts the zero-hexadecimal
     format.  It outputs data in hexadecimal format with zero-padding on the
     left.

* Python Scripting

  ** gdb.InferiorThread objects have a new attribute "global_num",
     which refers to the thread's global thread ID.  The existing
     "num" attribute now refers to the thread's per-inferior number.
     See "Per-inferior thread numbers" above.
  ** gdb.InferiorThread objects have a new attribute "inferior", which
     is the Inferior object the thread belongs to.

*** Changes in GDB 7.10

* Support for process record-replay and reverse debugging on aarch64*-linux*
  targets has been added.  GDB now supports recording of A64 instruction set
  including advance SIMD instructions.

* Support for Sun's version of the "stabs" debug file format has been removed.

* GDB now honors the content of the file /proc/PID/coredump_filter
  (PID is the process ID) on GNU/Linux systems.  This file can be used
  to specify the types of memory mappings that will be included in a
  corefile.  For more information, please refer to the manual page of
  "core(5)".  GDB also has a new command: "set use-coredump-filter
  on|off".  It allows to set whether GDB will read the content of the
  /proc/PID/coredump_filter file when generating a corefile.

* The "info os" command on GNU/Linux can now display information on
  cpu information :
    "info os cpus" Listing of all cpus/cores on the system

* GDB has two new commands: "set serial parity odd|even|none" and
  "show serial parity".  These allows to set or show parity for the
  remote serial I/O.

* The "info source" command now displays the producer string if it was
  present in the debug info.  This typically includes the compiler version
  and may include things like its command line arguments.

* The "info dll", an alias of the "info sharedlibrary" command,
  is now available on all platforms.

* Directory names supplied to the "set sysroot" commands may be
  prefixed with "target:" to tell GDB to access shared libraries from
  the target system, be it local or remote.  This replaces the prefix
  "remote:".  The default sysroot has been changed from "" to
  "target:".  "remote:" is automatically converted to "target:" for
  backward compatibility.

* The system root specified by "set sysroot" will be prepended to the
  filename of the main executable (if reported to GDB as absolute by
  the operating system) when starting processes remotely, and when
  attaching to already-running local or remote processes.

* GDB now supports automatic location and retrieval of executable
  files from remote targets.  Remote debugging can now be initiated
  using only a "target remote" or "target extended-remote" command
  (no "set sysroot" or "file" commands are required).  See "New remote
  packets" below.

* The "dump" command now supports verilog hex format.

* GDB now supports the vector ABI on S/390 GNU/Linux targets.

* On GNU/Linux, GDB and gdbserver are now able to access executable
  and shared library files without a "set sysroot" command when
  attaching to processes running in different mount namespaces from
  the debugger.  This makes it possible to attach to processes in
  containers as simply as "gdb -p PID" or "gdbserver --attach PID".
  See "New remote packets" below.

* The "tui reg" command now provides completion for all of the
  available register groups, including target specific groups.

* The HISTSIZE environment variable is no longer read when determining
  the size of GDB's command history.  GDB now instead reads the dedicated
  GDBHISTSIZE environment variable.  Setting GDBHISTSIZE to "-1" or to "" now
  disables truncation of command history.  Non-numeric values of GDBHISTSIZE
  are ignored.

* Guile Scripting

  ** Memory ports can now be unbuffered.

* Python Scripting

  ** gdb.Objfile objects have a new attribute "username",
     which is the name of the objfile as specified by the user,
     without, for example, resolving symlinks.
  ** You can now write frame unwinders in Python.
  ** gdb.Type objects have a new method "optimized_out",
     returning optimized out gdb.Value instance of this type.
  ** gdb.Value objects have new methods "reference_value" and
     "const_value" which return a reference to the value and a
     "const" version of the value respectively.

* New commands

maint print symbol-cache
  Print the contents of the symbol cache.

maint print symbol-cache-statistics
  Print statistics of symbol cache usage.

maint flush-symbol-cache
  Flush the contents of the symbol cache.

record btrace bts
record bts
  Start branch trace recording using Branch Trace Store (BTS) format.

compile print
  Evaluate expression by using the compiler and print result.

tui enable
tui disable
  Explicit commands for enabling and disabling tui mode.

show mpx bound
set mpx bound on i386 and amd64
   Support for bound table investigation on Intel MPX enabled applications.

record btrace pt
record pt
  Start branch trace recording using Intel Processor Trace format.

maint info btrace
  Print information about branch tracing internals.

maint btrace packet-history
  Print the raw branch tracing data.

maint btrace clear-packet-history
  Discard the stored raw branch tracing data.

maint btrace clear
  Discard all branch tracing data.  It will be fetched and processed
  anew by the next "record" command.

* New options

set debug dwarf-die
  Renamed from "set debug dwarf2-die".
show debug dwarf-die
  Renamed from "show debug dwarf2-die".

set debug dwarf-read
  Renamed from "set debug dwarf2-read".
show debug dwarf-read
  Renamed from "show debug dwarf2-read".

maint set dwarf always-disassemble
  Renamed from "maint set dwarf2 always-disassemble".
maint show dwarf always-disassemble
  Renamed from "maint show dwarf2 always-disassemble".

maint set dwarf max-cache-age
  Renamed from "maint set dwarf2 max-cache-age".
maint show dwarf max-cache-age
  Renamed from "maint show dwarf2 max-cache-age".

set debug dwarf-line
show debug dwarf-line
  Control display of debugging info regarding DWARF line processing.

set max-completions
show max-completions
  Set the maximum number of candidates to be considered during
  completion.  The default value is 200.  This limit allows GDB
  to avoid generating large completion lists, the computation of
  which can cause the debugger to become temporarily unresponsive.

set history remove-duplicates
show history remove-duplicates
  Control the removal of duplicate history entries.

maint set symbol-cache-size
maint show symbol-cache-size
  Control the size of the symbol cache.

set|show record btrace bts buffer-size
  Set and show the size of the ring buffer used for branch tracing in
  BTS format.
  The obtained size may differ from the requested size.  Use "info
  record" to see the obtained buffer size.

set debug linux-namespaces
show debug linux-namespaces
  Control display of debugging info regarding Linux namespaces.

set|show record btrace pt buffer-size
  Set and show the size of the ring buffer used for branch tracing in
  Intel Processor Trace format.
  The obtained size may differ from the requested size.  Use "info
  record" to see the obtained buffer size.

maint set|show btrace pt skip-pad
  Set and show whether PAD packets are skipped when computing the
  packet history.

* The command 'thread apply all' can now support new option '-ascending'
  to call its specified command for all threads in ascending order.

* Python/Guile scripting

  ** GDB now supports auto-loading of Python/Guile scripts contained in the
     special section named `.debug_gdb_scripts'.

* New remote packets

qXfer:btrace-conf:read
  Return the branch trace configuration for the current thread.

Qbtrace-conf:bts:size
  Set the requested ring buffer size for branch tracing in BTS format.

Qbtrace:pt
  Enable Intel Processor Trace-based branch tracing for the current
  process.  The remote stub reports support for this packet to GDB's
  qSupported query.

Qbtrace-conf:pt:size
  Set the requested ring buffer size for branch tracing in Intel Processor
  Trace format.

swbreak stop reason
  Indicates a memory breakpoint instruction was executed, irrespective
  of whether it was GDB that planted the breakpoint or the breakpoint
  is hardcoded in the program.  This is required for correct non-stop
  mode operation.

hwbreak stop reason
  Indicates the target stopped for a hardware breakpoint.  This is
  required for correct non-stop mode operation.

vFile:fstat:
  Return information about files on the remote system.

qXfer:exec-file:read
  Return the full absolute name of the file that was executed to
  create a process running on the remote system.

vFile:setfs:
  Select the filesystem on which vFile: operations with filename
  arguments will operate.  This is required for GDB to be able to
  access files on remote targets where the remote stub does not
  share a common filesystem with the inferior(s).

fork stop reason
  Indicates that a fork system call was executed.

vfork stop reason
  Indicates that a vfork system call was executed.

vforkdone stop reason
  Indicates that a vfork child of the specified process has executed
  an exec or exit, allowing the vfork parent to resume execution.

fork-events and vfork-events features in qSupported
  The qSupported packet allows GDB to request support for fork and 
  vfork events using new 'gdbfeatures' fork-events and vfork-events,
  and the qSupported response can contain the corresponding
  'stubfeatures'.  Set and show commands can be used to display
  whether these features are enabled.

* Extended-remote fork events

  ** GDB now has support for fork events on extended-remote Linux
     targets.  For targets with Linux kernels 2.5.60 and later, this
     enables follow-fork-mode and detach-on-fork for both fork and
     vfork, as well as fork and vfork catchpoints.

* The info record command now shows the recording format and the
  branch tracing configuration for the current thread when using
  the btrace record target.
  For the BTS format, it shows the ring buffer size.

* GDB now has support for DTrace USDT (Userland Static Defined
  Tracing) probes.  The supported targets are x86_64-*-linux-gnu.

* GDB now supports access to vector registers on S/390 GNU/Linux
  targets.

* Removed command line options

-xdb  HP-UX XDB compatibility mode.

* Removed targets and native configurations

HP/PA running HP-UX           hppa*-*-hpux*
Itanium running HP-UX         ia64-*-hpux*

* New configure options

--with-intel-pt
  This configure option allows the user to build GDB with support for
  Intel Processor Trace (default: auto).  This requires libipt.

--with-libipt-prefix=PATH
  Specify the path to the version of libipt that GDB should use.
  $PATH/include should contain the intel-pt.h header and
  $PATH/lib should contain the libipt.so library.

*** Changes in GDB 7.9.1

* Python Scripting

  ** Xmethods can now specify a result type.

*** Changes in GDB 7.9

* GDB now supports hardware watchpoints on x86 GNU Hurd.

* Python Scripting

  ** You can now access frame registers from Python scripts.
  ** New attribute 'producer' for gdb.Symtab objects.
  ** gdb.Objfile objects have a new attribute "progspace",
     which is the gdb.Progspace object of the containing program space.
  ** gdb.Objfile objects have a new attribute "owner".
  ** gdb.Objfile objects have a new attribute "build_id",
     which is the build ID generated when the file was built.
  ** gdb.Objfile objects have a new method "add_separate_debug_file".
  ** A new event "gdb.clear_objfiles" has been added, triggered when
     selecting a new file to debug.
  ** You can now add attributes to gdb.Objfile and gdb.Progspace objects.
  ** New function gdb.lookup_objfile.

  New events which are triggered when GDB modifies the state of the 
  inferior.

  ** gdb.events.inferior_call_pre: Function call is about to be made.
  ** gdb.events.inferior_call_post: Function call has just been made.
  ** gdb.events.memory_changed: A memory location has been altered.
  ** gdb.events.register_changed: A register has been altered.

* New Python-based convenience functions:

  ** $_caller_is(name [, number_of_frames])
  ** $_caller_matches(regexp [, number_of_frames])
  ** $_any_caller_is(name [, number_of_frames])
  ** $_any_caller_matches(regexp [, number_of_frames])

* GDB now supports the compilation and injection of source code into
  the inferior.  GDB will use GCC 5.0 or higher built with libcc1.so
  to compile the source code to object code, and if successful, inject
  and execute that code within the current context of the inferior.
  Currently the C language is supported.  The commands used to
  interface with this new feature are:

     compile code [-raw|-r] [--] [source code]
     compile file [-raw|-r] filename

* New commands

demangle [-l language] [--] name
  Demangle "name" in the specified language, or the current language
  if elided.  This command is renamed from the "maint demangle" command.
  The latter is kept as a no-op to avoid "maint demangle" being interpreted
  as "maint demangler-warning".

queue-signal signal-name-or-number
  Queue a signal to be delivered to the thread when it is resumed.

add-auto-load-scripts-directory directory
  Add entries to the list of directories from which to load auto-loaded
  scripts.

maint print user-registers
  List all currently available "user" registers.

compile code [-r|-raw] [--] [source code]
  Compile, inject, and execute in the inferior the executable object
  code produced by compiling the provided source code.

compile file [-r|-raw] filename
  Compile and inject into the inferior the executable object code
  produced by compiling the source code stored in the filename
  provided.

* On resume, GDB now always passes the signal the program had stopped
  for to the thread the signal was sent to, even if the user changed
  threads before resuming.  Previously GDB would often (but not
  always) deliver the signal to the thread that happens to be current
  at resume time.

* Conversely, the "signal" command now consistently delivers the
  requested signal to the current thread.  GDB now asks for
  confirmation if the program had stopped for a signal and the user
  switched threads meanwhile.

* "breakpoint always-inserted" modes "off" and "auto" merged.

  Now, when 'breakpoint always-inserted mode' is set to "off", GDB
  won't remove breakpoints from the target until all threads stop,
  even in non-stop mode.  The "auto" mode has been removed, and "off"
  is now the default mode.

* New options

set debug symbol-lookup
show debug symbol-lookup
  Control display of debugging info regarding symbol lookup.

* MI changes

  ** The -list-thread-groups command outputs an exit-code field for
     inferiors that have exited.

* New targets

MIPS SDE			mips*-sde*-elf*

* Removed targets

Support for these obsolete configurations has been removed.

Alpha running OSF/1 (or Tru64)		alpha*-*-osf*
SGI Irix-5.x				mips-*-irix5*
SGI Irix-6.x				mips-*-irix6*
VAX running (4.2 - 4.3 Reno) BSD 	vax-*-bsd*
VAX running Ultrix 			vax-*-ultrix*

* The "dll-symbols" command, and its two aliases ("add-shared-symbol-files"
  and "assf"), have been removed.  Use the "sharedlibrary" command, or
  its alias "share", instead.

*** Changes in GDB 7.8

* New command line options

-D data-directory
  This is an alias for the --data-directory option.

* GDB supports printing and modifying of variable length automatic arrays
  as specified in ISO C99.

* The ARM simulator now supports instruction level tracing
  with or without disassembly.

* Guile scripting

  GDB now has support for scripting using Guile.  Whether this is
  available is determined at configure time.
  Guile version 2.0 or greater is required.
  Guile version 2.0.9 is well tested, earlier 2.0 versions are not.

* New commands (for set/show, see "New options" below)

guile [code]
gu [code]
  Invoke CODE by passing it to the Guile interpreter.

guile-repl
gr
  Start a Guile interactive prompt (or "repl" for "read-eval-print loop").

info auto-load guile-scripts [regexp]
  Print the list of automatically loaded Guile scripts.

* The source command is now capable of sourcing Guile scripts.
  This feature is dependent on the debugger being built with Guile support.

* New options

set print symbol-loading (off|brief|full)
show print symbol-loading
  Control whether to print informational messages when loading symbol
  information for a file.  The default is "full", but when debugging
  programs with large numbers of shared libraries the amount of output
  becomes less useful.

set guile print-stack (none|message|full)
show guile print-stack
  Show a stack trace when an error is encountered in a Guile script.

set auto-load guile-scripts (on|off)
show auto-load guile-scripts
  Control auto-loading of Guile script files.

maint ada set ignore-descriptive-types (on|off)
maint ada show ignore-descriptive-types
  Control whether the debugger should ignore descriptive types in Ada
  programs.  The default is not to ignore the descriptive types.  See
  the user manual for more details on descriptive types and the intended
  usage of this option.

set auto-connect-native-target

  Control whether GDB is allowed to automatically connect to the
  native target for the run, attach, etc. commands when not connected
  to any target yet.  See also "target native" below.

set record btrace replay-memory-access (read-only|read-write)
show record btrace replay-memory-access
  Control what memory accesses are allowed during replay.

maint set target-async (on|off)
maint show target-async
  This controls whether GDB targets operate in synchronous or
  asynchronous mode.  Normally the default is asynchronous, if it is
  available; but this can be changed to more easily debug problems
  occurring only in synchronous mode.

set mi-async (on|off)
show mi-async
  Control whether MI asynchronous mode is preferred.  This supersedes
  "set target-async" of previous GDB versions.

* "set target-async" is deprecated as a CLI option and is now an alias
  for "set mi-async" (only puts MI into async mode).

* Background execution commands (e.g., "c&", "s&", etc.) are now
  possible ``out of the box'' if the target supports them.  Previously
  the user would need to explicitly enable the possibility with the
  "set target-async on" command.

* New features in the GDB remote stub, GDBserver

  ** New option --debug-format=option1[,option2,...] allows one to add
     additional text to each output.  At present only timestamps
     are supported: --debug-format=timestamps.
     Timestamps can also be turned on with the
     "monitor set debug-format timestamps" command from GDB.

* The 'record instruction-history' command now starts counting instructions
  at one.  This also affects the instruction ranges reported by the
  'record function-call-history' command when given the /i modifier.

* The command 'record function-call-history' supports a new modifier '/c' to
  indent the function names based on their call stack depth.
  The fields for the '/i' and '/l' modifier have been reordered.
  The source line range is now prefixed with 'at'.
  The instruction range is now prefixed with 'inst'.
  Both ranges are now printed as '<from>, <to>' to allow copy&paste to the
  "record instruction-history" and "list" commands.

* The ranges given as arguments to the 'record function-call-history' and
  'record instruction-history' commands are now inclusive.

* The btrace record target now supports the 'record goto' command.
  For locations inside the execution trace, the back trace is computed
  based on the information stored in the execution trace.

* The btrace record target supports limited reverse execution and replay.
  The target does not record data and therefore does not allow reading
  memory or registers.

* The "catch syscall" command now works on s390*-linux* targets.

* The "compare-sections" command is no longer specific to target
  remote.  It now works with all targets.

* All native targets are now consistently called "native".
  Consequently, the "target child", "target GNU", "target djgpp",
  "target procfs" (Solaris/Irix/OSF/AIX) and "target darwin-child"
  commands have been replaced with "target native".  The QNX/NTO port
  leaves the "procfs" target in place and adds a "native" target for
  consistency with other ports.  The impact on users should be minimal
  as these commands previously either throwed an error, or were
  no-ops.  The target's name is visible in the output of the following
  commands: "help target", "info target", "info files", "maint print
  target-stack".

* The "target native" command now connects to the native target.  This
  can be used to launch native programs even when "set
  auto-connect-native-target" is set to off.

* GDB now supports access to Intel MPX registers on GNU/Linux.

* Support for Intel AVX-512 registers on GNU/Linux.
  Support displaying and modifying Intel AVX-512 registers
  $zmm0 - $zmm31 and $k0 - $k7 on GNU/Linux.

* New remote packets

qXfer:btrace:read's annex
  The qXfer:btrace:read packet supports a new annex 'delta' to read
  branch trace incrementally.

* Python Scripting

  ** Valid Python operations on gdb.Value objects representing
     structs/classes invoke the corresponding overloaded operators if
     available.
  ** New `Xmethods' feature in the Python API.  Xmethods are
     additional methods or replacements for existing methods of a C++
     class.  This feature is useful for those cases where a method
     defined in C++ source code could be inlined or optimized out by
     the compiler, making it unavailable to GDB.

* New targets
PowerPC64 GNU/Linux little-endian	powerpc64le-*-linux*

* The "dll-symbols" command, and its two aliases ("add-shared-symbol-files"
  and "assf"), have been deprecated.  Use the "sharedlibrary" command, or
  its alias "share", instead.

* The commands "set remotebaud" and "show remotebaud" are no longer
  supported.  Use "set serial baud" and "show serial baud" (respectively)
  instead.

* MI changes

  ** A new option "-gdb-set mi-async" replaces "-gdb-set
     target-async".  The latter is left as a deprecated alias of the
     former for backward compatibility.  If the target supports it,
     CLI background execution commands are now always possible by
     default, independently of whether the frontend stated a
     preference for asynchronous execution with "-gdb-set mi-async".
     Previously "-gdb-set target-async off" affected both MI execution
     commands and CLI execution commands.

*** Changes in GDB 7.7

* Improved support for process record-replay and reverse debugging on
  arm*-linux* targets.  Support for thumb32 and syscall instruction
  recording has been added.

* GDB now supports SystemTap SDT probes on AArch64 GNU/Linux.

* GDB now supports Fission DWP file format version 2.
  http://gcc.gnu.org/wiki/DebugFission

* New convenience function "$_isvoid", to check whether an expression
  is void.  A void expression is an expression where the type of the
  result is "void".  For example, some convenience variables may be
  "void" when evaluated (e.g., "$_exitcode" before the execution of
  the program being debugged; or an undefined convenience variable).
  Another example, when calling a function whose return type is
  "void".

* The "maintenance print objfiles" command now takes an optional regexp.

* The "catch syscall" command now works on arm*-linux* targets.

* GDB now consistently shows "<not saved>" when printing values of
  registers the debug info indicates have not been saved in the frame
  and there's nowhere to retrieve them from
  (callee-saved/call-clobbered registers):

    (gdb) p $rax
    $1 = <not saved>

    (gdb) info registers rax
    rax            <not saved>

  Before, the former would print "<optimized out>", and the latter
  "*value not available*".

* New script contrib/gdb-add-index.sh for adding .gdb_index sections
  to binaries.

* Python scripting

  ** Frame filters and frame decorators have been added.
  ** Temporary breakpoints are now supported.
  ** Line tables representation has been added.
  ** New attribute 'parent_type' for gdb.Field objects.
  ** gdb.Field objects can be used as subscripts on gdb.Value objects.
  ** New attribute 'name' for gdb.Type objects.

* New targets

Nios II ELF 			nios2*-*-elf
Nios II GNU/Linux		nios2*-*-linux
Texas Instruments MSP430	msp430*-*-elf

* Removed native configurations

Support for these a.out NetBSD and OpenBSD obsolete configurations has
been removed.  ELF variants of these configurations are kept supported.

arm*-*-netbsd*              but arm*-*-netbsdelf*       is kept supported.
i[34567]86-*-netbsd*        but i[34567]86-*-netbsdelf* is kept supported.
i[34567]86-*-openbsd[0-2].* but i[34567]86-*-openbsd*   is kept supported.
i[34567]86-*-openbsd3.[0-3]
m68*-*-netbsd*              but m68*-*-netbsdelf*       is kept supported.
sparc-*-netbsd*             but sparc-*-netbsdelf*      is kept supported.
vax-*-netbsd*               but vax-*-netbsdelf*        is kept supported.

* New commands:
catch rethrow
  Like "catch throw", but catches a re-thrown exception.
maint check-psymtabs
  Renamed from old "maint check-symtabs".
maint check-symtabs
  Perform consistency checks on symtabs.
maint expand-symtabs
  Expand symtabs matching an optional regexp.

show configuration
  Display the details of GDB configure-time options.

maint set|show per-command
maint set|show per-command space
maint set|show per-command time
maint set|show per-command symtab
  Enable display of per-command gdb resource usage.

remove-symbol-file FILENAME
remove-symbol-file -a ADDRESS
  Remove a symbol file added via add-symbol-file.  The file to remove
  can be identified by its filename or by an address that lies within
  the boundaries of this symbol file in memory.

info exceptions
info exceptions REGEXP
  Display the list of Ada exceptions defined in the program being
  debugged.  If provided, only the exceptions whose names match REGEXP
  are listed.

* New options

set debug symfile off|on
show debug symfile
  Control display of debugging info regarding reading symbol files and
  symbol tables within those files

set print raw frame-arguments
show print raw frame-arguments
  Set/show whether to print frame arguments in raw mode,
  disregarding any defined pretty-printers.

set remote trace-status-packet
show remote trace-status-packet
  Set/show the use of remote protocol qTStatus packet.

set debug nios2
show debug nios2
  Control display of debugging messages related to Nios II targets.

set range-stepping
show range-stepping
  Control whether target-assisted range stepping is enabled.

set startup-with-shell
show startup-with-shell
  Specifies whether Unix child processes are started via a shell or
  directly.

set code-cache
show code-cache
  Use the target memory cache for accesses to the code segment.  This
  improves performance of remote debugging (particularly disassembly).

* You can now use a literal value 'unlimited' for options that
  interpret 0 or -1 as meaning "unlimited".  E.g., "set
  trace-buffer-size unlimited" is now an alias for "set
  trace-buffer-size -1" and "set height unlimited" is now an alias for
  "set height 0".

* The "set debug symtab-create" debugging option of GDB has been changed to
  accept a verbosity level.  0 means "off", 1 provides basic debugging
  output, and values of 2 or greater provides more verbose output.

* New command-line options
--configuration
  Display the details of GDB configure-time options.

* The command 'tsave' can now support new option '-ctf' to save trace
  buffer in Common Trace Format.

* Newly installed $prefix/bin/gcore acts as a shell interface for the
  GDB command gcore.

* GDB now implements the C++ 'typeid' operator.

* The new convenience variable $_exception holds the exception being
  thrown or caught at an exception-related catchpoint.

* The exception-related catchpoints, like "catch throw", now accept a
  regular expression which can be used to filter exceptions by type.

* The new convenience variable $_exitsignal is automatically set to
  the terminating signal number when the program being debugged dies
  due to an uncaught signal.

* MI changes

  ** All MI commands now accept an optional "--language" option.
     Support for this feature can be verified by using the "-list-features"
     command, which should contain "language-option".

  ** The new command -info-gdb-mi-command allows the user to determine
     whether a GDB/MI command is supported or not.

  ** The "^error" result record returned when trying to execute an undefined
     GDB/MI command now provides a variable named "code" whose content is the
     "undefined-command" error code.  Support for this feature can be verified
     by using the "-list-features" command, which should contain
     "undefined-command-error-code".

  ** The -trace-save MI command can optionally save trace buffer in Common
     Trace Format now.

  ** The new command -dprintf-insert sets a dynamic printf breakpoint.

  ** The command -data-list-register-values now accepts an optional
     "--skip-unavailable" option.  When used, only the available registers
     are displayed.

  ** The new command -trace-frame-collected dumps collected variables,
     computed expressions, tvars, memory and registers in a traceframe.

  ** The commands -stack-list-locals, -stack-list-arguments and
     -stack-list-variables now accept an option "--skip-unavailable".
     When used, only the available locals or arguments are displayed.

  ** The -exec-run command now accepts an optional "--start" option.
     When used, the command follows the same semantics as the "start"
     command, stopping the program's execution at the start of its
     main subprogram.  Support for this feature can be verified using
     the "-list-features" command, which should contain
     "exec-run-start-option".

  ** The new commands -catch-assert and -catch-exceptions insert
     catchpoints stopping the program when Ada exceptions are raised.

  ** The new command -info-ada-exceptions provides the equivalent of
     the new "info exceptions" command.

* New system-wide configuration scripts
  A GDB installation now provides scripts suitable for use as system-wide
  configuration scripts for the following systems:
    ** ElinOS
    ** Wind River Linux

* GDB now supports target-assigned range stepping with remote targets.
  This improves the performance of stepping source lines by reducing
  the number of control packets from/to GDB.  See "New remote packets"
  below.

* GDB now understands the element 'tvar' in the XML traceframe info.
  It has the id of the collected trace state variables.

* On S/390 targets that provide the transactional-execution feature,
  the program interruption transaction diagnostic block (TDB) is now
  represented as a number of additional "registers" in GDB.

* New remote packets

vCont;r

  The vCont packet supports a new 'r' action, that tells the remote
  stub to step through an address range itself, without GDB
  involvemement at each single-step.

qXfer:libraries-svr4:read's annex
  The previously unused annex of the qXfer:libraries-svr4:read packet
  is now used to support passing an argument list.  The remote stub
  reports support for this argument list to GDB's qSupported query.
  The defined arguments are "start" and "prev", used to reduce work
  necessary for library list updating, resulting in significant
  speedup.

* New features in the GDB remote stub, GDBserver

  ** GDBserver now supports target-assisted range stepping.  Currently
     enabled on x86/x86_64 GNU/Linux targets.

  ** GDBserver now adds element 'tvar' in the XML in the reply to
     'qXfer:traceframe-info:read'.  It has the id of the collected
     trace state variables.

  ** GDBserver now supports hardware watchpoints on the MIPS GNU/Linux
     target.

* New 'z' formatter for printing and examining memory, this displays the
  value as hexadecimal zero padded on the left to the size of the type.

* GDB can now use Windows x64 unwinding data.

* The "set remotebaud" command has been replaced by "set serial baud".
  Similarly, "show remotebaud" has been replaced by "show serial baud".
  The "set remotebaud" and "show remotebaud" commands are still available
  to provide backward compatibility with older versions of GDB.

*** Changes in GDB 7.6

* Target record has been renamed to record-full.
  Record/replay is now enabled with the "record full" command.
  This also affects settings that are associated with full record/replay
  that have been moved from "set/show record" to "set/show record full":

set|show record full insn-number-max
set|show record full stop-at-limit
set|show record full memory-query

* A new record target "record-btrace" has been added.  The new target
  uses hardware support to record the control-flow of a process.  It
  does not support replaying the execution, but it implements the
  below new commands for investigating the recorded execution log.
  This new recording method can be enabled using:

record btrace

  The "record-btrace" target is only available on Intel Atom processors
  and requires a Linux kernel 2.6.32 or later.

* Two new commands have been added for record/replay to give information
  about the recorded execution without having to replay the execution.
  The commands are only supported by "record btrace".

record instruction-history      prints the execution history at
                                instruction granularity

record function-call-history    prints the execution history at
                                function granularity

* New native configurations

ARM AArch64 GNU/Linux		aarch64*-*-linux-gnu
FreeBSD/powerpc			powerpc*-*-freebsd
x86_64/Cygwin			x86_64-*-cygwin*
Tilera TILE-Gx GNU/Linux	tilegx*-*-linux-gnu

* New targets

ARM AArch64			aarch64*-*-elf
ARM AArch64 GNU/Linux		aarch64*-*-linux
Lynx 178 PowerPC		powerpc-*-lynx*178
x86_64/Cygwin			x86_64-*-cygwin*
Tilera TILE-Gx GNU/Linux	tilegx*-*-linux

* If the configured location of system.gdbinit file (as given by the
  --with-system-gdbinit option at configure time) is in the
  data-directory (as specified by --with-gdb-datadir at configure
  time) or in one of its subdirectories, then GDB will look for the
  system-wide init file in the directory specified by the
  --data-directory command-line option.

* New command line options:

-nh   Disables auto-loading of ~/.gdbinit, but still executes all the
      other initialization files, unlike -nx which disables all of them.

* Removed command line options

-epoch  This was used by the gdb mode in Epoch, an ancient fork of
        Emacs.

* The 'ptype' and 'whatis' commands now accept an argument to control
  type formatting.

* 'info proc' now works on some core files.

* Python scripting

  ** Vectors can be created with gdb.Type.vector.

  ** Python's atexit.register now works in GDB.

  ** Types can be pretty-printed via a Python API.

  ** Python 3 is now supported (in addition to Python 2.4 or later)

  ** New class gdb.Architecture exposes GDB's internal representation
     of architecture in the Python API.

  ** New method Frame.architecture returns the gdb.Architecture object
     corresponding to the frame's architecture.

* New Python-based convenience functions:

  ** $_memeq(buf1, buf2, length)
  ** $_streq(str1, str2)
  ** $_strlen(str)
  ** $_regex(str, regex)

* The 'cd' command now defaults to using '~' (the home directory) if not
  given an argument.

* The C++ ABI now defaults to the GNU v3 ABI.  This has been the
  default for GCC since November 2000.

* The command 'forward-search' can now be abbreviated as 'fo'.

* The command 'info tracepoints' can now display 'installed on target'
  or 'not installed on target' for each non-pending location of tracepoint.

* New configure options

--enable-libmcheck/--disable-libmcheck
  By default, development versions are built with -lmcheck on hosts
  that support it, in order to help track memory corruption issues.
  Release versions, on the other hand, are built without -lmcheck
  by default.  The --enable-libmcheck/--disable-libmcheck configure
  options allow the user to override that default.
--with-babeltrace/--with-babeltrace-include/--with-babeltrace-lib
  This configure option allows the user to build GDB with
  libbabeltrace using which GDB can read Common Trace Format data.

* New commands (for set/show, see "New options" below)

catch signal 
  Catch signals.  This is similar to "handle", but allows commands and
  conditions to be attached.

maint info bfds
  List the BFDs known to GDB.

python-interactive [command]
pi [command]
  Start a Python interactive prompt, or evaluate the optional command
  and print the result of expressions.

py [command]
  "py" is a new alias for "python".

enable type-printer [name]...
disable type-printer [name]...
  Enable or disable type printers.

* Removed commands

  ** For the Renesas Super-H architecture, the "regs" command has been removed
     (has been deprecated in GDB 7.5), and "info all-registers" should be used
     instead.

* New options

set print type methods (on|off)
show print type methods
  Control whether method declarations are displayed by "ptype".
  The default is to show them.

set print type typedefs (on|off)
show print type typedefs
  Control whether typedef definitions are displayed by "ptype".
  The default is to show them.

set filename-display basename|relative|absolute
show filename-display
  Control the way in which filenames is displayed.
  The default is "relative", which preserves previous behavior.

set trace-buffer-size
show trace-buffer-size
  Request target to change the size of trace buffer.

set remote trace-buffer-size-packet auto|on|off
show remote trace-buffer-size-packet
  Control the use of the remote protocol `QTBuffer:size' packet.

set debug aarch64
show debug aarch64
  Control display of debugging messages related to ARM AArch64.
  The default is off.

set debug coff-pe-read
show debug coff-pe-read
  Control display of debugging messages related to reading of COFF/PE
  exported symbols.

set debug mach-o
show debug mach-o
  Control display of debugging messages related to Mach-O symbols
  processing.

set debug notification
show debug notification
  Control display of debugging info for async remote notification.

* MI changes

  ** Command parameter changes are now notified using new async record
     "=cmd-param-changed".
  ** Trace frame changes caused by command "tfind" are now notified using
     new async record "=traceframe-changed".
  ** The creation, deletion and modification of trace state variables
     are now notified using new async records "=tsv-created",
     "=tsv-deleted" and "=tsv-modified".
  ** The start and stop of process record are now notified using new
     async record "=record-started" and "=record-stopped".
  ** Memory changes are now notified using new async record
     "=memory-changed".
  ** The data-disassemble command response will include a "fullname" field
     containing the absolute file name when source has been requested.
  ** New optional parameter COUNT added to the "-data-write-memory-bytes" 
     command, to allow pattern filling of memory areas.
  ** New commands "-catch-load"/"-catch-unload" added for intercepting
     library load/unload events.
  ** The response to breakpoint commands and breakpoint async records
     includes an "installed" field containing a boolean state about each
     non-pending tracepoint location is whether installed on target or not.
  ** Output of the "-trace-status" command includes a "trace-file" field 
     containing the name of the trace file being examined.  This field is
     optional, and only present when examining a trace file.
  ** The "fullname" field is now always present along with the "file" field,
     even if the file cannot be found by GDB.

* GDB now supports the "mini debuginfo" section, .gnu_debugdata.
  You must have the LZMA library available when configuring GDB for this
  feature to be enabled.  For more information, see:
      http://fedoraproject.org/wiki/Features/MiniDebugInfo

* New remote packets

QTBuffer:size
   Set the size of trace buffer.  The remote stub reports support for this
   packet to gdb's qSupported query.

Qbtrace:bts
  Enable Branch Trace Store (BTS)-based branch tracing for the current
  thread.  The remote stub reports support for this packet to gdb's
  qSupported query.

Qbtrace:off
  Disable branch tracing for the current thread.  The remote stub reports
  support for this packet to gdb's qSupported query.

qXfer:btrace:read
  Read the traced branches for the current thread.  The remote stub
  reports support for this packet to gdb's qSupported query.

*** Changes in GDB 7.5

* GDB now supports x32 ABI.  Visit <http://sites.google.com/site/x32abi/>
  for more x32 ABI info.

* GDB now supports access to MIPS DSP registers on Linux targets.

* GDB now supports debugging microMIPS binaries.

* The "info os" command on GNU/Linux can now display information on
  several new classes of objects managed by the operating system:
    "info os procgroups" lists process groups
    "info os files" lists file descriptors
    "info os sockets" lists internet-domain sockets
    "info os shm" lists shared-memory regions
    "info os semaphores" lists semaphores
    "info os msg" lists message queues
    "info os modules" lists loaded kernel modules

* GDB now has support for SDT (Static Defined Tracing) probes.  Currently,
  the only implemented backend is for SystemTap probes (<sys/sdt.h>).  You
  can set a breakpoint using the new "-probe, "-pstap" or "-probe-stap"
  options and inspect the probe arguments using the new $_probe_arg family
  of convenience variables.  You can obtain more information about SystemTap
  in <http://sourceware.org/systemtap/>.

* GDB now supports reversible debugging on ARM, it allows you to
  debug basic ARM and THUMB instructions, and provides 
  record/replay support.  

* The option "symbol-reloading" has been deleted as it is no longer used.

* Python scripting

  ** GDB commands implemented in Python can now be put in command class
     "gdb.COMMAND_USER".

  ** The "maint set python print-stack on|off" is now deleted.

  ** A new class, gdb.printing.FlagEnumerationPrinter, can be used to
     apply "flag enum"-style pretty-printing to any enum.

  ** gdb.lookup_symbol can now work when there is no current frame.

  ** gdb.Symbol now has a 'line' attribute, holding the line number in
     the source at which the symbol was defined.

  ** gdb.Symbol now has the new attribute 'needs_frame' and the new
     method 'value'.  The former indicates whether the symbol needs a
     frame in order to compute its value, and the latter computes the
     symbol's value.

  ** A new method 'referenced_value' on gdb.Value objects which can
     dereference pointer as well as C++ reference values.

  ** New methods 'global_block' and 'static_block' on gdb.Symtab objects
     which return the global and static blocks (as gdb.Block objects),
     of the underlying symbol table, respectively.

  ** New function gdb.find_pc_line which returns the gdb.Symtab_and_line
     object associated with a PC value.

  ** gdb.Symtab_and_line has new attribute 'last' which holds the end
     of the address range occupied by code for the current source line.

* Go language support.
  GDB now supports debugging programs written in the Go programming
  language.

* GDBserver now supports stdio connections.
  E.g. (gdb) target remote | ssh myhost gdbserver - hello

* The binary "gdbtui" can no longer be built or installed.
  Use "gdb -tui" instead.

* GDB will now print "flag" enums specially.  A flag enum is one where
  all the enumerator values have no bits in common when pairwise
  "and"ed.  When printing a value whose type is a flag enum, GDB will
  show all the constants, e.g., for enum E { ONE = 1, TWO = 2}:
  (gdb) print (enum E) 3
  $1 = (ONE | TWO)

* The filename part of a linespec will now match trailing components
  of a source file name.  For example, "break gcc/expr.c:1000" will
  now set a breakpoint in build/gcc/expr.c, but not
  build/libcpp/expr.c.

* The "info proc" and "generate-core-file" commands will now also
  work on remote targets connected to GDBserver on Linux.

* The command "info catch" has been removed.  It has been disabled
  since December 2007.

* The "catch exception" and "catch assert" commands now accept
  a condition at the end of the command, much like the "break"
  command does. For instance:

        (gdb) catch exception Constraint_Error if Barrier = True

  Previously, it was possible to add a condition to such catchpoints,
  but it had to be done as a second step, after the catchpoint had been
  created, using the "condition" command.

* The "info static-tracepoint-marker" command will now also work on
  native Linux targets with in-process agent.

* GDB can now set breakpoints on inlined functions.

* The .gdb_index section has been updated to include symbols for
  inlined functions.  GDB will ignore older .gdb_index sections by
  default, which could cause symbol files to be loaded more slowly
  until their .gdb_index sections can be recreated.  The new command
  "set use-deprecated-index-sections on" will cause GDB to use any older
  .gdb_index sections it finds.  This will restore performance, but the
  ability to set breakpoints on inlined functions will be lost in symbol
  files with older .gdb_index sections.

  The .gdb_index section has also been updated to record more information
  about each symbol.  This speeds up the "info variables", "info functions"
  and "info types" commands when used with programs having the .gdb_index
  section, as well as speeding up debugging with shared libraries using
  the .gdb_index section.

* Ada support for GDB/MI Variable Objects has been added.

* GDB can now support 'breakpoint always-inserted mode' in 'record'
  target.

* MI changes

  ** New command -info-os is the MI equivalent of "info os".

  ** Output logs ("set logging" and related) now include MI output.

* New commands

  ** "set use-deprecated-index-sections on|off"
     "show use-deprecated-index-sections on|off"
     Controls the use of deprecated .gdb_index sections.

  ** "catch load" and "catch unload" can be used to stop when a shared
     library is loaded or unloaded, respectively.

  ** "enable count" can be used to auto-disable a breakpoint after
     several hits.

  ** "info vtbl" can be used to show the virtual method tables for
     C++ and Java objects.

  ** "explore" and its sub commands "explore value" and "explore type"
     can be used to recursively explore values and types of
     expressions.  These commands are available only if GDB is
     configured with '--with-python'.

  ** "info auto-load" shows status of all kinds of auto-loaded files,
     "info auto-load gdb-scripts" shows status of auto-loading GDB canned
     sequences of commands files, "info auto-load python-scripts"
     shows status of auto-loading Python script files,
     "info auto-load local-gdbinit" shows status of loading init file
     (.gdbinit) from current directory and "info auto-load libthread-db" shows
     status of inferior specific thread debugging shared library loading.

  ** "info auto-load-scripts", "set auto-load-scripts on|off"
     and "show auto-load-scripts" commands have been deprecated, use their
     "info auto-load python-scripts", "set auto-load python-scripts on|off"
     and "show auto-load python-scripts" counterparts instead.

  ** "dprintf location,format,args..." creates a dynamic printf, which
     is basically a breakpoint that does a printf and immediately
     resumes your program's execution, so it is like a printf that you
     can insert dynamically at runtime instead of at compiletime.

  ** "set print symbol"
     "show print symbol"
     Controls whether GDB attempts to display the symbol, if any,
     corresponding to addresses it prints.  This defaults to "on", but
     you can set it to "off" to restore GDB's previous behavior.

* Deprecated commands

  ** For the Renesas Super-H architecture, the "regs" command has been
     deprecated, and "info all-registers" should be used instead.

* New targets

Renesas RL78			rl78-*-elf
HP OpenVMS ia64			ia64-hp-openvms*

* GDBserver supports evaluation of breakpoint conditions.  When
  support is advertised by GDBserver, GDB may be told to send the
  breakpoint conditions in bytecode form to GDBserver.  GDBserver
  will only report the breakpoint trigger to GDB when its condition
  evaluates to true.

* New options

set mips compression
show mips compression
  Select the compressed ISA encoding used in functions that have no symbol
  information available.  The encoding can be set to either of:
    mips16
    micromips
  and is updated automatically from ELF file flags if available.

set breakpoint condition-evaluation
show breakpoint condition-evaluation
  Control whether breakpoint conditions are evaluated by GDB ("host") or by
  GDBserver ("target").  Default option "auto" chooses the most efficient
  available mode.
  This option can improve debugger efficiency depending on the speed of the
  target.

set auto-load off
  Disable auto-loading globally.

show auto-load
  Show auto-loading setting of all kinds of auto-loaded files.

set auto-load gdb-scripts on|off
show auto-load gdb-scripts
  Control auto-loading of GDB canned sequences of commands files.

set auto-load python-scripts on|off
show auto-load python-scripts
  Control auto-loading of Python script files.

set auto-load local-gdbinit on|off
show auto-load local-gdbinit
  Control loading of init file (.gdbinit) from current directory.

set auto-load libthread-db on|off
show auto-load libthread-db
  Control auto-loading of inferior specific thread debugging shared library.

set auto-load scripts-directory <dir1>[:<dir2>...]
show auto-load scripts-directory
  Set a list of directories from which to load auto-loaded scripts.
  Automatically loaded Python scripts and GDB scripts are located in one
  of the directories listed by this option.
  The delimiter (':' above) may differ according to the host platform.

set auto-load safe-path <dir1>[:<dir2>...]
show auto-load safe-path
  Set a list of directories from which it is safe to auto-load files.
  The delimiter (':' above) may differ according to the host platform.

set debug auto-load on|off
show debug auto-load
  Control display of debugging info for auto-loading the files above.

set dprintf-style gdb|call|agent
show dprintf-style
  Control the way in which a dynamic printf is performed; "gdb"
  requests a GDB printf command, while "call" causes dprintf to call a
  function in the inferior.  "agent" requests that the target agent
  (such as GDBserver) do the printing.

set dprintf-function <expr>
show dprintf-function
set dprintf-channel <expr>
show dprintf-channel
  Set the function and optional first argument to the call when using
  the "call" style of dynamic printf.

set disconnected-dprintf on|off
show disconnected-dprintf
  Control whether agent-style dynamic printfs continue to be in effect
  after GDB disconnects.

* New configure options

--with-auto-load-dir
  Configure default value for the 'set auto-load scripts-directory'
  setting above.  It defaults to '$debugdir:$datadir/auto-load',
  $debugdir representing global debugging info directories (available
  via 'show debug-file-directory') and $datadir representing GDB's data
  directory (available via 'show data-directory').

--with-auto-load-safe-path
  Configure default value for the 'set auto-load safe-path' setting
  above.  It defaults to the --with-auto-load-dir setting.

--without-auto-load-safe-path
  Set 'set auto-load safe-path' to '/', effectively disabling this
  security feature.

* New remote packets

z0/z1 conditional breakpoints extension

  The z0/z1 breakpoint insertion packets have been extended to carry
  a list of conditional expressions over to the remote stub depending on the
  condition evaluation mode.  The use of this extension can be controlled
  via the "set remote conditional-breakpoints-packet" command.

QProgramSignals:

  Specify the signals which the remote stub may pass to the debugged
  program without GDB involvement.

* New command line options

--init-command=FILE, -ix          Like --command, -x but execute it
                                  before loading inferior.
--init-eval-command=COMMAND, -iex Like --eval-command=COMMAND, -ex but
                                  execute it before loading inferior.

*** Changes in GDB 7.4

* GDB now handles ambiguous linespecs more consistently; the existing
  FILE:LINE support has been expanded to other types of linespecs.  A
  breakpoint will now be set on all matching locations in all
  inferiors, and locations will be added or removed according to
  inferior changes.

* GDB now allows you to skip uninteresting functions and files when
  stepping with the "skip function" and "skip file" commands.

* GDB has two new commands: "set remote hardware-watchpoint-length-limit"
  and "show remote hardware-watchpoint-length-limit".  These allows to
  set or show the maximum length limit (in bytes) of a remote
  target hardware watchpoint.

  This allows e.g. to use "unlimited" hardware watchpoints with the
  gdbserver integrated in Valgrind version >= 3.7.0.  Such Valgrind
  watchpoints are slower than real hardware watchpoints but are
  significantly faster than gdb software watchpoints.

* Python scripting

  ** The register_pretty_printer function in module gdb.printing now takes
     an optional `replace' argument.  If True, the new printer replaces any
     existing one.

  ** The "maint set python print-stack on|off" command has been
     deprecated and will be deleted in GDB 7.5.
     A new command: "set python print-stack none|full|message" has
     replaced it.  Additionally, the default for "print-stack" is
     now "message", which just prints the error message without
     the stack trace.
   
  ** A prompt substitution hook (prompt_hook) is now available to the
     Python API.

  ** A new Python module, gdb.prompt has been added to the GDB Python
     modules library.  This module provides functionality for
     escape sequences in prompts (used by set/show
     extended-prompt).  These escape sequences are replaced by their
     corresponding value.

  ** Python commands and convenience-functions located in
    'data-directory'/python/gdb/command and
    'data-directory'/python/gdb/function are now automatically loaded
     on GDB start-up.

  ** Blocks now provide four new attributes.  global_block and
     static_block will return the global and static blocks
     respectively.  is_static and is_global are boolean attributes
     that indicate if the block is one of those two types.

  ** Symbols now provide the "type" attribute, the type of the symbol.

  ** The "gdb.breakpoint" function has been deprecated in favor of
     "gdb.breakpoints".

  ** A new class "gdb.FinishBreakpoint" is provided to catch the return
     of a function.  This class is based on the "finish" command
     available in the CLI. 

  ** Type objects for struct and union types now allow access to
     the fields using standard Python dictionary (mapping) methods.
     For example, "some_type['myfield']" now works, as does
     "some_type.items()".

  ** A new event "gdb.new_objfile" has been added, triggered by loading a
     new object file.

  ** A new function, "deep_items" has been added to the gdb.types
     module in the GDB Python modules library.  This function returns
     an iterator over the fields of a struct or union type.  Unlike
     the standard Python "iteritems" method, it will recursively traverse
     any anonymous fields.

* MI changes

  ** "*stopped" events can report several new "reason"s, such as
     "solib-event".

  ** Breakpoint changes are now notified using new async records, like
     "=breakpoint-modified".

  ** New command -ada-task-info.

* libthread-db-search-path now supports two special values: $sdir and $pdir.
  $sdir specifies the default system locations of shared libraries.
  $pdir specifies the directory where the libpthread used by the application
  lives.

  GDB no longer looks in $sdir and $pdir after it has searched the directories
  mentioned in libthread-db-search-path.  If you want to search those
  directories, they must be specified in libthread-db-search-path.
  The default value of libthread-db-search-path on GNU/Linux and Solaris
  systems is now "$sdir:$pdir".

  $pdir is not supported by gdbserver, it is currently ignored.
  $sdir is supported by gdbserver.

* New configure option --with-iconv-bin.
  When using the internationalization support like the one in the GNU C
  library, GDB will invoke the "iconv" program to get a list of supported
  character sets.  If this program lives in a non-standard location, one can
  use this option to specify where to find it.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports masked hardware
  watchpoints, which specify a mask in addition to an address to watch.
  The mask specifies that some bits of an address (the bits which are
  reset in the mask) should be ignored when matching the address accessed
  by the inferior against the watchpoint address.  See the "PowerPC Embedded"
  section in the user manual for more details.

* The new option --once causes GDBserver to stop listening for connections once
  the first connection is made.  The listening port used by GDBserver will
  become available after that.

* New commands "info macros" and "alias" have been added.

* New function parameters suffix @entry specifies value of function parameter
  at the time the function got called.  Entry values are available only since
  gcc version 4.7.

* New commands

!SHELL COMMAND
  "!" is now an alias of the "shell" command.
  Note that no space is needed between "!" and SHELL COMMAND.

* Changed commands

watch EXPRESSION mask MASK_VALUE
  The watch command now supports the mask argument which allows creation
  of masked watchpoints, if the current architecture supports this feature.

info auto-load-scripts [REGEXP]
  This command was formerly named "maintenance print section-scripts".
  It is now generally useful and is no longer a maintenance-only command.

info macro [-all] [--] MACRO
  The info macro command has new options `-all' and `--'.  The first for
  printing all definitions of a macro.  The second for explicitly specifying
  the end of arguments and the beginning of the macro name in case the macro
  name starts with a hyphen.

collect[/s] EXPRESSIONS
  The tracepoint collect command now takes an optional modifier "/s"
  that directs it to dereference pointer-to-character types and
  collect the bytes of memory up to a zero byte.  The behavior is
  similar to what you see when you use the regular print command on a
  string.  An optional integer following the "/s" sets a bound on the
  number of bytes that will be collected.

tstart [NOTES]
  The trace start command now interprets any supplied arguments as a
  note to be recorded with the trace run, with an effect similar to
  setting the variable trace-notes.

tstop [NOTES]
  The trace stop command now interprets any arguments as a note to be
  mentioned along with the tstatus report that the trace was stopped
  with a command.  The effect is similar to setting the variable
  trace-stop-notes.

* Tracepoints can now be enabled and disabled at any time after a trace
  experiment has been started using the standard "enable" and "disable"
  commands.  It is now possible to start a trace experiment with no enabled
  tracepoints; GDB will display a warning, but will allow the experiment to
  begin, assuming that tracepoints will be enabled as needed while the trace
  is running.

* Fast tracepoints on 32-bit x86-architectures can now be placed at
  locations with 4-byte instructions, when they were previously
  limited to locations with instructions of 5 bytes or longer.

* New options

set debug dwarf2-read
show debug dwarf2-read
  Turns on or off display of debugging messages related to reading
  DWARF debug info.  The default is off.

set debug symtab-create
show debug symtab-create
  Turns on or off display of debugging messages related to symbol table
  creation.  The default is off.

set extended-prompt
show extended-prompt
  Set the GDB prompt, and allow escape sequences to be inserted to
  display miscellaneous information (see 'help set extended-prompt'
  for the list of sequences).  This prompt (and any information
  accessed through the escape sequences) is updated every time the
  prompt is displayed.

set print entry-values (both|compact|default|if-needed|no|only|preferred)
show print entry-values
  Set printing of frame argument values at function entry.  In some cases
  GDB can determine the value of function argument which was passed by the
  function caller, even if the value was modified inside the called function.

set debug entry-values
show debug entry-values
  Control display of debugging info for determining frame argument values at
  function entry and virtual tail call frames.

set basenames-may-differ
show basenames-may-differ
  Set whether a source file may have multiple base names.
  (A "base name" is the name of a file with the directory part removed.
  Example: The base name of "/home/user/hello.c" is "hello.c".)
  If set, GDB will canonicalize file names (e.g., expand symlinks)
  before comparing them.  Canonicalization is an expensive operation,
  but it allows the same file be known by more than one base name.
  If not set (the default), all source files are assumed to have just
  one base name, and gdb will do file name comparisons more efficiently.

set trace-user
show trace-user
set trace-notes
show trace-notes
  Set a user name and notes for the current and any future trace runs.
  This is useful for long-running and/or disconnected traces, to
  inform others (or yourself) as to who is running the trace, supply
  contact information, or otherwise explain what is going on.

set trace-stop-notes
show trace-stop-notes
  Set a note attached to the trace run, that is displayed when the
  trace has been stopped by a tstop command.  This is useful for
  instance as an explanation, if you are stopping a trace run that was
  started by someone else.

* New remote packets

QTEnable
  
  Dynamically enable a tracepoint in a started trace experiment.

QTDisable

  Dynamically disable a tracepoint in a started trace experiment.

QTNotes

  Set the user and notes of the trace run.

qTP

  Query the current status of a tracepoint.

qTMinFTPILen

  Query the minimum length of instruction at which a fast tracepoint may
  be placed.

* Dcache size (number of lines) and line-size are now runtime-configurable
  via "set dcache line" and "set dcache line-size" commands.

* New targets

Texas Instruments TMS320C6x		tic6x-*-*

* New Simulators

Renesas RL78				rl78-*-elf

*** Changes in GDB 7.3.1

* The build failure for NetBSD and OpenBSD targets have now been fixed.

*** Changes in GDB 7.3

* GDB has a new command: "thread find [REGEXP]".
  It finds the thread id whose name, target id, or thread extra info
  matches the given regular expression.

* The "catch syscall" command now works on mips*-linux* targets.

* The -data-disassemble MI command now supports modes 2 and 3 for
  dumping the instruction opcodes.

* New command line options

-data-directory DIR	Specify DIR as the "data-directory".
			This is mostly for testing purposes.

* The "maint set python auto-load on|off" command has been renamed to
  "set auto-load-scripts on|off".

* GDB has a new command: "set directories".
  It is like the "dir" command except that it replaces the
  source path list instead of augmenting it.

* GDB now understands thread names.

  On GNU/Linux, "info threads" will display the thread name as set by
  prctl or pthread_setname_np.

  There is also a new command, "thread name", which can be used to
  assign a name internally for GDB to display.

* OpenCL C
  Initial support for the OpenCL C language (http://www.khronos.org/opencl)
  has been integrated into GDB.

* Python scripting

  ** The function gdb.Write now accepts an optional keyword 'stream'.
     This keyword, when provided, will direct the output to either
     stdout, stderr, or GDB's logging output.

  ** Parameters can now be be sub-classed in Python, and in particular
     you may implement the get_set_doc and get_show_doc functions.
     This improves how Parameter set/show documentation is processed
     and allows for more dynamic content.

  ** Symbols, Symbol Table, Symbol Table and Line, Object Files,
     Inferior, Inferior Thread, Blocks, and Block Iterator APIs now
     have an is_valid method.

  ** Breakpoints can now be sub-classed in Python, and in particular
     you may implement a 'stop' function that is executed each time
     the inferior reaches that breakpoint.   

  ** New function gdb.lookup_global_symbol looks up a global symbol.

  ** GDB values in Python are now callable if the value represents a
     function.  For example, if 'some_value' represents a function that
     takes two integer parameters and returns a value, you can call
     that function like so:

     result = some_value (10,20)

  ** Module gdb.types has been added.
     It contains a collection of utilities for working with gdb.Types objects:
     get_basic_type, has_field, make_enum_dict.

  ** Module gdb.printing has been added.
     It contains utilities for writing and registering pretty-printers.
     New classes: PrettyPrinter,  SubPrettyPrinter,
     RegexpCollectionPrettyPrinter.
     New function: register_pretty_printer.

  ** New commands "info pretty-printers", "enable pretty-printer" and
     "disable pretty-printer" have been added.

  ** gdb.parameter("directories") is now available.

  ** New function gdb.newest_frame returns the newest frame in the
     selected thread.

  ** The gdb.InferiorThread class has a new "name" attribute.  This
     holds the thread's name.

  ** Python Support for Inferior events.
     Python scripts can add observers to be notified of events
     occurring in the process being debugged.
     The following events are currently supported:
     - gdb.events.cont Continue event.
     - gdb.events.exited Inferior exited event.
     - gdb.events.stop Signal received, and Breakpoint hit events.

* C++ Improvements:

  ** GDB now puts template parameters in scope when debugging in an
     instantiation.  For example, if you have:

     template<int X> int func (void) { return X; }

     then if you step into func<5>, "print X" will show "5".  This
     feature requires proper debuginfo support from the compiler; it
     was added to GCC 4.5.

  ** The motion commands "next", "finish", "until", and "advance" now
     work better when exceptions are thrown.  In particular, GDB will
     no longer lose control of the inferior; instead, the GDB will
     stop the inferior at the point at which the exception is caught.
     This functionality requires a change in the exception handling
     code that was introduced in GCC 4.5.

* GDB now follows GCC's rules on accessing volatile objects when
  reading or writing target state during expression evaluation.
  One notable difference to prior behavior is that "print x = 0"
  no longer generates a read of x; the value of the assignment is
  now always taken directly from the value being assigned.

* GDB now has some support for using labels in the program's source in
  linespecs.  For instance, you can use "advance label" to continue
  execution to a label.

* GDB now has support for reading and writing a new .gdb_index
  section.  This section holds a fast index of DWARF debugging
  information and can be used to greatly speed up GDB startup and
  operation.  See the documentation for `save gdb-index' for details.

* The "watch" command now accepts an optional "-location" argument.
  When used, this causes GDB to watch the memory referred to by the
  expression.  Such a watchpoint is never deleted due to it going out
  of scope.

* GDB now supports thread debugging of core dumps on GNU/Linux.

  GDB now activates thread debugging using the libthread_db library
  when debugging GNU/Linux core dumps, similarly to when debugging
  live processes.  As a result, when debugging a core dump file, GDB
  is now able to display pthread_t ids of threads.  For example, "info
  threads" shows the same output as when debugging the process when it
  was live.  In earlier releases, you'd see something like this:

  (gdb) info threads
   * 1 LWP 6780  main () at main.c:10

  While now you see this:

  (gdb) info threads
   * 1 Thread 0x7f0f5712a700 (LWP 6780)  main () at main.c:10

  It is also now possible to inspect TLS variables when debugging core
  dumps.

  When debugging a core dump generated on a machine other than the one
  used to run GDB, you may need to point GDB at the correct
  libthread_db library with the "set libthread-db-search-path"
  command.  See the user manual for more details on this command.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports ranged breakpoints,
  which stop execution of the inferior whenever it executes an instruction
  at any address within the specified range.  See the "PowerPC Embedded"
  section in the user manual for more details.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on PowerPC LynxOS (versions 4.x and 5.x),
     and i686 LynxOS (version 5.x).

  ** GDBserver is now supported on Blackfin Linux.

* New native configurations

ia64 HP-UX                      ia64-*-hpux*

* New targets:

Analog Devices, Inc. Blackfin Processor	bfin-*

* Ada task switching is now supported on sparc-elf targets when
  debugging a program using the Ravenscar Profile.  For more information,
  see the "Tasking Support when using the Ravenscar Profile" section
  in the GDB user manual.

* Guile support was removed.

* New features in the GNU simulator

  ** The --map-info flag lists all known core mappings.

  ** CFI flashes may be simulated via the "cfi" device.

*** Changes in GDB 7.2

* Shared library support for remote targets by default

  When GDB is configured for a generic, non-OS specific target, like
  for example, --target=arm-eabi or one of the many *-*-elf targets,
  GDB now queries remote stubs for loaded shared libraries using the
  `qXfer:libraries:read' packet.  Previously, shared library support
  was always disabled for such configurations.

* C++ Improvements:

  ** Argument Dependent Lookup (ADL)

  In C++ ADL lookup directs function search to the namespaces of its
  arguments even if the namespace has not been imported.
  For example:
    namespace A
      { 
        class B { }; 
        void foo (B) { }
      }
    ...
    A::B b
    foo(b)
  Here the compiler will search for `foo' in the namespace of 'b'
  and find A::foo.  GDB now supports this.  This construct is commonly
  used in the Standard Template Library for operators.

  ** Improved User Defined Operator Support

  In addition to member operators, GDB now supports lookup of operators
  defined in a namespace and imported with a `using' directive, operators
  defined in the global scope, operators imported implicitly from an
  anonymous namespace, and the ADL operators mentioned in the previous
  entry.
  GDB now also supports proper overload resolution for all the previously
  mentioned flavors of operators.

  ** static const class members

  Printing of static const class members that are initialized in the
  class definition has been fixed.

* Windows Thread Information Block access.

  On Windows targets, GDB now supports displaying the Windows Thread
  Information Block (TIB) structure.  This structure is visible either
  by using the new command `info w32 thread-information-block' or, by
  dereferencing the new convenience variable named `$_tlb', a
  thread-specific pointer to the TIB.  This feature is also supported
  when remote debugging using GDBserver.

* Static tracepoints

  Static tracepoints are calls in the user program into a tracing
  library.  One such library is a port of the LTTng kernel tracer to
  userspace --- UST (LTTng Userspace Tracer, http://lttng.org/ust).
  When debugging with GDBserver, GDB now supports combining the GDB
  tracepoint machinery with such libraries.  For example: the user can
  use GDB to probe a static tracepoint marker (a call from the user
  program into the tracing library) with the new "strace" command (see
  "New commands" below).  This creates a "static tracepoint" in the
  breakpoint list, that can be manipulated with the same feature set
  as fast and regular tracepoints.  E.g., collect registers, local and
  global variables, collect trace state variables, and define
  tracepoint conditions.  In addition, the user can collect extra
  static tracepoint marker specific data, by collecting the new
  $_sdata internal variable.  When analyzing the trace buffer, you can
  inspect $_sdata like any other variable available to GDB.  For more
  information, see the "Tracepoints" chapter in GDB user manual.  New
  remote packets have been defined to support static tracepoints, see
  the "New remote packets" section below.

* Better reconstruction of tracepoints after disconnected tracing

  GDB will attempt to download the original source form of tracepoint
  definitions when starting a trace run, and then will upload these
  upon reconnection to the target, resulting in a more accurate
  reconstruction of the tracepoints that are in use on the target.

* Observer mode

  You can now exercise direct control over the ways that GDB can
  affect your program.  For instance, you can disallow the setting of
  breakpoints, so that the program can run continuously (assuming
  non-stop mode).  In addition, the "observer" variable is available
  to switch all of the different controls; in observer mode, GDB
  cannot affect the target's behavior at all, which is useful for
  tasks like diagnosing live systems in the field.

* The new convenience variable $_thread holds the number of the
  current thread.

* New remote packets

qGetTIBAddr

  Return the address of the Windows Thread Information Block of a given thread.

qRelocInsn

  In response to several of the tracepoint packets, the target may now
  also respond with a number of intermediate `qRelocInsn' request
  packets before the final result packet, to have GDB handle
  relocating an instruction to execute at a different address.  This
  is particularly useful for stubs that support fast tracepoints.  GDB
  reports support for this feature in the qSupported packet.

qTfSTM, qTsSTM

  List static tracepoint markers in the target program.

qTSTMat

  List static tracepoint markers at a given address in the target
  program.

qXfer:statictrace:read

  Read the static trace data collected (by a `collect $_sdata'
  tracepoint action).  The remote stub reports support for this packet
  to gdb's qSupported query.

QAllow

  Send the current settings of GDB's permission flags.

QTDPsrc

  Send part of the source (textual) form of a tracepoint definition,
  which includes location, conditional, and action list.

* The source command now accepts a -s option to force searching for the
  script in the source search path even if the script name specifies
  a directory.

* New features in the GDB remote stub, GDBserver

  - GDBserver now support tracepoints (including fast tracepoints, and
    static tracepoints).  The feature is currently supported by the
    i386-linux and amd64-linux builds.  See the "Tracepoints support
    in gdbserver" section in the manual for more information.

    GDBserver JIT compiles the tracepoint's conditional agent
    expression bytecode into native code whenever possible for low
    overhead dynamic tracepoints conditionals.  For such tracepoints,
    an expression that examines program state is evaluated when the
    tracepoint is reached, in order to determine whether to capture
    trace data.  If the condition is simple and false, processing the
    tracepoint finishes very quickly and no data is gathered.

    GDBserver interfaces with the UST (LTTng Userspace Tracer) library
    for static tracepoints support.

  - GDBserver now supports x86_64 Windows 64-bit debugging.

* GDB now sends xmlRegisters= in qSupported packet to indicate that
  it understands register description.

* The --batch flag now disables pagination and queries.

* X86 general purpose registers

  GDB now supports reading/writing byte, word and double-word x86
  general purpose registers directly.  This means you can use, say,
  $ah or $ax to refer, respectively, to the byte register AH and
  16-bit word register AX that are actually portions of the 32-bit
  register EAX or 64-bit register RAX.

* The `commands' command now accepts a range of breakpoints to modify.
  A plain `commands' following a command that creates multiple
  breakpoints affects all the breakpoints set by that command.  This
  applies to breakpoints set by `rbreak', and also applies when a
  single `break' command creates multiple breakpoints (e.g.,
  breakpoints on overloaded c++ functions).

* The `rbreak' command now accepts a filename specification as part of
  its argument, limiting the functions selected by the regex to those
  in the specified file.

* Support for remote debugging Windows and SymbianOS shared libraries
  from Unix hosts has been improved.  Non Windows GDB builds now can
  understand target reported file names that follow MS-DOS based file
  system semantics, such as file names that include drive letters and
  use the backslash character as directory separator.  This makes it
  possible to transparently use the "set sysroot" and "set
  solib-search-path" on Unix hosts to point as host copies of the
  target's shared libraries.  See the new command "set
  target-file-system-kind" described below, and the "Commands to
  specify files" section in the user manual for more information.

* New commands

eval template, expressions...
  Convert the values of one or more expressions under the control
  of the string template to a command line, and call it.

set target-file-system-kind unix|dos-based|auto
show target-file-system-kind
  Set or show the assumed file system kind for target reported file
  names.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

`save tracepoints' is a new alias for `save-tracepoints'.  The latter
is now deprecated.

info static-tracepoint-markers
  Display information about static tracepoint markers in the target.

strace FN | FILE:LINE | *ADDR | -m MARKER_ID
  Define a static tracepoint by probing a marker at the given
  function, line, address, or marker ID.

set observer on|off
show observer
  Enable and disable observer mode.

set may-write-registers on|off
set may-write-memory on|off
set may-insert-breakpoints on|off
set may-insert-tracepoints on|off
set may-insert-fast-tracepoints on|off
set may-interrupt on|off
  Set individual permissions for GDB effects on the target.  Note that
  some of these settings can have undesirable or surprising
  consequences, particularly when changed in the middle of a session.
  For instance, disabling the writing of memory can prevent
  breakpoints from being inserted, cause single-stepping to fail, or
  even crash your program, if you disable after breakpoints have been
  inserted.  However, GDB should not crash.

set record memory-query on|off
show record memory-query
  Control whether to stop the inferior if memory changes caused
  by an instruction cannot be recorded.

* Changed commands

disassemble
  The disassemble command now supports "start,+length" form of two arguments.

* Python scripting

** GDB now provides a new directory location, called the python directory,
   where Python scripts written for GDB can be installed.  The location
   of that directory is <data-directory>/python, where <data-directory>
   is the GDB data directory.  For more details, see section `Scripting
   GDB using Python' in the manual.

** The GDB Python API now has access to breakpoints, symbols, symbol
   tables, program spaces, inferiors, threads and frame's code blocks.
   Additionally, GDB Parameters can now be created from the API, and
   manipulated via set/show in the CLI.

** New functions gdb.target_charset, gdb.target_wide_charset,
   gdb.progspaces, gdb.current_progspace, and gdb.string_to_argv.

** New exception gdb.GdbError.

** Pretty-printers are now also looked up in the current program space.

** Pretty-printers can now be individually enabled and disabled.

** GDB now looks for names of Python scripts to auto-load in a
   special section named `.debug_gdb_scripts', in addition to looking
   for a OBJFILE-gdb.py script when OBJFILE is read by the debugger.

* Tracepoint actions were unified with breakpoint commands. In particular,
there are no longer differences in "info break" output for breakpoints and
tracepoints and the "commands" command can be used for both tracepoints and
regular breakpoints.

* New targets

ARM Symbian			arm*-*-symbianelf*

* D language support.
  GDB now supports debugging programs written in the D programming
  language.

* GDB now supports the extended ptrace interface for PowerPC which is
  available since Linux kernel version 2.6.34.  This automatically enables
  any hardware breakpoints and additional hardware watchpoints available in
  the processor.  The old ptrace interface exposes just one hardware
  watchpoint and no hardware breakpoints.

* GDB is now able to use the Data Value Compare (DVC) register available on
  embedded PowerPC processors to implement in hardware simple watchpoint
  conditions of the form:

  watch ADDRESS|VARIABLE if ADDRESS|VARIABLE == CONSTANT EXPRESSION

  This works in native GDB running on Linux kernels with the extended ptrace
  interface mentioned above.

*** Changes in GDB 7.1

* C++ Improvements

  ** Namespace Support

  GDB now supports importing of namespaces in C++.  This enables the
  user to inspect variables from imported namespaces.  Support for
  namepace aliasing has also been added.  So, if a namespace is 
  aliased in the current scope (e.g. namepace C=A; ) the user can 
  print variables using the alias (e.g. (gdb) print C::x).

  ** Bug Fixes

  All known bugs relating to the printing of virtual base class were
  fixed.  It is now possible to call overloaded static methods using a
  qualified name.

  ** Cast Operators

  The C++ cast operators static_cast<>, dynamic_cast<>, const_cast<>,
  and reinterpret_cast<> are now handled by the C++ expression parser.

* New targets

Xilinx MicroBlaze		microblaze-*-*
Renesas RX			rx-*-elf

* New Simulators

Xilinx MicroBlaze		microblaze
Renesas RX			rx

* Multi-program debugging.

  GDB now has support for multi-program (a.k.a. multi-executable or
  multi-exec) debugging.  This allows for debugging multiple inferiors
  simultaneously each running a different program under the same GDB
  session.  See "Debugging Multiple Inferiors and Programs" in the
  manual for more information.  This implied some user visible changes
  in the multi-inferior support.  For example, "info inferiors" now
  lists inferiors that are not running yet or that have exited
  already.  See also "New commands" and "New options" below.

* New tracing features

  GDB's tracepoint facility now includes several new features:

  ** Trace state variables

  GDB tracepoints now include support for trace state variables, which
  are variables managed by the target agent during a tracing
  experiment.  They are useful for tracepoints that trigger each
  other, so for instance one tracepoint can count hits in a variable,
  and then a second tracepoint has a condition that is true when the
  count reaches a particular value.  Trace state variables share the
  $-syntax of GDB convenience variables, and can appear in both
  tracepoint actions and condition expressions.  Use the "tvariable"
  command to create, and "info tvariables" to view; see "Trace State
  Variables" in the manual for more detail.

  ** Fast tracepoints

  GDB now includes an option for defining fast tracepoints, which
  targets may implement more efficiently, such as by installing a jump
  into the target agent rather than a trap instruction.  The resulting
  speedup can be by two orders of magnitude or more, although the
  tradeoff is that some program locations on some target architectures
  might not allow fast tracepoint installation, for instance if the
  instruction to be replaced is shorter than the jump.  To request a
  fast tracepoint, use the "ftrace" command, with syntax identical to
  the regular trace command.

  ** Disconnected tracing

  It is now possible to detach GDB from the target while it is running
  a trace experiment, then reconnect later to see how the experiment
  is going.  In addition, a new variable disconnected-tracing lets you
  tell the target agent whether to continue running a trace if the
  connection is lost unexpectedly.

  ** Trace files

  GDB now has the ability to save the trace buffer into a file, and
  then use that file as a target, similarly to you can do with
  corefiles.  You can select trace frames, print data that was
  collected in them, and use tstatus to display the state of the
  tracing run at the moment that it was saved.  To create a trace
  file, use "tsave <filename>", and to use it, do "target tfile
  <name>".

  ** Circular trace buffer

  You can ask the target agent to handle the trace buffer as a
  circular buffer, discarding the oldest trace frames to make room for
  newer ones, by setting circular-trace-buffer to on.  This feature may
  not be available for all target agents.

* Changed commands

disassemble
  The disassemble command, when invoked with two arguments, now requires
  the arguments to be comma-separated.

info variables
  The info variables command now displays variable definitions.  Files
  which only declare a variable are not shown.

source
  The source command is now capable of sourcing Python scripts.
  This feature is dependent on the debugger being build with Python
  support.

  Related to this enhancement is also the introduction of a new command
  "set script-extension" (see below).

* New commands (for set/show, see "New options" below)

record save [<FILENAME>]
  Save a file (in core file format) containing the process record 
  execution log for replay debugging at a later time.

record restore <FILENAME>
  Restore the process record execution log that was saved at an
  earlier time, for replay debugging.

add-inferior [-copies <N>] [-exec <FILENAME>]
  Add a new inferior.

clone-inferior [-copies <N>] [ID]
  Make a new inferior ready to execute the same program another
  inferior has loaded.

remove-inferior ID
  Remove an inferior.

maint info program-spaces
  List the program spaces loaded into GDB.

set remote interrupt-sequence [Ctrl-C | BREAK | BREAK-g]
show remote interrupt-sequence
  Allow the user to select one of ^C, a BREAK signal or BREAK-g
  as the sequence to the remote target in order to interrupt the execution.
  Ctrl-C is a default.  Some system prefers BREAK which is high level of
  serial line for some certain time.  Linux kernel prefers BREAK-g, a.k.a
  Magic SysRq g.  It is BREAK signal and character 'g'.

set remote interrupt-on-connect [on | off]
show remote interrupt-on-connect
  When interrupt-on-connect is ON, gdb sends interrupt-sequence to
  remote target when gdb connects to it.  This is needed when you debug
  Linux kernel.

set remotebreak [on | off]
show remotebreak
Deprecated.  Use "set/show remote interrupt-sequence" instead.

tvariable $NAME [ = EXP ]
  Create or modify a trace state variable.

info tvariables
  List trace state variables and their values.

delete tvariable $NAME ...
  Delete one or more trace state variables.

teval EXPR, ...
  Evaluate the given expressions without collecting anything into the
  trace buffer. (Valid in tracepoint actions only.)

ftrace FN / FILE:LINE / *ADDR
  Define a fast tracepoint at the given function, line, or address.

* New expression syntax

  GDB now parses the 0b prefix of binary numbers the same way as GCC does.
  GDB now parses 0b101010 identically with 42.

* New options

set follow-exec-mode new|same
show follow-exec-mode
  Control whether GDB reuses the same inferior across an exec call or
  creates a new one.  This is useful to be able to restart the old
  executable after the inferior having done an exec call.

set default-collect EXPR, ...
show default-collect
   Define a list of expressions to be collected at each tracepoint.
   This is a useful way to ensure essential items are not overlooked,
   such as registers or a critical global variable.

set disconnected-tracing
show disconnected-tracing
   If set to 1, the target is instructed to continue tracing if it
   loses its connection to GDB.  If 0, the target is to stop tracing
   upon disconnection.

set circular-trace-buffer
show circular-trace-buffer
   If set to on, the target is instructed to use a circular trace buffer
   and discard the oldest trace frames instead of stopping the trace due
   to a full trace buffer.  If set to off, the trace stops when the buffer
   fills up.  Some targets may not support this.

set script-extension off|soft|strict
show script-extension
   If set to "off", the debugger does not perform any script language
   recognition, and all sourced files are assumed to be GDB scripts.
   If set to "soft" (the default), files are sourced according to
   filename extension, falling back to GDB scripts if the first
   evaluation failed.
   If set to "strict", files are sourced according to filename extension.

set ada trust-PAD-over-XVS on|off
show ada trust-PAD-over-XVS
   If off, activate a workaround against a bug in the debugging information
   generated by the compiler for PAD types (see gcc/exp_dbug.ads in
   the GCC sources for more information about the GNAT encoding and
   PAD types in particular).  It is always safe to set this option to
   off, but this introduces a slight performance penalty.  The default
   is on.

* Python API Improvements

  ** GDB provides the new class gdb.LazyString.  This is useful in
     some pretty-printing cases.  The new method gdb.Value.lazy_string
     provides a simple way to create objects of this type.

  ** The fields returned by gdb.Type.fields now have an
     `is_base_class' attribute.

  ** The new method gdb.Type.range returns the range of an array type.

  ** The new method gdb.parse_and_eval can be used to parse and
     evaluate an expression.

* New remote packets

QTDV
   Define a trace state variable.

qTV
   Get the current value of a trace state variable.

QTDisconnected
   Set desired tracing behavior upon disconnection.

QTBuffer:circular
   Set the trace buffer to be linear or circular.

qTfP, qTsP
   Get data about the tracepoints currently in use.

* Bug fixes

Process record now works correctly with hardware watchpoints.

Multiple bug fixes have been made to the mips-irix port, making it
much more reliable. In particular:
  - Debugging threaded applications is now possible again.  Previously,
    GDB would hang while starting the program, or while waiting for
    the program to stop at a breakpoint.
  - Attaching to a running process no longer hangs.
  - An error occurring while loading a core file has been fixed.
  - Changing the value of the PC register now works again.  This fixes
    problems observed when using the "jump" command, or when calling
    a function from GDB, or even when assigning a new value to $pc.
  - With the "finish" and "return" commands, the return value for functions
    returning a small array is now correctly printed.
  - It is now possible to break on shared library code which gets executed
    during a shared library init phase (code executed while executing
    their .init section).  Previously, the breakpoint would have no effect.
  - GDB is now able to backtrace through the signal handler for
    non-threaded programs.

PIE (Position Independent Executable) programs debugging is now supported.
This includes debugging execution of PIC (Position Independent Code) shared
libraries although for that, it should be possible to run such libraries as an
executable program.

*** Changes in GDB 7.0

* GDB now has an interface for JIT compilation.  Applications that
dynamically generate code can create symbol files in memory and register
them with GDB.  For users, the feature should work transparently, and
for JIT developers, the interface is documented in the GDB manual in the
"JIT Compilation Interface" chapter.

* Tracepoints may now be conditional.  The syntax is as for
breakpoints; either an "if" clause appended to the "trace" command,
or the "condition" command is available.  GDB sends the condition to
the target for evaluation using the same bytecode format as is used
for tracepoint actions.

* The disassemble command now supports: an optional /r modifier, print the
raw instructions in hex as well as in symbolic form, and an optional /m
modifier to print mixed source+assembly.

* Process record and replay

  In a architecture environment that supports ``process record and
  replay'', ``process record and replay'' target can record a log of
  the process execution, and replay it with both forward and reverse
  execute commands.

* Reverse debugging: GDB now has new commands reverse-continue, reverse-
step, reverse-next, reverse-finish, reverse-stepi, reverse-nexti, and
set execution-direction {forward|reverse}, for targets that support
reverse execution.

* GDB now supports hardware watchpoints on MIPS/Linux systems.  This
feature is available with a native GDB running on kernel version
2.6.28 or later.

* GDB now has support for multi-byte and wide character sets on the
target.  Strings whose character type is wchar_t, char16_t, or
char32_t are now correctly printed.  GDB supports wide- and unicode-
literals in C, that is, L'x', L"string", u'x', u"string", U'x', and
U"string" syntax.  And, GDB allows the "%ls" and "%lc" formats in
`printf'.  This feature requires iconv to work properly; if your
system does not have a working iconv, GDB can use GNU libiconv.  See
the installation instructions for more information.

* GDB now supports automatic retrieval of shared library files from
remote targets.  To use this feature, specify a system root that begins
with the `remote:' prefix, either via the `set sysroot' command or via
the `--with-sysroot' configure-time option.

* "info sharedlibrary" now takes an optional regex of libraries to show,
and it now reports if a shared library has no debugging information.

* Commands `set debug-file-directory', `set solib-search-path' and `set args'
now complete on file names.

* When completing in expressions, gdb will attempt to limit
completions to allowable structure or union fields, where appropriate.
For instance, consider:

    # struct example { int f1; double f2; };
    # struct example variable;
    (gdb) p variable.

If the user types TAB at the end of this command line, the available
completions will be "f1" and "f2".

* Inlined functions are now supported.  They show up in backtraces, and
the "step", "next", and "finish" commands handle them automatically.

* GDB now supports the token-splicing (##) and stringification (#)
operators when expanding macros.  It also supports variable-arity
macros.

* GDB now supports inspecting extra signal information, exported by
the new $_siginfo convenience variable.  The feature is currently
implemented on linux ARM, i386 and amd64.

* GDB can now display the VFP floating point registers and NEON vector
registers on ARM targets.  Both ARM GNU/Linux native GDB and gdbserver
can provide these registers (requires Linux 2.6.30 or later).  Remote
and simulator targets may also provide them.

* New remote packets

qSearch:memory:
  Search memory for a sequence of bytes.

QStartNoAckMode
  Turn off `+'/`-' protocol acknowledgments to permit more efficient
  operation over reliable transport links.  Use of this packet is
  controlled by the `set remote noack-packet' command.

vKill
  Kill the process with the specified process ID.  Use this in preference
  to `k' when multiprocess protocol extensions are supported.

qXfer:osdata:read
  Obtains additional operating system information

qXfer:siginfo:read
qXfer:siginfo:write
  Read or write additional signal information.

* Removed remote protocol undocumented extension

  An undocumented extension to the remote protocol's `S' stop reply
  packet that permitted the stub to pass a process id was removed.
  Remote servers should use the `T' stop reply packet instead.

* GDB now supports multiple function calling conventions according to the
DWARF-2 DW_AT_calling_convention function attribute.
  
* The SH target utilizes the aforementioned change to distinguish between gcc
and Renesas calling convention.  It also adds the new CLI commands
`set/show sh calling-convention'.

* GDB can now read compressed debug sections, as produced by GNU gold
with the --compress-debug-sections=zlib flag.

* 64-bit core files are now supported on AIX.

* Thread switching is now supported on Tru64.

* Watchpoints can now be set on unreadable memory locations, e.g. addresses
which will be allocated using malloc later in program execution.

* The qXfer:libraries:read remote protocol packet now allows passing a
list of section offsets.

* On GNU/Linux, GDB can now attach to stopped processes.  Several race
conditions handling signals delivered during attach or thread creation
have also been fixed.

* GDB now supports the use of DWARF boolean types for Ada's type Boolean.
From the user's standpoint, all unqualified instances of True and False
are treated as the standard definitions, regardless of context.

* GDB now parses C++ symbol and type names more flexibly.  For
example, given:

   template<typename T> class C { };
   C<char const *> c;

GDB will now correctly handle all of:

   ptype C<char const *>
   ptype C<char const*>
   ptype C<const char *>
   ptype C<const char*>

* New features in the GDB remote stub, gdbserver

  - The "--wrapper" command-line argument tells gdbserver to use a
  wrapper program to launch programs for debugging.

  - On PowerPC and S/390 targets, it is now possible to use a single
  gdbserver executable to debug both 32-bit and 64-bit programs.
  (This requires gdbserver itself to be built as a 64-bit executable.)

  - gdbserver uses the new noack protocol mode for TCP connections to
  reduce communications latency, if also supported and enabled in GDB.

  - Support for the sparc64-linux-gnu target is now included in
  gdbserver.

  - The amd64-linux build of gdbserver now supports debugging both
    32-bit and 64-bit programs.

  - The i386-linux, amd64-linux, and i386-win32 builds of gdbserver
    now support hardware watchpoints, and will use them automatically
    as appropriate.

* Python scripting

  GDB now has support for scripting using Python.  Whether this is
  available is determined at configure time.

  New GDB commands can now be written in Python.

* Ada tasking support

  Ada tasks can now be inspected in GDB. The following commands have
  been introduced:

    info tasks
      Print the list of Ada tasks.
    info task N
      Print detailed information about task number N.
    task
      Print the task number of the current task.
    task N
      Switch the context of debugging to task number N.

* Support for user-defined prefixed commands.  The "define" command can
add new commands to existing prefixes, e.g. "target".

* Multi-inferior, multi-process debugging.

  GDB now has generalized support for multi-inferior debugging.  See
  "Debugging Multiple Inferiors" in the manual for more information.
  Although availability still depends on target support, the command
  set is more uniform now.  The GNU/Linux specific multi-forks support
  has been migrated to this new framework.  This implied some user
  visible changes; see "New commands" and also "Removed commands"
  below.

* Target descriptions can now describe the target OS ABI.  See the
"Target Description Format" section in the user manual for more
information.

* Target descriptions can now describe "compatible" architectures
to indicate that the target can execute applications for a different
architecture in addition to those for the main target architecture.
See the "Target Description Format" section in the user manual for
more information.

* Multi-architecture debugging.

  GDB now includes general supports for debugging applications on
  hybrid systems that use more than one single processor architecture
  at the same time.  Each such hybrid architecture still requires
  specific support to be added.  The only hybrid architecture supported
  in this version of GDB is the Cell Broadband Engine.

* GDB now supports integrated debugging of Cell/B.E. applications that
use both the PPU and SPU architectures.  To enable support for hybrid
Cell/B.E. debugging, you need to configure GDB to support both the
powerpc-linux or powerpc64-linux and the spu-elf targets, using the
--enable-targets configure option.

* Non-stop mode debugging.

  For some targets, GDB now supports an optional mode of operation in
  which you can examine stopped threads while other threads continue
  to execute freely.  This is referred to as non-stop mode, with the
  old mode referred to as all-stop mode.  See the "Non-Stop Mode"
  section in the user manual for more information.

  To be able to support remote non-stop debugging, a remote stub needs
  to implement the non-stop mode remote protocol extensions, as
  described in the "Remote Non-Stop" section of the user manual.  The
  GDB remote stub, gdbserver, has been adjusted to support these
  extensions on linux targets.

* New commands (for set/show, see "New options" below)

catch syscall [NAME(S) | NUMBER(S)]
  Catch system calls.  Arguments, which should be names of system
  calls or their numbers, mean catch only those syscalls.  Without
  arguments, every syscall will be caught.  When the inferior issues
  any of the specified syscalls, GDB will stop and announce the system
  call, both when it is called and when its call returns.  This
  feature is currently available with a native GDB running on the
  Linux Kernel, under the following architectures: x86, x86_64,
  PowerPC and PowerPC64.

find [/size-char] [/max-count] start-address, end-address|+search-space-size,
    val1 [, val2, ...]
  Search memory for a sequence of bytes.

maint set python print-stack
maint show python print-stack
  Show a stack trace when an error is encountered in a Python script.

python [CODE]
  Invoke CODE by passing it to the Python interpreter.

macro define
macro list
macro undef
  These allow macros to be defined, undefined, and listed
  interactively.

info os processes
  Show operating system information about processes.

info inferiors
  List the inferiors currently under GDB's control.

inferior NUM
  Switch focus to inferior number NUM.

detach inferior NUM
  Detach from inferior number NUM.

kill inferior NUM
  Kill inferior number NUM.

* New options

set spu stop-on-load
show spu stop-on-load
  Control whether to stop for new SPE threads during Cell/B.E. debugging.

set spu auto-flush-cache
show spu auto-flush-cache
  Control whether to automatically flush the software-managed cache
  during Cell/B.E. debugging.

set sh calling-convention
show sh calling-convention
  Control the calling convention used when calling SH target functions.

set debug timestamp
show debug timestamp
  Control display of timestamps with GDB debugging output.

set disassemble-next-line
show disassemble-next-line
  Control display of disassembled source lines or instructions when
  the debuggee stops.

set remote noack-packet
show remote noack-packet
  Set/show the use of remote protocol QStartNoAckMode packet.  See above
  under "New remote packets."

set remote query-attached-packet
show remote query-attached-packet
  Control use of remote protocol `qAttached' (query-attached) packet.

set remote read-siginfo-object
show remote read-siginfo-object
  Control use of remote protocol `qXfer:siginfo:read' (read-siginfo-object)
  packet.

set remote write-siginfo-object
show remote write-siginfo-object
  Control use of remote protocol `qXfer:siginfo:write' (write-siginfo-object)
  packet.

set remote reverse-continue
show remote reverse-continue
  Control use of remote protocol 'bc' (reverse-continue) packet.

set remote reverse-step
show remote reverse-step
  Control use of remote protocol 'bs' (reverse-step) packet.

set displaced-stepping
show displaced-stepping
  Control displaced stepping mode.  Displaced stepping is a way to
  single-step over breakpoints without removing them from the debuggee.
  Also known as "out-of-line single-stepping".

set debug displaced
show debug displaced
  Control display of debugging info for displaced stepping.

maint set internal-error
maint show internal-error
  Control what GDB does when an internal error is detected.

maint set internal-warning
maint show internal-warning
  Control what GDB does when an internal warning is detected.

set exec-wrapper
show exec-wrapper
unset exec-wrapper
  Use a wrapper program to launch programs for debugging.

set multiple-symbols (all|ask|cancel)
show multiple-symbols
  The value of this variable can be changed to adjust the debugger behavior
  when an expression or a breakpoint location contains an ambiguous symbol
  name (an overloaded function name, for instance).
  
set breakpoint always-inserted
show breakpoint always-inserted
  Keep breakpoints always inserted in the target, as opposed to inserting
  them when resuming the target, and removing them when the target stops.
  This option can improve debugger performance on slow remote targets.

set arm fallback-mode (arm|thumb|auto)
show arm fallback-mode
set arm force-mode (arm|thumb|auto)
show arm force-mode
  These commands control how ARM GDB determines whether instructions
  are ARM or Thumb.  The default for both settings is auto, which uses
  the current CPSR value for instructions without symbols; previous
  versions of GDB behaved as if "set arm fallback-mode arm".

set arm unwind-secure-frames
  Enable unwinding from Non-secure to Secure mode on Cortex-M with
  Security extension.
  This can trigger security exceptions when unwinding exception stacks.

set disable-randomization
show disable-randomization
  Standalone programs run with the virtual address space randomization enabled
  by default on some platforms.  This option keeps the addresses stable across
  multiple debugging sessions.

set non-stop
show non-stop
  Control whether other threads are stopped or not when some thread hits
  a breakpoint.

set target-async
show target-async
  Requests that asynchronous execution is enabled in the target, if available.
  In this case, it's possible to resume target in the background, and interact
  with GDB while the target is running.  "show target-async" displays the
  current state of asynchronous execution of the target.

set target-wide-charset
show target-wide-charset
  The target-wide-charset is the name of the character set that GDB
  uses when printing characters whose type is wchar_t.

set tcp auto-retry (on|off)
show tcp auto-retry
set tcp connect-timeout
show tcp connect-timeout
  These commands allow GDB to retry failed TCP connections to a remote stub
  with a specified timeout period; this is useful if the stub is launched
  in parallel with GDB but may not be ready to accept connections immediately.

set libthread-db-search-path
show libthread-db-search-path
  Control list of directories which GDB will search for appropriate
  libthread_db.

set schedule-multiple (on|off)
show schedule-multiple
  Allow GDB to resume all threads of all processes or only threads of
  the current process.

set stack-cache
show stack-cache
  Use more aggressive caching for accesses to the stack.  This improves
  performance of remote debugging (particularly backtraces) without
  affecting correctness.

set interactive-mode (on|off|auto)
show interactive-mode
  Control whether GDB runs in interactive mode (on) or not (off).
  When in interactive mode, GDB waits for the user to answer all
  queries.  Otherwise, GDB does not wait and assumes the default
  answer.  When set to auto (the default), GDB determines which
  mode to use based on the stdin settings.

* Removed commands

info forks
  For program forks, this is replaced by the new more generic `info
  inferiors' command.  To list checkpoints, you can still use the
  `info checkpoints' command, which was an alias for the `info forks'
  command.

fork NUM
  Replaced by the new `inferior' command.  To switch between
  checkpoints, you can still use the `restart' command, which was an
  alias for the `fork' command.

process PID
  This is removed, since some targets don't have a notion of
  processes.  To switch between processes, you can still use the
  `inferior' command using GDB's own inferior number.

delete fork NUM
  For program forks, this is replaced by the new more generic `kill
  inferior' command.  To delete a checkpoint, you can still use the
  `delete checkpoint' command, which was an alias for the `delete
  fork' command.

detach fork NUM
  For program forks, this is replaced by the new more generic `detach
  inferior' command.  To detach a checkpoint, you can still use the
  `detach checkpoint' command, which was an alias for the `detach
  fork' command.

* New native configurations

x86/x86_64 Darwin		i[34567]86-*-darwin*

x86_64 MinGW			x86_64-*-mingw*

* New targets

Lattice Mico32                  lm32-*
x86 DICOS			i[34567]86-*-dicos*
x86_64 DICOS		        x86_64-*-dicos*
S+core 3			score-*-*

* The GDB remote stub, gdbserver, now supports x86 Windows CE
  (mingw32ce) debugging.

* Removed commands

catch load
catch unload
  These commands were actually not implemented on any target.

*** 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/Linux		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

* GDB on GNU/Linux and HP/UX can now debug through "exec" of a new
process.

* 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.

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 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 beginning 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 effect 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 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 occurred 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 compiling 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 multiple 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.
