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

*** Changes since GDB 15

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

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

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

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.

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 epilgoue, 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 commnds 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
  readibility of its output by styling the classes and
  command names.

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

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

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

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

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

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

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

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

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

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

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

* New command options, command completion

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

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

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

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

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

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

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

      -full
      -no-filters
      -hide

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

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

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

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

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

   The above is equivalent to:

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

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

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

* Completion improvements

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

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

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

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

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

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

* New MI commands

-complete
  This lists all the possible completions for the rest of the line, if it
  were to be given as a command itself.  This is intended for use by MI
  frontends in cases when separate CLI and MI channels cannot be used.

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

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

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

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

* Other MI changes

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

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

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

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

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

* Testsuite

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

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

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

* Building GDB now requires GNU readline >= 7.0.

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

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

* Removed targets and native configurations

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

* New Simulators

TI PRU					pru-*-elf

* Removed targets and native configurations

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

*** Changes in GDB 8.3

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

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

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

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

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

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

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

* The RISC-V target now supports target descriptions.

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

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

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

* New commands

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

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

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

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

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

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

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

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

* Changed commands

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

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

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

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

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

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

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

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

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

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

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

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

* MI changes

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

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

* New native configurations

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

* New targets

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

* Removed targets

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

* Python API

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

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

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

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

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

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

* Configure changes

--enable-ubsan

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

*** Changes in GDB 8.2

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

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

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

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

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

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

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

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

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

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

* New commands

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

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

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

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

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

* Python API

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

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

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

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

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

* New targets

RiscV ELF			riscv*-*-elf

* Removed targets and native configurations

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

* Aarch64/Linux hardware watchpoints improvements

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

* Configure changes

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

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

*** Changes in GDB 8.1

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

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

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

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

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

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

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

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

* Completion improvements

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

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

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

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

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

  ** GDB now TAB-completes label symbol names.

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

* New command line options (gcore)

-a
  Dump all memory mappings.

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

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

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

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

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

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

* Breakpoints on functions marked with C++ ABI tags

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

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

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

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

    (gdb) b function(int)

  Or if you need to disambiguate between tags, like:

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

  Tab completion was adjusted accordingly as well.

* Python Scripting

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

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

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


* New features in the GDB remote stub, GDBserver

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

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

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

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

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

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

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

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

* New remote packets

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

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

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

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

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

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

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

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

* New commands

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

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

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

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

maint info selftests
  List the registered selftests.

starti
  Start the debugged program stopping at the first instruction.

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

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

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

* Safer/improved support for debugging with no debug info

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

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

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

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

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

* New native configurations

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

* New targets

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

* Removed targets and native configurations

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

*** Changes in GDB 8.0

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

* GDB now supports C++11 rvalue references.

* Python Scripting

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

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

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

  For example, GCC 4.8 or later.

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

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

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

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

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

* Support for thread names on MS-Windows.

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

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

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

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

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

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

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

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

* New native configurations

FreeBSD/mips			mips*-*-freebsd

* New targets

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

* Removed targets and native configurations

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

* New commands

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

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

* New options

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

* New MI commands

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

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

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

*** Changes in GDB 7.12

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

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

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

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

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

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

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

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

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

* Intel MPX bound violation handling.

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

   For example:

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

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

* Support for running interpreters on specified input/output devices

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

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

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

* New commands

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

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

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

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

* Python Scripting

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

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

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

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

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

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

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

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

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

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

* New targets

Andes NDS32			nds32*-*-elf

*** Changes in GDB 7.11

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

* Per-inferior thread numbers

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

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

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

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

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

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

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

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

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

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

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

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

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

* Record btrace now supports non-stop mode.

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

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

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

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

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

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

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

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

* New commands

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

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

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

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

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

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

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

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

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

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

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

* Support for various ROM monitors has been removed:

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

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

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

* New remote packets

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

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

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

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

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

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

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

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

syscall_entry stop reason
  Indicates that a syscall was just called.

syscall_return stop reason
  Indicates that a syscall just returned.

* Extended-remote exec events

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

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

 * Thread names in remote protocol

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

* Target remote mode fork and exec events

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

* Remote syscall events

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

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

* MI changes

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

* Python Scripting

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

*** Changes in GDB 7.10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* Guile Scripting

  ** Memory ports can now be unbuffered.

* Python Scripting

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

* New commands

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

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

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

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

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

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

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

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

maint info btrace
  Print information about branch tracing internals.

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

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

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

* New options

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

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

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

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

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

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

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

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

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

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

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

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

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

* Python/Guile scripting

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

* New remote packets

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

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

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

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

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

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

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

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

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

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

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

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

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

* Extended-remote fork events

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

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

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

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

* Removed command line options

-xdb  HP-UX XDB compatibility mode.

* Removed targets and native configurations

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

* New configure options

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

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

*** Changes in GDB 7.9.1

* Python Scripting

  ** Xmethods can now specify a result type.

*** Changes in GDB 7.9

* GDB now supports hardware watchpoints on x86 GNU Hurd.

* Python Scripting

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

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

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

* New Python-based convenience functions:

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

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

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

* New commands

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

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

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

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

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

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

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

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

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

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

* New options

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

* MI changes

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

* New targets

MIPS SDE			mips*-sde*-elf*

* Removed targets

Support for these obsolete configurations has been removed.

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

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

*** Changes in GDB 7.8

* New command line options

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

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

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

* Guile scripting

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

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

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

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

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

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

* New options

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

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

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

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

set auto-connect-native-target

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

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

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

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

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

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

* New features in the GDB remote stub, GDBserver

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

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

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

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

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

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

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

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

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

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

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

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

* New remote packets

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

* Python Scripting

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

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

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

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

* MI changes

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

*** Changes in GDB 7.7

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

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

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

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

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

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

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

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

    (gdb) info registers rax
    rax            <not saved>

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

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

* Python scripting

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

* New targets

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

* Removed native configurations

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

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

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

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

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

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

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

* New options

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* MI changes

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

* New remote packets

vCont;r

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

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

* New features in the GDB remote stub, GDBserver

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

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

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

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

* GDB can now use Windows x64 unwinding data.

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

*** Changes in GDB 7.6

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

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

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

record btrace

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

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

record instruction-history      prints the execution history at
                                instruction granularity

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

* New native configurations

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

* New targets

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

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

* New command line options:

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

* Removed command line options

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

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

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

* Python scripting

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

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

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

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

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

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

* New Python-based convenience functions:

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

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

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

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

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

* New configure options

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

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

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

maint info bfds
  List the BFDs known to GDB.

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

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

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

* Removed commands

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

* New options

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

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

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

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

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

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

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

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

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

* MI changes

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

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

* New remote packets

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

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

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

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

*** Changes in GDB 7.5

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

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

* GDB now supports debugging microMIPS binaries.

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

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

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

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

* Python scripting

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        (gdb) catch exception Constraint_Error if Barrier = True

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

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

* GDB can now set breakpoints on inlined functions.

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

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

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

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

* MI changes

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

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

* New commands

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

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

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

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

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

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

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

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

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

* Deprecated commands

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

* New targets

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

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

* New options

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

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

set auto-load off
  Disable auto-loading globally.

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

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

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

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

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

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

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

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

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

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

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

* New configure options

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

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

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

* New remote packets

z0/z1 conditional breakpoints extension

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

QProgramSignals:

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

* New command line options

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

*** Changes in GDB 7.4

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

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

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

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

* Python scripting

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

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

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

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

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

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

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

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

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

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

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

* MI changes

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

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

  ** New command -ada-task-info.

* libthread-db-search-path now supports two special values: $sdir and $pdir.
  $sdir specifies the default system locations of shared libraries.
  $pdir specifies the directory where the libpthread used by the application
  lives.

  GDB no longer looks in $sdir and $pdir after it has searched the directories
  mentioned in libthread-db-search-path.  If you want to search those
  directories, they must be specified in libthread-db-search-path.
  The default value of libthread-db-search-path on GNU/Linux and Solaris
  systems is now "$sdir:$pdir".

  $pdir is not supported by gdbserver, it is currently ignored.
  $sdir is supported by gdbserver.

* New configure option --with-iconv-bin.
  When using the internationalization support like the one in the GNU C
  library, GDB will invoke the "iconv" program to get a list of supported
  character sets.  If this program lives in a non-standard location, one can
  use this option to specify where to find it.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports masked hardware
  watchpoints, which specify a mask in addition to an address to watch.
  The mask specifies that some bits of an address (the bits which are
  reset in the mask) should be ignored when matching the address accessed
  by the inferior against the watchpoint address.  See the "PowerPC Embedded"
  section in the user manual for more details.

* The new option --once causes GDBserver to stop listening for connections once
  the first connection is made.  The listening port used by GDBserver will
  become available after that.

* New commands "info macros" and "alias" have been added.

* New function parameters suffix @entry specifies value of function parameter
  at the time the function got called.  Entry values are available only since
  gcc version 4.7.

* New commands

!SHELL COMMAND
  "!" is now an alias of the "shell" command.
  Note that no space is needed between "!" and SHELL COMMAND.

* Changed commands

watch EXPRESSION mask MASK_VALUE
  The watch command now supports the mask argument which allows creation
  of masked watchpoints, if the current architecture supports this feature.

info auto-load-scripts [REGEXP]
  This command was formerly named "maintenance print section-scripts".
  It is now generally useful and is no longer a maintenance-only command.

info macro [-all] [--] MACRO
  The info macro command has new options `-all' and `--'.  The first for
  printing all definitions of a macro.  The second for explicitly specifying
  the end of arguments and the beginning of the macro name in case the macro
  name starts with a hyphen.

