Noteworthy changes in GCC after EGCS 1.1.
-----------------------------------------

Target specific NEWS

    RS6000/PowerPC: -mcpu=401 was added as an alias for -mcpu=403.  -mcpu=e603e
		    was added to do -mcpu=603e and -msoft-float.

Noteworthy changes in GCC for EGCS 1.1.
---------------------------------------

The compiler now implements global common subexpression elimination (gcse) as
well as global constant/copy propagation.  (link to gcse page).

More major improvements have been made to the alias analysis code.  A new
option to allow front-ends to provide alias information to the optimizers
has also been added (-fstrict-aliasing).  -fstrict-aliasing is off by default
now, but will be enabled by default in the future. (link to alias page)

Major changes continue in the exception handling support.  This release
includes some changes to reduce static overhead for exception handling.  It
also includes some major changes to the setjmp/longjmp based EH mechanism to
make it less pessimistic.  And finally, major infrastructure improvements
to the dwarf2 EH mechanism have been made to make our EH support extensible.

We have fixed the infamous security problems with temporary files. 

The "regmove" optimization pass has been nearly completely rewritten.  It now
uses much more information about the target to determine profitability of
transformations.

The compiler now recomputes register usage information immediately before
register allocation.  Previously such information was only not kept up to
date after instruction combination which led to poor register allocation
choices by our priority based register allocator.

The register reloading phase of the compiler has been improved to better
optimize spill code.  This primarily helps targets which generate lots of
spills (like the x86 ports and many register poor embedded ports).

A few changes in the heuristics used by the register allocator and scheduler
have been made which can significantly improve performance for certain
applications.

The compiler's branch shortening algorithms have been significantly improved
to work better on targets which align jump targets.

The compiler now supports the "ADDRESSOF" optimization which can significantly
reduce the overhead for certain inline calls (and inline calls in general).

The compiler now supports a code size optimization switch (-Os).  When enabled
the compiler will prefer optimizations which improve code size over those
which improve code speed.

The compiler has been improved to completely eliminate library calls which
compute constant values.  This is particularly useful on machines which
do not have integer mul/div or floating point support on-chip.

GCC now supports a "--help" option to print detailed help information.

cpplib has been greatly improved.  It is probably useable for some sites now
(major missing feature is trigraphs).

Memory footprint for the compiler has been significantly reduced for certain
pathalogical cases.

Build time improvements for targets which support lots of sched parameters
(alpha and mips primarily).

Compile time for certain programs using large constant initializers has been
improved (effects glibc significantly).

Plus an incredible number of infrastructure changes, warning fixes, bugfixes
and local optimizations.

Various improvements have been made to better support cross compilations.  They
are still not easy, but they are improving.

Target specific NEWS

    Sparc: Now includes V8 plus and V9 support, lots of tuning for Ultrasparcs
           and uses the Haifa scheduler by default.

    Alpha: EV6 tuned, optimized expansion of memcpy/bzero.

    x86: Data in the static store is aligned per Intel recommendations.  Jump
         targets are aligned per Intel recommendations.  Improved epilogue
         sequences for Pentium chips.  Backend improvements which should help
         register allocation on all x86 variants.  Support for PPro conditional
         move instructions has been fixed and enabled.  Random changes
	 throughout the port to make generated code more Pentium friendly.
         Improved support for 64bit integer operations.
         Unixware 7, a System V Release 5 target is now supported.
         SCO OpenServer targets can support GAS.  See gcc/INSTALL for details.

    RS6000/PowerPC: Includes AIX4.3 support as well as PowerPC64 support.  
                    Haifa instruction scheduling is enabled by default now.

    MIPS: Multiply/Multiply-Add support has been largely rewritten to generate
          more efficient code.  Includes mips16 support.

    M68K: Various micro-optimizations and Coldfire fixes.

    M32r: Major improvements to this port.

    Arm: Includes Thumb and super interworking support.

EGCS includes all gcc2 changes up to and including the June 9, 1998 snapshot.


Noteworthy changes in GCC version 2.8.1
---------------------------------------

Numerous bugs have been fixed and some minor performance
improvements (compilation speed) have been made.

Noteworthy changes in GCC version 2.8.0
---------------------------------------

A major change in this release is the addition of a framework for
exception handling, currently used by C++.  Many internal changes and
optimization improvements have been made.  These increase the
maintainability and portability of GCC.  GCC now uses autoconf to
compute many host parameters.

The following lists changes that add new features or targets.

See cp/NEWS for new features of C++ in this release.

