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

*** Changes since GDB 7.6

* New commands:
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.

* New options

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

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

* MI changes

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

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

* New targets

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

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

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

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

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

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

* 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 GDB can determine it and 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.

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

*** 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 reccursively 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 permited 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 procotol 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 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/Lunux		xtensa*-*-linux*

* Change in command line behavior -- corefiles vs. process ids.

  When the '-p NUMBER' or '--pid NUMBER' options are used, and
  attaching to process NUMBER fails, GDB no longer attempts to open a
  core file named NUMBER.  Attaching to a program using the -c option
  is no longer supported.  Instead, use the '-p' or '--pid' options.

* GDB can now be built as a native debugger for debugging Windows x86
(mingw32) Portable Executable (PE) programs.

* Pending breakpoints no longer change their number when their address
is resolved.

* GDB now supports breakpoints with multiple locations,
including breakpoints on C++ constructors, inside C++ templates,
and in inlined functions.

* GDB's ability to debug optimized code has been improved.  GDB more
accurately identifies function bodies and lexical blocks that occupy
more than one contiguous range of addresses.

* Target descriptions can now describe registers for PowerPC.

* The GDB remote stub, gdbserver, now supports the AltiVec and SPE
registers on PowerPC targets.

* The GDB remote stub, gdbserver, now supports thread debugging on GNU/Linux
targets even when the libthread_db library is not available.

* The GDB remote stub, gdbserver, now supports the new file transfer
commands (remote put, remote get, and remote delete).

* The GDB remote stub, gdbserver, now supports run and attach in
extended-remote mode.

* hppa*64*-*-hpux11* target broken
The debugger is unable to start a program and fails with the following
error: "Error trying to get information about dynamic linker".
The gdb-6.7 release is also affected.

* GDB now supports the --enable-targets= configure option to allow
building a single GDB executable that supports multiple remote
target architectures.

* GDB now supports debugging C and C++ programs which use the
Decimal Floating Point extension.  In addition, the PowerPC target
now has a set of pseudo-registers to inspect decimal float values
stored in two consecutive float registers.

* The -break-insert MI command can optionally create pending
breakpoints now.

* Improved support for debugging Ada
Many improvements to the Ada language support have been made.  These
include:
    - Better support for Ada2005 interface types
    - Improved handling of arrays and slices in general
    - Better support for Taft-amendment types
    - The '{type} ADDRESS' expression is now allowed on the left hand-side
      of an assignment
    - Improved command completion in Ada
    - Several bug fixes

* GDB on GNU/Linux and HP/UX can now debug through "exec" of a new
process.

* New commands

set print frame-arguments (all|scalars|none)
show print frame-arguments
  The value of this variable can be changed to control which argument
  values should be printed by the debugger when displaying a frame.

remote put
remote get
remote delete
  Transfer files to and from a remote target, and delete remote files.

* New MI commands

-target-file-put
-target-file-get
-target-file-delete
  Transfer files to and from a remote target, and delete remote files.

* New remote packets

vFile:open:
vFile:close:
vFile:pread:
vFile:pwrite:
vFile:unlink:
  Open, close, read, write, and delete files on the remote system.

vAttach
  Attach to an existing process on the remote system, in extended-remote
  mode.

vRun
  Run a new process on the remote system, in extended-remote mode.

*** Changes in GDB 6.7