collect[/s] EXPRESSIONS
  The tracepoint collect command now takes an optional modifier "/s"
  that directs it to dereference pointer-to-character types and
  collect the bytes of memory up to a zero byte.  The behavior is
  similar to what you see when you use the regular print command on a
  string.  An optional integer following the "/s" sets a bound on the
  number of bytes that will be collected.

tstart [NOTES]
  The trace start command now interprets any supplied arguments as a
  note to be recorded with the trace run, with an effect similar to
  setting the variable trace-notes.

tstop [NOTES]
  The trace stop command now interprets any arguments as a note to be
  mentioned along with the tstatus report that the trace was stopped
  with a command.  The effect is similar to setting the variable
  trace-stop-notes.

* Tracepoints can now be enabled and disabled at any time after a trace
  experiment has been started using the standard "enable" and "disable"
  commands.  It is now possible to start a trace experiment with no enabled
  tracepoints; GDB will display a warning, but will allow the experiment to
  begin, assuming that tracepoints will be enabled as needed while the trace
  is running.

* Fast tracepoints on 32-bit x86-architectures can now be placed at
  locations with 4-byte instructions, when they were previously
  limited to locations with instructions of 5 bytes or longer.

* New options

set debug dwarf2-read
show debug dwarf2-read
  Turns on or off display of debugging messages related to reading
  DWARF debug info.  The default is off.

set debug symtab-create
show debug symtab-create
  Turns on or off display of debugging messages related to symbol table
  creation.  The default is off.

set extended-prompt
show extended-prompt
  Set the GDB prompt, and allow escape sequences to be inserted to
  display miscellaneous information (see 'help set extended-prompt'
  for the list of sequences).  This prompt (and any information
  accessed through the escape sequences) is updated every time the
  prompt is displayed.

set print entry-values (both|compact|default|if-needed|no|only|preferred)
show print entry-values
  Set printing of frame argument values at function entry.  In some cases
  GDB can determine the value of function argument which was passed by the
  function caller, even if the value was modified inside the called function.

set debug entry-values
show debug entry-values
  Control display of debugging info for determining frame argument values at
  function entry and virtual tail call frames.

set basenames-may-differ
show basenames-may-differ
  Set whether a source file may have multiple base names.
  (A "base name" is the name of a file with the directory part removed.
  Example: The base name of "/home/user/hello.c" is "hello.c".)
  If set, GDB will canonicalize file names (e.g., expand symlinks)
  before comparing them.  Canonicalization is an expensive operation,
  but it allows the same file be known by more than one base name.
  If not set (the default), all source files are assumed to have just
  one base name, and gdb will do file name comparisons more efficiently.

set trace-user
show trace-user
set trace-notes
show trace-notes
  Set a user name and notes for the current and any future trace runs.
  This is useful for long-running and/or disconnected traces, to
  inform others (or yourself) as to who is running the trace, supply
  contact information, or otherwise explain what is going on.

set trace-stop-notes
show trace-stop-notes
  Set a note attached to the trace run, that is displayed when the
  trace has been stopped by a tstop command.  This is useful for
  instance as an explanation, if you are stopping a trace run that was
  started by someone else.

* New remote packets

QTEnable
  
  Dynamically enable a tracepoint in a started trace experiment.

QTDisable

  Dynamically disable a tracepoint in a started trace experiment.

QTNotes

  Set the user and notes of the trace run.

qTP

  Query the current status of a tracepoint.

qTMinFTPILen

  Query the minimum length of instruction at which a fast tracepoint may
  be placed.

* Dcache size (number of lines) and line-size are now runtime-configurable
  via "set dcache line" and "set dcache line-size" commands.

* New targets

Texas Instruments TMS320C6x		tic6x-*-*

* New Simulators

Renesas RL78				rl78-*-elf

*** Changes in GDB 7.3.1

* The build failure for NetBSD and OpenBSD targets have now been fixed.

*** Changes in GDB 7.3

* GDB has a new command: "thread find [REGEXP]".
  It finds the thread id whose name, target id, or thread extra info
  matches the given regular expression.

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

* The -data-disassemble MI command now supports modes 2 and 3 for
  dumping the instruction opcodes.

* New command line options

-data-directory DIR	Specify DIR as the "data-directory".
			This is mostly for testing purposes.

* The "maint set python auto-load on|off" command has been renamed to
  "set auto-load-scripts on|off".

* GDB has a new command: "set directories".
  It is like the "dir" command except that it replaces the
  source path list instead of augmenting it.

* GDB now understands thread names.

  On GNU/Linux, "info threads" will display the thread name as set by
  prctl or pthread_setname_np.

  There is also a new command, "thread name", which can be used to
  assign a name internally for GDB to display.