New tools and features:

    The Dwarf 2 debugging information format is supported on ELF systems, and
    is the default for -ggdb where available.  It can also be used for C++.
    The Dwarf version 1 debugging format is also permitted for C++, but
    does not work well.

    gcov.c is provided for test coverage analysis and branch profiling
    analysis is also supported; see -fprofile-arcs, -ftest-coverage,
    and -fbranch-probabilities.

    Support for the Checker memory checking tool.

    New switch, -fstack-check, to check for stack overflow on systems that
    don't have such built into their ABI.

    New switches, -Wundef and -Wno-undef to warn if an undefined identifier
    is evaluated in an #if directive.

    Options -Wall and -Wimplicit now cause GCC to warn about implicit int
    in declarations (e.g. `register i;'), since the C Standard committee
    has decided to disallow this in the next revision of the standard;
    -Wimplicit-function-declarations and -Wimplicit-int are subsets of
    this.

    Option -Wsign-compare causes GCC to warn about comparison of signed and
    unsigned values.

    Add -dI option of cccp for cxref.

New features in configuration, installation and specs file handling:

    New option --enable-c-cpplib to configure script.

    You can use --with-cpu on the configure command to specify the default
    CPU that GCC should generate code for.

    The -specs=file switch allows you to override default specs used in
    invoking programs like cc1, as, etc.

    Allow including one specs file from another and renaming a specs
    variable.

    You can now relocate all GCC files with a single environment variable
    or a registry entry under Windows 95 and Windows NT.

Changes in Objective-C:

    The Objective-C Runtime Library has been made thread-safe.

    The Objective-C Runtime Library contains an interface for creating
    mutexes, condition mutexes, and threads; it requires a back-end
    implementation for the specific platform and/or thread package.
    Currently supported are DEC/OSF1, IRIX, Mach, OS/2, POSIX, PCThreads,
    Solaris, and Windows32.  The --enable-threads parameter can be used
    when configuring GCC to enable and select a thread back-end.

    Objective-C is now configured as separate front-end language to GCC,
    making it more convenient to conditionally build it.

    The internal structures of the Objective-C Runtime Library have
    changed sufficiently to warrant a new version number; now version 8.
    Programs compiled with an older version must be recompiled.

    The Objective-C Runtime Library can be built as a DLL on Windows 95
    and Windows NT systems.
    
    The Objective-C Runtime Library implements +load.

The following new targets are supported (see also list under each
individual CPU below):

    Embedded target m32r-elf.
    Embedded Hitachi Super-H using ELF.
    RTEMS real-time system on various CPU targets.
    ARC processor.
    NEC V850 processor.
    Matsushita MN10200 processor.
    Matsushita MN10300 processor.
    Sparc and PowerPC running on VxWorks.
    Support both glibc versions 1 and 2 on Linux-based GNU systems.

New features for DEC Alpha systems:

    Allow detailed specification of IEEE fp support:
      -mieee, -mieee-with-inexact, and -mieee-conformant
      -mfp-trap-mode=xxx, -mfp-round-mode=xxx, -mtrap-precision=xxx
    -mcpu=xxx for CPU selection
    Support scheduling parameters for EV5.
    Add support for BWX, CIX, and MAX instruction set extensions.
    Support Linux-based GNU systems.
    Support VMS.

Additional supported processors and systems for MIPS targets:

    MIPS4 instruction set.
    R4100, R4300 and R5000 processors.
    N32 and N64 ABI.
    IRIX 6.2.
    SNI SINIX.
    
New features for Intel x86 family:

    Add scheduling parameters for Pentium and Pentium Pro.
    Support stabs on Solaris-x86.
    Intel x86 processors running the SCO OpenServer 5 family.
    Intel x86 processors running DG/UX.
    Intel x86 using Cygwin32 or Mingw32 on Windows 95 and Windows NT.

New features for Motorola 68k family:

    Support for 68060 processor.
    More consistent switches to specify processor.
    Motorola 68k family running AUX.
    68040 running pSOS, ELF object files, DBX debugging.
    Coldfire variant of Motorola m68k family.

New features for the HP PA RISC:

    -mspace and -mno-space
    -mlong-load-store and -mno-long-load-store
    -mbig-switch -mno-big-switch

    GCC on the PA requires either gas-2.7 or the HP assembler; for best
    results using GAS is highly recommended.  GAS is required for -g and
    exception handling support.

New features for SPARC-based systems:

    The ultrasparc cpu.
    The sparclet cpu, supporting only a.out file format.
    Sparc running SunOS 4 with the GNU assembler.
    Sparc running the Linux-based GNU system.
    Embedded Sparc processors running the ELF object file format.
    -mcpu=xxx
    -mtune=xxx
    -malign-loops=xxx
    -malign-jumps=xxx
    -malign-functions=xxx
    -mimpure-text and -mno-impure-text

    Options -mno-v8 and -mno-sparclite are no longer supported on SPARC
    targets.  Options -mcypress, -mv8, -msupersparc, -msparclite, -mf930,
    and -mf934 are deprecated and will be deleted in GCC 2.9.  Use
    -mcpu=xxx instead.

New features for rs6000 and PowerPC systems:

    Solaris 2.51 running on PowerPC's.
    The Linux-based GNU system running on PowerPC's.
    -mcpu=604e,602,603e,620,801,823,mpc505,821,860,power2
    -mtune=xxx
    -mrelocatable-lib, -mno-relocatable-lib
    -msim, -mmve, -memb
    -mupdate, -mno-update
    -mfused-madd, -mno-fused-madd

    -mregnames
    -meabi
    -mcall-linux, -mcall-solaris, -mcall-sysv-eabi, -mcall-sysv-noeabi
    -msdata, -msdata=none, -msdata=default, -msdata=sysv, -msdata=eabi
    -memb, -msim, -mmvme
    -myellowknife, -mads
    wchar_t is now of type long as per the ABI, not unsigned short.
    -p/-pg support
    -mcpu=403 now implies -mstrict-align.
    Implement System V profiling.

    Aix 4.1 GCC targets now default to -mcpu=common so that programs
    compiled can be moved between rs6000 and powerpc based systems.  A
    consequence of this is that -static won't work, and that some programs
    may be slightly slower.

    You can select the default value to use for -mcpu=xxx on rs6000 and
    powerpc targets by using the --with-cpu=xxx option when configuring the
    compiler.  In addition, a new options, -mtune=xxx was added that
    selects the machine to schedule for but does not select the
    architecture level.

    Directory names used for storing the multilib libraries on System V
    and embedded PowerPC systems have been shortened to work with commands
    like tar that have fixed limits on pathname size.

New features for the Hitachi H8/300(H):

    -malign-300
    -ms (for the Hitachi H8/S processor)
    -mint32

New features for the ARM:

    -march=xxx, -mtune=xxx, -mcpu=xxx
    Support interworking with Thumb code.
    ARM processor with a.out object format, COFF, or AOF assembler.
    ARM on "semi-hosted" platform.
    ARM running NetBSD.
    ARM running the Linux-based GNU system.

New feature for Solaris systems:

    GCC installation no longer makes a copy of system include files,
    thus insulating GCC better from updates to the operating system.


Noteworthy changes in GCC version 2.7.2
---------------------------------------

A few bugs have been fixed (most notably the generation of an
invalid assembler opcode on some RS/6000 systems).

Noteworthy changes in GCC version 2.7.1
---------------------------------------

This release fixes numerous bugs (mostly minor) in GCC 2.7.0, but
also contains a few new features, mostly related to specific targets.

Major changes have been made in code to support Windows NT.

The following new targets are supported:

	2.9 BSD on PDP-11
	Linux on m68k
	HP/UX version 10 on HP PA RISC (treated like version 9)
	DEC Alpha running Windows NT

When parsing C, GCC now recognizes C++ style `//' comments unless you
specify `-ansi' or `-traditional'.

The PowerPC System V targets (powerpc-*-sysv, powerpc-*-eabi) now use the
calling sequence specified in the System V Application Binary Interface
Processor Supplement (PowerPC Processor ABI Supplement) rather than the calling
sequence used in GCC version 2.7.0.  That calling sequence was based on the AIX
calling sequence without function descriptors.  To compile code for that older
calling sequence, either configure the compiler for powerpc-*-eabiaix or use
the -mcall-aix switch when compiling and linking.

Noteworthy changes in GCC version 2.7.0
---------------------------------------

GCC now works better on systems that use ".obj" and ".exe" instead of
".o" and no extension.  This involved changes to the driver program,
gcc.c, to convert ".o" names to ".obj" and to GCC's Makefile to use
".obj" and ".exe" in filenames that are not targets.  In order to
build GCC on such systems, you may need versions of GNU make and/or
compatible shells.  At this point, this support is preliminary.

Object file extensions of ".obj" and executable file extensions of
".exe" are allowed when using appropriate version of GNU Make.

Numerous enhancements were made to the __attribute__ facility including
more attributes and more places that support it.  We now support the
"packed", "nocommon", "noreturn", "volatile", "const", "unused",
"transparent_union", "constructor", "destructor", "mode", "section",
"align", "format", "weak", and "alias" attributes.  Each of these
names may also be specified with added underscores, e.g., "__packed__".
__attribute__ may now be applied to parameter definitions, function
definitions, and structure, enum, and union definitions.

GCC now supports returning more structures in registers, as specified by
many calling sequences (ABIs), such as on the HP PA RISC.

A new option '-fpack-struct' was added to automatically pack all structure
members together without holes.

There is a new library (cpplib) and program (cppmain) that at some
point will replace cpp (aka cccp).  To use cppmain as cpp now, pass
the option CCCP=cppmain to make.  The library is already used by the
fix-header program, which should speed up the fixproto script.

New options for supported targets:

    GNU on many targets.
    NetBSD on MIPS, m68k, VAX, and x86.
    LynxOS on x86, m68k, Sparc, and RS/6000.
    VxWorks on many targets.

    Windows/NT on x86 architecture.  Initial support for Windows/NT on Alpha
    (not fully working).

    Many embedded targets, specifically UDI on a29k, aout, coff, elf,
    and vsta "operating systems" on m68k, m88k, mips, sparc, and x86.

Additional support for x86 (i386, i486, and Pentium):

    Work with old and new linkers for Linux-based GNU systems,
	supporting both a.out and ELF.
    FreeBSD on x86.
    Stdcall convention.
    -malign-double, -mregparm=, -malign-loops= and -malign-jumps=  switches.
    On ISC systems, support -Xp like -posix.

Additions for RS/6000:

    Instruction scheduling information for PowerPC 403.
    AIX 4.1 on PowerPC.
    -mstring and -mno-string.
    -msoft-float and floating-point emulation included.
    Preliminary support for PowerPC System V.4 with or without the GNU as.
    Preliminary support for EABI.
    Preliminary support for 64-bit systems.
    Both big and little endian systems.

New features for MIPS-based systems:

    r4650.
    mips4 and R8000.
    Irix 6.0.
    64-bit ABI.
    Allow dollar signs in labels on SGI/Irix 5.x.

New support for HP PA RISC:

    Generation of PIC (requires binutils-2.5.2.u6 or later).
    HP-UX version 9 on HP PA RISC (dynamically links even with -g).
    Processor variants for HP PA RISC: 700, 7100, and 7100LC.
    Automatic generation of long calls when needed.
    -mfast-indirect-calls for kernels and static binaries.

    The called routine now copies arguments passed by invisible reference,
    as required by the calling standard.

Other new miscellaneous target-specific support:

    -mno-multm on a29k.
    -mold-align for i960.
    Configuration for "semi-hosted" ARM.
    -momit-leaf-frame-pointer for M88k.
    SH3 variant of Hitachi Super-H and support both big and little endian.

Changes to Objective-C:

    Bare-bones implementation of NXConstantString has been added,
    which is invoked by the @"string" directive.

    Class * has been changed to Class to conform to the NextSTEP and
    OpenStep runtime.

    Enhancements to make dynamic loading easier.

    The module version number has been updated to Version 7, thus existing
    code will need to be recompiled to use the current run-time library.

GCC now supports the ISO Normative Addendum 1 to the C Standard.
As a result:

    The header <iso646.h> defines macros for C programs written
    in national variants of ISO 646.

    The following digraph tokens are supported:
	<:	:>	<%	%>	%:	%:%:
    These behave like the following, respectively:
	[	]	{	}	#	##

    Digraph tokens are supported unless you specify the `-traditional'
    option; you do not need to specify `-ansi' or `-trigraphs'.  Except
    for contrived and unlikely examples involving preprocessor
    stringizing, digraph interpretation doesn't change the meaning of
    programs; this is unlike trigraph interpretation, which changes the
    meanings of relatively common strings.

    The macro __STDC_VERSION__ has the value 199409L.

  As usual, for full conformance to the standard, you also need a
  C library that conforms.

The following lists changes that have been made to g++.  If some
features mentioned below sound unfamiliar, you will probably want to
look at the recently-released public review copy of the C++ Working
Paper.  For PostScript and PDF (Adobe Acrobat) versions, see the
archive at ftp://research.att.com/dist/stdc++/WP.  For HTML and ASCII
versions, see ftp://ftp.cygnus.com/pub/g++.  On the web, see
http://www.cygnus.com/~mrs/wp-draft.

The scope of variables declared in the for-init-statement has been changed
to conform to http://www.cygnus.com/~mrs/wp-draft/stmt.html#stmt.for; as a
result, packages such as groff 1.09 will not compile unless you specify the
-fno-for-scope flag.  PLEASE DO NOT REPORT THIS AS A BUG; this is a change
mandated by the C++ standardization committee.

Binary incompatibilities:

    The builtin 'bool' type is now the size of a machine word on RISC targets,
    for code efficiency; it remains one byte long on CISC targets.

    Code that does not use #pragma interface/implementation will most
    likely shrink dramatically, as g++ now only emits the vtable for a
    class in the translation unit where its first non-inline, non-abstract
    virtual function is defined.

    Classes that do not define the copy constructor will sometimes be
    passed and returned in registers.  This may illuminate latent bugs in
    your code.

Support for automatic template instantiation has *NOT* been added, due
to a disagreement over design philosophies.

Support for exception handling has been improved; more targets are now
supported, and throws will use the RTTI mechanism to match against the
catch parameter type.  Optimization is NOT SUPPORTED with
-fhandle-exceptions; no need to report this as a bug.

Support for Run-Time Type Identification has been added with -frtti.
This support is still in alpha; one major restriction is that any file
compiled with -frtti must include <typeinfo.h>.

Preliminary support for namespaces has been added.  This support is far
from complete, and probably not useful.

Synthesis of compiler-generated constructors, destructors and
assignment operators is now deferred until the functions are used.

The parsing of expressions such as `a ? b : c = 1' has changed from
`(a ? b : c) = 1' to `a : b ? (c = 1)'.

The code generated for testing conditions, especially those using ||
and &&, is now more efficient.

The operator keywords and, and_eq, bitand, bitor, compl, not, not_eq,
or, or_eq, xor and xor_eq are now supported.  Use -ansi or
-foperator-names to enable them.

The 'explicit' keyword is now supported.  'explicit' is used to mark
constructors and type conversion operators that should not be used
implicitly.

g++ now accepts the typename keyword, though it currently has no
semantics; it can be a no-op in the current template implementation.
You may want to start using it in your code, however, since the
pending rewrite of the template implementation to compile STL properly
(perhaps for 2.8.0, perhaps not) will require you to use it as
indicated by the current draft.

Handling of user-defined type conversion has been overhauled so that
type conversion operators are now found and used properly in
expressions and function calls.

-fno-strict-prototype now only applies to function declarations with
"C" linkage.

g++ now warns about 'if (x=0)' with -Wparentheses or -Wall.

#pragma weak and #pragma pack are supported on System V R4 targets, as
are various other target-specific #pragmas supported by gcc.

new and delete of const types is now allowed (with no additional
semantics).

Explicit instantiation of template methods is now supported.  Also,
'inline template class foo<int>;' can be used to emit only the vtable
for a template class.

With -fcheck-new, g++ will check the return value of all calls to
operator new, and not attempt to modify a returned null pointer.

The template instantiation code now handles more conversions when
passing to a parameter that does not depend on template arguments.
This means that code like 'string s; cout << s;' now works.

Invalid jumps in a switch statement past declarations that require
initializations are now caught.

Functions declared 'extern inline' now have the same linkage semantics
as inline member functions.  On supported targets, where previously
these functions (and vtables, and template instantiations) would have
been defined statically, they will now be defined as weak symbols so
that only one out-of-line definition is used.

collect2 now demangles linker output, and c++filt has become part of
the gcc distribution.

Noteworthy changes in GCC version 2.6.3:

A few more bugs have been fixed.

Noteworthy changes in GCC version 2.6.2:

A few bugs have been fixed.

Names of attributes can now be preceded and followed by double underscores.

Noteworthy changes in GCC version 2.6.1:

Numerous (mostly minor) bugs have been fixed.

The following new configurations are supported:

	GNU on x86 (instead of treating it like MACH)
	NetBSD on Sparc and Motorola 68k
	AIX 4.1 on RS/6000 and PowerPC systems
	Sequent DYNIX/ptx 1.x and 2.x.
	Both COFF and ELF configurations on AViiON without using /bin/gcc
	Windows/NT on x86 architecture; preliminary
	AT&T DSP1610 digital signal processor chips
	i960 systems on bare boards using COFF
	PDP11; target only and not extensively tested

The -pg option is now supported for Alpha under OSF/1 V3.0 or later.

Files with an extension of ".c++" are treated as C++ code.

The -Xlinker and -Wl arguments are now passed to the linker in the
position they were specified on the command line.  This makes it
possible, for example, to pass flags to the linker about specific
object files.

The use of positional arguments to the configure script is no longer
recommended.  Use --target= to specify the target; see the GCC manual.

The 386 now supports two new switches: -mreg-alloc=<string> changes
the default register allocation order used by the compiler, and
-mno-wide-multiply disables the use of the mul/imul instructions that
produce 64 bit results in EAX:EDX from 32 bit operands to do long long
multiplies and 32-bit division by constants.

Noteworthy changes in GCC version 2.6.0:

Numerous bugs have been fixed, in the C and C++ front-ends, as
well as in the common compiler code.

This release includes the C, Objective-C, and C++ compilers.  However,
we have moved the files for the C++ compiler (G++) files to a
subdirectory, cp.  Subsequent releases of GCC will split these files
to a separate TAR file.

The G++ team has been tracking the development of the ANSI standard for C++.
Here are some new features added from the latest working paper:

	* built-in boolean type 'bool', with constants 'true' and 'false'.
	* array new and delete (operator new [] and delete []).
	* WP-conforming lifetime of temporaries.
	* explicit instantiation of templates (template class A<int>;),
          along with an option (-fno-implicit-templates) to disable emission
          of implicitly instantiated templates, obsoletes -fexternal-templates.
	* static member constants (static const int foo = 4; within the
          class declaration).

Many error messages have been improved to tell the user more about the
problem.  Conformance checking with -pedantic-errors has been
improved.  G++ now compiles Fresco.

There is now an experimental implementation of virtual functions using
thunks instead of Cfront-style vtables, enabled with -fvtable-thunks.
This option also enables a heuristic which causes the compiler to only
emit the vtable in the translation unit where its first non-inline
virtual function is defined; using this option and
-fno-implicit-templates, users should be able to avoid #pragma
interface/implementation altogether.

Signatures have been added as a GNU C++ extension.  Using the option
-fhandle-signatures, users are able to turn on recognition of
signatures.  A short introduction on signatures is in the section
`Extension to the C++ Language' in the manual.

The `g++' program is now a C program, rather than a shell script.

Lots and lots and lots of bugs fixes, in nested types, access control,
pointers to member functions, the parser, templates, overload
resolution, etc, etc.

There have been two major enhancements to the Objective-C compiler:

1) Added portability.  It now runs on Alpha, and some problems with
   message forwarding have been addressed on other platforms.