* Resolved 101 resource leaks, null pointer dereferences, etc. in gdb, 
bfd, libiberty and opcodes, as revealed by static analysis donated by
Coverity, Inc. (http://scan.coverity.com).

* When looking up multiply-defined global symbols, GDB will now prefer the
symbol definition in the current shared library if it was built using the
-Bsymbolic linker option.

* When the Text User Interface (TUI) is not configured, GDB will now
recognize the -tui command-line option and print a message that the TUI
is not supported.

* The GDB remote stub, gdbserver, now has lower overhead for high 
frequency signals (e.g. SIGALRM) via the QPassSignals packet.

* GDB for MIPS targets now autodetects whether a remote target provides
32-bit or 64-bit register values.

* Support for C++ member pointers has been improved.

* GDB now understands XML target descriptions, which specify the
target's overall architecture.  GDB can read a description from
a local file or over the remote serial protocol.

* Vectors of single-byte data use a new integer type which is not
automatically displayed as character or string data.

* The /s format now works with the print command.  It displays
arrays of single-byte integers and pointers to single-byte integers
as strings.

* Target descriptions can now describe target-specific registers,
for architectures which have implemented the support (currently
only ARM, M68K, and MIPS).

* GDB and the GDB remote stub, gdbserver, now support the XScale
iWMMXt coprocessor.

* The GDB remote stub, gdbserver, has been updated to support
ARM Windows CE (mingw32ce) debugging, and GDB Windows CE support
has been rewritten to use the standard GDB remote protocol.

* GDB can now step into C++ functions which are called through thunks.

* GDB for the Cell/B.E. SPU now supports overlay debugging.

* The GDB remote protocol "qOffsets" packet can now honor ELF segment
layout.  It also supports a TextSeg= and DataSeg= response when only
segment base addresses (rather than offsets) are available.

* The /i format now outputs any trailing branch delay slot instructions 
immediately following the last instruction within the count specified.

* The GDB remote protocol "T" stop reply packet now supports a
"library" response.  Combined with the new "qXfer:libraries:read"
packet, this response allows GDB to debug shared libraries on targets
where the operating system manages the list of loaded libraries (e.g.
Windows and SymbianOS).

* The GDB remote stub, gdbserver, now supports dynamic link libraries
(DLLs) on Windows and Windows CE targets.

* GDB now supports a faster verification that a .debug file matches its binary
according to its build-id signature, if the signature is present.

* New commands

set remoteflow
show remoteflow
  Enable or disable hardware flow control (RTS/CTS) on the serial port
  when debugging using remote targets.

set mem inaccessible-by-default
show mem inaccessible-by-default
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  prevents GDB from accessing memory outside the memory map.  This
  is useful for targets with memory mapped registers or which react
  badly to accesses of unmapped address space.

set breakpoint auto-hw
show breakpoint auto-hw
  If the target supplies a memory map, for instance via the remote
  protocol's "qXfer:memory-map:read" packet, setting this variable
  lets GDB use hardware breakpoints automatically for memory regions
  where it can not use software breakpoints.  This covers both the
  "break" command and internal breakpoints used for other commands
  including "next" and "finish".

catch exception
catch exception unhandled
  Stop the program execution when Ada exceptions are raised.

catch assert
  Stop the program execution when an Ada assertion failed.

set sysroot
show sysroot
  Set an alternate system root for target files.  This is a more
  general version of "set solib-absolute-prefix", which is now
  an alias to "set sysroot".

info spu
  Provide extended SPU facility status information.  This set of
  commands is available only when debugging the Cell/B.E. SPU
  architecture.

* New native configurations

OpenBSD/sh			sh*-*openbsd*

set tdesc filename
unset tdesc filename
show tdesc filename
  Use the specified local file as an XML target description, and do
  not query the target for its built-in description.

* New targets

OpenBSD/sh			sh*-*-openbsd*
MIPS64 GNU/Linux (gdbserver)	mips64-linux-gnu
Toshiba Media Processor		mep-elf

* New remote packets

QPassSignals:
  Ignore the specified signals; pass them directly to the debugged program
  without stopping other threads or reporting them to GDB.

qXfer:features:read:
  Read an XML target description from the target, which describes its
  features.

qXfer:spu:read:
qXfer:spu:write:
  Read or write contents of an spufs file on the target system.  These
  packets are available only on the Cell/B.E. SPU architecture.

qXfer:libraries:read:
  Report the loaded shared libraries.  Combined with new "T" packet
  response, this packet allows GDB to debug shared libraries on
  targets where the operating system manages the list of loaded
  libraries (e.g. Windows and SymbianOS).

* Removed targets

Support for these obsolete configurations has been removed.

alpha*-*-osf1*
alpha*-*-osf2*
d10v-*-*
hppa*-*-hiux*
i[34567]86-ncr-*
i[34567]86-*-dgux*
i[34567]86-*-lynxos*
i[34567]86-*-netware*
i[34567]86-*-sco3.2v5*
i[34567]86-*-sco3.2v4*
i[34567]86-*-sco*
i[34567]86-*-sysv4.2*
i[34567]86-*-sysv4*
i[34567]86-*-sysv5*
i[34567]86-*-unixware2*
i[34567]86-*-unixware*
i[34567]86-*-sysv*
i[34567]86-*-isc*
m68*-cisco*-*
m68*-tandem-*
mips*-*-pe
rs6000-*-lynxos*
sh*-*-pe

* Other removed features

target abug
target cpu32bug
target est
target rom68k

	Various m68k-only ROM monitors.

target hms
target e7000
target sh3
target sh3e

	Various Renesas ROM monitors and debugging interfaces for SH and
	H8/300.

target ocd

	Support for a Macraigor serial interface to on-chip debugging.
	GDB does not directly support the newer parallel or USB
	interfaces.

DWARF 1 support

	A debug information format.  The predecessor to DWARF 2 and 
	DWARF 3, which are still supported.

Support for the HP aCC compiler on HP-UX/PA-RISC

	SOM-encapsulated symbolic debugging information, automatic
	invocation of pxdb, and the aCC custom C++ ABI.  This does not
	affect HP-UX for Itanium or GCC for HP-UX/PA-RISC.  Code compiled
	with aCC can still be debugged on an assembly level.

MIPS ".pdr" sections

	A MIPS-specific format used to describe stack frame layout
	in debugging information.

Scheme support

	GDB could work with an older version of Guile to debug
	the interpreter and Scheme programs running in it.

set mips stack-arg-size
set mips saved-gpreg-size

	Use "set mips abi" to control parameter passing for MIPS.

*** Changes in GDB 6.6

* New targets

Xtensa				xtensa-elf
Cell Broadband Engine SPU	spu-elf

* GDB can now be configured as a cross-debugger targeting native Windows
(mingw32) or Cygwin.  It can communicate with a remote debugging stub
running on a Windows system over TCP/IP to debug Windows programs.

* The GDB remote stub, gdbserver, has been updated to support Windows and
Cygwin debugging.  Both single-threaded and multi-threaded programs are
supported.

* The "set trust-readonly-sections" command works again.  This command was
broken in GDB 6.3, 6.4, and 6.5.

* The "load" command now supports writing to flash memory, if the remote
stub provides the required support.

* Support for GNU/Linux Thread Local Storage (TLS, per-thread variables) no
longer requires symbolic debug information (e.g. DWARF-2).

* New commands

set substitute-path
unset substitute-path
show substitute-path
  Manage a list of substitution rules that GDB uses to rewrite the name
  of the directories where the sources are located. This can be useful
  for instance when the sources were moved to a different location
  between compilation and debugging.

set trace-commands
show trace-commands
  Print each CLI command as it is executed.  Each command is prefixed with
  a number of `+' symbols representing the nesting depth.
  The source command now has a `-v' option to enable the same feature.

* REMOVED features

The ARM Demon monitor support (RDP protocol, "target rdp").

Kernel Object Display, an embedded debugging feature which only worked with
an obsolete version of Cisco IOS.

The 'set download-write-size' and 'show download-write-size' commands.

* New remote packets

qSupported:
  Tell a stub about GDB client features, and request remote target features.
  The first feature implemented is PacketSize, which allows the target to
  specify the size of packets it can handle - to minimize the number of
  packets required and improve performance when connected to a remote
  target.

qXfer:auxv:read:
  Fetch an OS auxilliary vector from the remote stub.  This packet is a
  more efficient replacement for qPart:auxv:read.

qXfer:memory-map:read:
  Fetch a memory map from the remote stub, including information about
  RAM, ROM, and flash memory devices.

vFlashErase:
vFlashWrite:
vFlashDone:
  Erase and program a flash memory device.

* Removed remote packets

qPart:auxv:read:
  This packet has been replaced by qXfer:auxv:read.  Only GDB 6.4 and 6.5
  used it, and only gdbserver implemented it.

*** Changes in GDB 6.5

* New targets

Renesas M32C/M16C		m32c-elf

Morpho Technologies ms1		ms1-elf

* New commands

init-if-undefined		Initialize a convenience variable, but
				only if it doesn't already have a value.

The following commands are presently only implemented for native GNU/Linux:

checkpoint			Save a snapshot of the program state.

restart	<n>			Return the program state to a 
				previously saved state.

info checkpoints		List currently saved checkpoints.

delete-checkpoint <n>		Delete a previously saved checkpoint.

set|show detach-on-fork		Tell gdb whether to detach from a newly
				forked process, or to keep debugging it.

info forks			List forks of the user program that
				are available to be debugged.

fork <n>			Switch to debugging one of several
				forks of the user program that are
				available to be debugged.

delete-fork <n>			Delete a fork from the list of forks
				that are available to be debugged (and
				kill the forked process).

detach-fork <n>			Delete a fork from the list of forks
				that are available to be debugged (and
				allow the process to continue).

* New architecture

Morpho Technologies ms2		ms1-elf

* Improved Windows host support

GDB now builds as a cross debugger hosted on i686-mingw32, including
native console support, and remote communications using either
network sockets or serial ports.

* Improved Modula-2 language support

GDB can now print most types in the Modula-2 syntax.  This includes:
basic types, set types, record types, enumerated types, range types,
pointer types and ARRAY types.  Procedure var parameters are correctly
printed and hexadecimal addresses and character constants are also
written in the Modula-2 syntax.  Best results can be obtained by using
GNU Modula-2 together with the -gdwarf-2 command line option.

* REMOVED features

The ARM rdi-share module.

The Netware NLM debug server.

*** Changes in GDB 6.4

* New native configurations

OpenBSD/arm			arm*-*-openbsd*
OpenBSD/mips64			mips64-*-openbsd*

* New targets

Morpho Technologies ms1		ms1-elf

* New command line options

--batch-silent			As for --batch, but totally silent.
--return-child-result		The debugger will exist with the same value
				the child (debugged) program exited with.
--eval-command COMMAND, -ex COMMAND
				Execute a single GDB CLI command. This may be
				specified multiple times and in conjunction
				with the --command (-x) option.

* Deprecated commands removed

The following commands, that were deprecated in 2000, have been
removed:

  Command				Replacement
  set|show arm disassembly-flavor	set|show arm disassembler
  othernames				set arm disassembler
  set|show remotedebug			set|show debug remote
  set|show archdebug			set|show debug arch
  set|show eventdebug			set|show debug event
  regs					info registers

* New BSD user-level threads support

It is now possible to debug programs using the user-level threads
library on OpenBSD and FreeBSD.  Currently supported (target)
configurations are:

FreeBSD/amd64			x86_64-*-freebsd*
FreeBSD/i386			i386-*-freebsd*
OpenBSD/i386			i386-*-openbsd*

Note that the new kernel threads libraries introduced in FreeBSD 5.x
are not yet supported.

* New support for Matsushita MN10300 w/sim added
(Work in progress).  mn10300-elf.

* REMOVED configurations and files

VxWorks and the XDR protocol			*-*-vxworks
Motorola MCORE                                  mcore-*-*
National Semiconductor NS32000			ns32k-*-*

* New "set print array-indexes" command

After turning this setting "on", GDB prints the index of each element
when displaying arrays.  The default is "off" to preserve the previous
behavior.

* VAX floating point support

GDB now supports the not-quite-ieee VAX F and D floating point formats.

* User-defined command support

In addition to using $arg0..$arg9 for argument passing, it is now possible
to use $argc to determine now many arguments have been passed.  See the
section on user-defined commands in the user manual for more information.

*** Changes in GDB 6.3:

* New command line option

GDB now accepts -l followed by a number to set the timeout for remote
debugging.

* GDB works with GCC -feliminate-dwarf2-dups

GDB now supports a more compact representation of DWARF-2 debug
information using DW_FORM_ref_addr references.  These are produced
by GCC with the option -feliminate-dwarf2-dups and also by some
proprietary compilers.  With GCC, you must use GCC 3.3.4 or later
to use -feliminate-dwarf2-dups.

* Internationalization

When supported by the host system, GDB will be built with
internationalization (libintl).  The task of marking up the sources is
continued, we're looking forward to our first translation.

* Ada

Initial support for debugging programs compiled with the GNAT 
implementation of the Ada programming language has been integrated 
into GDB.  In this release, support is limited to expression evaluation.

* New native configurations

GNU/Linux/m32r					m32r-*-linux-gnu

* Remote 'p' packet

GDB's remote protocol now includes support for the 'p' packet.  This
packet is used to fetch individual registers from a remote inferior.

* END-OF-LIFE registers[] compatibility module

GDB's internal register infrastructure has been completely rewritten.
The new infrastructure making possible the implementation of key new
features including 32x64 (e.g., 64-bit amd64 GDB debugging a 32-bit
i386 application).

GDB 6.3 will be the last release to include the the registers[]
compatibility module that allowed out-of-date configurations to
continue to work.  This change directly impacts the following
configurations:

hppa-*-hpux
ia64-*-aix
mips-*-irix*
*-*-lynx
mips-*-linux-gnu
sds protocol
xdr protocol
powerpc bdm protocol

Unless there is activity to revive these configurations, they will be
made OBSOLETE in GDB 6.4, and REMOVED from GDB 6.5.

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

h8300-*-*
mcore-*-*
mn10300-*-*
ns32k-*-*
sh64-*-*
v850-*-*

*** Changes in GDB 6.2.1:

* MIPS `break main; run' gave an heuristic-fence-post warning

When attempting to run even a simple program, a warning about
heuristic-fence-post being hit would be reported.  This problem has
been fixed.

* MIPS IRIX 'long double' crashed GDB

When examining a long double variable, GDB would get a segmentation
fault.  The crash has been fixed (but GDB 6.2 cannot correctly examine
IRIX long double values).

* VAX and "next"

A bug in the VAX stack code was causing problems with the "next"
command.  This problem has been fixed.

*** Changes in GDB 6.2:

* Fix for ``many threads''

On GNU/Linux systems that use the NPTL threads library, a program
rapidly creating and deleting threads would confuse GDB leading to the
error message:

	ptrace: No such process.
	thread_db_get_info: cannot get thread info: generic error

This problem has been fixed.

* "-async" and "-noasync" options removed.

Support for the broken "-noasync" option has been removed (it caused
GDB to dump core).

* New ``start'' command.

This command runs the program until the begining of the main procedure.

* New BSD Kernel Data Access Library (libkvm) interface

Using ``target kvm'' it is now possible to debug kernel core dumps and
live kernel memory images on various FreeBSD, NetBSD and OpenBSD
platforms.  Currently supported (native-only) configurations are:

FreeBSD/amd64			x86_64-*-freebsd*
FreeBSD/i386			i?86-*-freebsd*
NetBSD/i386			i?86-*-netbsd*
NetBSD/m68k			m68*-*-netbsd*
NetBSD/sparc			sparc-*-netbsd*
OpenBSD/amd64			x86_64-*-openbsd*
OpenBSD/i386			i?86-*-openbsd*
OpenBSD/m68k			m68*-openbsd*
OpenBSD/sparc			sparc-*-openbsd*

* Signal trampoline code overhauled

Many generic problems with GDB's signal handling code have been fixed.
These include: backtraces through non-contiguous stacks; recognition
of sa_sigaction signal trampolines; backtrace from a NULL pointer
call; backtrace through a signal trampoline; step into and out of
signal handlers; and single-stepping in the signal trampoline.

Please note that kernel bugs are a limiting factor here.  These
features have been shown to work on an s390 GNU/Linux system that
include a 2.6.8-rc1 kernel.  Ref PR breakpoints/1702.

* Cygwin support for DWARF 2 added.

* New native configurations

GNU/Linux/hppa					hppa*-*-linux*
OpenBSD/hppa					hppa*-*-openbsd*
OpenBSD/m68k					m68*-*-openbsd*
OpenBSD/m88k					m88*-*-openbsd*
OpenBSD/powerpc					powerpc-*-openbsd*
NetBSD/vax					vax-*-netbsd*
OpenBSD/vax					vax-*-openbsd*

* END-OF-LIFE frame compatibility module

GDB's internal frame infrastructure has been completely rewritten.
The new infrastructure making it possible to support key new features
including DWARF 2 Call Frame Information.  To aid in the task of
migrating old configurations to this new infrastructure, a
compatibility module, that allowed old configurations to continue to
work, was also included.

GDB 6.2 will be the last release to include this frame compatibility
module.  This change directly impacts the following configurations:

h8300-*-*
mcore-*-*
mn10300-*-*
ns32k-*-*
sh64-*-*
v850-*-*
xstormy16-*-*

Unless there is activity to revive these configurations, they will be
made OBSOLETE in GDB 6.3, and REMOVED from GDB 6.4.

* REMOVED configurations and files

Sun 3, running SunOS 3				m68*-*-sunos3*
Sun 3, running SunOS 4				m68*-*-sunos4*
Sun 2, running SunOS 3				m68000-*-sunos3*
Sun 2, running SunOS 4				m68000-*-sunos4*
Motorola 680x0 running LynxOS			m68*-*-lynxos*
AT&T 3b1/Unix pc				m68*-att-*
Bull DPX2 (68k, System V release 3)		m68*-bull-sysv*
decstation					mips-dec-* mips-little-*
riscos						mips-*-riscos* mips-*-sysv*
sonymips					mips-sony-*
sysv					mips*-*-sysv4* (IRIX 5/6 not included)

*** Changes in GDB 6.1.1:

* TUI (Text-mode User Interface) built-in (also included in GDB 6.1)

The TUI (Text-mode User Interface) is now built as part of a default
GDB configuration.  It is enabled by either selecting the TUI with the
command line option "-i=tui" or by running the separate "gdbtui"
program.  For more information on the TUI, see the manual "Debugging
with GDB".

* Pending breakpoint support (also included in GDB 6.1)

Support has been added to allow you to specify breakpoints in shared
libraries that have not yet been loaded.  If a breakpoint location
cannot be found, and the "breakpoint pending" option is set to auto,
GDB queries you if you wish to make the breakpoint pending on a future
shared-library load.  If and when GDB resolves the breakpoint symbol,
the pending breakpoint is removed as one or more regular breakpoints
are created.

Pending breakpoints are very useful for GCJ Java debugging.

* Fixed ISO-C build problems

The files bfd/elf-bfd.h, gdb/dictionary.c and gdb/types.c contained
non ISO-C code that stopped them being built using a more strict ISO-C
compiler (e.g., IBM's C compiler).

* Fixed build problem on IRIX 5

Due to header problems with <sys/proc.h>, the file gdb/proc-api.c
wasn't able to compile compile on an IRIX 5 system.

* Added execute permission to gdb/gdbserver/configure

The shell script gdb/testsuite/gdb.stabs/configure lacked execute
permission.  This bug would cause configure to fail on a number of
systems (Solaris, IRIX).  Ref: server/519.

* Fixed build problem on hpux2.0w-hp-hpux11.00 using the HP ANSI C compiler

Older HPUX ANSI C compilers did not accept variable array sizes.  somsolib.c
has been updated to use constant array sizes.

* Fixed a panic in the DWARF Call Frame Info code on Solaris 2.7

GCC 3.3.2, on Solaris 2.7, includes the DW_EH_PE_funcrel encoding in
its generated DWARF Call Frame Info.  This encoding was causing GDB to
panic, that panic has been fixed.  Ref: gdb/1628.

* Fixed a problem when examining parameters in shared library code.

When examining parameters in optimized shared library code generated
by a mainline GCC, GDB would incorrectly report ``Variable "..." is
not available''.  GDB now correctly displays the variable's value.

*** Changes in GDB 6.1:

* Removed --with-mmalloc

Support for the mmalloc memory manager has been removed, as it
conflicted with the internal gdb byte cache.

* Changes in AMD64 configurations

The AMD64 target now includes the %cs and %ss registers.  As a result
the AMD64 remote protocol has changed; this affects the floating-point
and SSE registers.  If you rely on those registers for your debugging,
you should upgrade gdbserver on the remote side.

* Revised SPARC target

The SPARC target has been completely revised, incorporating the
FreeBSD/sparc64 support that was added for GDB 6.0.  As a result
support for LynxOS and SunOS 4 has been dropped.  Calling functions
from within GDB on operating systems with a non-executable stack
(Solaris, OpenBSD) now works.

* New C++ demangler

GDB has a new C++ demangler which does a better job on the mangled
names generated by current versions of g++.  It also runs faster, so
with this and other changes gdb should now start faster on large C++
programs.

* DWARF 2 Location Expressions

GDB support for location expressions has been extended to support function
arguments and frame bases.  Older versions of GDB could crash when they
encountered these.

* C++ nested types and namespaces

GDB's support for nested types and namespaces in C++ has been
improved, especially if you use the DWARF 2 debugging format.  (This
is the default for recent versions of GCC on most platforms.)
Specifically, if you have a class "Inner" defined within a class or
namespace "Outer", then GDB realizes that the class's name is
"Outer::Inner", not simply "Inner".  This should greatly reduce the
frequency of complaints about not finding RTTI symbols.  In addition,
if you are stopped at inside of a function defined within a namespace,
GDB modifies its name lookup accordingly.

* New native configurations

NetBSD/amd64					x86_64-*-netbsd*
OpenBSD/amd64					x86_64-*-openbsd*
OpenBSD/alpha					alpha*-*-openbsd*
OpenBSD/sparc					sparc-*-openbsd*
OpenBSD/sparc64					sparc64-*-openbsd*

* New debugging protocols

M32R with SDI protocol				m32r-*-elf*

* "set prompt-escape-char" command deleted.

The command "set prompt-escape-char" has been deleted.  This command,
and its very obscure effet on GDB's prompt, was never documented,
tested, nor mentioned in the NEWS file.

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Sun 3, running SunOS 3				m68*-*-sunos3*
Sun 3, running SunOS 4				m68*-*-sunos4*
Sun 2, running SunOS 3				m68000-*-sunos3*
Sun 2, running SunOS 4				m68000-*-sunos4*
Motorola 680x0 running LynxOS			m68*-*-lynxos*
AT&T 3b1/Unix pc				m68*-att-*
Bull DPX2 (68k, System V release 3)		m68*-bull-sysv*
decstation					mips-dec-* mips-little-*
riscos						mips-*-riscos* mips-*-sysv*
sonymips					mips-sony-*
sysv					mips*-*-sysv4* (IRIX 5/6 not included)

* REMOVED configurations and files

SGI Irix-4.x				mips-sgi-irix4	or iris4
SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
Matsushita MN10200 w/simulator			mn10200-*-*
H8/500 simulator 			h8500-hitachi-hms or h8500hms
HP/PA running BSD				hppa*-*-bsd*
HP/PA running OSF/1				hppa*-*-osf*
HP/PA Pro target				hppa*-*-pro*
PMAX (MIPS) running Mach 3.0			mips*-*-mach3*
386BSD						i[3456]86-*-bsd*
Sequent family					i[3456]86-sequent-sysv4*
						i[3456]86-sequent-sysv*
						i[3456]86-sequent-bsd*
SPARC running LynxOS				sparc-*-lynxos*
SPARC running SunOS 4				sparc-*-sunos4*
Tsqware Sparclet				sparclet-*-*
Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite

*** Changes in GDB 6.0:

* Objective-C

Support for debugging the Objective-C programming language has been
integrated into GDB.

* New backtrace mechanism (includes DWARF 2 Call Frame Information).

DWARF 2's Call Frame Information makes available compiler generated
information that more exactly describes the program's run-time stack.
By using this information, GDB is able to provide more robust stack
backtraces.

The i386, amd64 (nee, x86-64), Alpha, m68hc11, ia64, and m32r targets
have been updated to use a new backtrace mechanism which includes
DWARF 2 CFI support.

* Hosted file I/O.

GDB's remote protocol has been extended to include support for hosted
file I/O (where the remote target uses GDB's file system).  See GDB's
remote protocol documentation for details.

* All targets using the new architecture framework.

All of GDB's targets have been updated to use the new internal
architecture framework.  The way is now open for future GDB releases
to include cross-architecture native debugging support (i386 on amd64,
ppc32 on ppc64).

* GNU/Linux's Thread Local Storage (TLS)

GDB now includes support for for the GNU/Linux implementation of
per-thread variables.

* GNU/Linux's Native POSIX Thread Library (NPTL)

GDB's thread code has been updated to work with either the new
GNU/Linux NPTL thread library or the older "LinuxThreads" library.

* Separate debug info.

GDB, in conjunction with BINUTILS, now supports a mechanism for
automatically loading debug information from a separate file.  Instead
of shipping full debug and non-debug versions of system libraries,
system integrators can now instead ship just the stripped libraries
and optional debug files.

* DWARF 2 Location Expressions

DWARF 2 Location Expressions allow the compiler to more completely
describe the location of variables (even in optimized code) to the
debugger.

GDB now includes preliminary support for location expressions (support
for DW_OP_piece is still missing).

* Java

A number of long standing bugs that caused GDB to die while starting a
Java application have been fixed.  GDB's Java support is now
considered "useable".

* GNU/Linux support for fork, vfork, and exec.

The "catch fork", "catch exec", "catch vfork", and "set follow-fork-mode"
commands are now implemented for GNU/Linux.  They require a 2.5.x or later
kernel.

* GDB supports logging output to a file

There are two new commands, "set logging" and "show logging", which can be
used to capture GDB's output to a file.

* The meaning of "detach" has changed for gdbserver

The "detach" command will now resume the application, as documented.  To
disconnect from gdbserver and leave it stopped, use the new "disconnect"
command.

* d10v, m68hc11 `regs' command deprecated

The `info registers' command has been updated so that it displays the
registers using a format identical to the old `regs' command.

* Profiling support

A new command, "maint set profile on/off", has been added.  This command can
be used to enable or disable profiling while running GDB, to profile a
session or a set of commands.  In addition there is a new configure switch,
"--enable-profiling", which will cause GDB to be compiled with profiling
data, for more informative profiling results.

* Default MI syntax changed to "mi2".

The default MI (machine interface) syntax, enabled by the command line
option "-i=mi", has been changed to "mi2".  The previous MI syntax,
"mi1", can be enabled by specifying the option "-i=mi1".

Support for the original "mi0" syntax (included in GDB 5.0) has been
removed.

Fix for gdb/192: removed extraneous space when displaying frame level.
Fix for gdb/672: update changelist is now output in mi list format.
Fix for gdb/702: a -var-assign that updates the value now shows up
                 in a subsequent -var-update.

* New native configurations.

FreeBSD/amd64					x86_64-*-freebsd*

* Multi-arched targets.

HP/PA HPUX11                                    hppa*-*-hpux*
Renesas M32R/D w/simulator			m32r-*-elf*

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
Matsushita MN10200 w/simulator			mn10200-*-*
H8/500 simulator 			h8500-hitachi-hms or h8500hms
HP/PA running BSD				hppa*-*-bsd*
HP/PA running OSF/1				hppa*-*-osf*
HP/PA Pro target				hppa*-*-pro*
PMAX (MIPS) running Mach 3.0			mips*-*-mach3*
Sequent family					i[3456]86-sequent-sysv4*
						i[3456]86-sequent-sysv*
						i[3456]86-sequent-bsd*
Tsqware Sparclet				sparclet-*-*
Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite

* REMOVED configurations and files

V850EA ISA				
Motorola Delta 88000 running Sys V		m88k-motorola-sysv  or  delta88
IBM AIX PS/2					i[3456]86-*-aix
i386 running Mach 3.0				i[3456]86-*-mach3*
i386 running Mach				i[3456]86-*-mach*
i386 running OSF/1				i[3456]86-*osf1mk*
HP/Apollo 68k Family				m68*-apollo*-sysv*,
						m68*-apollo*-bsd*,
						m68*-hp-bsd*, m68*-hp-hpux*
Argonaut Risc Chip (ARC)			arc-*-*
Mitsubishi D30V					d30v-*-*
Fujitsu FR30					fr30-*-elf*
OS/9000						i[34]86-*-os9k
I960 with MON960				i960-*-coff

* MIPS $fp behavior changed

The convenience variable $fp, for the MIPS, now consistently returns
the address of the current frame's base.  Previously, depending on the
context, $fp could refer to either $sp or the current frame's base
address.  See ``8.10 Registers'' in the manual ``Debugging with GDB:
The GNU Source-Level Debugger''.

*** Changes in GDB 5.3:

* GNU/Linux shared library multi-threaded performance improved.

When debugging a multi-threaded application on GNU/Linux, GDB now uses
`/proc', in preference to `ptrace' for memory reads.  This may result
in an improvement in the start-up time of multi-threaded, shared
library applications when run under GDB.  One GDB user writes: ``loads
shared libs like mad''.

* ``gdbserver'' now supports multi-threaded applications on some targets

Support for debugging multi-threaded applications which use  
the GNU/Linux LinuxThreads package has been added for
arm*-*-linux*-gnu*, i[3456]86-*-linux*-gnu*, mips*-*-linux*-gnu*,
powerpc*-*-linux*-gnu*, and sh*-*-linux*-gnu*.

* GDB now supports C/C++ preprocessor macros.

GDB now expands preprocessor macro invocations in C/C++ expressions,
and provides various commands for showing macro definitions and how
they expand.

The new command `macro expand EXPRESSION' expands any macro
invocations in expression, and shows the result.

The new command `show macro MACRO-NAME' shows the definition of the
macro named MACRO-NAME, and where it was defined.

Most compilers don't include information about macros in the debugging
information by default.  In GCC 3.1, for example, you need to compile
your program with the options `-gdwarf-2 -g3'.  If the macro
information is present in the executable, GDB will read it.

* Multi-arched targets.

DEC Alpha (partial)				alpha*-*-*
DEC VAX (partial)				vax-*-*
NEC V850					v850-*-*
National Semiconductor NS32000 (partial)	ns32k-*-*
Motorola 68000 (partial)                        m68k-*-*
Motorola MCORE                                  mcore-*-*

* New targets.

Fujitsu FRV architecture added by Red Hat	frv*-*-*


* New native configurations

Alpha NetBSD					alpha*-*-netbsd*
SH NetBSD					sh*-*-netbsdelf*
MIPS NetBSD					mips*-*-netbsd*
UltraSPARC NetBSD				sparc64-*-netbsd*

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

Mitsubishi D30V					d30v-*-*
OS/9000						i[34]86-*-os9k
IBM AIX PS/2					i[3456]86-*-aix
Fujitsu FR30					fr30-*-elf*
Motorola Delta 88000 running Sys V		m88k-motorola-sysv  or  delta88
Argonaut Risc Chip (ARC)			arc-*-*
i386 running Mach 3.0				i[3456]86-*-mach3*
i386 running Mach				i[3456]86-*-mach*
i386 running OSF/1				i[3456]86-*osf1mk*
HP/Apollo 68k Family				m68*-apollo*-sysv*,
						m68*-apollo*-bsd*,
						m68*-hp-bsd*, m68*-hp-hpux*
I960 with MON960				i960-*-coff

* OBSOLETE languages

CHILL, a Pascal like language used by telecommunications companies.

* REMOVED configurations and files

AMD 29k family via UDI				a29k-amd-udi, udi29k
A29K VxWorks					a29k-*-vxworks
AMD 29000 embedded, using EBMON			a29k-none-none
AMD 29000 embedded with COFF			a29k-none-coff
AMD 29000 embedded with a.out			a29k-none-aout

testsuite/gdb.hp/gdb.threads-hp/		directory

* New command "set max-user-call-depth <nnn>"

This command allows the user to limit the call depth of user-defined
commands.  The default is 1024.

* Changes in FreeBSD/i386 native debugging.

Support for the "generate-core-file" has been added.

* New commands "dump", "append", and "restore".

These commands allow data to be copied from target memory
to a bfd-format or binary file (dump and append), and back
from a file into memory (restore).

* Improved "next/step" support on multi-processor Alpha Tru64.

The previous single-step mechanism could cause unpredictable problems,
including the random appearance of SIGSEGV or SIGTRAP signals. The use
of a software single-step mechanism prevents this.

*** Changes in GDB 5.2.1:

* New targets.

Atmel AVR					avr*-*-*

* Bug fixes

gdb/182: gdb/323: gdb/237: On alpha, gdb was reporting:
mdebugread.c:2443: gdb-internal-error: sect_index_data not initialized
Fix, by Joel Brobecker imported from mainline.

gdb/439: gdb/291: On some ELF object files, gdb was reporting:
dwarf2read.c:1072: gdb-internal-error: sect_index_text not initialize
Fix, by Fred Fish, imported from mainline.

Dwarf2 .debug_frame & .eh_frame handler improved in many ways. 
Surprisingly enough, it works now.
By Michal Ludvig, imported from mainline.

i386 hardware watchpoint support: 
avoid misses on second run for some targets.
By Pierre Muller, imported from mainline.

*** Changes in GDB 5.2:

* New command "set trust-readonly-sections on[off]".

This command is a hint that tells gdb that read-only sections
really are read-only (ie. that their contents will not change).
In this mode, gdb will go to the object file rather than the
target to read memory from read-only sections (such as ".text").
This can be a significant performance improvement on some
(notably embedded) targets.

* New command "generate-core-file" (or "gcore").

This new gdb command allows the user to drop a core file of the child
process state at any time.  So far it's been implemented only for
GNU/Linux and Solaris, but should be relatively easily ported to other
hosts.  Argument is core file name (defaults to core.<pid>).

* New command line option

GDB now accepts --pid or -p followed by a process id.  

* Change in command line behavior -- corefiles vs. process ids.

There is a subtle behavior in the way in which GDB handles 
command line arguments.  The first non-flag argument is always
a program to debug, but the second non-flag argument may either
be a corefile or a process id.  Previously, GDB would attempt to
open the second argument as a corefile, and if that failed, would
issue a superfluous error message and then attempt to attach it as
a process.  Now, if the second argument begins with a non-digit, 
it will be treated as a corefile.  If it begins with a digit, 
GDB will attempt to attach it as a process, and if no such process
is found, will then attempt to open it as a corefile.

* Changes in ARM configurations.

Multi-arch support is enabled for all ARM configurations.  The ARM/NetBSD
configuration is fully multi-arch.

* New native configurations

ARM NetBSD					arm*-*-netbsd*
x86 OpenBSD					i[3456]86-*-openbsd*
AMD x86-64 running GNU/Linux			x86_64-*-linux-*
Sparc64 running FreeBSD				sparc64-*-freebsd*

* New targets

Sanyo XStormy16					xstormy16-elf

* OBSOLETE configurations and files

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

AMD 29k family via UDI				a29k-amd-udi, udi29k
A29K VxWorks					a29k-*-vxworks
AMD 29000 embedded, using EBMON			a29k-none-none
AMD 29000 embedded with COFF			a29k-none-coff
AMD 29000 embedded with a.out			a29k-none-aout

testsuite/gdb.hp/gdb.threads-hp/		directory

* REMOVED configurations and files

TI TMS320C80					tic80-*-*
WDC 65816					w65-*-*
PowerPC Solaris					powerpcle-*-solaris*
PowerPC Windows NT				powerpcle-*-cygwin32
PowerPC Netware					powerpc-*-netware*
Harris/CXUX m88k				m88*-harris-cxux*
Most ns32k hosts and targets			ns32k-*-mach3* ns32k-umax-*
						ns32k-utek-sysv* ns32k-utek-*
SunOS 4.0.Xi on i386				i[3456]86-*-sunos*
Ultracomputer (29K) running Sym1		a29k-nyu-sym1 a29k-*-kern*
Sony NEWS (68K) running NEWSOS 3.x		m68*-sony-sysv news
ISI Optimum V (3.05) under 4.3bsd.		m68*-isi-*
Apple Macintosh (MPW) host and target		N/A host, powerpc-*-macos*

* Changes to command line processing

The new `--args' feature can be used to specify command-line arguments
for the inferior from gdb's command line.

* Changes to key bindings

There is a new `operate-and-get-next' function bound to `C-o'.

*** Changes in GDB 5.1.1 

Fix compile problem on DJGPP.

Fix a problem with floating-point registers on the i386 being
corrupted.

Fix to stop GDB crashing on .debug_str debug info.

Numerous documentation fixes.

Numerous testsuite fixes.

*** Changes in GDB 5.1:

* New native configurations

Alpha FreeBSD					alpha*-*-freebsd*
x86 FreeBSD 3.x and 4.x				i[3456]86*-freebsd[34]*
MIPS GNU/Linux					mips*-*-linux*
MIPS SGI Irix 6.x				mips*-sgi-irix6*
ia64 AIX					ia64-*-aix*
s390 and s390x GNU/Linux			{s390,s390x}-*-linux*

* New targets

Motorola 68HC11 and 68HC12			m68hc11-elf
CRIS						cris-axis
UltraSparc running GNU/Linux			sparc64-*-linux*

* OBSOLETE configurations and files

x86 FreeBSD before 2.2				i[3456]86*-freebsd{1,2.[01]}*, 
Harris/CXUX m88k				m88*-harris-cxux*
Most ns32k hosts and targets			ns32k-*-mach3* ns32k-umax-*
						ns32k-utek-sysv* ns32k-utek-*
TI TMS320C80					tic80-*-*
WDC 65816					w65-*-*
Ultracomputer (29K) running Sym1		a29k-nyu-sym1 a29k-*-kern*
PowerPC Solaris					powerpcle-*-solaris*
PowerPC Windows NT				powerpcle-*-cygwin32
PowerPC Netware					powerpc-*-netware*
SunOS 4.0.Xi on i386				i[3456]86-*-sunos*
Sony NEWS (68K) running NEWSOS 3.x		m68*-sony-sysv news
ISI Optimum V (3.05) under 4.3bsd.		m68*-isi-*
Apple Macintosh (MPW) host			N/A

stuff.c (Program to stuff files into a specially prepared space in kdb)
kdb-start.c (Main loop for the standalone kernel debugger)

Configurations that have been declared obsolete in this release have
been commented out.  Unless there is activity to revive these
configurations, the next release of GDB will have their sources
permanently REMOVED.

* REMOVED configurations and files

Altos 3068					m68*-altos-*
Convex						c1-*-*, c2-*-*
Pyramid						pyramid-*-*
ARM RISCix					arm-*-* (as host)
Tahoe						tahoe-*-*
ser-ocd.c					*-*-*

* GDB has been converted to ISO C.

GDB's source code has been converted to ISO C.  In particular, the
sources are fully protoized, and rely on standard headers being
present.

* Other news:

* "info symbol" works on platforms which use COFF, ECOFF, XCOFF, and NLM.

* The MI enabled by default.

The new machine oriented interface (MI) introduced in GDB 5.0 has been
revised and enabled by default.  Packages which use GDB as a debugging
engine behind a UI or another front end are encouraged to switch to
using the GDB/MI interface, instead of the old annotations interface
which is now deprecated.

* Support for debugging Pascal programs.

GDB now includes support for debugging Pascal programs.  The following
main features are supported:

    - Pascal-specific data types such as sets;

    - automatic recognition of Pascal sources based on file-name
      extension;

    - Pascal-style display of data types, variables, and functions;

    - a Pascal expression parser.

However, some important features are not yet supported.

    - Pascal string operations are not supported at all;

    - there are some problems with boolean types;

    - Pascal type hexadecimal constants are not supported
      because they conflict with the internal variables format;

    - support for Pascal objects and classes is not full yet;

    - unlike Pascal, GDB is case-sensitive for symbol names.

* Changes in completion.

Commands such as `shell', `run' and `set args', which pass arguments
to inferior programs, now complete on file names, similar to what
users expect at the shell prompt.

Commands which accept locations, such as `disassemble', `print',
`breakpoint', `until', etc. now complete on filenames as well as
program symbols.  Thus, if you type "break foob TAB", and the source
files linked into the programs include `foobar.c', that file name will
be one of the candidates for completion.  However, file names are not
considered for completion after you typed a colon that delimits a file
name from a name of a function in that file, as in "break foo.c:bar".

`set demangle-style' completes on available demangling styles.

* New platform-independent commands:

It is now possible to define a post-hook for a command as well as a
hook that runs before the command.  For more details, see the
documentation of `hookpost' in the GDB manual.

* Changes in GNU/Linux native debugging.

Support for debugging multi-threaded programs has been completely
revised for all platforms except m68k and sparc.  You can now debug as
many threads as your system allows you to have.

Attach/detach is supported for multi-threaded programs.

Support for SSE registers was added for x86.  This doesn't work for
multi-threaded programs though.

* Changes in MIPS configurations.

Multi-arch support is enabled for all MIPS configurations.

GDB can now be built as native debugger on SGI Irix 6.x systems for
debugging n32 executables.  (Debugging 64-bit executables is not yet
supported.)

* Unified support for hardware watchpoints in all x86 configurations.

Most (if not all) native x86 configurations support hardware-assisted
breakpoints and watchpoints in a unified manner.  This support
implements debug register sharing between watchpoints, which allows to
put a virtually infinite number of watchpoints on the same address,
and also supports watching regions up to 16 bytes with several debug
registers.

The new maintenance command `maintenance show-debug-regs' toggles
debugging print-outs in functions that insert, remove, and test
watchpoints and hardware breakpoints.

* Changes in the DJGPP native configuration.

New command ``info dos sysinfo'' displays assorted information about
the CPU, OS, memory, and DPMI server.

New commands ``info dos gdt'', ``info dos ldt'', and ``info dos idt''
display information about segment descriptors stored in GDT, LDT, and
IDT.

New commands ``info dos pde'' and ``info dos pte'' display entries
from Page Directory and Page Tables (for now works with CWSDPMI only).
New command ``info dos address-pte'' displays the Page Table entry for
a given linear address.

GDB can now pass command lines longer than 126 characters to the
program being debugged (requires an update to the libdbg.a library
which is part of the DJGPP development kit).

DWARF2 debug info is now supported.

It is now possible to `step' and `next' through calls to `longjmp'.

* Changes in documentation.

All GDB documentation was converted to GFDL, the GNU Free
Documentation License.

Tracepoints-related commands are now fully documented in the GDB
manual.

TUI, the Text-mode User Interface, is now documented in the manual.

Tracepoints-related commands are now fully documented in the GDB
manual.

The "GDB Internals" manual now has an index.  It also includes
documentation of `ui_out' functions, GDB coding standards, x86
hardware watchpoints, and memory region attributes.

* GDB's version number moved to ``version.in''

The Makefile variable VERSION has been replaced by the file
``version.in''.  People creating GDB distributions should update the
contents of this file.

* gdba.el deleted

GUD support is now a standard part of the EMACS distribution.

*** Changes in GDB 5.0:

* Improved support for debugging FP programs on x86 targets

Unified and much-improved support for debugging floating-point
programs on all x86 targets.  In particular, ``info float'' now
displays the FP registers in the same format on all x86 targets, with
greater level of detail.

* Improvements and bugfixes in hardware-assisted watchpoints

It is now possible to watch array elements, struct members, and
bitfields with hardware-assisted watchpoints.  Data-read watchpoints
on x86 targets no longer erroneously trigger when the address is
written.

* Improvements in the native DJGPP version of GDB

The distribution now includes all the scripts and auxiliary files
necessary to build the native DJGPP version on MS-DOS/MS-Windows
machines ``out of the box''.

The DJGPP version can now debug programs that use signals.  It is
possible to catch signals that happened in the debuggee, deliver
signals to it, interrupt it with Ctrl-C, etc.  (Previously, a signal
would kill the program being debugged.)  Programs that hook hardware
interrupts (keyboard, timer, etc.) can also be debugged.

It is now possible to debug DJGPP programs that redirect their
standard handles or switch them to raw (as opposed to cooked) mode, or
even close them.  The command ``run < foo > bar'' works as expected,
and ``info terminal'' reports useful information about the debuggee's
terminal, including raw/cooked mode, redirection, etc.

The DJGPP version now uses termios functions for console I/O, which
enables debugging graphics programs.  Interrupting GDB with Ctrl-C
also works.

DOS-style file names with drive letters are now fully supported by
GDB.

It is now possible to debug DJGPP programs that switch their working
directory.  It is also possible to rerun the debuggee any number of
times without restarting GDB; thus, you can use the same setup,
breakpoints, etc. for many debugging sessions.

* New native configurations

ARM GNU/Linux					arm*-*-linux*
PowerPC GNU/Linux				powerpc-*-linux*

* New targets

Motorola MCore					mcore-*-*
x86 VxWorks					i[3456]86-*-vxworks*
PowerPC VxWorks					powerpc-*-vxworks*
TI TMS320C80					tic80-*-*

* OBSOLETE configurations

Altos 3068					m68*-altos-*
Convex						c1-*-*, c2-*-*
Pyramid						pyramid-*-*
ARM RISCix					arm-*-* (as host)
Tahoe						tahoe-*-*

Configurations that have been declared obsolete will be commented out,
but the code will be left in place.  If there is no activity to revive
these configurations before the next release of GDB, the sources will
be permanently REMOVED.

* Gould support removed

Support for the Gould PowerNode and NP1 has been removed.

* New features for SVR4

On SVR4 native platforms (such as Solaris), if you attach to a process
without first loading a symbol file, GDB will now attempt to locate and
load symbols from the running process's executable file.

* Many C++ enhancements

C++ support has been greatly improved. Overload resolution now works properly
in almost all cases. RTTI support is on the way.

* Remote targets can connect to a sub-program

A popen(3) style serial-device has been added.  This device starts a
sub-process (such as a stand-alone simulator) and then communicates
with that.  The sub-program to run is specified using the syntax
``|<program> <args>'' vis:

	(gdb) set remotedebug 1
	(gdb) target extended-remote |mn10300-elf-sim program-args

* MIPS 64 remote protocol

A long standing bug in the mips64 remote protocol where by GDB
expected certain 32 bit registers (ex SR) to be transfered as 32
instead of 64 bits has been fixed.

The command ``set remote-mips64-transfers-32bit-regs on'' has been
added to provide backward compatibility with older versions of GDB.

* ``set remotebinarydownload'' replaced by ``set remote X-packet''

The command ``set remotebinarydownload'' command has been replaced by
``set remote X-packet''.  Other commands in ``set remote'' family
include ``set remote P-packet''.

* Breakpoint commands accept ranges.

The breakpoint commands ``enable'', ``disable'', and ``delete'' now
accept a range of breakpoints, e.g. ``5-7''.  The tracepoint command
``tracepoint passcount'' also accepts a range of tracepoints.

* ``apropos'' command added.

The ``apropos'' command searches through command names and
documentation strings, printing out matches, making it much easier to
try to find a command that does what you are looking for.

* New MI interface

A new machine oriented interface (MI) has been added to GDB.  This
interface is designed for debug environments running GDB as a separate
process.  This is part of the long term libGDB project.  See the
"GDB/MI" chapter of the GDB manual for further information.  It can be
enabled by configuring with:

	.../configure --enable-gdbmi

*** Changes in GDB-4.18:

* New native configurations

HP-UX 10.20					hppa*-*-hpux10.20
HP-UX 11.x					hppa*-*-hpux11.0*
M68K GNU/Linux					m68*-*-linux*

* New targets

Fujitsu FR30					fr30-*-elf*
Intel StrongARM					strongarm-*-*
Mitsubishi D30V					d30v-*-*

* OBSOLETE configurations

Gould PowerNode, NP1				np1-*-*, pn-*-*

Configurations that have been declared obsolete will be commented out,
but the code will be left in place.  If there is no activity to revive
these configurations before the next release of GDB, the sources will
be permanently REMOVED.

* ANSI/ISO C

As a compatibility experiment, GDB's source files buildsym.h and
buildsym.c have been converted to pure standard C, no longer
containing any K&R compatibility code.  We believe that all systems in
use today either come with a standard C compiler, or have a GCC port
available.  If this is not true, please report the affected
configuration to bug-gdb@gnu.org immediately.  See the README file for
information about getting a standard C compiler if you don't have one
already.

* Readline 2.2

GDB now uses readline 2.2.

* set extension-language

You can now control the mapping between filename extensions and source
languages by using the `set extension-language' command.  For instance,
you can ask GDB to treat .c files as C++ by saying
	set extension-language .c c++
The command `info extensions' lists all of the recognized extensions
and their associated languages.

* Setting processor type for PowerPC and RS/6000

When GDB is configured for a powerpc*-*-* or an rs6000*-*-* target,
you can use the `set processor' command to specify what variant of the
PowerPC family you are debugging.  The command

	set processor NAME

sets the PowerPC/RS6000 variant to NAME.  GDB knows about the
following PowerPC and RS6000 variants:

  ppc-uisa  PowerPC UISA - a PPC processor as viewed by user-level code
  rs6000    IBM RS6000 ("POWER") architecture, user-level view
  403       IBM PowerPC 403
  403GC     IBM PowerPC 403GC
  505       Motorola PowerPC 505
  860       Motorola PowerPC 860 or 850
  601       Motorola PowerPC 601
  602       Motorola PowerPC 602
  603       Motorola/IBM PowerPC 603 or 603e
  604       Motorola PowerPC 604 or 604e
  750       Motorola/IBM PowerPC 750 or 750

At the moment, this command just tells GDB what to name the
special-purpose processor registers.  Since almost all the affected
registers are inaccessible to user-level programs, this command is
only useful for remote debugging in its present form.

* HP-UX support

Thanks to a major code donation from Hewlett-Packard, GDB now has much
more extensive support for HP-UX.  Added features include shared
library support, kernel threads and hardware watchpoints for 11.00,
support for HP's ANSI C and C++ compilers, and a compatibility mode
for xdb and dbx commands.

* Catchpoints

HP's donation includes the new concept of catchpoints, which is a
generalization of the old catch command.  On HP-UX, it is now possible
to catch exec, fork, and vfork, as well as library loading.

This means that the existing catch command has changed; its first
argument now specifies the type of catch to be set up.  See the
output of "help catch" for a list of catchpoint types.

* Debugging across forks

On HP-UX, you can choose which process to debug when a fork() happens
in the inferior.

* TUI

HP has donated a curses-based terminal user interface (TUI).  To get
it, build with --enable-tui.  Although this can be enabled for any
configuration, at present it only works for native HP debugging.

* GDB remote protocol additions

A new protocol packet 'X' that writes binary data is now available.
Default behavior is to try 'X', then drop back to 'M' if the stub
fails to respond.  The settable variable `remotebinarydownload'
allows explicit control over the use of 'X'.

For 64-bit targets, the memory packets ('M' and 'm') can now contain a
full 64-bit address.  The command

	set remoteaddresssize 32

can be used to revert to the old behaviour.  For existing remote stubs
the change should not be noticed, as the additional address information
will be discarded.

In order to assist in debugging stubs, you may use the maintenance
command `packet' to send any text string to the stub.  For instance,

	maint packet heythere

sends the packet "$heythere#<checksum>".  Note that it is very easy to
disrupt a debugging session by sending the wrong packet at the wrong
time.

The compare-sections command allows you to compare section data on the
target to what is in the executable file without uploading or
downloading, by comparing CRC checksums.

* Tracing can collect general expressions

You may now collect general expressions at tracepoints.  This requires
further additions to the target-side stub; see tracepoint.c and
doc/agentexpr.texi for further details.

* mask-address variable for Mips

For Mips targets, you may control the zeroing of the upper 32 bits of
a 64-bit address by entering `set mask-address on'.  This is mainly
of interest to users of embedded R4xxx and R5xxx processors.

* Higher serial baud rates

GDB's serial code now allows you to specify baud rates 57600, 115200,
230400, and 460800 baud.  (Note that your host system may not be able
to achieve all of these rates.)

* i960 simulator

The i960 configuration now includes an initial implementation of a
builtin simulator, contributed by Jim Wilson.


*** Changes in GDB-4.17:

* New native configurations

Alpha GNU/Linux					alpha*-*-linux*
Unixware 2.x					i[3456]86-unixware2*
Irix 6.x					mips*-sgi-irix6*
PowerPC GNU/Linux				powerpc-*-linux*
PowerPC Solaris					powerpcle-*-solaris*
Sparc GNU/Linux					sparc-*-linux*
Motorola sysV68 R3V7.1				m68k-motorola-sysv

* New targets

Argonaut Risc Chip (ARC)			arc-*-*
Hitachi H8/300S					h8300*-*-*
Matsushita MN10200 w/simulator			mn10200-*-*
Matsushita MN10300 w/simulator			mn10300-*-*
MIPS NEC VR4100					mips64*vr4100*{,el}-*-elf*
MIPS NEC VR5000					mips64*vr5000*{,el}-*-elf*
MIPS Toshiba TX39				mips64*tx39*{,el}-*-elf*
Mitsubishi D10V w/simulator			d10v-*-*
Mitsubishi M32R/D w/simulator			m32r-*-elf*
Tsqware Sparclet				sparclet-*-*
NEC V850 w/simulator				v850-*-*

* New debugging protocols

ARM with RDI protocol				arm*-*-*
M68K with dBUG monitor				m68*-*-{aout,coff,elf}
DDB and LSI variants of PMON protocol		mips*-*-*
PowerPC with DINK32 monitor			powerpc{,le}-*-eabi
PowerPC with SDS protocol			powerpc{,le}-*-eabi
Macraigor OCD (Wiggler) devices			powerpc{,le}-*-eabi

* DWARF 2

All configurations can now understand and use the DWARF 2 debugging
format.  The choice is automatic, if the symbol file contains DWARF 2
information.

* Java frontend

GDB now includes basic Java language support.  This support is
only useful with Java compilers that produce native machine code.

* solib-absolute-prefix and solib-search-path

For SunOS and SVR4 shared libraries, you may now set the prefix for
loading absolute shared library symbol files, and the search path for
locating non-absolute shared library symbol files.

* Live range splitting

GDB can now effectively debug code for which GCC has performed live
range splitting as part of its optimization.  See gdb/doc/LRS for
more details on the expected format of the stabs information.

* Hurd support

GDB's support for the GNU Hurd, including thread debugging, has been
updated to work with current versions of the Hurd.

* ARM Thumb support

GDB's ARM target configuration now handles the ARM7T (Thumb) 16-bit
instruction set.  ARM GDB automatically detects when Thumb
instructions are in use, and adjusts disassembly and backtracing
accordingly.

* MIPS16 support

GDB's MIPS target configurations now handle the MIP16 16-bit
instruction set.

* Overlay support

GDB now includes support for overlays; if an executable has been
linked such that multiple sections are based at the same address, GDB
will decide which section to use for symbolic info.  You can choose to
control the decision manually, using overlay commands, or implement
additional target-side support and use "overlay load-target" to bring
in the overlay mapping.  Do "help overlay" for more detail.

* info symbol

The command "info symbol <address>" displays information about
the symbol at the specified address.

* Trace support

The standard remote protocol now includes an extension that allows
asynchronous collection and display of trace data.  This requires
extensive support in the target-side debugging stub.  Tracing mode
includes a new interaction mode in GDB and new commands: see the
file tracepoint.c for more details.

* MIPS simulator

Configurations for embedded MIPS now include a simulator contributed
by Cygnus Solutions.  The simulator supports the instruction sets
of most MIPS variants.

* Sparc simulator

Sparc configurations may now include the ERC32 simulator contributed
by the European Space Agency.  The simulator is not built into
Sparc targets by default; configure with --enable-sim to include it.

* set architecture

For target configurations that may include multiple variants of a
basic architecture (such as MIPS and SH), you may now set the
architecture explicitly.  "set arch" sets, "info arch" lists
the possible architectures.

*** Changes in GDB-4.16:

* New native configurations

Windows 95, x86 Windows NT			i[345]86-*-cygwin32
M68K NetBSD					m68k-*-netbsd*
PowerPC AIX 4.x					powerpc-*-aix*
PowerPC MacOS					powerpc-*-macos*
PowerPC Windows NT				powerpcle-*-cygwin32
RS/6000 AIX 4.x					rs6000-*-aix4*

* New targets

ARM with RDP protocol				arm-*-*
I960 with MON960				i960-*-coff
MIPS VxWorks					mips*-*-vxworks*
MIPS VR4300 with PMON				mips64*vr4300{,el}-*-elf*
PowerPC with PPCBUG monitor			powerpc{,le}-*-eabi*
Hitachi SH3					sh-*-*
Matra Sparclet					sparclet-*-*

* PowerPC simulator

The powerpc-eabi configuration now includes the PSIM simulator,
contributed by Andrew Cagney, with assistance from Mike Meissner.
PSIM is a very elaborate model of the PowerPC, including not only
basic instruction set execution, but also details of execution unit
performance and I/O hardware.  See sim/ppc/README for more details.

* Solaris 2.5

GDB now works with Solaris 2.5.

* Windows 95/NT native

GDB will now work as a native debugger on Windows 95 and Windows NT.
To build it from source, you must use the "gnu-win32" environment,
which uses a DLL to emulate enough of Unix to run the GNU tools.
Further information, binaries, and sources are available at
ftp.cygnus.com, under pub/gnu-win32.

* dont-repeat command

If a user-defined command includes the command `dont-repeat', then the
command will not be repeated if the user just types return.  This is
useful if the command is time-consuming to run, so that accidental
extra keystrokes don't run the same command many times.

* Send break instead of ^C

The standard remote protocol now includes an option to send a break
rather than a ^C to the target in order to interrupt it.  By default,
GDB will send ^C; to send a break, set the variable `remotebreak' to 1.

* Remote protocol timeout

The standard remote protocol includes a new variable `remotetimeout'
that allows you to set the number of seconds before GDB gives up trying
to read from the target.  The default value is 2.

* Automatic tracking of dynamic object loading (HPUX and Solaris only)

By default GDB will automatically keep track of objects as they are
loaded and unloaded by the dynamic linker.  By using the command `set
stop-on-solib-events 1' you can arrange for GDB to stop the inferior
when shared library events occur, thus allowing you to set breakpoints
in shared libraries which are explicitly loaded by the inferior.

Note this feature does not work on hpux8.  On hpux9 you must link
/usr/lib/end.o into your program.  This feature should work
automatically on hpux10.

* Irix 5.x hardware watchpoint support

Irix 5 configurations now support the use of hardware watchpoints.

* Mips protocol "SYN garbage limit"

When debugging a Mips target using the `target mips' protocol, you
may set the number of characters that GDB will ignore by setting
the `syn-garbage-limit'.  A value of -1 means that GDB will ignore
every character.  The default value is 1050.

* Recording and replaying remote debug sessions

If you set `remotelogfile' to the name of a file, gdb will write to it
a recording of a remote debug session.  This recording may then be
replayed back to gdb using "gdbreplay".  See gdbserver/README for
details.  This is useful when you have a problem with GDB while doing
remote debugging; you can make a recording of the session and send it
to someone else, who can then recreate the problem.

* Speedups for remote debugging

GDB includes speedups for downloading and stepping MIPS systems using
the IDT monitor, fast downloads to the Hitachi SH E7000 emulator,
and more efficient S-record downloading.

* Memory use reductions and statistics collection

GDB now uses less memory and reports statistics about memory usage.
Try the `maint print statistics' command, for example.

*** Changes in GDB-4.15:

* Psymtabs for XCOFF

The symbol reader for AIX GDB now uses partial symbol tables.  This
can greatly improve startup time, especially for large executables.

* Remote targets use caching

Remote targets now use a data cache to speed up communication with the
remote side.  The data cache could lead to incorrect results because
it doesn't know about volatile variables, thus making it impossible to
debug targets which use memory mapped I/O devices. `set remotecache
off' turns the the data cache off.

* Remote targets may have threads

The standard remote protocol now includes support for multiple threads
in the target system, using new protocol commands 'H' and 'T'.  See
gdb/remote.c for details.

* NetROM support

If GDB is configured with `--enable-netrom', then it will include
support for the NetROM ROM emulator from XLNT Designs.  The NetROM
acts as though it is a bank of ROM on the target board, but you can
write into it over the network.  GDB's support consists only of
support for fast loading into the emulated ROM; to debug, you must use
another protocol, such as standard remote protocol.  The usual
sequence is something like

	target nrom <netrom-hostname>
	load <prog>
	target remote <netrom-hostname>:1235

* Macintosh host

GDB now includes support for the Apple Macintosh, as a host only.  It
may be run as either an MPW tool or as a standalone application, and
it can debug through the serial port.  All the usual GDB commands are
available, but to the target command, you must supply "serial" as the
device type instead of "/dev/ttyXX".  See mpw-README in the main
directory for more information on how to build.  The MPW configuration
scripts */mpw-config.in support only a few targets, and only the
mips-idt-ecoff target has been tested.

* Autoconf

GDB configuration now uses autoconf.  This is not user-visible,
but does simplify configuration and building.

* hpux10

GDB now supports hpux10.

*** Changes in GDB-4.14:

* New native configurations

x86 FreeBSD					i[345]86-*-freebsd
x86 NetBSD					i[345]86-*-netbsd
NS32k NetBSD					ns32k-*-netbsd
Sparc NetBSD					sparc-*-netbsd

* New targets

A29K VxWorks					a29k-*-vxworks
HP PA PRO embedded (WinBond W89K & Oki OP50N)	hppa*-*-pro*
CPU32 EST-300 emulator				m68*-*-est*
PowerPC ELF					powerpc-*-elf
WDC 65816					w65-*-*

* Alpha OSF/1 support for procfs

GDB now supports procfs under OSF/1-2.x and higher, which makes it
possible to attach to running processes.  As the mounting of the /proc
filesystem is optional on the Alpha, GDB automatically determines
the availability of /proc during startup.  This can lead to problems
if /proc is unmounted after GDB has been started.

* Arguments to user-defined commands

User commands may accept up to 10 arguments separated by whitespace.
Arguments are accessed within the user command via $arg0..$arg9.  A
trivial example:
define adder
  print $arg0 + $arg1 + $arg2

To execute the command use:
adder 1 2 3

Defines the command "adder" which prints the sum of its three arguments.
Note the arguments are text substitutions, so they may reference variables,
use complex expressions, or even perform inferior function calls.

* New `if' and `while' commands

This makes it possible to write more sophisticated user-defined
commands.  Both commands take a single argument, which is the
expression to evaluate, and must be followed by the commands to
execute, one per line, if the expression is nonzero, the list being
terminated by the word `end'.  The `if' command list may include an
`else' word, which causes the following commands to be executed only
if the expression is zero.

* Fortran source language mode

GDB now includes partial support for Fortran 77.  It will recognize
Fortran programs and can evaluate a subset of Fortran expressions, but
variables and functions may not be handled correctly.  GDB will work
with G77, but does not yet know much about symbols emitted by other
Fortran compilers.

* Better HPUX support

Most debugging facilities now work on dynamic executables for HPPAs
running hpux9 or later.  You can attach to running dynamically linked
processes, but by default the dynamic libraries will be read-only, so
for instance you won't be able to put breakpoints in them.  To change
that behavior do the following before running the program:

	adb -w a.out
	__dld_flags?W 0x5
	control-d

This will cause the libraries to be mapped private and read-write.
To revert to the normal behavior, do this:

	adb -w a.out
	__dld_flags?W 0x4
	control-d

You cannot set breakpoints or examine data in the library until after
the library is loaded if the function/data symbols do not have
external linkage.

GDB can now also read debug symbols produced by the HP C compiler on
HPPAs (sorry, no C++, Fortran or 68k support).

* Target byte order now dynamically selectable

You can choose which byte order to use with a target system, via the
commands "set endian big" and "set endian little", and you can see the
current setting by using "show endian".  You can also give the command
"set endian auto", in which case GDB will use the byte order
associated with the executable.  Currently, only embedded MIPS
configurations support dynamic selection of target byte order.

* New DOS host serial code

This version uses DPMI interrupts to handle buffered I/O, so you
no longer need to run asynctsr when debugging boards connected to
a PC's serial port.

*** Changes in GDB-4.13:

* New "complete" command

This lists all the possible completions for the rest of the line, if it
were to be given as a command itself.  This is intended for use by emacs.

* Trailing space optional in prompt

"set prompt" no longer adds a space for you after the prompt you set.  This
allows you to set a prompt which ends in a space or one that does not.

* Breakpoint hit counts

"info break" now displays a count of the number of times the breakpoint
has been hit.  This is especially useful in conjunction with "ignore"; you
can ignore a large number of breakpoint hits, look at the breakpoint info
to see how many times the breakpoint was hit, then run again, ignoring one
less than that number, and this will get you quickly to the last hit of
that breakpoint.

* Ability to stop printing at NULL character

"set print null-stop" will cause GDB to stop printing the characters of
an array when the first NULL is encountered.  This is useful when large
arrays actually contain only short strings.

* Shared library breakpoints

In SunOS 4.x, SVR4, and Alpha OSF/1 configurations, you can now set
breakpoints in shared libraries before the executable is run.

* Hardware watchpoints

There is a new hardware breakpoint for the watch command for sparclite
targets.  See gdb/sparclite/hw_breakpoint.note.

Hardware watchpoints are also now supported under GNU/Linux.
 
* Annotations

Annotations have been added.  These are for use with graphical interfaces,
and are still experimental.  Currently only gdba.el uses these.

* Improved Irix 5 support

GDB now works properly with Irix 5.2.

* Improved HPPA support

GDB now works properly with the latest GCC and GAS.

* New native configurations

Sequent PTX4				i[34]86-sequent-ptx4
HPPA running OSF/1			hppa*-*-osf*
Atari TT running SVR4			m68*-*-sysv4*
RS/6000 LynxOS				rs6000-*-lynxos*

* New targets

OS/9000					i[34]86-*-os9k
MIPS R4000				mips64*{,el}-*-{ecoff,elf}
Sparc64					sparc64-*-*

* Hitachi SH7000 and E7000-PC ICE support

There is now support for communicating with the Hitachi E7000-PC ICE.
This is available automatically when GDB is configured for the SH.

* Fixes

As usual, a variety of small fixes and improvements, both generic
and configuration-specific.  See the ChangeLog for more detail.

*** Changes in GDB-4.12:

* Irix 5 is now supported

* HPPA support

GDB-4.12 on the HPPA has a number of changes which make it unable
to debug the output from the currently released versions of GCC and
GAS (GCC 2.5.8 and GAS-2.2 or PAGAS-1.36).  Until the next major release
of GCC and GAS, versions of these tools designed to work with GDB-4.12
can be retrieved via anonymous ftp from jaguar.cs.utah.edu:/dist.


*** Changes in GDB-4.11:

* User visible changes:

* Remote Debugging

The "set remotedebug" option is now consistent between the mips remote
target, remote targets using the gdb-specific protocol, UDI (AMD's
debug protocol for the 29k) and the 88k bug monitor.  It is now an
integer specifying a debug level (normally 0 or 1, but 2 means more
debugging info for the mips target).

* DEC Alpha native support

GDB now works on the DEC Alpha.  GCC 2.4.5 does not produce usable
debug info, but GDB works fairly well with the DEC compiler and should
work with a future GCC release.  See the README file for a few
Alpha-specific notes.

* Preliminary thread implementation

GDB now has preliminary thread support for both SGI/Irix and LynxOS.

* LynxOS native and target support for 386

This release has been hosted on LynxOS 2.2, and also can be configured
to remotely debug programs running under LynxOS (see gdb/gdbserver/README
for details).

* Improvements in C++ mangling/demangling.

This release has much better g++ debugging, specifically in name 
mangling/demangling, virtual function calls, print virtual table,
call methods, ...etc.

*** Changes in GDB-4.10:

 * User visible changes:

Remote debugging using the GDB-specific (`target remote') protocol now
supports the `load' command.  This is only useful if you have some
other way of getting the stub to the target system, and you can put it
somewhere in memory where it won't get clobbered by the download.

Filename completion now works.

When run under emacs mode, the "info line" command now causes the
arrow to point to the line specified.  Also, "info line" prints
addresses in symbolic form (as well as hex).

All vxworks based targets now support a user settable option, called
vxworks-timeout.  This option represents the number of seconds gdb
should wait for responses to rpc's.  You might want to use this if
your vxworks target is, perhaps, a slow software simulator or happens
to be on the far side of a thin network line.

 * DEC alpha support

This release contains support for using a DEC alpha as a GDB host for
cross debugging.  Native alpha debugging is not supported yet.


*** Changes in GDB-4.9:

 * Testsuite

This is the first GDB release which is accompanied by a matching testsuite.
The testsuite requires installation of dejagnu, which should be available
via ftp from most sites that carry GNU software.

 * C++ demangling

'Cfront' style demangling has had its name changed to 'ARM' style, to
emphasize that it was written from the specifications in the C++ Annotated
Reference Manual, not necessarily to be compatible with AT&T cfront.  Despite
disclaimers, it still generated too much confusion with users attempting to
use gdb with AT&T cfront.

 * Simulators

GDB now uses a standard remote interface to a simulator library.
So far, the library contains simulators for the Zilog Z8001/2, the
Hitachi H8/300, H8/500 and Super-H.

 * New targets supported

H8/300 simulator 			h8300-hitachi-hms or h8300hms
H8/500 simulator 			h8500-hitachi-hms or h8500hms
SH simulator				sh-hitachi-hms    or sh
Z8000 simulator		  		z8k-zilog-none 	  or z8ksim
IDT MIPS board over serial line		mips-idt-ecoff

Cross-debugging to GO32 targets is supported.  It requires a custom
version of the i386-stub.c module which is integrated with the 
GO32 memory extender.

 * New remote protocols

MIPS remote debugging protocol.

 * New source languages supported

This version includes preliminary support for Chill, a Pascal like language
used by telecommunications companies.  Chill support is also being integrated
into the GNU compiler, but we don't know when it will be publically available.


*** Changes in GDB-4.8:

 * HP Precision Architecture supported

GDB now supports HP PA-RISC machines running HPUX.  A preliminary
version of this support was available as a set of patches from the
University of Utah.  GDB does not support debugging of programs
compiled with the HP compiler, because HP will not document their file
format.  Instead, you must use GCC (version 2.3.2 or later) and PA-GAS
(as available from jaguar.cs.utah.edu:/dist/pa-gas.u4.tar.Z).

Many problems in the preliminary version have been fixed.

 * Faster and better demangling

We have improved template demangling and fixed numerous bugs in the GNU style
demangler.  It can now handle type modifiers such as `static' or `const'.  Wide
character types (wchar_t) are now supported.  Demangling of each symbol is now
only done once, and is cached when the symbol table for a file is read in.
This results in a small increase in memory usage for C programs, a moderate
increase in memory usage for C++ programs, and a fantastic speedup in
symbol lookups.

`Cfront' style demangling still doesn't work with AT&T cfront.  It was written
from the specifications in the Annotated Reference Manual, which AT&T's
compiler does not actually implement.

 * G++ multiple inheritance compiler problem

In the 2.3.2 release of gcc/g++, how the compiler resolves multiple
inheritance lattices was reworked to properly discover ambiguities.  We
recently found an example which causes this new algorithm to fail in a
very subtle way, producing bad debug information for those classes.
The file 'gcc.patch' (in this directory) can be applied to gcc to
circumvent the problem.  A future GCC release will contain a complete
fix.

The previous G++ debug info problem (mentioned below for the gdb-4.7
release) is fixed in gcc version 2.3.2.

 * Improved configure script

The `configure' script will now attempt to guess your system type if
you don't supply a host system type.  The old scheme of supplying a
host system triplet is preferable over using this.  All the magic is
done in the new `config.guess' script.  Examine it for details.

We have also brought our configure script much more in line with the FSF's
version.  It now supports the --with-xxx options.  In particular,
`--with-minimal-bfd' can be used to make the GDB binary image smaller.
The resulting GDB will not be able to read arbitrary object file formats --
only the format ``expected'' to be used on the configured target system.
We hope to make this the default in a future release.

 * Documentation improvements

There's new internal documentation on how to modify GDB, and how to
produce clean changes to the code.  We implore people to read it
before submitting changes.

The GDB manual uses new, sexy Texinfo conditionals, rather than arcane
M4 macros.  The new texinfo.tex is provided in this release.  Pre-built
`info' files are also provided.  To build `info' files from scratch,
you will need the latest `makeinfo' release, which will be available in
a future texinfo-X.Y release.

*NOTE*  The new texinfo.tex can cause old versions of TeX to hang.
We're not sure exactly which versions have this problem, but it has
been seen in 3.0.  We highly recommend upgrading to TeX version 3.141
or better.  If that isn't possible, there is a patch in
`texinfo/tex3patch' that will modify `texinfo/texinfo.tex' to work
around this problem.

 * New features

GDB now supports array constants that can be used in expressions typed in by
the user.  The syntax is `{element, element, ...}'.  Ie: you can now type
`print {1, 2, 3}', and it will build up an array in memory malloc'd in
the target program.

The new directory `gdb/sparclite' contains a program that demonstrates
how the sparc-stub.c remote stub runs on a Fujitsu SPARClite processor.

 * New native hosts supported

HP/PA-RISC under HPUX using GNU tools	hppa1.1-hp-hpux
386 CPUs running SCO Unix 3.2v4		i386-unknown-sco3.2v4

 * New targets supported

AMD 29k family via UDI			a29k-amd-udi  or  udi29k

 * New file formats supported

BFD now supports reading HP/PA-RISC executables (SOM file format?),
HPUX core files, and SCO 3.2v2 core files.

 * Major bug fixes

Attaching to processes now works again; thanks for the many bug reports.

We have also stomped on a bunch of core dumps caused by
printf_filtered("%s") problems.

We eliminated a copyright problem on the rpc and ptrace header files
for VxWorks, which was discovered at the last minute during the 4.7
release.  You should now be able to build a VxWorks GDB.

You can now interrupt gdb while an attached process is running.  This
will cause the attached process to stop, and give control back to GDB.

We fixed problems caused by using too many file descriptors
for reading symbols from object files and libraries.  This was
especially a problem for programs that used many (~100) shared
libraries.

The `step' command now only enters a subroutine if there is line number
information for the subroutine.  Otherwise it acts like the `next'
command.  Previously, `step' would enter subroutines if there was
any debugging information about the routine.  This avoids problems
when using `cc -g1' on MIPS machines.

 * Internal improvements

GDB's internal interfaces have been improved to make it easier to support
debugging of multiple languages in the future.

GDB now uses a common structure for symbol information internally.
Minimal symbols (derived from linkage symbols in object files), partial
symbols (from a quick scan of debug information), and full symbols
contain a common subset of information, making it easier to write
shared code that handles any of them.

 * New command line options

We now accept --silent as an alias for --quiet.

 * Mmalloc licensing

The memory-mapped-malloc library is now licensed under the GNU Library
General Public License.

*** Changes in GDB-4.7:

 * Host/native/target split

GDB has had some major internal surgery to untangle the support for
hosts and remote targets.  Now, when you configure GDB for a remote
target, it will no longer load in all of the support for debugging
local programs on the host.  When fully completed and tested, this will
ensure that arbitrary host/target combinations are possible.

The primary conceptual shift is to separate the non-portable code in
GDB into three categories.  Host specific code is required any time GDB
is compiled on that host, regardless of the target.  Target specific
code relates to the peculiarities of the target, but can be compiled on
any host.  Native specific code is everything else:  it can only be
built when the host and target are the same system.  Child process
handling and core file support are two common `native' examples.

GDB's use of /proc for controlling Unix child processes is now cleaner.
It has been split out into a single module under the `target_ops' vector,
plus two native-dependent functions for each system that uses /proc.

 * New hosts supported

HP/Apollo 68k (under the BSD domain)	m68k-apollo-bsd  or  apollo68bsd
386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  i386sco

 * New targets supported

Fujitsu SPARClite 			sparclite-fujitsu-none  or  sparclite
68030 and CPU32				m68030-*-*, m68332-*-*

 * New native hosts supported

386 CPUs running various BSD ports	i386-unknown-bsd  or  386bsd
    (386bsd is not well tested yet)
386 CPUs running SCO Unix		i386-unknown-scosysv322  or  sco

 * New file formats supported

BFD now supports COFF files for the Zilog Z8000 microprocessor.  It
supports reading of `a.out.adobe' object files, which are an a.out
format extended with minimal information about multiple sections.

 * New commands

`show copying' is the same as the old `info copying'.
`show warranty' is the same as `info warrantee'.
These were renamed for consistency.  The old commands continue to work.

`info handle' is a new alias for `info signals'.

You can now define pre-command hooks, which attach arbitrary command
scripts to any command.  The commands in the hook will be executed
prior to the user's command.  You can also create a hook which will be
executed whenever the program stops.  See gdb.texinfo.

 * C++ improvements

We now deal with Cfront style name mangling, and can even extract type
info from mangled symbols.  GDB can automatically figure out which
symbol mangling style your C++ compiler uses.

Calling of methods and virtual functions has been improved as well.

 * Major bug fixes

The crash that occured when debugging Sun Ansi-C compiled binaries is
fixed.  This was due to mishandling of the extra N_SO stabs output
by the compiler.

We also finally got Ultrix 4.2 running in house, and fixed core file
support, with help from a dozen people on the net.

John M. Farrell discovered that the reason that single-stepping was so
slow on all of the Mips based platforms (primarily SGI and DEC) was
that we were trying to demangle and lookup a symbol used for internal
purposes on every instruction that was being stepped through.  Changing
the name of that symbol so that it couldn't be mistaken for a C++
mangled symbol sped things up a great deal.

Rich Pixley sped up symbol lookups in general by getting much smarter
about when C++ symbol mangling is necessary.  This should make symbol
completion (TAB on the command line) much faster.  It's not as fast as
we'd like, but it's significantly faster than gdb-4.6.

 * AMD 29k support

A new user controllable variable 'call_scratch_address' can
specify the location of a scratch area to be used when GDB
calls a function in the target.  This is necessary because the
usual method of putting the scratch area on the stack does not work
in systems that have separate instruction and data spaces.

We integrated changes to support the 29k UDI (Universal Debugger
Interface), but discovered at the last minute that we didn't have all
of the appropriate copyright paperwork.  We are working with AMD to
resolve this, and hope to have it available soon.

 * Remote interfaces

We have sped up the remote serial line protocol, especially for targets
with lots of registers.  It now supports a new `expedited status' ('T')
message which can be used in place of the existing 'S' status message.
This allows the remote stub to send only the registers that GDB
needs to make a quick decision about single-stepping or conditional
breakpoints, eliminating the need to fetch the entire register set for
each instruction being stepped through.

The GDB remote serial protocol now implements a write-through cache for
registers, only re-reading the registers if the target has run.

There is also a new remote serial stub for SPARC processors.  You can
find it in gdb-4.7/gdb/sparc-stub.c.  This was written to support the
Fujitsu SPARClite processor, but will run on any stand-alone SPARC
processor with a serial port.

 * Configuration

Configure.in files have become much easier to read and modify.  A new
`table driven' format makes it more obvious what configurations are
supported, and what files each one uses.

 * Library changes

There is a new opcodes library which will eventually contain all of the
disassembly routines and opcode tables.  At present, it only contains
Sparc and Z8000 routines.  This will allow the assembler, debugger, and
disassembler (binutils/objdump) to share these routines.

The libiberty library is now copylefted under the GNU Library General
Public License.  This allows more liberal use, and was done so libg++
can use it.  This makes no difference to GDB, since the Library License
grants all the rights from the General Public License.

 * Documentation

The file gdb-4.7/gdb/doc/stabs.texinfo is a (relatively) complete
reference to the stabs symbol info used by the debugger.  It is (as far
as we know) the only published document on this fascinating topic.  We
encourage you to read it, compare it to the stabs information on your
system, and send improvements on the document in general (to
bug-gdb@prep.ai.mit.edu).

And, of course, many bugs have been fixed.


*** Changes in GDB-4.6:

 * Better support for C++ function names

GDB now accepts as input the "demangled form" of C++ overloaded function
names and member function names, and can do command completion on such names
(using TAB, TAB-TAB, and ESC-?).  The names have to be quoted with a pair of
single quotes.  Examples are 'func (int, long)' and 'obj::operator==(obj&)'.
Make use of command completion, it is your friend.

GDB also now accepts a variety of C++ mangled symbol formats.  They are
the GNU g++ style, the Cfront (ARM) style, and the Lucid (lcc) style.
You can tell GDB which format to use by doing a 'set demangle-style {gnu,
lucid, cfront, auto}'.  'gnu' is the default.  Do a 'set demangle-style foo'
for the list of formats.

 * G++ symbol mangling problem