* OpenCL C
  Initial support for the OpenCL C language (http://www.khronos.org/opencl)
  has been integrated into GDB.

* Python scripting

  ** The function gdb.Write now accepts an optional keyword 'stream'.
     This keyword, when provided, will direct the output to either
     stdout, stderr, or GDB's logging output.

  ** Parameters can now be be sub-classed in Python, and in particular
     you may implement the get_set_doc and get_show_doc functions.
     This improves how Parameter set/show documentation is processed
     and allows for more dynamic content.

  ** Symbols, Symbol Table, Symbol Table and Line, Object Files,
     Inferior, Inferior Thread, Blocks, and Block Iterator APIs now
     have an is_valid method.

  ** Breakpoints can now be sub-classed in Python, and in particular
     you may implement a 'stop' function that is executed each time
     the inferior reaches that breakpoint.   

  ** New function gdb.lookup_global_symbol looks up a global symbol.

  ** GDB values in Python are now callable if the value represents a
     function.  For example, if 'some_value' represents a function that
     takes two integer parameters and returns a value, you can call
     that function like so:

     result = some_value (10,20)

  ** Module gdb.types has been added.
     It contains a collection of utilities for working with gdb.Types objects:
     get_basic_type, has_field, make_enum_dict.

  ** Module gdb.printing has been added.
     It contains utilities for writing and registering pretty-printers.
     New classes: PrettyPrinter,  SubPrettyPrinter,
     RegexpCollectionPrettyPrinter.
     New function: register_pretty_printer.

  ** New commands "info pretty-printers", "enable pretty-printer" and
     "disable pretty-printer" have been added.

  ** gdb.parameter("directories") is now available.

  ** New function gdb.newest_frame returns the newest frame in the
     selected thread.

  ** The gdb.InferiorThread class has a new "name" attribute.  This
     holds the thread's name.

  ** Python Support for Inferior events.
     Python scripts can add observers to be notified of events
     occurring in the process being debugged.
     The following events are currently supported:
     - gdb.events.cont Continue event.
     - gdb.events.exited Inferior exited event.
     - gdb.events.stop Signal received, and Breakpoint hit events.

* C++ Improvements:

  ** GDB now puts template parameters in scope when debugging in an
     instantiation.  For example, if you have:

     template<int X> int func (void) { return X; }

     then if you step into func<5>, "print X" will show "5".  This
     feature requires proper debuginfo support from the compiler; it
     was added to GCC 4.5.

  ** The motion commands "next", "finish", "until", and "advance" now
     work better when exceptions are thrown.  In particular, GDB will
     no longer lose control of the inferior; instead, the GDB will
     stop the inferior at the point at which the exception is caught.
     This functionality requires a change in the exception handling
     code that was introduced in GCC 4.5.

* GDB now follows GCC's rules on accessing volatile objects when
  reading or writing target state during expression evaluation.
  One notable difference to prior behavior is that "print x = 0"
  no longer generates a read of x; the value of the assignment is
  now always taken directly from the value being assigned.

* GDB now has some support for using labels in the program's source in
  linespecs.  For instance, you can use "advance label" to continue
  execution to a label.

* GDB now has support for reading and writing a new .gdb_index
  section.  This section holds a fast index of DWARF debugging
  information and can be used to greatly speed up GDB startup and
  operation.  See the documentation for `save gdb-index' for details.

* The "watch" command now accepts an optional "-location" argument.
  When used, this causes GDB to watch the memory referred to by the
  expression.  Such a watchpoint is never deleted due to it going out
  of scope.

* GDB now supports thread debugging of core dumps on GNU/Linux.

  GDB now activates thread debugging using the libthread_db library
  when debugging GNU/Linux core dumps, similarly to when debugging
  live processes.  As a result, when debugging a core dump file, GDB
  is now able to display pthread_t ids of threads.  For example, "info
  threads" shows the same output as when debugging the process when it
  was live.  In earlier releases, you'd see something like this:

  (gdb) info threads
   * 1 LWP 6780  main () at main.c:10

  While now you see this:

  (gdb) info threads
   * 1 Thread 0x7f0f5712a700 (LWP 6780)  main () at main.c:10

  It is also now possible to inspect TLS variables when debugging core
  dumps.

  When debugging a core dump generated on a machine other than the one
  used to run GDB, you may need to point GDB at the correct
  libthread_db library with the "set libthread-db-search-path"
  command.  See the user manual for more details on this command.

* When natively debugging programs on PowerPC BookE processors running
  a Linux kernel version 2.6.34 or later, GDB supports ranged breakpoints,
  which stop execution of the inferior whenever it executes an instruction
  at any address within the specified range.  See the "PowerPC Embedded"
  section in the user manual for more details.

* New features in the GDB remote stub, GDBserver

  ** GDBserver is now supported on PowerPC LynxOS (versions 4.x and 5.x),
     and i686 LynxOS (version 5.x).

  ** GDBserver is now supported on Blackfin Linux.

* New native configurations

ia64 HP-UX                      ia64-*-hpux*

* New targets:

Analog Devices, Inc. Blackfin Processor	bfin-*

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

* Guile support was removed.

* New features in the GNU simulator

  ** The --map-info flag lists all known core mappings.

  ** CFI flashes may be simulated via the "cfi" device.

*** Changes in GDB 7.2

* Shared library support for remote targets by default

  When GDB is configured for a generic, non-OS specific target, like
  for example, --target=arm-eabi or one of the many *-*-elf targets,
  GDB now queries remote stubs for loaded shared libraries using the
  `qXfer:libraries:read' packet.  Previously, shared library support
  was always disabled for such configurations.

* C++ Improvements:

  ** Argument Dependent Lookup (ADL)

  In C++ ADL lookup directs function search to the namespaces of its
  arguments even if the namespace has not been imported.
  For example:
    namespace A
      { 
        class B { }; 
        void foo (B) { }
      }
    ...
    A::B b
    foo(b)
  Here the compiler will search for `foo' in the namespace of 'b'
  and find A::foo.  GDB now supports this.  This construct is commonly
  used in the Standard Template Library for operators.

  ** Improved User Defined Operator Support

  In addition to member operators, GDB now supports lookup of operators
  defined in a namespace and imported with a `using' directive, operators
  defined in the global scope, operators imported implicitly from an
  anonymous namespace, and the ADL operators mentioned in the previous
  entry.
  GDB now also supports proper overload resolution for all the previously
  mentioned flavors of operators.

  ** static const class members

  Printing of static const class members that are initialized in the
  class definition has been fixed.

* Windows Thread Information Block access.

  On Windows targets, GDB now supports displaying the Windows Thread
  Information Block (TIB) structure.  This structure is visible either
  by using the new command `info w32 thread-information-block' or, by
  dereferencing the new convenience variable named `$_tlb', a
  thread-specific pointer to the TIB.  This feature is also supported
  when remote debugging using GDBserver.

* Static tracepoints

  Static tracepoints are calls in the user program into a tracing
  library.  One such library is a port of the LTTng kernel tracer to
  userspace --- UST (LTTng Userspace Tracer, http://lttng.org/ust).
  When debugging with GDBserver, GDB now supports combining the GDB
  tracepoint machinery with such libraries.  For example: the user can
  use GDB to probe a static tracepoint marker (a call from the user
  program into the tracing library) with the new "strace" command (see
  "New commands" below).  This creates a "static tracepoint" in the
  breakpoint list, that can be manipulated with the same feature set
  as fast and regular tracepoints.  E.g., collect registers, local and
  global variables, collect trace state variables, and define
  tracepoint conditions.  In addition, the user can collect extra
  static tracepoint marker specific data, by collecting the new
  $_sdata internal variable.  When analyzing the trace buffer, you can
  inspect $_sdata like any other variable available to GDB.  For more
  information, see the "Tracepoints" chapter in GDB user manual.  New
  remote packets have been defined to support static tracepoints, see
  the "New remote packets" section below.

* Better reconstruction of tracepoints after disconnected tracing

  GDB will attempt to download the original source form of tracepoint
  definitions when starting a trace run, and then will upload these
  upon reconnection to the target, resulting in a more accurate
  reconstruction of the tracepoints that are in use on the target.

* Observer mode

  You can now exercise direct control over the ways that GDB can
  affect your program.  For instance, you can disallow the setting of
  breakpoints, so that the program can run continuously (assuming
  non-stop mode).  In addition, the "observer" variable is available
  to switch all of the different controls; in observer mode, GDB
  cannot affect the target's behavior at all, which is useful for
  tasks like diagnosing live systems in the field.

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

* New remote packets

qGetTIBAddr

  Return the address of the Windows Thread Information Block of a given thread.

qRelocInsn

  In response to several of the tracepoint packets, the target may now
  also respond with a number of intermediate `qRelocInsn' request
  packets before the final result packet, to have GDB handle
  relocating an instruction to execute at a different address.  This
  is particularly useful for stubs that support fast tracepoints.  GDB
  reports support for this feature in the qSupported packet.

qTfSTM, qTsSTM

  List static tracepoint markers in the target program.

qTSTMat

  List static tracepoint markers at a given address in the target
  program.

qXfer:statictrace:read

  Read the static trace data collected (by a `collect $_sdata'
  tracepoint action).  The remote stub reports support for this packet
  to gdb's qSupported query.

QAllow

  Send the current settings of GDB's permission flags.

QTDPsrc

  Send part of the source (textual) form of a tracepoint definition,
  which includes location, conditional, and action list.

* The source command now accepts a -s option to force searching for the
  script in the source search path even if the script name specifies
  a directory.

* New features in the GDB remote stub, GDBserver

  - GDBserver now support tracepoints (including fast tracepoints, and
    static tracepoints).  The feature is currently supported by the
    i386-linux and amd64-linux builds.  See the "Tracepoints support
    in gdbserver" section in the manual for more information.

    GDBserver JIT compiles the tracepoint's conditional agent
    expression bytecode into native code whenever possible for low
    overhead dynamic tracepoints conditionals.  For such tracepoints,
    an expression that examines program state is evaluated when the
    tracepoint is reached, in order to determine whether to capture
    trace data.  If the condition is simple and false, processing the
    tracepoint finishes very quickly and no data is gathered.

    GDBserver interfaces with the UST (LTTng Userspace Tracer) library
    for static tracepoints support.

  - GDBserver now supports x86_64 Windows 64-bit debugging.

* GDB now sends xmlRegisters= in qSupported packet to indicate that
  it understands register description.

* The --batch flag now disables pagination and queries.

* X86 general purpose registers

  GDB now supports reading/writing byte, word and double-word x86
  general purpose registers directly.  This means you can use, say,
  $ah or $ax to refer, respectively, to the byte register AH and
  16-bit word register AX that are actually portions of the 32-bit
  register EAX or 64-bit register RAX.

* The `commands' command now accepts a range of breakpoints to modify.
  A plain `commands' following a command that creates multiple
  breakpoints affects all the breakpoints set by that command.  This
  applies to breakpoints set by `rbreak', and also applies when a
  single `break' command creates multiple breakpoints (e.g.,
  breakpoints on overloaded c++ functions).

* The `rbreak' command now accepts a filename specification as part of
  its argument, limiting the functions selected by the regex to those
  in the specified file.

* Support for remote debugging Windows and SymbianOS shared libraries
  from Unix hosts has been improved.  Non Windows GDB builds now can
  understand target reported file names that follow MS-DOS based file
  system semantics, such as file names that include drive letters and
  use the backslash character as directory separator.  This makes it
  possible to transparently use the "set sysroot" and "set
  solib-search-path" on Unix hosts to point as host copies of the
  target's shared libraries.  See the new command "set
  target-file-system-kind" described below, and the "Commands to
  specify files" section in the user manual for more information.

* New commands

eval template, expressions...
  Convert the values of one or more expressions under the control
  of the string template to a command line, and call it.

set target-file-system-kind unix|dos-based|auto
show target-file-system-kind
  Set or show the assumed file system kind for target reported file
  names.

save breakpoints <filename>
  Save all current breakpoint definitions to a file suitable for use
  in a later debugging session.  To read the saved breakpoint
  definitions, use the `source' command.

`save tracepoints' is a new alias for `save-tracepoints'.  The latter
is now deprecated.

info static-tracepoint-markers
  Display information about static tracepoint markers in the target.

strace FN | FILE:LINE | *ADDR | -m MARKER_ID
  Define a static tracepoint by probing a marker at the given
  function, line, address, or marker ID.

set observer on|off
show observer
  Enable and disable observer mode.

set may-write-registers on|off
set may-write-memory on|off
set may-insert-breakpoints on|off
set may-insert-tracepoints on|off
set may-insert-fast-tracepoints on|off
set may-interrupt on|off
  Set individual permissions for GDB effects on the target.  Note that
  some of these settings can have undesirable or surprising
  consequences, particularly when changed in the middle of a session.
  For instance, disabling the writing of memory can prevent
  breakpoints from being inserted, cause single-stepping to fail, or
  even crash your program, if you disable after breakpoints have been
  inserted.  However, GDB should not crash.

set record memory-query on|off
show record memory-query
  Control whether to stop the inferior if memory changes caused
  by an instruction cannot be recorded.

* Changed commands

disassemble
  The disassemble command now supports "start,+length" form of two arguments.

* Python scripting

** GDB now provides a new directory location, called the python directory,
   where Python scripts written for GDB can be installed.  The location
   of that directory is <data-directory>/python, where <data-directory>
   is the GDB data directory.  For more details, see section `Scripting
   GDB using Python' in the manual.

** The GDB Python API now has access to breakpoints, symbols, symbol
   tables, program spaces, inferiors, threads and frame's code blocks.
   Additionally, GDB Parameters can now be created from the API, and
   manipulated via set/show in the CLI.

** New functions gdb.target_charset, gdb.target_wide_charset,
   gdb.progspaces, gdb.current_progspace, and gdb.string_to_argv.

** New exception gdb.GdbError.

** Pretty-printers are now also looked up in the current program space.

** Pretty-printers can now be individually enabled and disabled.

** GDB now looks for names of Python scripts to auto-load in a
   special section named `.debug_gdb_scripts', in addition to looking
   for a OBJFILE-gdb.py script when OBJFILE is read by the debugger.

* Tracepoint actions were unified with breakpoint commands. In particular,
there are no longer differences in "info break" output for breakpoints and
tracepoints and the "commands" command can be used for both tracepoints and
regular breakpoints.

* New targets

ARM Symbian			arm*-*-symbianelf*

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

