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

*** Changes since GDB 16

* Debugger Adapter Protocol changes

  ** GDB now supports the "completions" request.

* "set style" commands now supports numeric format for basic colors
  from 0 to 255 and #RRGGBB format for TrueColor.

* New built-in convenience variable $_colorsupport provides comma-separated
  list of color space names supported by terminal.  Each color space name is one
  of monochrome, ansi_8color, aixterm_16color, xterm_256color or rgb_24bit.
  It is handy for conditionally using styling colors based on terminal features.
  For example:

  (gdb) if $_regex ($_colorsupport, ".*(^|,)rgb_24bit($|,).*")
   >set style filename background #FACADE
   >else
   >if $_regex ($_colorsupport, ".*(^|,)xterm_256color($|,).*")
    >set style filename background 224
    >else
    >set style filename background red
    >end
   >end

* UST (static tracepoint) support from gdbserver has been removed.

* Linux checkpoint code has been updated to work with multiple inferiors.

* The gcore and gdb-add-index scripts now have a -v or --version
  option, which prints the version number, and then exits.  As well as
  a -h or --help option, which prints each options and a brief
  description.

* On systems that support linkage namespaces, the output of the command
  "info sharedlibraries" may add one more column, NS, which identifies the
  namespace into which the library was loaded, if more than one namespace
  is active.

* New built-in convenience variables $_active_linker_namespaces and
  $_current_linker_namespace.  These show the number of active linkage
  namespaces, and the namespace to which the current location belongs to.
  In systems that don't support linkage namespaces, these always return 1
  and [[0]] respectively.

 * Add record full support for rv64gc architectures

* New commands

maintenance check psymtabs
  Renamed from maintenance check-psymtabs

maintenance check symtabs
  Renamed from maintenance check-symtabs

maintenance canonicalize
  Show the canonical form of a C++ name.

set riscv numeric-register-names on|off
show riscv numeric-register-names
  Controls whether GDB refers to risc-v registers by their numeric names
  (e.g 'x1') or their abi names (e.g. 'ra').
  Defaults to 'off', matching the old behaviour (abi names).

set style emoji on|off|auto
show style emoji
  Controls whether GDB can display emoji.  The default is "auto",
  which means emoji will be displayed in some situations when
  the host charset is UTF-8.

set style warning-prefix STRING
set style error-prefix STRING
  These commands control the prefix that is printed before warnings
  and errors, respectively.  This functionality is intended for use
  with emoji display, and so the prefixes are only displayed if emoji
  styling is enabled.

info linker-namespaces
info linker-namespaces [[N]]
  Print information about the given linker namespace (identified as N),
  or about all the namespaces if no argument is given.

* Changed commands

info sharedlibrary
  On Linux and FreeBSD, the addresses shown in the output of this
  command are now for the full memory range allocated to the shared
  library.

info threads [-gid] [-stopped] [-running] [ID]...
  If no threads match the given ID(s) or filter options, GDB now prints

    No threads matched.

  without printing the provided arguments.  The newly added '-stopped'
  option makes GDB list the stopped threads only.  Similarly,
  '-running' makes GDB list the running threads only.  If both options
  are given together, both stopped and running threads are listed.
  These new flags can be useful to get a reduced list when there is a
  large number of threads.

* GDB-internal Thread Local Storage (TLS) support

  ** Linux targets for the x86_64, aarch64, ppc64, s390x, and riscv
     architectures now have GDB-internal support for TLS address
     lookup in addition to that traditionally provided by the
     libthread_db library.  This internal support works for programs
     linked against either the GLIBC or MUSL C libraries.  For
     programs linked against MUSL, this new internal support provides
     new debug functionality, allowing access to TLS variables, due to
     the fact that MUSL does not implement the libthread_db library.
     Internal TLS support is also useful in cross-debugging
     situations, debugging statically linked binaries, and debugging
     programs linked against GLIBC 2.33 and earlier, but which are not
     linked against libpthread.

  ** The command 'maint set force-internal-tls-address-lookup on' may
     be used to force the internal TLS lookup mechanisms to be used.
     Otherwise, TLS lookup via libthread_db will still be preferred,
     when available.

* Python API

  ** New class gdb.Color for dealing with colors.

  ** New constant gdb.PARAM_COLOR represents color type of a
     gdb.Parameter.value.  Parameter's value is gdb.Color instance.

  ** The memory_source argument (the second argument) has been removed
     from gdb.disassembler.builtin_disassemble.  This argument was
     never used by GDB, and was added by mistake.  The unused argument
     was never documented in the GDB manual, so users should not have
     been using it.

  ** gdb.execute has an additional 'styling' argument.  When True, then
     output will be styled.  The default for this argument is True
     when output is going to standard output, and False when output is
     going to a string.

  ** Setting the documentation string (__doc__) of a gdb.Parameter
     sub-class to the empty string, means GDB will only display the
     set_doc or show_doc strings in the set/show help output.

  ** New gdb.ParameterPrefix class.  This can be used to create 'set'
     and 'show' gdb.Command prefixes, suitable for use with new
     gdb.Parameters.