2) Selectors have been redefined to be pointers to structs like:
   { void *sel_id, char *sel_types }, where the sel_id is the unique
   identifier, the selector itself is no longer unique.  

   Programmers should use the new function sel_eq to test selector
   equivalence.

The following major changes have been made to the base compiler and
machine-specific files.

- The MIL-STD-1750A is a new port, but still preliminary.

- The h8/300h is now supported; both the h8/300 and h8/300h ports come
  with 32 bit IEEE 754 software floating point support.

- The 64-bit Sparc (v9) and 64-bit MIPS chips are supported.

- NetBSD is supported on m68k, Intel x86, and pc523 systems and FreeBSD
  on x86.

- COFF is supported on x86, m68k, and Sparc systems running LynxOS.

- 68K systems from Bull and Concurrent are supported and System V
  Release 4 is supported on the Atari.

- GCC supports GAS on the Motorola 3300 (sysV68) and debugging
  (assuming GAS) on the Plexus 68K system.  (However, GAS does not yet
  work on those systems).

- System V Release 4 is supported on MIPS (Tandem).

- For DG/UX, an ELF configuration is now supported, and both the ELF
  and BCS configurations support ELF and COFF object file formats.

- OSF/1 V2.0 is supported on Alpha.

- Function profiling is also supported on Alpha.