* GDB now supports the extended ptrace interface for PowerPC which is
  available since Linux kernel version 2.6.34.  This automatically enables
  any hardware breakpoints and additional hardware watchpoints available in
  the processor.  The old ptrace interface exposes just one hardware
  watchpoint and no hardware breakpoints.

* GDB is now able to use the Data Value Compare (DVC) register available on
  embedded PowerPC processors to implement in hardware simple watchpoint
  conditions of the form:

  watch ADDRESS|VARIABLE if ADDRESS|VARIABLE == CONSTANT EXPRESSION

  This works in native GDB running on Linux kernels with the extended ptrace
  interface mentioned above.

*** Changes in GDB 7.1

* C++ Improvements

  ** Namespace Support

  GDB now supports importing of namespaces in C++.  This enables the
  user to inspect variables from imported namespaces.  Support for
  namepace aliasing has also been added.  So, if a namespace is 
  aliased in the current scope (e.g. namepace C=A; ) the user can 
  print variables using the alias (e.g. (gdb) print C::x).

  ** Bug Fixes

  All known bugs relating to the printing of virtual base class were
  fixed.  It is now possible to call overloaded static methods using a
  qualified name.

  ** Cast Operators

  The C++ cast operators static_cast<>, dynamic_cast<>, const_cast<>,
  and reinterpret_cast<> are now handled by the C++ expression parser.

* New targets

Xilinx MicroBlaze		microblaze-*-*
Renesas RX			rx-*-elf

* New Simulators

Xilinx MicroBlaze		microblaze
Renesas RX			rx

* Multi-program debugging.

  GDB now has support for multi-program (a.k.a. multi-executable or
  multi-exec) debugging.  This allows for debugging multiple inferiors
  simultaneously each running a different program under the same GDB
  session.  See "Debugging Multiple Inferiors and Programs" in the
  manual for more information.  This implied some user visible changes
  in the multi-inferior support.  For example, "info inferiors" now
  lists inferiors that are not running yet or that have exited
  already.  See also "New commands" and "New options" below.

* New tracing features

  GDB's tracepoint facility now includes several new features:

  ** Trace state variables

  GDB tracepoints now include support for trace state variables, which
  are variables managed by the target agent during a tracing
  experiment.  They are useful for tracepoints that trigger each
  other, so for instance one tracepoint can count hits in a variable,
  and then a second tracepoint has a condition that is true when the
  count reaches a particular value.  Trace state variables share the
  $-syntax of GDB convenience variables, and can appear in both
  tracepoint actions and condition expressions.  Use the "tvariable"
  command to create, and "info tvariables" to view; see "Trace State
  Variables" in the manual for more detail.

  ** Fast tracepoints

  GDB now includes an option for defining fast tracepoints, which
  targets may implement more efficiently, such as by installing a jump
  into the target agent rather than a trap instruction.  The resulting
  speedup can be by two orders of magnitude or more, although the
  tradeoff is that some program locations on some target architectures
  might not allow fast tracepoint installation, for instance if the
  instruction to be replaced is shorter than the jump.  To request a
  fast tracepoint, use the "ftrace" command, with syntax identical to
  the regular trace command.

  ** Disconnected tracing

  It is now possible to detach GDB from the target while it is running
  a trace experiment, then reconnect later to see how the experiment
  is going.  In addition, a new variable disconnected-tracing lets you
  tell the target agent whether to continue running a trace if the
  connection is lost unexpectedly.

  ** Trace files

  GDB now has the ability to save the trace buffer into a file, and
  then use that file as a target, similarly to you can do with
  corefiles.  You can select trace frames, print data that was
  collected in them, and use tstatus to display the state of the
  tracing run at the moment that it was saved.  To create a trace
  file, use "tsave <filename>", and to use it, do "target tfile
  <name>".

  ** Circular trace buffer

  You can ask the target agent to handle the trace buffer as a
  circular buffer, discarding the oldest trace frames to make room for
  newer ones, by setting circular-trace-buffer to on.  This feature may
  not be available for all target agents.

* Changed commands

disassemble
  The disassemble command, when invoked with two arguments, now requires
  the arguments to be comma-separated.

info variables
  The info variables command now displays variable definitions.  Files
  which only declare a variable are not shown.

source
  The source command is now capable of sourcing Python scripts.
  This feature is dependent on the debugger being build with Python
  support.

  Related to this enhancement is also the introduction of a new command
  "set script-extension" (see below).

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

record save [<FILENAME>]
  Save a file (in core file format) containing the process record 
  execution log for replay debugging at a later time.

record restore <FILENAME>
  Restore the process record execution log that was saved at an
  earlier time, for replay debugging.

add-inferior [-copies <N>] [-exec <FILENAME>]
  Add a new inferior.

clone-inferior [-copies <N>] [ID]
  Make a new inferior ready to execute the same program another
  inferior has loaded.

remove-inferior ID
  Remove an inferior.

maint info program-spaces
  List the program spaces loaded into GDB.

set remote interrupt-sequence [Ctrl-C | BREAK | BREAK-g]
show remote interrupt-sequence
  Allow the user to select one of ^C, a BREAK signal or BREAK-g
  as the sequence to the remote target in order to interrupt the execution.
  Ctrl-C is a default.  Some system prefers BREAK which is high level of
  serial line for some certain time.  Linux kernel prefers BREAK-g, a.k.a
  Magic SysRq g.  It is BREAK signal and character 'g'.

set remote interrupt-on-connect [on | off]
show remote interrupt-on-connect
  When interrupt-on-connect is ON, gdb sends interrupt-sequence to
  remote target when gdb connects to it.  This is needed when you debug
  Linux kernel.

set remotebreak [on | off]
show remotebreak
Deprecated.  Use "set/show remote interrupt-sequence" instead.

tvariable $NAME [ = EXP ]
  Create or modify a trace state variable.

info tvariables
  List trace state variables and their values.

delete tvariable $NAME ...
  Delete one or more trace state variables.

teval EXPR, ...
  Evaluate the given expressions without collecting anything into the
  trace buffer. (Valid in tracepoint actions only.)

ftrace FN / FILE:LINE / *ADDR
  Define a fast tracepoint at the given function, line, or address.

* New expression syntax

  GDB now parses the 0b prefix of binary numbers the same way as GCC does.
  GDB now parses 0b101010 identically with 42.

* New options

set follow-exec-mode new|same
show follow-exec-mode
  Control whether GDB reuses the same inferior across an exec call or
  creates a new one.  This is useful to be able to restart the old
  executable after the inferior having done an exec call.

set default-collect EXPR, ...
show default-collect
   Define a list of expressions to be collected at each tracepoint.
   This is a useful way to ensure essential items are not overlooked,
   such as registers or a critical global variable.

set disconnected-tracing
show disconnected-tracing
   If set to 1, the target is instructed to continue tracing if it
   loses its connection to GDB.  If 0, the target is to stop tracing
   upon disconnection.

set circular-trace-buffer
show circular-trace-buffer
   If set to on, the target is instructed to use a circular trace buffer
   and discard the oldest trace frames instead of stopping the trace due
   to a full trace buffer.  If set to off, the trace stops when the buffer
   fills up.  Some targets may not support this.

set script-extension off|soft|strict
show script-extension
   If set to "off", the debugger does not perform any script language
   recognition, and all sourced files are assumed to be GDB scripts.
   If set to "soft" (the default), files are sourced according to
   filename extension, falling back to GDB scripts if the first
   evaluation failed.
   If set to "strict", files are sourced according to filename extension.

set ada trust-PAD-over-XVS on|off
show ada trust-PAD-over-XVS
   If off, activate a workaround against a bug in the debugging information
   generated by the compiler for PAD types (see gcc/exp_dbug.ads in
   the GCC sources for more information about the GNAT encoding and
   PAD types in particular).  It is always safe to set this option to
   off, but this introduces a slight performance penalty.  The default
   is on.

* Python API Improvements

  ** GDB provides the new class gdb.LazyString.  This is useful in
     some pretty-printing cases.  The new method gdb.Value.lazy_string
     provides a simple way to create objects of this type.

  ** The fields returned by gdb.Type.fields now have an
     `is_base_class' attribute.

  ** The new method gdb.Type.range returns the range of an array type.

  ** The new method gdb.parse_and_eval can be used to parse and
     evaluate an expression.

* New remote packets

QTDV
   Define a trace state variable.

qTV
   Get the current value of a trace state variable.

QTDisconnected
   Set desired tracing behavior upon disconnection.

QTBuffer:circular
   Set the trace buffer to be linear or circular.

qTfP, qTsP
   Get data about the tracepoints currently in use.

* Bug fixes

Process record now works correctly with hardware watchpoints.

Multiple bug fixes have been made to the mips-irix port, making it
much more reliable. In particular:
  - Debugging threaded applications is now possible again.  Previously,
    GDB would hang while starting the program, or while waiting for
    the program to stop at a breakpoint.
  - Attaching to a running process no longer hangs.
  - An error occurring while loading a core file has been fixed.
  - Changing the value of the PC register now works again.  This fixes
    problems observed when using the "jump" command, or when calling
    a function from GDB, or even when assigning a new value to $pc.
  - With the "finish" and "return" commands, the return value for functions
    returning a small array is now correctly printed.
  - It is now possible to break on shared library code which gets executed
    during a shared library init phase (code executed while executing
    their .init section).  Previously, the breakpoint would have no effect.
  - GDB is now able to backtrace through the signal handler for
    non-threaded programs.

PIE (Position Independent Executable) programs debugging is now supported.
This includes debugging execution of PIC (Position Independent Code) shared
libraries although for that, it should be possible to run such libraries as an
executable program.

*** Changes in GDB 7.0

* GDB now has an interface for JIT compilation.  Applications that
dynamically generate code can create symbol files in memory and register
them with GDB.  For users, the feature should work transparently, and
for JIT developers, the interface is documented in the GDB manual in the
"JIT Compilation Interface" chapter.

* Tracepoints may now be conditional.  The syntax is as for
breakpoints; either an "if" clause appended to the "trace" command,
or the "condition" command is available.  GDB sends the condition to
the target for evaluation using the same bytecode format as is used
for tracepoint actions.

* The disassemble command now supports: an optional /r modifier, print the
raw instructions in hex as well as in symbolic form, and an optional /m
modifier to print mixed source+assembly.

* Process record and replay

  In a architecture environment that supports ``process record and
  replay'', ``process record and replay'' target can record a log of
  the process execution, and replay it with both forward and reverse
  execute commands.

* Reverse debugging: GDB now has new commands reverse-continue, reverse-
step, reverse-next, reverse-finish, reverse-stepi, reverse-nexti, and
set execution-direction {forward|reverse}, for targets that support
reverse execution.

* GDB now supports hardware watchpoints on MIPS/Linux systems.  This
feature is available with a native GDB running on kernel version
2.6.28 or later.

* GDB now has support for multi-byte and wide character sets on the
target.  Strings whose character type is wchar_t, char16_t, or
char32_t are now correctly printed.  GDB supports wide- and unicode-
literals in C, that is, L'x', L"string", u'x', u"string", U'x', and
U"string" syntax.  And, GDB allows the "%ls" and "%lc" formats in
`printf'.  This feature requires iconv to work properly; if your
system does not have a working iconv, GDB can use GNU libiconv.  See
the installation instructions for more information.

