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

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