* Guile API

  ** New type <gdb:color> for dealing with colors.

  ** New constant PARAM_COLOR represents color type of a value
     of a <gdb:parameter> object.  Parameter's value is <gdb::color> instance.

  ** Eliding the #:doc string from make-parameter now means that GDB
     will use a default documentation string.  Setting #:doc to the
     empty string for make-parameter means GDB will only display the
     #:set_doc or #:show_doc strings in the set/show help output.

* New remote packets

binary-upload in qSupported reply
  If the stub sends back 'binary-upload+' in it's qSupported reply,
  then GDB will, where possible, make use of the 'x' packet.  If the
  stub doesn't report this feature supported, then GDB will not use
  the 'x' packet.

* Changed remote packets

qXfer:threads:read
  The XML that is sent as a response can now include an "id_str"
  attribute for a thread element.  The attribute indicates what GDB
  should print as the target ID of the thread, for example in the
  "info threads" command or when switching to the thread.

* MI changes

** The =library-unloaded event now includes the 'ranges' field, which
   has the same meaning as for the =library-loaded event.

** The =library-unloaded event now includes the 'still-in-use' field.
   This field is 'true' when a library is unloaded (removed from the
   inferior's list of loaded libraries), but the mapping within the
   inferior's address space is retained, as the library was mapped
   multiple times, and the same mapping was being reused.  In all
   other cases, this field will have the value 'false'.

* Support for stabs debugging format and the a.out/dbx object format is
  deprecated, and will be removed in GDB 18.

* A new configure option was added, allowing support for the compile
  subsystem to be disabled at configure time, in the form of
  --disable-gdb-compile.

*** Changes in GDB 16

* Support for Nios II targets has been removed as this architecture
  has been EOL'ed by Intel.

* GDB now supports watchpoints for tagged data pointers (see
  https://en.wikipedia.org/wiki/Tagged_pointer) on amd64, such as the
  one used by the Linear Address Masking (LAM) feature provided by
  Intel.

* Debugging support for Intel MPX has been removed.  This includes the
  removal of
  ** MPX register support
  ** the commands "show/set mpx bound" (deprecated since GDB 15)
  ** i386 and amd64 implementation of the hooks report_signal_info and
     get_siginfo_type.

* GDB now supports printing of asynchronous events from the Intel Processor
  Trace during 'record instruction-history', 'record function-call-history'
  and all stepping commands.  This can be controlled with the new
  "set record btrace pt event-tracing" command.

* GDB now supports printing of ptwrite payloads from the Intel Processor
  Trace during 'record instruction-history', 'record function-call-history'
  and all stepping commands.  The payload is also accessible in Python as a
  RecordAuxiliary object.  Printing is customizable via a ptwrite filter
  function in Python.  By default, the raw ptwrite payload is printed for
  each ptwrite that is encountered.

* For breakpoints that are created in the 'pending' state, any
  'thread' or 'task' keywords are parsed at the time the breakpoint is
  created, rather than at the time the breakpoint becomes non-pending.

* Thread-specific breakpoints are only inserted into the program space
  in which the thread of interest is running.  In most cases program
  spaces are unique for each inferior, so this means that
  thread-specific breakpoints will usually only be inserted for the
  inferior containing the thread of interest.  The breakpoint will
  be hit no less than before.

* For ARM targets, the offset of the pc in the jmp_buf has been fixed to match
  glibc 2.20 and later.  This should only matter when not using libc probes.
  This may cause breakage when using an incompatible libc, like uclibc or
  newlib, or an older glibc.

* MTE (Memory Tagging Extension) debugging is now supported on AArch64 baremetal
  targets.

* Remove support (native and remote) for QNX Neutrino (triplet
  `i[3456]86-*-nto*`).

* In a record session, when a forward emulation reaches the end of the reverse
  history, the warning message has been changed to indicate that the end of the
  history has been reached.  It also specifies that the forward execution can
  continue, and the recording will also continue.

* The Ada 'Object_Size attribute is now supported.

* Support for process record/replay and reverse debugging on loongarch*-linux*
  targets has been added.

* New bash script gstack uses GDB to print stack traces of running processes.

* Python API

  ** Added gdb.record.clear.  Clears the trace data of the current recording.
     This forces re-decoding of the trace for successive commands.

  ** Added the new event source gdb.tui_enabled.

  ** New module gdb.missing_objfile that facilitates dealing with
     missing objfiles when opening a core-file.

  ** New function gdb.missing_objfile.register_handler that can
     register an instance of a sub-class of
     gdb.missing_debug.MissingObjfileHandler as a handler for missing
     objfiles.

  ** New class gdb.missing_objfile.MissingObjfileHandler which can be
     sub-classed to create handlers for missing objfiles.

  ** The 'signed' argument to gdb.Architecture.integer_type() will no
     longer accept non-bool types.

  ** The gdb.MICommand.installed property can only be set to True or
     False.

  ** The 'qualified' argument to gdb.Breakpoint constructor will no
     longer accept non-bool types.

  ** Added the gdb.Symbol.is_artificial attribute.

  ** Added gdb.Block.subblocks.  Returns a list of blocks contained in that
     block.

  ** Added gdb.Symbol.domain.  Contains the domain of the symbol.

  ** Added gdb.Architecture.void_type. Returns a gdb.Type representing "void"
     type for that architecture.

* Debugger Adapter Protocol changes

  ** The "scopes" request will now return a scope holding global
     variables from the stack frame's compilation unit.

  ** The "scopes" request will return a "returnValue" scope holding
     the return value from the latest "stepOut" command, when
     appropriate.

  ** The "launch" and "attach" requests were rewritten in accordance
     with some clarifications to the spec.  Now they can be sent at
     any time after the "initialized" event, but will not take effect
     (or send a response) until after the "configurationDone" request
     has been sent.

  ** The "variables" request will not return artificial symbols.

* New commands

show jit-reader-directory
  Show the name of the directory that "jit-reader-load" uses for
  relative file names.

set style line-number foreground COLOR
set style line-number background COLOR
set style line-number intensity VALUE
  Control the styling of line numbers printed by GDB.

set style command foreground COLOR
set style command background COLOR
set style command intensity VALUE
  Control the styling of GDB commands when displayed by GDB.

set style title foreground COLOR
set style title background COLOR
set style title intensity VALUE
  This style now applies to the header line of lists, for example the
  first line of the output of "info breakpoints".  Previous uses of
  this style have been replaced with the new "command" style.

set warn-language-frame-mismatch [on|off]
show warn-language-frame-mismatch
  Control the warning that is emitted when specifying a language that
  does not match the current frame's language.

maintenance info inline-frames [ADDRESS]
  New command which displays GDB's inline-frame information for the
  current address, or for ADDRESS if specified.  The output identifies
  inlined frames which start at the specified address.

maintenance info blocks [ADDRESS]
  New command which displays information about all of the blocks at
  ADDRESS, or at the current address if ADDRESS is not given.  Blocks
  are listed starting at the inner global block out to the most inner
  block.

maintenance frame-unwinder disable [-all | -name NAME | [-class] CLASS]
maintenance frame-unwinder enable [-all | -name NAME | [-class] CLASS]
  Enable or disable frame unwinders.  This is only meant to be used when
  testing unwinders themselves, and you want to ensure that a fallback
  algorithm won't obscure a regression.  GDB is not expected to behave
  well if you try to execute the inferior with unwinders disabled.

info missing-objfile-handlers
  List all the registered missing-objfile handlers.

enable missing-objfile-handler LOCUS HANDLER
disable missing-objfile-handler LOCUS HANDLER
  Enable or disable a missing-objfile handler with a name matching the
  regular expression HANDLER, in LOCUS.

  LOCUS can be 'global' to operate on global missing-objfile handler,
  'progspace' to operate on handlers within the current program space,
  or can be a regular expression which is matched against the filename
  of the primary executable in each program space.

* Changed commands

remove-symbol-file
  This command now supports file-name completion.

remove-symbol-file -a ADDRESS
  The ADDRESS expression can now be a full expression consisting of
  multiple terms, e.g. 'function + 0x1000' (without quotes),
  previously only a single term could be given.

target core
target exec
target tfile
target ctf
compile file
maint print c-tdesc
save gdb-index
  These commands now require their filename argument to be quoted if
  it contains white space or quote characters.  If the argument
  contains no such special characters then quoting is not required.

maintenance print remote-registers
  Add an "Expedited" column to the output of the command.  It indicates
  which registers were included in the last stop reply packet received by
  GDB.

maintenance info frame-unwinders
  Add a CLASS column to the output.  This class is a somewhat arbitrary
  grouping of unwinders, based on which area of GDB adds the unwinder.
  Also add an ENABLED column, that will show if the unwinder is enabled
  or not.

maintenance set dwarf unwinders (on|off)
  This command has been removed because the same functionality can be
  achieved with maint frame-unwinder (enable|disable) DEBUGINFO.

maintenance show dwarf unwinders
  This command has been removed since the functionality can be achieved
  by checking the last column of maint info frame-unwinders.

show configuration
  Now includes the version of GNU Readline library that GDB is using.

* New remote packets

vFile:stat
  Return information about files on the remote system.  Like
  vFile:fstat but takes a filename rather than an open file
  descriptor.

x addr,length
  Given ADDR and LENGTH, fetch LENGTH units from the memory at address
  ADDR and send the fetched data in binary format.  This packet is
  equivalent to 'm', except that the data in the response are in
  binary format.

*** Changes in GDB 15

* The MPX commands "show/set mpx bound" have been deprecated, as Intel
  listed MPX as removed in 2019.

* Building GDB and GDBserver now requires a C++17 compiler.
  For example, GCC 9 or later.

* GDB index now contains information about the main function.  This speeds up
  startup when it is being used for some large binaries.

* On hosts where threading is available, DWARF reading is now done in
  the background, resulting in faster startup.  This can be controlled
  using "maint set dwarf synchronous".

* Changed commands

disassemble
  Attempting to use both the 'r' and 'b' flags with the disassemble
  command will now give an error.  Previously the 'b' flag would
  always override the 'r' flag.

gcore
generate-core-file
  GDB now generates sparse core files, on systems that support it.

maintenance info line-table
  Add an EPILOGUE-BEGIN column to the output of the command.  It indicates
  if the line is considered the start of the epilogue, and thus a point at
  which the frame can be considered destroyed.

set unwindonsignal on|off
show unwindonsignal
  These commands are now aliases for the new set/show unwind-on-signal.

target record-full
  This command now gives an error if any unexpected arguments are
  found after the command.

list .
  When using the command "list ." in a location that has no debug information
  or no file loaded, GDB now says that there is no debug information to print
  lines.  This makes it more obvious that there is no information, as opposed
  to implying there is no inferior loaded.

* New commands

info missing-debug-handler
  List all the registered missing debug handlers.

enable missing-debug-handler LOCUS HANDLER
disable missing-debug-handler LOCUS HANDLER
  Enable or disable a missing debug handler with a name matching the
  regular expression HANDLER, in LOCUS.

  LOCUS can be 'global' to operate on global missing debug handler,
  'progspace' to operate on handlers within the current program space,
  or can be a regular expression which is matched against the filename
  of the primary executable in each program space.

maintenance info linux-lwps
  List all LWPs under control of the linux-nat target.

set remote thread-options-packet
show remote thread-options-packet
  Set/show the use of the thread options packet.

set direct-call-timeout SECONDS
show direct-call-timeout
set indirect-call-timeout SECONDS
show indirect-call-timeout
  These new settings can be used to limit how long GDB will wait for
  an inferior function call to complete.  The direct timeout is used
  for inferior function calls from e.g. 'call' and 'print' commands,
  while the indirect timeout is used for inferior function calls from
  within a conditional breakpoint expression.

  The default for the direct timeout is unlimited, while the default
  for the indirect timeout is 30 seconds.

  These timeouts will only have an effect for targets that are
  operating in async mode.  For non-async targets the timeouts are
  ignored, GDB will wait indefinitely for an inferior function to
  complete, unless interrupted by the user using Ctrl-C.

set unwind-on-timeout on|off
show unwind-on-timeout
  These commands control whether GDB should unwind the stack when a
  timeout occurs during an inferior function call.  The default is
  off, in which case the inferior will remain in the frame where the
  timeout occurred.  When on, GDB will unwind the stack removing the
  dummy frame that was added for the inferior call, and restoring the
  inferior state to how it was before the inferior call started.

set unwind-on-signal on|off
show unwind-on-signal
  These new commands replaces the existing set/show unwindonsignal.  The
  old command is maintained as an alias.

* New features in the GDB remote stub, GDBserver

  ** The --remote-debug and --event-loop-debug command line options
     have been removed.

  ** The --debug command line option now takes an optional comma
     separated list of components to emit debug for.  The currently
     supported components are: all, threads, event-loop, and remote.
     If no components are given then threads is assumed.

  ** The 'monitor set remote-debug' and 'monitor set event-loop-debug'
     command have been removed.

  ** The 'monitor set debug 0|1' command has been extended to take a
     component name, e.g.: 'monitor set debug COMPONENT off|on'.
     Possible component names are: all, threads, event-loop, and
     remote.

* Python API

  ** New function gdb.notify_mi(NAME, DATA), that emits custom
     GDB/MI async notification.

  ** New read/write attribute gdb.Value.bytes that contains a bytes
     object holding the contents of this value.

  ** New module gdb.missing_debug that facilitates dealing with
     objfiles that are missing any debug information.

  ** New function gdb.missing_debug.register_handler that can register
     an instance of a sub-class of gdb.missing_debug.MissingDebugInfo
     as a handler for objfiles that are missing debug information.

  ** New class gdb.missing_debug.MissingDebugInfo which can be
     sub-classed to create handlers for objfiles with missing debug
     information.

  ** Stop events now have a "details" attribute that holds a
     dictionary that carries the same information as an MI "*stopped"
     event.

  ** New function gdb.interrupt(), that interrupts GDB as if the user
     typed control-c.

  ** New gdb.InferiorThread.ptid_string attribute.  This read-only
     attribute contains the string that appears in the 'Target Id'
     column of the 'info threads' command output.

  ** It is no longer possible to create new gdb.Progspace object using
     'gdb.Progspace()', this will result in a TypeError.  Progspace
     objects can still be obtained through calling other API
     functions, for example 'gdb.current_progspace()'.

  ** User defined attributes can be added to a gdb.Inferior object,
     these will be stored in the object's new Inferior.__dict__
     attribute.

  ** User defined attributes can be added to a gdb.InferiorThread
     object, these will be stored in the object's new
     InferiorThread.__dict__ attribute.

  ** New constants gdb.SYMBOL_TYPE_DOMAIN, gdb.SYMBOL_FUNCTION_DOMAIN,
     and gdb.SEARCH_*_DOMAIN corresponding to all the existing symbol
     domains.  Symbol lookup can now search in multiple domains at
     once, and can also narrowly search for just a type or function.

* Debugger Adapter Protocol changes

  ** GDB now emits the "process" event.

  ** GDB now supports the "cancel" request.

  ** The "attach" request now supports specifying the program.

  ** New command "set debug dap-log-level" controls DAP logging.

  ** The "set debug dap-log-file" command is now documented.  This
     command was available in GDB 14 but not documented.

* Guile API

  ** New constants SYMBOL_TYPE_DOMAIN, SYMBOL_FUNCTION_DOMAIN, and
     SEARCH_*_DOMAIN corresponding to all the existing symbol domains.
     Symbol lookup can now search in multiple domains at once, and can
     also narrowly search for just a type or function.

* New remote packets

New stop reason: clone
  Indicates that a clone system call was executed.

QThreadOptions
  Enable/disable optional event reporting, on a per-thread basis.
  Currently supported options are GDB_THREAD_OPTION_CLONE, to enable
  clone event reporting, and GDB_THREAD_OPTION_EXIT to enable thread
  exit event reporting.

QThreadOptions in qSupported
  The qSupported packet allows GDB to inform the stub it supports the
  QThreadOptions packet, and the qSupported response can contain the
  set of thread options the remote stub supports.

qIsAddressTagged
  This new packet allows GDB to query the stub about a given address to check
  if it is tagged or not.  Many memory tagging-related GDB commands need to
  perform this check before they read/write the allocation tag related to an
  address.  Currently, however, this is done through a 'vFile' request to read
  the file /proc/<PID>/smaps and check if the address is in a region reported
  as memory tagged.  Since not all targets have a notion of what the smaps
  file is about, this new packet provides a more generic way to perform such
  a check.

*** Changes in GDB 14

* GDB now supports the AArch64 Scalable Matrix Extension 2 (SME2), which
  includes a new 512 bit lookup table register named ZT0.

* GDB now supports the AArch64 Scalable Matrix Extension (SME), which includes
  a new matrix register named ZA, a new thread register TPIDR2 and a new vector
  length register SVG (streaming vector granule).  GDB also supports tracking
  ZA state across signal frames.

  Some features are still under development or are dependent on ABI specs that
  are still in alpha stage.  For example, manual function calls with ZA state
  don't have any special handling, and tracking of SVG changes based on
  DWARF information is still not implemented, but there are plans to do so in
  the future.

* GDB now recognizes the NO_COLOR environment variable and disables
  styling according to the spec.  See https://no-color.org/.
  Styling can be re-enabled with "set style enabled on".

* The AArch64 'org.gnu.gdb.aarch64.pauth' Pointer Authentication feature string
  has been deprecated in favor of the 'org.gnu.gdb.aarch64.pauth_v2' feature
  string.

* GDB now has some support for integer types larger than 64 bits.

* Removed targets and native configurations

  GDB no longer supports AIX 4.x, AIX 5.x and AIX 6.x.  The minimum supported
  AIX version is now AIX 7.1.

* Multi-target feature configuration

  GDB now supports the individual configuration of remote targets' feature
  sets.  Based on the current selection of a target, the commands 'set remote
  <name>-packet (on|off|auto)' and 'show remote <name>-packet' can be used to
  configure a target's feature packet and to display its configuration,
  respectively.

  The individual packet sizes can be configured and shown using the commands
    ** 'set remote memory-read-packet-size (number of bytes|fixed|limit)'
    ** 'set remote memory-write-packet-size (number of bytes|fixed|limit)'
    ** 'show remote memory-read-packet-size'
    ** 'show remote memory-write-packet-size'.

  The configuration of the packet itself, as well as the size of a memory-read
  or memory-write packet applies to the currently selected target (if
  available).  If no target is selected, it applies to future remote
  connections.  Similarly, the show commands print the configuration of the
  currently selected target.  If no remote target is selected, the default
  configuration for future connections is shown.

* GDB has initial built-in support for the Debugger Adapter Protocol.
  This support requires that GDB be built with Python scripting
  enabled.

* For the break command, multiple uses of the 'thread' or 'task'
  keywords will now give an error instead of just using the thread or
  task id from the last instance of the keyword.  E.g.:
    break foo thread 1 thread 2
  will now give an error rather than using 'thread 2'.

* For the watch command, multiple uses of the 'task' keyword will now
  give an error instead of just using the task id from the last
  instance of the keyword.  E.g.:
    watch my_var task 1 task 2
  will now give an error rather than using 'task 2'.  The 'thread'
  keyword already gave an error when used multiple times with the
  watch command, this remains unchanged.

* The 'set print elements' setting now helps when printing large arrays.
  If an array would otherwise exceed max-value-size, but 'print elements'
  is set such that the size of elements to print is less than or equal
  to 'max-value-size', GDB will now still print the array, however only
  'max-value-size' worth of data will be added into the value history.

* For both the break and watch commands, it is now invalid to use both
  the 'thread' and 'task' keywords within the same command.  For
  example the following commands will now give an error:
    break foo thread 1 task 1
    watch var thread 2 task 3

* The printf command now accepts a '%V' output format which will
  format an expression just as the 'print' command would.  Print
  options can be placed within '[...]' after the '%V' to modify how
  the value is printed.  E.g:
    printf "%V", some_array
    printf "%V[-array-indexes on]", some_array
  will print the array without, or with array indexes included, just
  as the array would be printed by the 'print' command.  This
  functionality is also available for dprintf when dprintf-style is
  'gdb'.

* When the printf command requires a string to be fetched from the
  inferior, GDB now uses the existing 'max-value-size' setting to the
  limit the memory allocated within GDB.  The default 'max-value-size'
  is 64k.  To print longer strings you should increase
  'max-value-size'.

* The Ada 2022 Enum_Rep and Enum_Val attributes are now supported.

* The Ada 2022 target name symbol ('@') is now supported by the Ada
  expression parser.

* The 'list' command now accepts '.' as an argument, which tells GDB to
  print the location around the point of execution within the current frame.
  If the inferior hasn't started yet, the command will print around the
  beginning of the 'main' function.

* Using the 'list' command with no arguments in a situation where the
  command would attempt to list past the end of the file now warns the
  user that the end of file has been reached, refers the user to the
  newly added '.' argument

* Breakpoints can now be inferior-specific.  This is similar to the
  existing thread-specific breakpoint support.  Breakpoint conditions
  can include the 'inferior' keyword followed by an inferior id (as
  displayed in the 'info inferiors' output).  It is invalid to use the
  'inferior' keyword with either the 'thread' or 'task' keywords when
  creating a breakpoint.

* New convenience function "$_shell", to execute a shell command and
  return the result.  This lets you run shell commands in expressions.
  Some examples:

   (gdb) p $_shell("true")
   $1 = 0
   (gdb) p $_shell("false")
   $2 = 1
   (gdb) break func if $_shell("some command") == 0

* Configure changes

--additional-debug-dirs=PATHs

  Provide a colon-separated list of additional directories to search for
  separate debug info.  These directories are added to the default value of
  the 'debug-file-directory' GDB parameter.

* New commands

set debug breakpoint on|off
  show debug breakpoint
  Print additional debug messages about breakpoint insertion and removal.

maintenance print record-instruction [ N ]
  Print the recorded information for a given instruction.  If N is not given
  prints how GDB would undo the last instruction executed.  If N is negative,
  prints how GDB would undo the N-th previous instruction, and if N is
  positive, it prints how GDB will redo the N-th following instruction.

maintenance info frame-unwinders
  List the frame unwinders currently in effect, starting with the highest
  priority.

maintenance wait-for-index-cache
  Wait until all pending writes to the index cache have completed.

set always-read-ctf on|off
show always-read-ctf
  When off, CTF is only read if DWARF is not present.  When on, CTF is
  read regardless of whether DWARF is present.  Off by default.

info main
  Get main symbol to identify entry point into program.

set tui mouse-events [on|off]
show tui mouse-events
  When on (default), mouse clicks control the TUI and can be accessed by
  Python extensions.  When off, mouse clicks are handled by the terminal,
  enabling terminal-native text selection.

* MI changes

** MI version 1 has been removed.

** mi now reports 'no-history' as a stop reason when hitting the end of the
   reverse execution history.

** When creating a thread-specific breakpoint using the '-p' option,
   the -break-insert command would report the 'thread' field twice in
   the reply.  The content of both fields was always identical.  This
   has now been fixed; the 'thread' field will be reported just once
   for thread-specific breakpoints, or not at all for breakpoints
   without a thread restriction.  The same is also true for the 'task'
   field of an Ada task-specific breakpoint.

** It is no longer possible to create a thread-specific breakpoint for
   a thread that doesn't exist using '-break-insert -p ID'.  Creating
   breakpoints for non-existent threads is not allowed when using the
   CLI, that the MI allowed it was a long standing bug, which has now
   been fixed.

** The '--simple-values' argument to the '-stack-list-arguments',
   '-stack-list-locals', '-stack-list-variables', and '-var-list-children'
   commands now takes reference types into account: that is, a value is now
   considered simple if it is neither an array, structure, or union, nor a
   reference to an array, structure, or union.  (Previously all references were
   considered simple.)  Support for this feature can be verified by using the
   '-list-features' command, which should contain "simple-values-ref-types".

** The -break-insert command now accepts a '-g thread-group-id' option
   to allow for the creation of inferior-specific breakpoints.

** The bkpt tuple, which appears in breakpoint-created notifications,
   and in the result of the -break-insert command can now include an
   optional 'inferior' field for both the main breakpoint, and each
   location, when the breakpoint is inferior-specific.

* Python API

  ** gdb.ThreadExitedEvent added.  Emits a ThreadEvent.

  ** The gdb.unwinder.Unwinder.name attribute is now read-only.

  ** The name argument passed to gdb.unwinder.Unwinder.__init__ must
     now be of type 'str' otherwise a TypeError will be raised.

  ** The gdb.unwinder.Unwinder.enabled attribute can now only accept
     values of type 'bool'.  Changing this attribute will now
     invalidate GDB's frame-cache, which means GDB will need to
     rebuild its frame-cache when next required - either with, or
     without the particular unwinder, depending on how 'enabled' was
     changed.

  ** New methods added to the gdb.PendingFrame class.  These methods
     have the same behavior as the corresponding methods on
     gdb.Frame.  The new methods are:

     - gdb.PendingFrame.name: Return the name for the frame's
       function, or None.
     - gdb.PendingFrame.is_valid: Return True if the pending frame
       object is valid.
     - gdb.PendingFrame.pc: Return the $pc register value for this
       frame.
     - gdb.PendingFrame.language: Return a string containing the
       language for this frame, or None.
     - gdb.PendingFrame.find_sal: Return a gdb.Symtab_and_line
       object for the current location within the pending frame, or
       None.
     - gdb.PendingFrame.block: Return a gdb.Block for the current
       pending frame, or None.
     - gdb.PendingFrame.function: Return a gdb.Symbol for the
       current pending frame, or None.

  ** The frame-id passed to gdb.PendingFrame.create_unwind_info can
     now use either an integer or a gdb.Value object for each of its
     'sp', 'pc', and 'special' attributes.

  ** A new class gdb.unwinder.FrameId has been added.  Instances of
     this class are constructed with 'sp' (stack-pointer) and 'pc'
     (program-counter) values, and can be used as the frame-id when
     calling gdb.PendingFrame.create_unwind_info.

  ** It is now no longer possible to sub-class the
     gdb.disassembler.DisassemblerResult type.

  ** The Disassembler API from the gdb.disassembler module has been
     extended to include styling support:

     - The DisassemblerResult class can now be initialized with a list
       of parts.  Each part represents part of the disassembled
       instruction along with the associated style information.  This
       list of parts can be accessed with the new
       DisassemblerResult.parts property.

     - New constants gdb.disassembler.STYLE_* representing all the
       different styles part of an instruction might have.

     - New methods DisassembleInfo.text_part and
       DisassembleInfo.address_part which are used to create the new
       styled parts of a disassembled instruction.

     - Changes are backwards compatible, the older API can still be
       used to disassemble instructions without styling.

  ** New function gdb.execute_mi(COMMAND, [ARG]...), that invokes a
     GDB/MI command and returns the output as a Python dictionary.

  ** New function gdb.block_signals().  This returns a context manager
     that blocks any signals that GDB needs to handle itself.

  ** New class gdb.Thread.  This is a subclass of threading.Thread
     that calls gdb.block_signals in its "start" method.

  ** gdb.parse_and_eval now has a new "global_context" parameter.
     This can be used to request that the parse only examine global
     symbols.

  ** gdb.Inferior now has a new "arguments" attribute.  This holds the
     command-line arguments to the inferior, if known.

  ** gdb.Inferior now has a new "main_name" attribute.  This holds the
     name of the inferior's "main", if known.

  ** gdb.Inferior now has new methods "clear_env", "set_env", and
     "unset_env".  These can be used to modify the inferior's
     environment before it is started.

  ** gdb.Value now has the 'assign' method.

  ** gdb.Value now has the 'to_array' method.  This converts an
     array-like Value to an array.

  ** gdb.Progspace now has the new method "objfile_for_address".  This
     returns the gdb.Objfile, if any, that covers a given address.

  ** gdb.Breakpoint now has an "inferior" attribute.  If the
     Breakpoint object is inferior specific then this attribute holds
     the inferior-id (an integer).  If the Breakpoint object is not
     inferior specific, then this field contains None.  This field can
     be written too.

  ** gdb.Type now has the "is_array_like" and "is_string_like"
     methods.  These reflect GDB's internal idea of whether a type
     might be array- or string-like, even if they do not have the
     corresponding type code.

  ** gdb.ValuePrinter is a new class that can be used as the base
     class for the result of applying a pretty-printer.  As a base
     class, it signals to gdb that the printer may implement new
     pretty-printer methods.

  ** New attribute Progspace.symbol_file.  This attribute holds the
     gdb.Objfile that corresponds to Progspace.filename (when
     Progspace.filename is not None), otherwise, this attribute is
     itself None.

  ** New attribute Progspace.executable_filename.  This attribute
     holds a string containing a file name set by the "exec-file" or
     "file" commands, or None if no executable file is set.  This
     isn't the exact string passed by the user to these commands; the
     file name will have been partially resolved to an absolute file
     name.

  ** A new executable_changed event registry is available.  This event
     emits ExecutableChangedEvent objects, which have 'progspace' (a
     gdb.Progspace) and 'reload' (a Boolean) attributes.  This event
     is emitted when gdb.Progspace.executable_filename changes.

  ** New event registries gdb.events.new_progspace and
     gdb.events.free_progspace, these emit NewProgspaceEvent and
     FreeProgspaceEvent event types respectively.  Both of these event
     types have a single 'progspace' attribute, which is the
     gdb.Progspace that is either being added to GDB, or removed from
     GDB.

  ** gdb.LazyString now implements the __str__ method.

  ** New method gdb.Frame.static_link that returns the outer frame
     of a nested function frame.

*** Changes in GDB 13

* MI version 1 is deprecated, and will be removed in GDB 14.

* 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.

* Scheduler-locking and new threads

  When scheduler-locking is in effect, only the current thread may run
  when the inferior is resumed.  However, previously, new threads
  created by the resumed thread would still be able to run free.  Now,
  they are held stopped.

* "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.

* The Windows native target now supports target async.

* gdb now supports zstd compressed debug sections (ELFCOMPRESS_ZSTD) for ELF.

* The format of 'disassemble /r' and 'record instruction-history /r'
  has changed.  The instruction bytes could now be grouped together,
  and displayed in the endianness of the instruction.  This is the
  same layout as used by GNU objdump when disassembling.

  There is now 'disassemble /b' and 'record instruction-history /b'
  which will always display the instructions bytes one at a time in
  memory order, that is, the byte at the lowest address first.

  For both /r and /b GDB is now better at using whitespace in order to
  align the disassembled instruction text.

* The TUI no longer styles the source and assembly code highlighted by
  the current position indicator by default.  You can however
  re-enable styling using the new "set style tui-current-position"
  command.

* New convenience variable $_inferior_thread_count contains the number
  of live threads in the current inferior.

* When a breakpoint with multiple code locations is hit, GDB now prints
  the code location using the syntax <breakpoint_number>.<location_number>
  such as in:
     Thread 1 "zeoes" hit Breakpoint 2.3, some_func () at zeoes.c:8

* When a breakpoint is hit, GDB now sets the convenience variables $_hit_bpnum
  and $_hit_locno to the hit breakpoint number and code location number.
  This allows to disable the last hit breakpoint using
     (gdb) disable $_hit_bpnum
   or disable only the specific breakpoint code location using
     (gdb) disable $_hit_bpnum.$_hit_locno
  These commands can be used inside the command list of a breakpoint to
  automatically disable the just encountered breakpoint (or the just
  encountered specific breakpoint code location).
  When a breakpoint has only one location, $_hit_locno is set to 1 so that
     (gdb) disable $_hit_bpnum.$_hit_locno
  and
     (gdb) disable $_hit_bpnum
  are both disabling the breakpoint.

* 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.

maintenance print frame-id [ LEVEL ]
  Print GDB's internal frame-id for the frame at LEVEL.  If LEVEL is
  not given, then print the frame-id for the currently selected frame.

set debug infcall on|off
show debug infcall
  Print additional debug messages about inferior function calls.

set debug solib on|off
show debug solib
  Print additional debug messages about shared library handling.

set style tui-current-position [on|off]
  Whether to style the source and assembly code highlighted by the
  TUI's current position indicator.  The default is off.

set print characters LIMIT
show print characters
  This new setting is like 'set print elements', but controls how many
  characters of a string are printed.  This functionality used to be
  covered by 'set print elements', but it can be controlled separately
  now.  LIMIT can be set to a numerical value to request that particular
  character count, to 'unlimited' to print all characters of a string,
  or to 'elements', which is also the default, to follow the setting of
 'set print elements' as it used to be.

print -characters LIMIT
  This new option to the 'print' command has the same effect as a temporary
  use of 'set print characters'.

* Changed commands

document user-defined
  It is now possible to document user-defined aliases.
  When a user-defined alias is documented, the help and apropos commands
  use the provided documentation instead of the documentation of the
  aliased command.
  Documenting a user-defined alias is particularly useful when the alias
  is a set of nested 'with' commands to avoid showing the help of
  the with command for an alias that will in fact launch the
  last command given in the nested 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.

* Removed commands

set debug aix-solib on|off
show debug aix-solib
set debug solib-frv on|off
show debug solib-frv
  Removed in favor of "set/show debug solib".

maintenance info program-spaces
  This command now includes a 'Core File' column which indicates the
  name of the core file associated with each program space.

* New targets

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

GNU/Linux/CSKY (gdbserver) csky*-*linux*

AMDGPU amdgcn-*-*

* MI changes

 ** The async record stating the stopped reason 'breakpoint-hit' now
    contains an optional field locno giving the code location number
    when the breakpoint has multiple code locations.

* 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.

  ** The gdb.register_window_type method now restricts the set of
     acceptable window names.  The first character of a window's name
     must start with a character in the set [a-zA-Z], every subsequent
     character of a window's name must be in the set [-_.a-zA-Z0-9].

* New features in the GDB remote stub, GDBserver

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

* LoongArch floating-point support

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

* AMD GPU ROCm debugging support

GDB now supports debugging programs offloaded to AMD GPUs using the ROCm
platform.

*** 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 behavior 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.

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

 ** The "script" field in breakpoint output (which is syntactically
    incorrect in MI 3 and below) has changed in MI 4 to become a list.
    This affects the following commands and events:

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

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

* 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 behavior 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
  readability 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 information 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 threw 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 compile time.

  ** "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
  namespace aliasing has also been added.  So, if a namespace is
  aliased in the current scope (e.g. namespace 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 auxiliary 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 transferred 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 behavior.  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 publicly 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 required (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 explicitly
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
required (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.