- GAS and GDB is supported for Irix 5 (MIPS).

- "common mode" (code that will run on both POWER and PowerPC
  architectures) is now supported for the RS/6000 family; the
  compiler knows about more PPC chips.

- Both NeXTStep 2.1 and 3 are supported on 68k-based architectures.

- On the AMD 29k, the -msoft-float is now supported, as well as
  -mno-sum-in-toc for RS/6000, -mapp-regs and -mflat for Sparc, and
  -membedded-pic for MIPS.

- GCC can now convert division by integer constants into the equivalent
  multiplication and shift operations when that is faster than the
  division.
	
- Two new warning options, -Wbad-function-cast and
  -Wmissing-declarations have been added.

- Configurations may now add machine-specific __attribute__ options on
  type; many machines support the `section' attribute.

- The -ffast-math flag permits some optimization that violate strict
  IEEE rules, such as converting X * 0.0 to 0.0.

Noteworthy changes in GCC version 2.5.8:

This release only fixes a few serious bugs.  These include fixes for a
bug that prevented most programs from working on the RS/6000, a bug
that caused invalid assembler code for programs with a `switch'
statement on the NS32K, a G++ problem that caused undefined names in
some configurations, and several less serious problems, some of which
can affect most configuration.

Noteworthy change in GCC version 2.5.7:

This release only fixes a few bugs, one of which was causing bootstrap
compare errors on some systems.

Noteworthy change in GCC version 2.5.6:

A few backend bugs have been fixed, some of which only occur on one
machine.

The C++ compiler in 2.5.6 includes:

 * fixes for some common crashes
 * correct handling of nested types that are referenced as `foo::bar'
 * spurious warnings about friends being declared static and never
   defined should no longer appear
 * enums that are local to a method in a class, or a class that's
   local to a function, are now handled correctly.  For example:
       class foo { void bar () { enum { x, y } E; x; } };
       void bar () { class foo { enum { x, y } E; E baz; }; }

Noteworthy change in GCC version 2.5.5:

A large number of C++ bugs have been fixed.

The fixproto script adds prototypes conditionally on __cplusplus.

Noteworthy change in GCC version 2.5.4:

A bug fix in passing of structure arguments for the HP-PA architecture
makes code compiled with GCC 2.5.4 incompatible with code compiled
with earlier versions (if it passes struct arguments of 33 to 64 bits,
interspersed with other types of arguments).

Noteworthy change in gcc version 2.5.3:

The method of "mangling" C++ function names has been changed.  So you
must recompile all C++ programs completely when you start using GCC
2.5.  Also, GCC 2.5 requires libg++ version 2.5.  Earlier libg++
versions won't work with GCC 2.5.  (This is generally true--GCC
version M.N requires libg++ version M.N.)

Noteworthy GCC changes in version 2.5:

* There is now support for the IBM 370 architecture as a target.
Currently the only operating system supported is MVS; GCC does not run
on MVS, so you must produce .s files using GCC as a cross compiler,
then transfer them to MVS to assemble them.  This port is not reliable
yet.

* The Power PC is now supported.

* The i860-based Paragon machine is now supported.

* The Hitachi 3050 (an HP-PA machine) is now supported.

* The variable __GNUC_MINOR__ holds the minor version number of GCC, as
an integer.  For version 2.5.X, the value is 5.

* In C, initializers for static and global variables are now processed
an element at a time, so that they don't need a lot of storage.

* The C syntax for specifying which structure field comes next in an
initializer is now `.FIELDNAME='.  The corresponding syntax for
array initializers is now `[INDEX]='.  For example,

  char whitespace[256]
    = { [' '] = 1, ['\t'] = 1, ['\n'] = 1 };

This was changed to accord with the syntax proposed by the Numerical
C Extensions Group (NCEG).

* Complex numbers are now supported in C.  Use the keyword __complex__
to declare complex data types.  See the manual for details.

* GCC now supports `long double' meaningfully on the Sparc (128-bit
floating point) and on the 386 (96-bit floating point).  The Sparc
support is enabled on Solaris 2.x because earlier system versions
(SunOS 4) have bugs in the emulation.