* GDB now supports automatic retrieval of shared library files from
remote targets.  To use this feature, specify a system root that begins
with the `remote:' prefix, either via the `set sysroot' command or via
the `--with-sysroot' configure-time option.

* "info sharedlibrary" now takes an optional regex of libraries to show,
and it now reports if a shared library has no debugging information.

* Commands `set debug-file-directory', `set solib-search-path' and `set args'
now complete on file names.

* When completing in expressions, gdb will attempt to limit
completions to allowable structure or union fields, where appropriate.
For instance, consider:

    # struct example { int f1; double f2; };
    # struct example variable;
    (gdb) p variable.

If the user types TAB at the end of this command line, the available
completions will be "f1" and "f2".

* Inlined functions are now supported.  They show up in backtraces, and
the "step", "next", and "finish" commands handle them automatically.

* GDB now supports the token-splicing (##) and stringification (#)
operators when expanding macros.  It also supports variable-arity
macros.

* GDB now supports inspecting extra signal information, exported by
the new $_siginfo convenience variable.  The feature is currently
implemented on linux ARM, i386 and amd64.

* GDB can now display the VFP floating point registers and NEON vector
registers on ARM targets.  Both ARM GNU/Linux native GDB and gdbserver
can provide these registers (requires Linux 2.6.30 or later).  Remote
and simulator targets may also provide them.

* New remote packets

qSearch:memory:
  Search memory for a sequence of bytes.

QStartNoAckMode
  Turn off `+'/`-' protocol acknowledgments to permit more efficient
  operation over reliable transport links.  Use of this packet is
  controlled by the `set remote noack-packet' command.

vKill
  Kill the process with the specified process ID.  Use this in preference
  to `k' when multiprocess protocol extensions are supported.

qXfer:osdata:read
  Obtains additional operating system information

qXfer:siginfo:read
qXfer:siginfo:write
  Read or write additional signal information.

* Removed remote protocol undocumented extension

  An undocumented extension to the remote protocol's `S' stop reply
  packet that permitted the stub to pass a process id was removed.
  Remote servers should use the `T' stop reply packet instead.

* GDB now supports multiple function calling conventions according to the
DWARF-2 DW_AT_calling_convention function attribute.
  
* The SH target utilizes the aforementioned change to distinguish between gcc
and Renesas calling convention.  It also adds the new CLI commands
`set/show sh calling-convention'.

* GDB can now read compressed debug sections, as produced by GNU gold
with the --compress-debug-sections=zlib flag.

* 64-bit core files are now supported on AIX.

* Thread switching is now supported on Tru64.

* Watchpoints can now be set on unreadable memory locations, e.g. addresses
which will be allocated using malloc later in program execution.

* The qXfer:libraries:read remote protocol packet now allows passing a
list of section offsets.

* On GNU/Linux, GDB can now attach to stopped processes.  Several race
conditions handling signals delivered during attach or thread creation
have also been fixed.

* GDB now supports the use of DWARF boolean types for Ada's type Boolean.
From the user's standpoint, all unqualified instances of True and False
are treated as the standard definitions, regardless of context.

* GDB now parses C++ symbol and type names more flexibly.  For
example, given:

   template<typename T> class C { };
   C<char const *> c;

GDB will now correctly handle all of:

   ptype C<char const *>
   ptype C<char const*>
   ptype C<const char *>
   ptype C<const char*>

* New features in the GDB remote stub, gdbserver

  - The "--wrapper" command-line argument tells gdbserver to use a
  wrapper program to launch programs for debugging.

  - On PowerPC and S/390 targets, it is now possible to use a single
  gdbserver executable to debug both 32-bit and 64-bit programs.
  (This requires gdbserver itself to be built as a 64-bit executable.)

  - gdbserver uses the new noack protocol mode for TCP connections to
  reduce communications latency, if also supported and enabled in GDB.

  - Support for the sparc64-linux-gnu target is now included in
  gdbserver.

  - The amd64-linux build of gdbserver now supports debugging both
    32-bit and 64-bit programs.

  - The i386-linux, amd64-linux, and i386-win32 builds of gdbserver
    now support hardware watchpoints, and will use them automatically
    as appropriate.

* Python scripting

  GDB now has support for scripting using Python.  Whether this is
  available is determined at configure time.

  New GDB commands can now be written in Python.

* Ada tasking support

  Ada tasks can now be inspected in GDB. The following commands have
  been introduced:

    info tasks
      Print the list of Ada tasks.
    info task N
      Print detailed information about task number N.
    task
      Print the task number of the current task.
    task N
      Switch the context of debugging to task number N.

* Support for user-defined prefixed commands.  The "define" command can
add new commands to existing prefixes, e.g. "target".

* Multi-inferior, multi-process debugging.

  GDB now has generalized support for multi-inferior debugging.  See
  "Debugging Multiple Inferiors" in the manual for more information.
  Although availability still depends on target support, the command
  set is more uniform now.  The GNU/Linux specific multi-forks support
  has been migrated to this new framework.  This implied some user
  visible changes; see "New commands" and also "Removed commands"
  below.

* Target descriptions can now describe the target OS ABI.  See the
"Target Description Format" section in the user manual for more
information.

* Target descriptions can now describe "compatible" architectures
to indicate that the target can execute applications for a different
architecture in addition to those for the main target architecture.
See the "Target Description Format" section in the user manual for
more information.

* Multi-architecture debugging.

  GDB now includes general supports for debugging applications on
  hybrid systems that use more than one single processor architecture
  at the same time.  Each such hybrid architecture still requires
  specific support to be added.  The only hybrid architecture supported
  in this version of GDB is the Cell Broadband Engine.

* GDB now supports integrated debugging of Cell/B.E. applications that
use both the PPU and SPU architectures.  To enable support for hybrid
Cell/B.E. debugging, you need to configure GDB to support both the
powerpc-linux or powerpc64-linux and the spu-elf targets, using the
--enable-targets configure option.

* Non-stop mode debugging.

  For some targets, GDB now supports an optional mode of operation in
  which you can examine stopped threads while other threads continue
  to execute freely.  This is referred to as non-stop mode, with the
  old mode referred to as all-stop mode.  See the "Non-Stop Mode"
  section in the user manual for more information.

  To be able to support remote non-stop debugging, a remote stub needs
  to implement the non-stop mode remote protocol extensions, as
  described in the "Remote Non-Stop" section of the user manual.  The
  GDB remote stub, gdbserver, has been adjusted to support these
  extensions on linux targets.

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

catch syscall [NAME(S) | NUMBER(S)]
  Catch system calls.  Arguments, which should be names of system
  calls or their numbers, mean catch only those syscalls.  Without
  arguments, every syscall will be caught.  When the inferior issues
  any of the specified syscalls, GDB will stop and announce the system
  call, both when it is called and when its call returns.  This
  feature is currently available with a native GDB running on the
  Linux Kernel, under the following architectures: x86, x86_64,
  PowerPC and PowerPC64.

find [/size-char] [/max-count] start-address, end-address|+search-space-size,
    val1 [, val2, ...]
  Search memory for a sequence of bytes.

maint set python print-stack
maint show python print-stack
  Show a stack trace when an error is encountered in a Python script.

python [CODE]
  Invoke CODE by passing it to the Python interpreter.

macro define
macro list
macro undef
  These allow macros to be defined, undefined, and listed
  interactively.

info os processes
  Show operating system information about processes.

info inferiors
  List the inferiors currently under GDB's control.

inferior NUM
  Switch focus to inferior number NUM.

detach inferior NUM
  Detach from inferior number NUM.

kill inferior NUM
  Kill inferior number NUM.

* New options

set spu stop-on-load
show spu stop-on-load
  Control whether to stop for new SPE threads during Cell/B.E. debugging.

set spu auto-flush-cache
show spu auto-flush-cache
  Control whether to automatically flush the software-managed cache
  during Cell/B.E. debugging.

set sh calling-convention
show sh calling-convention
  Control the calling convention used when calling SH target functions.

set debug timestamp
show debug timestamp
  Control display of timestamps with GDB debugging output.