Recent versions of gcc have a bug in how they emit debugging information for
C++ methods (when using dbx-style stabs).  The file 'gcc.patch' (in this
directory) can be applied to gcc to fix the problem.  Alternatively, if you
can't fix gcc, you can #define GCC_MANGLE_BUG when compling gdb/symtab.c. The
usual symptom is difficulty with setting breakpoints on methods.  GDB complains
about the method being non-existent.  (We believe that version 2.2.2 of GCC has
this problem.)

 * New 'maintenance' command

All of the commands related to hacking GDB internals have been moved out of
the main command set, and now live behind the 'maintenance' command.  This
can also be abbreviated as 'mt'.  The following changes were made:

	dump-me ->		maintenance dump-me
	info all-breakpoints ->	maintenance info breakpoints
	printmsyms ->		maintenance print msyms
	printobjfiles ->	maintenance print objfiles
	printpsyms ->		maintenance print psymbols
	printsyms ->		maintenance print symbols

The following commands are new:

	maintenance demangle	Call internal GDB demangler routine to
				demangle a C++ link name and prints the result.
	maintenance print type	Print a type chain for a given symbol

 * Change to .gdbinit file processing

We now read the $HOME/.gdbinit file before processing the argv arguments
(e.g. reading symbol files or core files).  This allows global parameters to
be set, which will apply during the symbol reading.  The ./.gdbinit is still
read after argv processing.

 * New hosts supported