* All targets now have assertions for cpu, machine and system.  So you
can now use assertions to distinguish among all supported targets.

* Nested functions in C may now be inline.  Just declare them inline
in the usual way.

* Packed structure members are now supported fully; it should be possible 
to access them on any supported target, no matter how little alignment
they have.

* To declare that a function does not return, you must now write
something like this (works only in 2.5):

    void fatal () __attribute__ ((noreturn));

or like this (works in older versions too):

    typedef void voidfn ();

    volatile voidfn fatal;

It used to be possible to do so by writing this:

    volatile void fatal ();

but it turns out that ANSI C requires that to mean something
else (which is useless).

Likewise, to declare that a function is side-effect-free
so that calls may be deleted or combined, write
something like this (works only in 2.5):

    int computation () __attribute__ ((const));

or like this (works in older versions too):

    typedef int intfn ();

    const intfn computation;

* The new option -iwithprefixbefore specifies a directory to add to 
the search path for include files in the same position where -I would
put it, but uses the specified prefix just like -iwithprefix.

* Basic block profiling has been enhanced to record the function the
basic block comes from, and if the module was compiled for debugging,
the line number and filename.  A default version of the basic block
support module has been added to libgcc2 that appends the basic block
information to a text file 'bb.out'.  Machine descriptions can now
override the basic block support module in the target macro file.