set disassemble-next-line
show disassemble-next-line
  Control display of disassembled source lines or instructions when
  the debuggee stops.

set remote noack-packet
show remote noack-packet
  Set/show the use of remote protocol QStartNoAckMode packet.  See above
  under "New remote packets."

set remote query-attached-packet
show remote query-attached-packet
  Control use of remote protocol `qAttached' (query-attached) packet.

set remote read-siginfo-object
show remote read-siginfo-object
  Control use of remote protocol `qXfer:siginfo:read' (read-siginfo-object)
  packet.

set remote write-siginfo-object
show remote write-siginfo-object
  Control use of remote protocol `qXfer:siginfo:write' (write-siginfo-object)
  packet.

set remote reverse-continue
show remote reverse-continue
  Control use of remote protocol 'bc' (reverse-continue) packet.

set remote reverse-step
show remote reverse-step
  Control use of remote protocol 'bs' (reverse-step) packet.

set displaced-stepping
show displaced-stepping
  Control displaced stepping mode.  Displaced stepping is a way to
  single-step over breakpoints without removing them from the debuggee.
  Also known as "out-of-line single-stepping".

set debug displaced
show debug displaced
  Control display of debugging info for displaced stepping.

maint set internal-error
maint show internal-error
  Control what GDB does when an internal error is detected.

maint set internal-warning
maint show internal-warning
  Control what GDB does when an internal warning is detected.

set exec-wrapper
show exec-wrapper
unset exec-wrapper
  Use a wrapper program to launch programs for debugging.

set multiple-symbols (all|ask|cancel)
show multiple-symbols
  The value of this variable can be changed to adjust the debugger behavior
  when an expression or a breakpoint location contains an ambiguous symbol
  name (an overloaded function name, for instance).
  
set breakpoint always-inserted
show breakpoint always-inserted
  Keep breakpoints always inserted in the target, as opposed to inserting
  them when resuming the target, and removing them when the target stops.
  This option can improve debugger performance on slow remote targets.

set arm fallback-mode (arm|thumb|auto)
show arm fallback-mode
set arm force-mode (arm|thumb|auto)
show arm force-mode
  These commands control how ARM GDB determines whether instructions
  are ARM or Thumb.  The default for both settings is auto, which uses
  the current CPSR value for instructions without symbols; previous
  versions of GDB behaved as if "set arm fallback-mode arm".

set arm unwind-secure-frames
  Enable unwinding from Non-secure to Secure mode on Cortex-M with
  Security extension.
  This can trigger security exceptions when unwinding exception stacks.

set disable-randomization
show disable-randomization
  Standalone programs run with the virtual address space randomization enabled
  by default on some platforms.  This option keeps the addresses stable across
  multiple debugging sessions.

set non-stop
show non-stop
  Control whether other threads are stopped or not when some thread hits
  a breakpoint.

set target-async
show target-async
  Requests that asynchronous execution is enabled in the target, if available.
  In this case, it's possible to resume target in the background, and interact
  with GDB while the target is running.  "show target-async" displays the
  current state of asynchronous execution of the target.

set target-wide-charset
show target-wide-charset
  The target-wide-charset is the name of the character set that GDB
  uses when printing characters whose type is wchar_t.

set tcp auto-retry (on|off)
show tcp auto-retry
set tcp connect-timeout
show tcp connect-timeout
  These commands allow GDB to retry failed TCP connections to a remote stub
  with a specified timeout period; this is useful if the stub is launched
  in parallel with GDB but may not be ready to accept connections immediately.

set libthread-db-search-path
show libthread-db-search-path
  Control list of directories which GDB will search for appropriate
  libthread_db.

set schedule-multiple (on|off)
show schedule-multiple
  Allow GDB to resume all threads of all processes or only threads of
  the current process.

set stack-cache
show stack-cache
  Use more aggressive caching for accesses to the stack.  This improves
  performance of remote debugging (particularly backtraces) without
  affecting correctness.

set interactive-mode (on|off|auto)
show interactive-mode
  Control whether GDB runs in interactive mode (on) or not (off).
  When in interactive mode, GDB waits for the user to answer all
  queries.  Otherwise, GDB does not wait and assumes the default
  answer.  When set to auto (the default), GDB determines which
  mode to use based on the stdin settings.

* Removed commands

info forks
  For program forks, this is replaced by the new more generic `info
  inferiors' command.  To list checkpoints, you can still use the
  `info checkpoints' command, which was an alias for the `info forks'
  command.

fork NUM
  Replaced by the new `inferior' command.  To switch between
  checkpoints, you can still use the `restart' command, which was an
  alias for the `fork' command.

process PID
  This is removed, since some targets don't have a notion of
  processes.  To switch between processes, you can still use the
  `inferior' command using GDB's own inferior number.

delete fork NUM
  For program forks, this is replaced by the new more generic `kill
  inferior' command.  To delete a checkpoint, you can still use the
  `delete checkpoint' command, which was an alias for the `delete
  fork' command.

detach fork NUM
  For program forks, this is replaced by the new more generic `detach
  inferior' command.  To detach a checkpoint, you can still use the
  `detach checkpoint' command, which was an alias for the `detach
  fork' command.

* New native configurations

x86/x86_64 Darwin		i[34567]86-*-darwin*

x86_64 MinGW			x86_64-*-mingw*

* New targets

Lattice Mico32                  lm32-*
x86 DICOS			i[34567]86-*-dicos*
x86_64 DICOS		        x86_64-*-dicos*
S+core 3			score-*-*

* The GDB remote stub, gdbserver, now supports x86 Windows CE
  (mingw32ce) debugging.

* Removed commands

catch load
catch unload
  These commands were actually not implemented on any target.

*** Changes in GDB 6.8

* New native configurations

NetBSD/hppa			hppa*-*netbsd*
Xtensa GNU/Linux		xtensa*-*-linux*

* New targets

NetBSD/hppa			hppa*-*-netbsd*
Xtensa GNU/Linux		xtensa*-*-linux*

* Change in command line behavior -- corefiles vs. process ids.

  When the '-p NUMBER' or '--pid NUMBER' options are used, and
  attaching to process NUMBER fails, GDB no longer attempts to open a
  core file named NUMBER.  Attaching to a program using the -c option
  is no longer supported.  Instead, use the '-p' or '--pid' options.

* GDB can now be built as a native debugger for debugging Windows x86
(mingw32) Portable Executable (PE) programs.

* Pending breakpoints no longer change their number when their address
is resolved.

* GDB now supports breakpoints with multiple locations,
including breakpoints on C++ constructors, inside C++ templates,
and in inlined functions.

* GDB's ability to debug optimized code has been improved.  GDB more
accurately identifies function bodies and lexical blocks that occupy
more than one contiguous range of addresses.

* Target descriptions can now describe registers for PowerPC.

* The GDB remote stub, gdbserver, now supports the AltiVec and SPE
registers on PowerPC targets.

* The GDB remote stub, gdbserver, now supports thread debugging on GNU/Linux
targets even when the libthread_db library is not available.

* The GDB remote stub, gdbserver, now supports the new file transfer
commands (remote put, remote get, and remote delete).

* The GDB remote stub, gdbserver, now supports run and attach in
extended-remote mode.

* hppa*64*-*-hpux11* target broken
The debugger is unable to start a program and fails with the following
error: "Error trying to get information about dynamic linker".
The gdb-6.7 release is also affected.

* GDB now supports the --enable-targets= configure option to allow
building a single GDB executable that supports multiple remote
target architectures.

* GDB now supports debugging C and C++ programs which use the
Decimal Floating Point extension.  In addition, the PowerPC target
now has a set of pseudo-registers to inspect decimal float values
stored in two consecutive float registers.

* The -break-insert MI command can optionally create pending
breakpoints now.

* Improved support for debugging Ada
Many improvements to the Ada language support have been made.  These
include:
    - Better support for Ada2005 interface types
    - Improved handling of arrays and slices in general
    - Better support for Taft-amendment types
    - The '{type} ADDRESS' expression is now allowed on the left hand-side
      of an assignment
    - Improved command completion in Ada
    - Several bug fixes

* GDB on GNU/Linux and HP/UX can now debug through "exec" of a new
process.

* New commands

set print frame-arguments (all|scalars|none)
show print frame-arguments
  The value of this variable can be changed to control which argument
  values should be printed by the debugger when displaying a frame.

remote put
remote get
remote delete
  Transfer files to and from a remote target, and delete remote files.

* New MI commands

-target-file-put
-target-file-get
-target-file-delete
  Transfer files to and from a remote target, and delete remote files.

* New remote packets

vFile:open:
vFile:close:
vFile:pread:
vFile:pwrite:
vFile:unlink:
  Open, close, read, write, and delete files on the remote system.

vAttach
  Attach to an existing process on the remote system, in extended-remote
  mode.

vRun
  Run a new process on the remote system, in extended-remote mode.

*** Changes in GDB 6.7