Solaris-2.0 !!!				sparc-sun-solaris2  or  sun4sol2

GNU/Linux support			i386-unknown-linux  or  linux

We are also including code to support the HP/PA running BSD and HPUX.  This
is almost guaranteed not to work, as we didn't have time to test or build it
for this release.  We are including it so that the more adventurous (or
masochistic) of you can play with it.  We also had major problems with the
fact that the compiler that we got from HP doesn't support the -g option.
It costs extra.

 * New targets supported

Hitachi H8/300				h8300-hitachi-hms  or  h8300hms

 * More smarts about finding #include files

GDB now remembers the compilation directory for all include files, and for
all files from which C is generated (like yacc and lex sources).  This
greatly improves GDB's ability to find yacc/lex sources, and include files,
especially if you are debugging your program from a directory different from
the one that contains your sources.

We also fixed a bug which caused difficulty with listing and setting
breakpoints in include files which contain C code.  (In the past, you had to
try twice in order to list an include file that you hadn't looked at before.)

 * Interesting infernals change

GDB now deals with arbitrary numbers of sections, where the symbols for each
section must be relocated relative to that section's landing place in the
target's address space.  This work was needed to support ELF with embedded
stabs used by Solaris-2.0.

 * Bug fixes (of course!)

There have been loads of fixes for the following things:
	mips, rs6000, 29k/udi, m68k, g++, type handling, elf/dwarf, m88k,
	i960, stabs, DOS(GO32), procfs, etc...

See the ChangeLog for details.

*** Changes in GDB-4.5:

 * New machines supported (host and target)

IBM RS6000 running AIX			rs6000-ibm-aix	or rs6000

SGI Irix-4.x				mips-sgi-irix4	or iris4

 * New malloc package

GDB now uses a new memory manager called mmalloc, based on gmalloc.
Mmalloc is capable of handling mutiple heaps of memory.  It is also
capable of saving a heap to a file, and then mapping it back in later.
This can be used to greatly speedup the startup of GDB by using a
pre-parsed symbol table which lives in a mmalloc managed heap.  For
more details, please read mmalloc/mmalloc.texi.

 * info proc

The 'info proc' command (SVR4 only) has been enhanced quite a bit.  See
'help info proc' for details.

 * MIPS ecoff symbol table format

The code that reads MIPS symbol table format is now supported on all hosts.
Thanks to MIPS for releasing the sym.h and symconst.h files to make this
possible.

 * File name changes for MS-DOS

Many files in the config directories have been renamed to make it easier to
support GDB on MS-DOSe systems (which have very restrictive file name
conventions :-( ).  MS-DOSe host support (under DJ Delorie's GO32
environment) is close to working but has some remaining problems.  Note
that debugging of DOS programs is not supported, due to limitations
in the ``operating system'', but it can be used to host cross-debugging.

 * Cross byte order fixes

Many fixes have been made to support cross debugging of Sparc and MIPS
targets from hosts whose byte order differs.

 * New -mapped and -readnow options

If memory-mapped files are available on your system through the 'mmap'
system call, you can use the -mapped option on the `file' or
`symbol-file' commands to cause GDB to write the symbols from your
program into a reusable file.  If the program you are debugging is
called `/path/fred', the mapped symbol file will be `./fred.syms'.
Future GDB debugging sessions will notice the presence of this file,
and will quickly map in symbol information from it, rather than reading
the symbol table from the executable program.  Using the '-mapped'
option in a GDB `file' or `symbol-file' command has the same effect as
starting GDB with the '-mapped' command-line option.

You can cause GDB to read the entire symbol table immediately by using
the '-readnow' option with any of the commands that load symbol table
information (or on the GDB command line).  This makes the command
slower, but makes future operations faster.

The -mapped and -readnow options are typically combined in order to
build a `fred.syms' file that contains complete symbol information.
A simple GDB invocation to do nothing but build a `.syms' file for future
use is:

	gdb -batch -nx -mapped -readnow programname

The `.syms' file is specific to the host machine on which GDB is run.
It holds an exact image of GDB's internal symbol table.  It cannot be
shared across multiple host platforms.

 * longjmp() handling

GDB is now capable of stepping and nexting over longjmp(), _longjmp(), and
siglongjmp() without losing control.  This feature has not yet been ported to
all systems.  It currently works on many 386 platforms, all MIPS-based
platforms (SGI, DECstation, etc), and Sun3/4.

 * Solaris 2.0

Preliminary work has been put in to support the new Solaris OS from Sun.  At
this time, it can control and debug processes, but it is not capable of
reading symbols.

 * Bug fixes

As always, many many bug fixes.  The major areas were with g++, and mipsread.
People using the MIPS-based platforms should experience fewer mysterious
crashes and trashed symbol tables.

*** Changes in GDB-4.4:

 * New machines supported (host and target)

SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
	(except core files)
BSD Reno on Vax				vax-dec-bsd
Ultrix on Vax				vax-dec-ultrix

 * New machines supported (target)

AMD 29000 embedded, using EBMON		a29k-none-none

 * C++ support

GDB continues to improve its handling of C++.  `References' work better.
The demangler has also been improved, and now deals with symbols mangled as
per the Annotated C++ Reference Guide.

GDB also now handles `stabs' symbol information embedded in MIPS
`ecoff' symbol tables.  Since the ecoff format was not easily
extensible to handle new languages such as C++, this appeared to be a
good way to put C++ debugging info into MIPS binaries.  This option
will be supported in the GNU C compiler, version 2, when it is
released.

 * New features for SVR4

GDB now handles SVR4 shared libraries, in the same fashion as SunOS
shared libraries.  Debugging dynamically linked programs should present
only minor differences from debugging statically linked programs.

The `info proc' command will print out information about any process
on an SVR4 system (including the one you are debugging).  At the moment,
it prints the address mappings of the process.

If you bring up GDB on another SVR4 system, please send mail to
bug-gdb@prep.ai.mit.edu to let us know what changes were reqired (if any).

 * Better dynamic linking support in SunOS

Reading symbols from shared libraries which contain debugging symbols
now works properly.  However, there remain issues such as automatic
skipping of `transfer vector' code during function calls, which
make it harder to debug code in a shared library, than to debug the
same code linked statically.

 * New Getopt

GDB is now using the latest `getopt' routines from the FSF.  This
version accepts the -- prefix for options with long names.  GDB will
continue to accept the old forms (-option and +option) as well.
Various single letter abbreviations for options have been explicity
added to the option table so that they won't get overshadowed in the
future by other options that begin with the same letter.

 * Bugs fixed

The `cleanup_undefined_types' bug that many of you noticed has been squashed.
Many assorted bugs have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.


*** Changes in GDB-4.3:

 * New machines supported (host and target)

Amiga 3000 running Amix			m68k-cbm-svr4	or  amix
NCR 3000 386 running SVR4		i386-ncr-svr4	or  ncr3000
Motorola Delta 88000 running Sys V	m88k-motorola-sysv  or  delta88

 * Almost SCO Unix support

We had hoped to support:
SCO Unix on i386 IBM PC clones		i386-sco-sysv	or  i386sco
(except for core file support), but we discovered very late in the release
that it has problems with process groups that render gdb unusable.  Sorry
about that.  I encourage people to fix it and post the fixes.

 * Preliminary ELF and DWARF support

GDB can read ELF object files on System V Release 4, and can handle
debugging records for C, in DWARF format, in ELF files.  This support
is preliminary.  If you bring up GDB on another SVR4 system, please
send mail to bug-gdb@prep.ai.mit.edu to let us know what changes were
reqired (if any).

 * New Readline

GDB now uses the latest `readline' library.  One user-visible change
is that two tabs will list possible command completions, which previously
required typing M-? (meta-question mark, or ESC ?).

 * Bugs fixed

The `stepi' bug that many of you noticed has been squashed.
Many bugs in C++ have been handled.  Many more remain to be handled.
See the various ChangeLog files (primarily in gdb and bfd) for details.

 * State of the MIPS world (in case you wondered):

GDB can understand the symbol tables emitted by the compilers
supplied by most vendors of MIPS-based machines, including DEC.  These
symbol tables are in a format that essentially nobody else uses.

Some versions of gcc come with an assembler post-processor called
mips-tfile.  This program is required if you want to do source-level
debugging of gcc-compiled programs.  I believe FSF does not ship
mips-tfile with gcc version 1, but it will eventually come with gcc
version 2.

Debugging of g++ output remains a problem.  g++ version 1.xx does not
really support it at all.  (If you're lucky, you should be able to get
line numbers and stack traces to work, but no parameters or local
variables.)  With some work it should be possible to improve the
situation somewhat.

When gcc version 2 is released, you will have somewhat better luck.
However, even then you will get confusing results for inheritance and
methods.

We will eventually provide full debugging of g++ output on
DECstations.  This will probably involve some kind of stabs-in-ecoff
encapulation, but the details have not been worked out yet.


*** Changes in GDB-4.2:

 *  Improved configuration

Only one copy of `configure' exists now, and it is not self-modifying.
Porting BFD is simpler.  

 *  Stepping improved

The `step' and `next' commands now only stop at the first instruction
of a source line.  This prevents the multiple stops that used to occur
in switch statements, for-loops, etc.  `Step' continues to stop if a
function that has debugging information is called within the line.

 *  Bug fixing

Lots of small bugs fixed.  More remain.

 *  New host supported (not target)

Intel 386 PC clone running Mach		i386-none-mach


*** Changes in GDB-4.1:

 *  Multiple source language support

GDB now has internal scaffolding to handle several source languages.
It determines the type of each source file from its filename extension,
and will switch expression parsing and number formatting to match the
language of the function in the currently selected stack frame.
You can also specifically set the language to be used, with
`set language c' or `set language modula-2'.

 *  GDB and Modula-2

GDB now has preliminary support for the GNU Modula-2 compiler,
currently under development at the State University of New York at
Buffalo.  Development of both GDB and the GNU Modula-2 compiler will
continue through the fall of 1991 and into 1992.

Other Modula-2 compilers are currently not supported, and attempting to
debug programs compiled with them will likely result in an error as the
symbol table is read.  Feel free to work on it, though!

There are hooks in GDB for strict type checking and range checking,
in the `Modula-2 philosophy', but they do not currently work.

 * set write on/off

GDB can now write to executable and core files (e.g. patch
a variable's value).   You must turn this switch on, specify
the file ("exec foo" or "core foo"), *then* modify it, e.g.
by assigning a new value to a variable.  Modifications take
effect immediately.

 * Automatic SunOS shared library reading

When you run your program, GDB automatically determines where its
shared libraries (if any) have been loaded, and reads their symbols.
The `share' command is no longer needed.  This also works when
examining core files.

 * set listsize

You can specify the number of lines that the `list' command shows.
The default is 10.

 * New machines supported (host and target)

SGI Iris (MIPS) running Irix V3:  	mips-sgi-irix   or  iris
Sony NEWS (68K) running NEWSOS 3.x:	m68k-sony-sysv	or  news
Ultracomputer (29K) running Sym1:	a29k-nyu-sym1	or  ultra3

 * New hosts supported (not targets)

IBM RT/PC:				romp-ibm-aix 	or  rtpc

 * New targets supported (not hosts)

AMD 29000 embedded with COFF		a29k-none-coff
AMD 29000 embedded with a.out		a29k-none-aout
Ultracomputer remote kernel debug	a29k-nyu-kern

 * New remote interfaces

AMD 29000 Adapt
AMD 29000 Minimon


*** Changes in GDB-4.0:

 *  New Facilities

Wide output is wrapped at good places to make the output more readable.

Gdb now supports cross-debugging from a host machine of one type to a
target machine of another type.  Communication with the target system
is over serial lines.  The ``target'' command handles connecting to the
remote system; the ``load'' command will download a program into the
remote system.  Serial stubs for the m68k and i386 are provided.  Gdb
also supports debugging of realtime processes running under VxWorks,
using SunRPC Remote Procedure Calls over TCP/IP to talk to a debugger
stub on the target system.

New CPUs supported include the AMD 29000 and Intel 960.

GDB now reads object files and symbol tables via a ``binary file'' 
library, which allows a single copy of GDB to debug programs of multiple
object file types such as a.out and coff.

There is now a GDB reference card in "doc/refcard.tex".  (Make targets
refcard.dvi and refcard.ps are available to format it).


 *  Control-Variable user interface simplified

All variables that control the operation of the debugger can be set
by the ``set'' command, and displayed by the ``show'' command.

For example, ``set prompt new-gdb=>'' will change your prompt to new-gdb=>.
``Show prompt'' produces the response:
Gdb's prompt is new-gdb=>.

What follows are the NEW set commands.  The command ``help set'' will
print a complete list of old and new set commands.  ``help set FOO''
will give a longer description of the variable FOO.  ``show'' will show
all of the variable descriptions and their current settings.

confirm on/off:  Enables warning questions for operations that are
		 hard to recover from, e.g. rerunning the program while
		 it is already running.  Default is ON.

editing on/off:  Enables EMACS style command line editing 
                 of input.  Previous lines can be recalled with 
		 control-P, the current line can be edited with control-B,
		 you can search for commands with control-R, etc.
		 Default is ON.

history filename NAME:  NAME is where the gdb command history 
			will be stored.  The default is .gdb_history,
			or the value of the environment variable
			GDBHISTFILE.

history size N:  The size, in commands, of the command history.  The 
		 default is 256, or the value of the environment variable
		 HISTSIZE.

history save on/off: If this value is set to ON, the history file will
		      be saved after exiting gdb.  If set to OFF, the 
		      file will not be saved.  The default is OFF.

history expansion on/off: If this value is set to ON, then csh-like 
			  history expansion will be performed  on 
			  command line input.  The default is OFF.

radix N:  Sets the default radix for input and output.  It can be set
	  to 8, 10, or 16.  Note that the argument to "radix" is interpreted
	  in the current radix, so "set radix 10" is always a no-op.

height N: This integer value is the number of lines on a page. Default
          is 24, the current `stty rows'' setting, or the ``li#''
	  setting from the termcap entry matching the environment
	  variable TERM.

width N:  This integer value is the number of characters on a line.
	  Default is 80, the current `stty cols'' setting, or the ``co#''
	  setting from the termcap entry matching the environment
	  variable TERM.

Note: ``set screensize'' is obsolete. Use ``set height'' and
``set width'' instead.

print address on/off:  Print memory addresses in various command displays,
		      such as stack traces and structure values.  Gdb looks
		      more ``symbolic'' if you turn this off; it looks more
		      ``machine level'' with it on.  Default is ON.

print array on/off:  Prettyprint arrays.  New convenient format!  Default 
                    is OFF.

print demangle on/off:   Print C++ symbols in "source" form if on,
			"raw" form if off.

print asm-demangle on/off:  Same, for assembler level printouts
			like instructions.

print vtbl on/off:  Prettyprint C++ virtual function tables.  Default is OFF.


 *  Support for Epoch Environment.

The epoch environment is a version of Emacs v18 with windowing.  One
new command, ``inspect'', is identical to ``print'', except that if you
are running in the epoch environment, the value is printed in its own
window.


 *  Support for Shared Libraries

GDB can now debug programs and core files that use SunOS shared libraries.
Symbols from a shared library cannot be referenced
before the shared library has been linked with the program (this
happens after you type ``run'' and before the function main() is entered).
At any time after this linking (including when examining core files
from dynamically linked programs), gdb reads the symbols from each
shared library when you type the ``sharedlibrary'' command.
It can be abbreviated ``share''.

sharedlibrary REGEXP:  Load shared object library symbols for files 
                       matching a unix regular expression.  No argument
		       indicates to load symbols for all shared libraries.

info sharedlibrary:  Status of loaded shared libraries.


 *  Watchpoints

A watchpoint stops execution of a program whenever the value of an
expression changes.  Checking for this slows down execution
tremendously whenever you are in the scope of the expression, but is
quite useful for catching tough ``bit-spreader'' or pointer misuse
problems.  Some machines such as the 386 have hardware for doing this
more quickly, and future versions of gdb will use this hardware.

watch EXP:  Set a watchpoint (breakpoint) for an expression.

info watchpoints:  Information about your watchpoints.

delete N:   Deletes watchpoint number N (same as breakpoints).
disable N:  Temporarily turns off watchpoint number N (same as breakpoints).
enable N:   Re-enables watchpoint number N (same as breakpoints).


 *  C++ multiple inheritance

When used with a GCC version 2 compiler, GDB supports multiple inheritance
for C++ programs.

 *  C++ exception handling

Gdb now supports limited C++ exception handling.  Besides the existing
ability to breakpoint on an exception handler, gdb can breakpoint on
the raising of an exception (before the stack is peeled back to the
handler's context).

catch FOO:  If there is a FOO exception handler in the dynamic scope,
	    set a breakpoint to catch exceptions which may be raised there.
	    Multiple exceptions (``catch foo bar baz'') may be caught.

info catch:  Lists all exceptions which may be caught in the
             current stack frame.


 *  Minor command changes

The command ``call func (arg, arg, ...)'' now acts like the print
command, except it does not print or save a value if the function's result
is void.  This is similar to dbx usage.

The ``up'' and ``down'' commands now always print the frame they end up
at; ``up-silently'' and `down-silently'' can be used in scripts to change
frames without printing.

 *  New directory command

'dir' now adds directories to the FRONT of the source search path.
The path starts off empty.  Source files that contain debug information
about the directory in which they were compiled can be found even
with an empty path; Sun CC and GCC include this information.  If GDB can't
find your source file in the current directory, type "dir .".

 * Configuring GDB for compilation

For normal use, type ``./configure host''.  See README or gdb.texinfo
for more details.

GDB now handles cross debugging.  If you are remotely debugging between 
two different machines, type ``./configure host -target=targ''.
Host is the machine where GDB will run; targ is the machine
where the program that you are debugging will run.