New features in g++:

* The new flag `-fansi-overloading' for C++.  Use a newly implemented
scheme of argument matching for C++.  It makes g++ more accurately
obey the rules set down in Chapter 13 of the Annotated C++ Reference
Manual (the ARM).  This option will be turned on by default in a
future release.

* The -finline-debug flag is now gone (it was never really used by the
  compiler).

* Recognizing the syntax for pointers to members, e.g., "foo::*bar", has been
  dramatically improved.  You should not get any syntax errors or incorrect
  runtime results while using pointers to members correctly; if you do, it's
  a definite bug.

* Forward declaration of an enum is now flagged as an error.

* Class-local typedefs are now working properly.

* Nested class support has been significantly improved.  The compiler
  will now (in theory) support up to 240 nested classes before hitting
  other system limits (like memory size).

* There is a new C version of the `g++' driver, to replace the old
  shell script.  This should significantly improve the performance of
  executing g++ on a system where a user's PATH environment variable
  references many NFS-mounted filesystems.  This driver also works
  under MS-DOS and OS/2.

* The ANSI committee working on the C++ standard has adopted a new
  keyword `mutable'.  This will allow you to make a specific member be
  modifiable in an otherwise const class.

Noteworthy GCC changes in version 2.4.4:

  A crash building g++ on various hosts (including m68k) has been
  fixed.  Also the g++ compiler no longer reports incorrect
  ambiguities in some situations where they do not exist, and
  const template member functions are now being found properly.

Noteworthy GCC changes in version 2.4:

* On each target, the default is now to return short structures
compatibly with the "usual" compiler on that target.

For most targets, this means the default is to return all structures
in memory, like long structures, in whatever way is used on that
target.  Use -freg-struct-return to enable returning short structures
(and unions) in registers.

This change means that newly compiled binaries are incompatible with
binaries compiled with previous versions of GCC.

On some targets, GCC is itself the usual compiler.  On these targets,
the default way to return short structures is still in registers.
Use -fpcc-struct-return to tell GCC to return them in memory.

* There is now a floating point emulator which can imitate the way all
supported target machines do floating point arithmetic.

This makes it possible to have cross compilation to and from the VAX,
and between machines of different endianness.  However, this works
only when the target machine description is updated to use the new
facilities, and not all have been updated.

This also makes possible support for longer floating point types.
GCC 2.4 supports extended format on the 68K if you use `long double',
for targets that have a 68881.  (When we have run time library
routines for extended floating point, then `long double' will use
extended format on all 68K targets.)

We expect to support extended floating point on the i386 and Sparc in
future versions.

* Building GCC now automatically fixes the system's header files.
This should require no attention.

* GCC now installs an unsigned data type as size_t when it fixes the
header files (on all but a handful of old target machines).
Therefore, the bug that size_t failed to be unsigned is fixed.

* Building and installation are now completely separate.
All new files are constructed during the build process; 
installation just copies them.

* New targets supported: Clipper, Hitachi SH, Hitachi 8300, and Sparc
Lite.

* A totally new and much better Objective C run time system is included.

* Objective C supports many new features.  Alas, I can't describe them
since I don't use that language; however, they are the same ones 
supported in recent versions of the NeXT operating system.

* The builtin functions __builtin_apply_args, __builtin_apply and
__builtin_return let you record the arguments and returned
value of a function without knowing their number or type.

* The builtin string variables __FUNCTION__ and __PRETTY_FUNCTION__
give the name of the function in the source, and a pretty-printed
version of the name.  The two are the same in C, but differ in C++.

* Casts to union types do not yield lvalues.

* ## before an empty rest argument discards the preceding sequence
of non-whitespace characters from the macro definition.
(This feature is subject to change.)


New features specific to C++:

* The manual contains a new section ``Common Misunderstandings with
GNU C++'' that C++ users should read.

* #pragma interface and #pragma implementation let you use the same
C++ source file for both interface and implementation.
However, this mechanism is still in transition.

* Named returned values let you avoid an extra constructor call
when a function result has a class type.

* The C++ operators <? and >? yield min and max, respectively.

* C++ gotos can exit a block safely even if the block has
aggregates that require destructors.

* gcc defines the macro __GNUG__ when compiling C++ programs.

* GNU C++ now correctly distinguishes between the prefix and postfix
forms of overloaded operator ++ and --.  To avoid breaking old
code, if a class defines only the prefix form, the compiler
accepts either ++obj or obj++, unless -pedantic is used.

* If you are using version 2.3 of libg++, you need to rebuild it with
`make CC=gcc' to avoid mismatches in the definition of `size_t'.

Newly documented compiler options:

-fnostartfiles
	Omit the standard system startup files when linking.

-fvolatile-global
	Consider memory references to extern and global data items to
	be volatile.

-idirafter DIR
	Add DIR to the second include path.

-iprefix PREFIX
	Specify PREFIX for later -iwithprefix options.

-iwithprefix DIR
	Add PREFIX/DIR to the second include path.

-mv8
	Emit Sparc v8 code (with integer multiply and divide).
-msparclite
	Emit Sparclite code (roughly v7.5).

-print-libgcc-file-name
	Search for the libgcc.a file, print its absolute file name, and exit.

-Woverloaded-virtual
	Warn when a derived class function declaration may be an error
	in defining a C++ virtual function. 

-Wtemplate-debugging
	When using templates in a C++ program, warn if debugging is
	not yet fully available.

+eN
	Control how C++ virtual function definitions are used
	(like cfront 1.x).