* Resolved 101 resource leaks, null pointer dereferences, etc. in gdb, 
bfd, libiberty and opcodes, as revealed by static analysis donated by
Coverity, Inc. (http://scan.coverity.com).

* When looking up multiply-defined global symbols, GDB will now prefer the
symbol definition in the current shared library if it was built using the
-Bsymbolic linker option.

* When the Text User Interface (TUI) is not configured, GDB will now
recognize the -tui command-line option and print a message that the TUI
is not supported.

* The GDB remote stub, gdbserver, now has lower overhead for high 
frequency signals (e.g. SIGALRM) via the QPassSignals packet.

* GDB for MIPS targets now autodetects whether a remote target provides
32-bit or 64-bit register values.

* Support for C++ member pointers has been improved.

* GDB now understands XML target descriptions, which specify the
target's overall architecture.  GDB can read a description from
a local file or over the remote serial protocol.

* Vectors of single-byte data use a new integer type which is not
automatically displayed as character or string data.

* The /s format now works with the print command.  It displays
arrays of single-byte integers and pointers to single-byte integers
as strings.

* Target descriptions can now describe target-specific registers,
for architectures which have implemented the support (currently
only ARM, M68K, and MIPS).

* GDB and the GDB remote stub, gdbserver, now support the XScale
iWMMXt coprocessor.

* The GDB remote stub, gdbserver, has been updated to support
ARM Windows CE (mingw32ce) debugging, and GDB Windows CE support
has been rewritten to use the standard GDB remote protocol.

* GDB can now step into C++ functions which are called through thunks.

* GDB for the Cell/B.E. SPU now supports overlay debugging.

* The GDB remote protocol "qOffsets" packet can now honor ELF segment
layout.  It also supports a TextSeg= and DataSeg= response when only
segment base addresses (rather than offsets) are available.

* The /i format now outputs any trailing branch delay slot instructions 
immediately following the last instruction within the count specified.

* The GDB remote protocol "T" stop reply packet now supports a
"library" response.  Combined with the new "qXfer:libraries:read"
packet, this response allows GDB to debug shared libraries on targets
where the operating system manages the list of loaded libraries (e.g.
Windows and SymbianOS).

* The GDB remote stub, gdbserver, now supports dynamic link libraries
(DLLs) on Windows and Windows CE targets.

* GDB now supports a faster verification that a .debug file matches its binary
according to its build-id signature, if the signature is present.

* New commands

set remoteflow
show remoteflow
  Enable or disable hardware flow control (RTS/CTS) on the serial port
  when debugging using remote targets.

set mem inaccessible-by-default
show mem inaccessible-by-default
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  prevents GDB from accessing memory outside the memory map.  This
  is useful for targets with memory mapped registers or which react
  badly to accesses of unmapped address space.

set breakpoint auto-hw
show breakpoint auto-hw
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  lets GDB use hardware breakpoints automatically for memory regions
  where it can not use software breakpoints.  This covers both the
  "break" command and internal breakpoints used for other commands
  including "next" and "finish".

catch exception
catch exception unhandled
  Stop the program execution when Ada exceptions are raised.

catch assert
  Stop the program execution when an Ada assertion failed.

set sysroot
show sysroot
  Set an alternate system root for target files.  This is a more
  general version of "set solib-absolute-prefix", which is now
  an alias to "set sysroot".

info spu
  Provide extended SPU facility status information.  This set of
  commands is available only when debugging the Cell/B.E. SPU
  architecture.

* New native configurations

OpenBSD/sh			sh*-*openbsd*

set tdesc filename
unset tdesc filename
show tdesc filename
  Use the specified local file as an XML target description, and do
  not query the target for its built-in description.

* New targets

OpenBSD/sh			sh*-*-openbsd*
MIPS64 GNU/Linux (gdbserver)	mips64-linux-gnu
Toshiba Media Processor		mep-elf

* New remote packets

QPassSignals:
  Ignore the specified signals; pass them directly to the debugged program
  without stopping other threads or reporting them to GDB.

qXfer:features:read:
  Read an XML target description from the target, which describes its
  features.

qXfer:spu:read:
qXfer:spu:write:
  Read or write contents of an spufs file on the target system.  These
  packets are available only on the Cell/B.E. SPU architecture.

qXfer:libraries:read:
  Report the loaded shared libraries.  Combined with new "T" packet
  response, this packet allows GDB to debug shared libraries on
  targets where the operating system manages the list of loaded
  libraries (e.g. Windows and SymbianOS).

* Removed targets

Support for these obsolete configurations has been removed.

alpha*-*-osf1*
alpha*-*-osf2*
d10v-*-*
hppa*-*-hiux*
i[34567]86-ncr-*
i[34567]86-*-dgux*
i[34567]86-*-lynxos*
i[34567]86-*-netware*
i[34567]86-*-sco3.2v5*
i[34567]86-*-sco3.2v4*
i[34567]86-*-sco*
i[34567]86-*-sysv4.2*
i[34567]86-*-sysv4*
i[34567]86-*-sysv5*
i[34567]86-*-unixware2*
i[34567]86-*-unixware*
i[34567]86-*-sysv*
i[34567]86-*-isc*
m68*-cisco*-*
m68*-tandem-*
mips*-*-pe
rs6000-*-lynxos*
sh*-*-pe

* Other removed features

target abug
target cpu32bug
target est
target rom68k

	Various m68k-only ROM monitors.

target hms
target e7000
target sh3
target sh3e

	Various Renesas ROM monitors and debugging interfaces for SH and
	H8/300.

target ocd

	Support for a Macraigor serial interface to on-chip debugging.
	GDB does not directly support the newer parallel or USB
	interfaces.

DWARF 1 support

	A debug information format.  The predecessor to DWARF 2 and 
	DWARF 3, which are still supported.

Support for the HP aCC compiler on HP-UX/PA-RISC

	SOM-encapsulated symbolic debugging information, automatic
	invocation of pxdb, and the aCC custom C++ ABI.  This does not
	affect HP-UX for Itanium or GCC for HP-UX/PA-RISC.  Code compiled
	with aCC can still be debugged on an assembly level.

MIPS ".pdr" sections

	A MIPS-specific format used to describe stack frame layout
	in debugging information.

Scheme support

	GDB could work with an older version of Guile to debug
	the interpreter and Scheme programs running in it.

set mips stack-arg-size
set mips saved-gpreg-size

	Use "set mips abi" to control parameter passing for MIPS.

*** Changes in GDB 6.6

* New targets

Xtensa				xtensa-elf
Cell Broadband Engine SPU	spu-elf

* GDB can now be configured as a cross-debugger targeting native Windows
(mingw32) or Cygwin.  It can communicate with a remote debugging stub
running on a Windows system over TCP/IP to debug Windows programs.

* The GDB remote stub, gdbserver, has been updated to support Windows and
Cygwin debugging.  Both single-threaded and multi-threaded programs are
supported.

* The "set trust-readonly-sections" command works again.  This command was
broken in GDB 6.3, 6.4, and 6.5.

* The "load" command now supports writing to flash memory, if the remote
stub provides the required support.

* Support for GNU/Linux Thread Local Storage (TLS, per-thread variables) no
longer requires symbolic debug information (e.g. DWARF-2).

* New commands

set substitute-path
unset substitute-path
show substitute-path
  Manage a list of substitution rules that GDB uses to rewrite the name
  of the directories where the sources are located. This can be useful
  for instance when the sources were moved to a different location
  between compilation and debugging.

set trace-commands
show trace-commands
  Print each CLI command as it is executed.  Each command is prefixed with
  a number of `+' symbols representing the nesting depth.
  The source command now has a `-v' option to enable the same feature.

* REMOVED features

The ARM Demon monitor support (RDP protocol, "target rdp").

Kernel Object Display, an embedded debugging feature which only worked with
an obsolete version of Cisco IOS.

The 'set download-write-size' and 'show download-write-size' commands.

* New remote packets

qSupported:
  Tell a stub about GDB client features, and request remote target features.
  The first feature implemented is PacketSize, which allows the target to
  specify the size of packets it can handle - to minimize the number of
  packets required and improve performance when connected to a remote
  target.

qXfer:auxv:read:
  Fetch an OS 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 reqired (if any).

 * Better dynamic linking support in SunOS

Reading symbols from shared libraries which contain debugging symbols
now works properly.  However, there remain issues such as automatic
skipping of `transfer vector' code during function calls, which
make it harder to debug code in a shared library, than to debug the
same code linked statically.

 * New Getopt

GDB is now using the latest `getopt' routines from the FSF.  This
version accepts the -- prefix for options with long names.  GDB will
continue to accept the old forms (-option and +option) as well.
Various single letter abbreviations for options have been explicity
added to the option table so that they won't get overshadowed in the
future by other options that begin with the same letter.

 * Bugs fixed

The `cleanup_undefined_types' bug that many of you noticed has been squashed.
Many assorted bugs have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.


*** Changes in GDB-4.3:

 * New machines supported (host and target)

Amiga 3000 running Amix			m68k-cbm-svr4	or  amix
NCR 3000 386 running SVR4		i386-ncr-svr4	or  ncr3000
Motorola Delta 88000 running Sys V	m88k-motorola-sysv  or  delta88

 * Almost SCO Unix support

We had hoped to support:
SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
(except for core file support), but we discovered very late in the release
that it has problems with process groups that render gdb unusable.  Sorry
about that.  I encourage people to fix it and post the fixes.

 * Preliminary ELF and DWARF support

GDB can read ELF object files on System V Release 4, and can handle
debugging records for C, in DWARF format, in ELF files.  This support
is preliminary.  If you bring up GDB on another SVR4 system, please
send mail to bug-gdb@prep.ai.mit.edu to let us know what changes were
reqired (if any).

 * New Readline

GDB now uses the latest `readline' library.  One user-visible change
is that two tabs will list possible command completions, which previously
required typing M-? (meta-question mark, or ESC ?).

 * Bugs fixed

The `stepi' bug that many of you noticed has been squashed.
Many bugs in C++ have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.

 * State of the MIPS world (in case you wondered):

GDB can understand the symbol tables emitted by the compilers
supplied by most vendors of MIPS-based machines, including DEC.  These
symbol tables are in a format that essentially nobody else uses.

Some versions of gcc come with an assembler post-processor called
mips-tfile.  This program is required if you want to do source-level
debugging of gcc-compiled programs.  I believe FSF does not ship
mips-tfile with gcc version 1, but it will eventually come with gcc
version 2.

Debugging of g++ output remains a problem.  g++ version 1.xx does not
really support it at all.  (If you're lucky, you should be able to get
line numbers and stack traces to work, but no parameters or local
variables.)  With some work it should be possible to improve the
situation somewhat.

When gcc version 2 is released, you will have somewhat better luck.
However, even then you will get confusing results for inheritance and
methods.

We will eventually provide full debugging of g++ output on
DECstations.  This will probably involve some kind of stabs-in-ecoff
encapulation, but the details have not been worked out yet.


*** Changes in GDB-4.2:

 *  Improved configuration

Only one copy of `configure' exists now, and it is not self-modifying.
Porting BFD is simpler.  

 *  Stepping improved

The `step' and `next' commands now only stop at the first instruction
of a source line.  This prevents the multiple stops that used to occur
in switch statements, for-loops, etc.  `Step' continues to stop if a
function that has debugging information is called within the line.

 *  Bug fixing

Lots of small bugs fixed.  More remain.

 *  New host supported (not target)

Intel 386 PC clone running Mach		i386-none-mach


*** Changes in GDB-4.1:

 *  Multiple source language support

GDB now has internal scaffolding to handle several source languages.
It determines the type of each source file from its filename extension,
and will switch expression parsing and number formatting to match the
language of the function in the currently selected stack frame.
You can also specifically set the language to be used, with
`set language c' or `set language modula-2'.

 *  GDB and Modula-2

GDB now has preliminary support for the GNU Modula-2 compiler,
currently under development at the State University of New York at
Buffalo.  Development of both GDB and the GNU Modula-2 compiler will
continue through the fall of 1991 and into 1992.

Other Modula-2 compilers are currently not supported, and attempting to
debug programs compiled with them will likely result in an error as the
symbol table is read.  Feel free to work on it, though!

There are hooks in GDB for strict type checking and range checking,
in the `Modula-2 philosophy', but they do not currently work.

 * set write on/off

GDB can now write to executable and core files (e.g. patch
a variable's value).   You must turn this switch on, specify
the file ("exec foo" or "core foo"), *then* modify it, e.g.
by assigning a new value to a variable.  Modifications take
effect immediately.

 * Automatic SunOS shared library reading

When you run your program, GDB automatically determines where its
shared libraries (if any) have been loaded, and reads their symbols.
The `share' command is no longer needed.  This also works when
examining core files.

 * set listsize

You can specify the number of lines that the `list' command shows.
The default is 10.

 * New machines supported (host and target)

SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Sony NEWS (68K) running NEWSOS 3.x:	m68k-sony-sysv	or  news
Ultracomputer (29K) running Sym1:	a29k-nyu-sym1	or  ultra3

 * New hosts supported (not targets)

IBM RT/PC:				romp-ibm-aix 	or  rtpc

 * New targets supported (not hosts)

AMD 29000 embedded with COFF		a29k-none-coff
AMD 29000 embedded with a.out		a29k-none-aout
Ultracomputer remote kernel debug	a29k-nyu-kern

 * New remote interfaces

AMD 29000 Adapt
AMD 29000 Minimon


*** Changes in GDB-4.0:

 *  New Facilities

Wide output is wrapped at good places to make the output more readable.

Gdb now supports cross-debugging from a host machine of one type to a
target machine of another type.  Communication with the target system
is over serial lines.  The ``target'' command handles connecting to the
remote system; the ``load'' command will download a program into the
remote system.  Serial stubs for the m68k and i386 are provided.  Gdb
also supports debugging of realtime processes running under VxWorks,
using SunRPC Remote Procedure Calls over TCP/IP to talk to a debugger
stub on the target system.

New CPUs supported include the AMD 29000 and Intel 960.

GDB now reads object files and symbol tables via a ``binary file'' 
library, which allows a single copy of GDB to debug programs of multiple
object file types such as a.out and coff.

There is now a GDB reference card in "doc/refcard.tex".  (Make targets
refcard.dvi and refcard.ps are available to format it).


 *  Control-Variable user interface simplified

All variables that control the operation of the debugger can be set
by the ``set'' command, and displayed by the ``show'' command.

For example, ``set prompt new-gdb=>'' will change your prompt to new-gdb=>.
``Show prompt'' produces the response:
Gdb's prompt is new-gdb=>.

What follows are the NEW set commands.  The command ``help set'' will
print a complete list of old and new set commands.  ``help set FOO''
will give a longer description of the variable FOO.  ``show'' will show
all of the variable descriptions and their current settings.

confirm on/off:  Enables warning questions for operations that are
		 hard to recover from, e.g. rerunning the program while
		 it is already running.  Default is ON.

editing on/off:  Enables EMACS style command line editing 
                 of input.  Previous lines can be recalled with 
		 control-P, the current line can be edited with control-B,
		 you can search for commands with control-R, etc.
		 Default is ON.

history filename NAME:  NAME is where the gdb command history 
			will be stored.  The default is .gdb_history,
			or the value of the environment variable
			GDBHISTFILE.

history size N:  The size, in commands, of the command history.  The 
		 default is 256, or the value of the environment variable
		 HISTSIZE.

history save on/off: If this value is set to ON, the history file will
		      be saved after exiting gdb.  If set to OFF, the 
		      file will not be saved.  The default is OFF.

history expansion on/off: If this value is set to ON, then csh-like 
			  history expansion will be performed  on 
			  command line input.  The default is OFF.

radix N:  Sets the default radix for input and output.  It can be set
	  to 8, 10, or 16.  Note that the argument to "radix" is interpreted
	  in the current radix, so "set radix 10" is always a no-op.

height N: This integer value is the number of lines on a page. Default
          is 24, the current `stty rows'' setting, or the ``li#''
	  setting from the termcap entry matching the environment
	  variable TERM.

width N:  This integer value is the number of characters on a line.
	  Default is 80, the current `stty cols'' setting, or the ``co#''
	  setting from the termcap entry matching the environment
	  variable TERM.

Note: ``set screensize'' is obsolete. Use ``set height'' and
``set width'' instead.

print address on/off:  Print memory addresses in various command displays,
		      such as stack traces and structure values.  Gdb looks
		      more ``symbolic'' if you turn this off; it looks more
		      ``machine level'' with it on.  Default is ON.

print array on/off:  Prettyprint arrays.  New convenient format!  Default 
                    is OFF.

print demangle on/off:   Print C++ symbols in "source" form if on,
			"raw" form if off.

print asm-demangle on/off:  Same, for assembler level printouts
			like instructions.

print vtbl on/off:  Prettyprint C++ virtual function tables.  Default is OFF.


 *  Support for Epoch Environment.

The epoch environment is a version of Emacs v18 with windowing.  One
new command, ``inspect'', is identical to ``print'', except that if you
are running in the epoch environment, the value is printed in its own
window.


 *  Support for Shared Libraries

GDB can now debug programs and core files that use SunOS shared libraries.
Symbols from a shared library cannot be referenced
before the shared library has been linked with the program (this
happens after you type ``run'' and before the function main() is entered).
At any time after this linking (including when examining core files
from dynamically linked programs), gdb reads the symbols from each
shared library when you type the ``sharedlibrary'' command.
It can be abbreviated ``share''.

sharedlibrary REGEXP:  Load shared object library symbols for files 
                       matching a unix regular expression.  No argument
		       indicates to load symbols for all shared libraries.

info sharedlibrary:  Status of loaded shared libraries.


 *  Watchpoints

A watchpoint stops execution of a program whenever the value of an
expression changes.  Checking for this slows down execution
tremendously whenever you are in the scope of the expression, but is
quite useful for catching tough ``bit-spreader'' or pointer misuse
problems.  Some machines such as the 386 have hardware for doing this
more quickly, and future versions of gdb will use this hardware.

watch EXP:  Set a watchpoint (breakpoint) for an expression.

info watchpoints:  Information about your watchpoints.

delete N:   Deletes watchpoint number N (same as breakpoints).
disable N:  Temporarily turns off watchpoint number N (same as breakpoints).
enable N:   Re-enables watchpoint number N (same as breakpoints).


 *  C++ multiple inheritance

When used with a GCC version 2 compiler, GDB supports multiple inheritance
for C++ programs.

 *  C++ exception handling

Gdb now supports limited C++ exception handling.  Besides the existing
ability to breakpoint on an exception handler, gdb can breakpoint on
the raising of an exception (before the stack is peeled back to the
handler's context).

catch FOO:  If there is a FOO exception handler in the dynamic scope,
	    set a breakpoint to catch exceptions which may be raised there.
	    Multiple exceptions (``catch foo bar baz'') may be caught.

info catch:  Lists all exceptions which may be caught in the
             current stack frame.


 *  Minor command changes

The command ``call func (arg, arg, ...)'' now acts like the print
command, except it does not print or save a value if the function's result
is void.  This is similar to dbx usage.

The ``up'' and ``down'' commands now always print the frame they end up
at; ``up-silently'' and `down-silently'' can be used in scripts to change
frames without printing.

 *  New directory command

'dir' now adds directories to the FRONT of the source search path.
The path starts off empty.  Source files that contain debug information
about the directory in which they were compiled can be found even
with an empty path; Sun CC and GCC include this information.  If GDB can't
find your source file in the current directory, type "dir .".

 * Configuring GDB for compilation

For normal use, type ``./configure host''.  See README or gdb.texinfo
for more details.

GDB now handles cross debugging.  If you are remotely debugging between 
two different machines, type ``./configure host -target=targ''.
Host is the machine where GDB will run; targ is the machine
where the program that you are debugging will run.
