This file contains information about GCC releases which has been generated
automatically from the online release notes.  It covers releases of GCC
(and the former EGCS project) since EGCS 1.0, on the line of development
that led to GCC 3. For information on GCC 2.8.1 and older releases of GCC 2,
see ONEWS.

======================================================================
http://gcc.gnu.org/gcc-4.8/index.html

                             GCC 4.8 Release Series

   May 22, 2014

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.8.3.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.8.2 relative to previous releases of GCC.

Release History

   GCC 4.8.3
          May 22, 2014 ([2]changes, [3]documentation)

   GCC 4.8.2
          October 16, 2013 ([4]changes, [5]documentation)

   GCC 4.8.1
          May 31, 2013 ([6]changes, [7]documentation)

   GCC 4.8.0
          March 22, 2013 ([8]changes, [9]documentation)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [10]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [11]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [12]GCC
   project web site or contact the [13]GCC development mailing list.

   To obtain GCC please use [14]our mirror sites or [15]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [16]GCC manuals. If that fails, the
    [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
    archives.

   Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [21]maintained by the GCC team. Last modified
   2014-05-22[22].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.8/changes.html
   3. http://gcc.gnu.org/onlinedocs/4.8.3/
   4. http://gcc.gnu.org/gcc-4.8/changes.html
   5. http://gcc.gnu.org/onlinedocs/4.8.2/
   6. http://gcc.gnu.org/gcc-4.8/changes.html
   7. http://gcc.gnu.org/onlinedocs/4.8.1/
   8. http://gcc.gnu.org/gcc-4.8/changes.html
   9. http://gcc.gnu.org/onlinedocs/4.8.0/
  10. http://gcc.gnu.org/gcc-4.8/buildstat.html
  11. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  12. http://gcc.gnu.org/index.html
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/mirrors.html
  15. http://gcc.gnu.org/svn.html
  16. http://gcc.gnu.org/onlinedocs/
  17. mailto:gcc-help@gcc.gnu.org
  18. mailto:gcc@gcc.gnu.org
  19. http://gcc.gnu.org/lists.html
  20. http://www.fsf.org/
  21. http://gcc.gnu.org/about.html
  22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.8/changes.html

                             GCC 4.8 Release Series
                        Changes, New Features, and Fixes

Caveats

   GCC now uses C++ as its implementation language. This means that to
   build GCC from sources, you will need a C++ compiler that understands
   C++ 2003. For more details on the rationale and specific changes,
   please refer to the [1]C++ conversion page.

   To enable the Graphite framework for loop optimizations you now need
   CLooG version 0.18.0 and ISL version 0.11.1. Both can be obtained from
   the [2]GCC infrastructure directory. The installation manual contains
   more information about requirements to build GCC.

   GCC now uses a more aggressive analysis to derive an upper bound for
   the number of iterations of loops using constraints imposed by language
   standards. This may cause non-conforming programs to no longer work as
   expected, such as SPEC CPU 2006 464.h264ref and 416.gamess. A new
   option, -fno-aggressive-loop-optimizations, was added to disable this
   aggressive analysis. In some loops that have known constant number of
   iterations, but undefined behavior is known to occur in the loop before
   reaching or during the last iteration, GCC will warn about the
   undefined behavior in the loop instead of deriving lower upper bound of
   the number of iterations for the loop. The warning can be disabled with
   -Wno-aggressive-loop-optimizations.

   On ARM, a bug has been fixed in GCC's implementation of the AAPCS rules
   for the layout of vectors that could lead to wrong code being
   generated. Vectors larger than 8 bytes in size are now by default
   aligned to an 8-byte boundary. This is an ABI change: code that makes
   explicit use of vector types may be incompatible with binary objects
   built with older versions of GCC. Auto-vectorized code is not affected
   by this change.

   On AVR, support has been removed for the command-line option
   -mshort-calls deprecated in GCC 4.7.

   On AVR, the configure option --with-avrlibc supported since GCC 4.7.2
   is turned on per default for all non-RTEMS configurations. This option
   arranges for a better integration of [3]AVR Libc with avr-gcc. For
   technical details, see [4]PR54461. To turn off the option in non-RTEMS
   configurations, use --with-avrlibc=no. If the compiler is configured
   for RTEMS, the option is always turned off.

   More information on porting to GCC 4.8 from previous versions of GCC
   can be found in the [5]porting guide for this release.

General Optimizer Improvements (and Changes)

     * DWARF4 is now the default when generating DWARF debug information.
       When -g is used on a platform that uses DWARF debugging
       information, GCC will now default to -gdwarf-4
       -fno-debug-types-section.
       GDB 7.5, Valgrind 3.8.0 and elfutils 0.154 debug information
       consumers support DWARF4 by default. Before GCC 4.8 the default
       version used was DWARF2. To make GCC 4.8 generate an older DWARF
       version use -g together with -gdwarf-2 or -gdwarf-3. The default
       for Darwin and VxWorks is still -gdwarf-2 -gstrict-dwarf.
     * A new general optimization level, -Og, has been introduced. It
       addresses the need for fast compilation and a superior debugging
       experience while providing a reasonable level of runtime
       performance. Overall experience for development should be better
       than the default optimization level -O0.
     * A new option -ftree-partial-pre was added to control the partial
       redundancy elimination (PRE) optimization. This option is enabled
       by default at the -O3 optimization level, and it makes PRE more
       aggressive.
     * The option -fconserve-space has been removed; it was no longer
       useful on most targets since GCC supports putting variables into
       BSS without making them common.
     * The struct reorg and matrix reorg optimizations (command-line
       options -fipa-struct-reorg and -fipa-matrix-reorg) have been
       removed. They did not always work correctly, nor did they work with
       link-time optimization (LTO), hence were only applicable to
       programs consisting of a single translation unit.
     * Several scalability bottle-necks have been removed from GCC's
       optimization passes. Compilation of extremely large functions, e.g.
       due to the use of the flatten attribute in the "Eigen" C++ linear
       algebra templates library, is significantly faster than previous
       releases of GCC.
     * Link-time optimization (LTO) improvements:
          + LTO partitioning has been rewritten for better reliability and
            maintanibility. Several important bugs leading to link
            failures have been fixed.
     * Interprocedural optimization improvements:
          + A new symbol table has been implemented. It builds on existing
            callgraph and varpool modules and provide a new API. Unusual
            symbol visibilities and aliases are handled more consistently
            leading to, for example, more aggressive unreachable code
            removal with LTO.
          + The inline heuristic can now bypass limits on the size of of
            inlined functions when the inlining is particularly
            profitable. This happens, for example, when loop bounds or
            array strides get propagated.
          + Values passed through aggregates (either by value or
            reference) are now propagated at the inter-procedural level
            leading to better inlining decisions (for example in the case
            of Fortran array descriptors) and devirtualization.
     * [6]AddressSanitizer , a fast memory error detector, has been added
       and can be enabled via -fsanitize=address. Memory access
       instructions will be instrumented to detect heap-, stack-, and
       global-buffer overflow as well as use-after-free bugs. To get nicer
       stacktraces, use -fno-omit-frame-pointer. The AddressSanitizer is
       available on IA-32/x86-64/x32/PowerPC/PowerPC64 GNU/Linux and on
       x86-64 Darwin.
     * [7]ThreadSanitizer has been added and can be enabled via
       -fsanitize=thread. Instructions will be instrumented to detect data
       races. The ThreadSanitizer is available on x86-64 GNU/Linux.
     * A new local register allocator (LRA) has been implemented, which
       replaces the 26 year old reload pass and improves generated code
       quality. For now it is active on the IA-32 and x86-64 targets.
     * Support for transactional memory has been implemented on the
       following architectures: IA-32/x86-64, ARM, PowerPC, SH, SPARC, and
       Alpha.

New Languages and Language specific improvements

  C family

     * Each diagnostic emitted now includes the original source line and a
       caret '^' indicating the column. The option
       -fno-diagnostics-show-caret suppresses this information.
     * The option -ftrack-macro-expansion=2 is now enabled by default.
       This allows the compiler to display the macro expansion stack in
       diagnostics. Combined with the caret information, an example
       diagnostic showing these two features is:

t.c:1:94: error: invalid operands to binary < (have `struct mystruct' and `float
')
 #define MYMAX(A,B)    __extension__ ({ __typeof__(A) __a = (A); __typeof__(B) _
_b = (B); __a < __b ? __b : __a; })

              ^
t.c:7:7: note: in expansion of macro 'MYMAX'
   X = MYMAX(P, F);
       ^

     * A new -Wsizeof-pointer-memaccess warning has been added (also
       enabled by -Wall) to warn about suspicious length parameters to
       certain string and memory built-in functions if the argument uses
       sizeof. This warning warns e.g. about memset (ptr, 0, sizeof
       (ptr)); if ptr is not an array, but a pointer, and suggests a
       possible fix, or about memcpy (&foo, ptr, sizeof (&foo));.
     * The new option -Wpedantic is an alias for -pedantic, which is now
       deprecated. The forms -Wno-pedantic, -Werror=pedantic, and
       -Wno-error=pedantic work in the same way as for any other -W
       option. One caveat is that -Werror=pedantic is not equivalent to
       -pedantic-errors, since the latter makes into errors some warnings
       that are not controlled by -Wpedantic, and the former only affects
       diagnostics that are disabled when using -Wno-pedantic.
     * The option -Wshadow no longer warns if a declaration shadows a
       function declaration, unless the former declares a function or
       pointer to function, because this is [8]a common and valid case in
       real-world code.

  C++

     * G++ now implements the [9]C++11 thread_local keyword; this differs
       from the GNU __thread keyword primarily in that it allows dynamic
       initialization and destruction semantics. Unfortunately, this
       support requires a run-time penalty for references to
       non-function-local thread_local variables defined in a different
       translation unit even if they don't need dynamic initialization, so
       users may want to continue to use __thread for TLS variables with
       static initialization semantics.
       If the programmer can be sure that no use of the variable in a
       non-defining TU needs to trigger dynamic initialization (either
       because the variable is statically initialized, or a use of the
       variable in the defining TU will be executed before any uses in
       another TU), they can avoid this overhead with the
       -fno-extern-tls-init option.
       OpenMP threadprivate variables now also support dynamic
       initialization and destruction by the same mechanism.
     * G++ now implements the [10]C++11 attribute syntax, e.g.

[[noreturn]] void f();

       and also the alignment specifier, e.g.

alignas(double) int i;

     * G++ now implements [11]C++11 inheriting constructors, e.g.

struct A { A(int); };
struct B: A { using A::A; }; // defines B::B(int)
B b(42); // OK

     * As of GCC 4.8.1, G++ implements the change to decltype semantics
       from [12]N3276.

struct A f();
decltype(f()) g();    // OK, return type of f() is not required to be complete.

     * As of GCC 4.8.1, G++ implements [13]C++11 ref-qualifiers, e.g.

struct A { int f() &; };
int i = A().f();  // error, f() requires an lvalue object

     * G++ now supports a -std=c++1y option for experimentation with
       features proposed for the next revision of the standard, expected
       around 2014. Currently the only difference from -std=c++11 is
       support for return type deduction in normal functions, as proposed
       in [14]N3386. Status of C++1y features in GCC 4.8 can be found
       [15]here.
     * The G++ namespace association extension, __attribute ((strong)),
       has been deprecated. Inline namespaces should be used instead.
     * G++ now supports a -fext-numeric-literal option to control whether
       GNU numeric literal suffixes are accepted as extensions or
       processed as C++11 user-defined numeric literal suffixes. The flag
       is on (use suffixes for GNU literals) by default for -std=gnu++*,
       and -std=c++98. The flag is off (use suffixes for user-defined
       literals) by default for -std=c++11 and later.

    Runtime Library (libstdc++)

     * [16]Improved experimental support for the new ISO C++ standard,
       C++11, including:
          + forward_list meets the allocator-aware container requirements;
          + this_thread::sleep_for(), this_thread::sleep_until() and
            this_thread::yield() are defined without requiring the
            configure option --enable-libstdcxx-time;
     * Improvements to <random>:
          + SSE optimized normal_distribution.
          + Use of hardware RNG instruction for random_device on new x86
            processors (requires the assembler to support the
            instruction.)
       and <ext/random>:
          + New random number engine simd_fast_mersenne_twister_engine
            with an optimized SSE implementation.
          + New random number distributions beta_distribution,
            normal_mv_distribution, rice_distribution,
            nakagami_distribution, pareto_distribution, k_distribution,
            arcsine_distribution, hoyt_distribution.
     * Added --disable-libstdcxx-verbose configure option to disable
       diagnostic messages issued when a process terminates abnormally.
       This may be useful for embedded systems to reduce the size of
       executables that link statically to the library.

  Fortran

     * Compatibility notice:
          + Module files: The version of module files (.mod) has been
            incremented. Fortran MODULEs compiled by earlier GCC versions
            have to be recompiled, when they are USEd by files compiled
            with GCC 4.8. GCC 4.8 is not able to read .mod files created
            by earlier versions; attempting to do so gives an error
            message.
            Note: The ABI of the produced assembler data itself has not
            changed; object files and libraries are fully compatible with
            older versions except as noted below.
          + ABI: Some internal names (used in the assembler/object file)
            have changed for symbols declared in the specification part of
            a module. If an affected module - or a file using it via use
            association - is recompiled, the module and all files which
            directly use such symbols have to be recompiled as well. This
            change only affects the following kind of module symbols:
               o Procedure pointers. Note: C-interoperable function
                 pointers (type(c_funptr)) are not affected nor are
                 procedure-pointer components.
               o Deferred-length character strings.
     * The [17]BACKTRACE intrinsic subroutine has been added. It shows a
       backtrace at an arbitrary place in user code; program execution
       continues normally afterwards.
     * The [18]-Wc-binding-type warning option has been added (disabled by
       default). It warns if the a variable might not be C interoperable;
       in particular, if the variable has been declared using an intrinsic
       type with default kind instead of using a kind parameter defined
       for C interoperability in the intrinsic ISO_C_Binding module.
       Before, this warning was always printed. The -Wc-binding-type
       option is enabled by -Wall.
     * The [19]-Wrealloc-lhs and -Wrealloc-lhs-all warning command-line
       options have been added, which diagnose when code to is inserted
       for automatic (re)allocation of a variable during assignment. This
       option can be used to decide whether it is safe to use
       [20]-fno-realloc-lhs. Additionally, it can be used to find
       automatic (re)allocation in hot loops. (For arrays, replacing
       "var=" by "var(:)=" disables the automatic reallocation.)
     * The [21]-Wcompare-reals command-line option has been added. When
       this is set, warnings are issued when comparing REAL or COMPLEX
       types for equality and inequality; consider replacing a == b by
       abs(a -b) < eps with a suitable eps. -Wcompare-reals is enabled by
       -Wextra.
     * The [22]-Wtarget-lifetime command-line option has been added
       (enabled with -Wall), which warns if the pointer in a pointer
       assignment might outlive its target.
     * Reading floating point numbers which use "q" for the exponential
       (such as 4.0q0) is now supported as vendor extension for better
       compatibility with old data files. It is strongly recommended to
       use for I/O the equivalent but standard conforming "e" (such as
       4.0e0).
       (For Fortran source code, consider replacing the "q" in
       floating-point literals by a kind parameter (e.g. 4.0e0_qp with a
       suitable qp). Note that - in Fortran source code - replacing "q" by
       a simple "e" is not equivalent.)
     * The GFORTRAN_TMPDIR environment variable for specifying a
       non-default directory for files opened with STATUS="SCRATCH", is
       not used anymore. Instead gfortran checks the POSIX/GNU standard
       TMPDIR environment variable. If TMPDIR is not defined, gfortran
       falls back to other methods to determine the directory for
       temporary files as documented in the [23]user manual.
     * [24]Fortran 2003:
          + Support for unlimited polymorphic variables (CLASS(*)) has
            been added. Nonconstant character lengths are not yet
            supported.
     * [25]TS 29113:
          + Assumed types (TYPE(*)) are now supported.
          + Experimental support for assumed-rank arrays (dimension(..))
            has been added. Note that currently gfortran's own array
            descriptor is used, which is different from the one defined in
            TS29113, see [26]gfortran's header file or use the [27]Chasm
            Language Interoperability Tools.

  Go

     * GCC 4.8.2 provides a complete implementation of the Go 1.1.2
       release.
     * GCC 4.8.0 and 4.8.1 implement a preliminary version of the Go 1.1
       release. The library support is not quite complete.
     * Go has been tested on GNU/Linux and Solaris platforms for various
       processors including x86, x86_64, PowerPC, SPARC, and Alpha. It may
       work on other platforms as well.

New Targets and Target Specific Improvements

  AArch64

     * A new port has been added to support AArch64, the new 64-bit
       architecture from ARM. Note that this is a separate port from the
       existing 32-bit ARM port.
     * The port provides initial support for the Cortex-A53 and the
       Cortex-A57 processors with the command line options
       -mcpu=cortex-a53 and -mcpu=cortex-a57.

  ARM

     * Initial support has been added for the AArch32 extensions defined
       in the ARMv8 architecture.
     * Code generation improvements for the Cortex-A7 and Cortex-A15 CPUs.
     * A new option, -mcpu=marvell-pj4, has been added to generate code
       for the Marvell PJ4 processor.
     * The compiler can now automatically generate the VFMA, VFMS, REVSH
       and REV16 instructions.
     * A new vectorizer cost model for Advanced SIMD configurations to
       improve the auto-vectorization strategies used.
     * The scheduler now takes into account the number of live registers
       to reduce the amount of spilling that can occur. This should
       improve code performance in large functions. The limit can be
       removed by using the option -fno-sched-pressure.
     * Improvements have been made to the Marvell iWMMX code generation
       and support for the iWMMX2 SIMD unit has been added. The option
       -mcpu=iwmmxt2 can be used to enable code generation for the latter.
     * A number of code generation improvements for Thumb2 to reduce code
       size when compiling for the M-profile processors.
     * The RTEMS (arm-rtems) port has been updated to use the EABI.
     * Code generation support for the old FPA and Maverick floating-point
       architectures has been removed. Ports that previously relied on
       these features have also been removed. This includes the targets:
          + arm*-*-linux-gnu (use arm*-*-linux-gnueabi)
          + arm*-*-elf (use arm*-*-eabi)
          + arm*-*-uclinux* (use arm*-*-uclinux*eabi)
          + arm*-*-ecos-elf (no alternative)
          + arm*-*-freebsd (no alternative)
          + arm*-wince-pe* (no alternative).

  AVR

     * Support for the "Embedded C" fixed-point has been added. For
       details, see the [28]GCC wiki and the [29]user manual. The support
       is not complete.
     * A new print modifier %r for register operands in inline assembler
       is supported. It will print the raw register number without the
       register prefix 'r':
    /* Return the most significant byte of 'val', a 64-bit value.  */

    unsigned char msb (long long val)
    {
      unsigned char c;
      __asm__ ("mov %0, %r1+7" : "=r" (c) : "r" (val));
      return c;
    }
       The inline assembler in this example will generate code like
    mov r24, 8+7
       provided c is allocated to R24 and val is allocated to R8...R15.
       This works because the GNU assembler accepts plain register numbers
       without register prefix.
     * Static initializers with 3-byte symbols are supported now:
    extern const __memx char foo;
    const __memx void *pfoo = &foo;
       This requires at least Binutils 2.23.

  IA-32/x86-64

     * Allow -mpreferred-stack-boundary=3 for the x86-64 architecture with
       SSE extensions disabled. Since the x86-64 ABI requires 16 byte
       stack alignment, this is ABI incompatible and intended to be used
       in controlled environments where stack space is an important
       limitation. This option will lead to wrong code when functions
       compiled with 16 byte stack alignment (such as functions from a
       standard library) are called with misaligned stack. In this case,
       SSE instructions may lead to misaligned memory access traps. In
       addition, variable arguments will be handled incorrectly for 16
       byte aligned objects (including x87 long double and __int128),
       leading to wrong results. You must build all modules with
       -mpreferred-stack-boundary=3, including any libraries. This
       includes the system libraries and startup modules.
     * Support for the new Intel processor codename Broadwell with RDSEED,
       ADCX, ADOX, PREFETCHW is available through -madx, -mprfchw,
       -mrdseed command-line options.
     * Support for the Intel RTM and HLE intrinsics, built-in functions
       and code generation is available via -mrtm and -mhle.
     * Support for the Intel FXSR, XSAVE and XSAVEOPT instruction sets.
       Intrinsics and built-in functions are available via -mfxsr, -mxsave
       and -mxsaveopt respectively.
     * New -maddress-mode=[short|long] options for x32.
       -maddress-mode=short overrides default 64-bit addresses to 32-bit
       by emitting the 0x67 address-size override prefix. This is the
       default address mode for x32.
     * New built-in functions to detect run-time CPU type and ISA:
          + A built-in function __builtin_cpu_is has been added to detect
            if the run-time CPU is of a particular type. It returns a
            positive integer on a match and zero otherwise. It accepts one
            string literal argument, the CPU name. For example,
            __builtin_cpu_is("westmere") returns a positive integer if the
            run-time CPU is an Intel Core i7 Westmere processor. Please
            refer to the [30]user manual for the list of valid CPU names
            recognized.
          + A built-in function __builtin_cpu_supports has been added to
            detect if the run-time CPU supports a particular ISA feature.
            It returns a positive integer on a match and zero otherwise.
            It accepts one string literal argument, the ISA feature. For
            example, __builtin_cpu_supports("ssse3") returns a positive
            integer if the run-time CPU supports SSSE3 instructions.
            Please refer to the [31]user manual for the list of valid ISA
            names recognized.
       Caveat: If these built-in functions are called before any static
       constructors are invoked, like during IFUNC initialization, then
       the CPU detection initialization must be explicitly run using this
       newly provided built-in function, __builtin_cpu_init. The
       initialization needs to be done only once. For example, this is how
       the invocation would look like inside an IFUNC initializer:
    static void (*some_ifunc_resolver(void))(void)
    {
      __builtin_cpu_init();
      if (__builtin_cpu_is("amdfam10h") ...
      if (__builtin_cpu_supports("popcnt") ...
    }

     * Function Multiversioning Support with G++:
       It is now possible to create multiple function versions each
       targeting a specific processor and/or ISA. Function versions have
       the same signature but different target attributes. For example,
       here is a program with function versions:
    __attribute__ ((target ("default")))
    int foo(void)
    {
      return 1;
    }

    __attribute__ ((target ("sse4.2")))
    int foo(void)
    {
      return 2;
    }

    int main (void)
    {
      int (*p) = &foo;
      assert ((*p)() == foo());
      return 0;
    }

       Please refer to this [32]wiki for more information.
     * The x86 back end has been improved to allow option -fschedule-insns
       to work reliably. This option can be used to schedule instructions
       better and leads to improved performace in certain cases.
     * Windows MinGW-w64 targets (*-w64-mingw*) require at least r5437
       from the Mingw-w64 trunk.
     * Support for new AMD family 15h processors (Steamroller core) is now
       available through the -march=bdver3 and -mtune=bdver3 options.
     * Support for new AMD family 16h processors (Jaguar core) is now
       available through the -march=btver2 and -mtune=btver2 options.

  FRV

     * This target now supports the -fstack-usage command-line option.

  MIPS

     * GCC can now generate code specifically for the R4700, Broadcom XLP
       and MIPS 34kn processors. The associated -march options are
       -march=r4700, -march=xlp and -march=34kn respectively.
     * GCC now generates better DSP code for MIPS 74k cores thanks to
       further scheduling optimizations.
     * The MIPS port now supports the -fstack-check option.
     * GCC now passes the -mmcu and -mno-mcu options to the assembler.
     * Previous versions of GCC would silently accept -fpic and -fPIC for
       -mno-abicalls targets like mips*-elf. This combination was not
       intended or supported, and did not generate position-independent
       code. GCC 4.8 now reports an error when this combination is used.

  PowerPC / PowerPC64 / RS6000

     * SVR4 configurations (GNU/Linux, FreeBSD, NetBSD) no longer save,
       restore or update the VRSAVE register by default. The respective
       operating systems manage the VRSAVE register directly.
     * Large TOC support has been added for AIX through the command line
       option -mcmodel=large.
     * Native Thread-Local Storage support has been added for AIX.
     * VMX (Altivec) and VSX instruction sets now are enabled implicitly
       when targetting processors that support those hardware features on
       AIX 6.1 and above.

  RX

     * This target will now issue a warning message whenever multiple fast
       interrupt handlers are found in the same compilation unit. This
       feature can be turned off by the new
       -mno-warn-multiple-fast-interrupts command-line option.

  S/390, System z

     * Support for the IBM zEnterprise zEC12 processor has been added.
       When using the -march=zEC12 option, the compiler will generate code
       making use of the following new instructions:
          + load and trap instructions
          + 2 new compare and trap instructions
          + rotate and insert selected bits - without CC clobber
       The -mtune=zEC12 option enables zEC12 specific instruction
       scheduling without making use of new instructions.
     * Register pressure sensitive instruction scheduling is enabled by
       default.
     * The ifunc function attribute is enabled by default.
     * memcpy and memcmp invokations on big memory chunks or with run time
       lengths are not generated inline anymore when tuning for z10 or
       higher. The purpose is to make use of the IFUNC optimized versions
       in Glibc.

  SH

     * The default alignment settings have been reduced to be less
       aggressive. This results in more compact code for optimization
       levels other than -Os.
     * Improved support for the __atomic built-in functions:
          + A new option -matomic-model=model selects the model for the
            generated atomic sequences. The following models are
            supported:

              soft-gusa
                      Software gUSA sequences (SH3* and SH4* only). On
                      SH4A targets this will now also partially utilize
                      the movco.l and movli.l instructions. This is the
                      default when the target is sh3*-*-linux* or
                      sh4*-*-linux*.

              hard-llcs
                      Hardware movco.l / movli.l sequences (SH4A only).

              soft-tcb
                      Software thread control block sequences.

              soft-imask
                      Software interrupt flipping sequences (privileged
                      mode only). This is the default when the target is
                      sh1*-*-linux* or sh2*-*-linux*.

              none
                      Generates function calls to the respective __atomic
                      built-in functions. This is the default for SH64
                      targets or when the target is not sh*-*-linux*.

          + The option -msoft-atomic has been deprecated. It is now an
            alias for -matomic-model=soft-gusa.
          + A new option -mtas makes the compiler generate the tas.b
            instruction for the __atomic_test_and_set built-in function
            regardless of the selected atomic model.
          + The __sync functions in libgcc now reflect the selected atomic
            model when building the toolchain.
     * Added support for the mov.b and mov.w instructions with
       displacement addressing.
     * Added support for the SH2A instructions movu.b and movu.w.
     * Various improvements to code generated for integer arithmetic.
     * Improvements to conditional branches and code that involves the T
       bit. A new option -mzdcbranch tells the compiler to favor
       zero-displacement branches. This is enabled by default for SH4*
       targets.
     * The pref instruction will now be emitted by the __builtin_prefetch
       built-in function for SH3* targets.
     * The fmac instruction will now be emitted by the fmaf standard
       function and the __builtin_fmaf built-in function.
     * The -mfused-madd option has been deprecated in favor of the
       machine-independent -ffp-contract option. Notice that the fmac
       instruction will now be generated by default for expressions like a
       * b + c. This is due to the compiler default setting
       -ffp-contract=fast.
     * Added new options -mfsrra and -mfsca to allow the compiler using
       the fsrra and fsca instructions on targets other than SH4A (where
       they are already enabled by default).
     * Added support for the __builtin_bswap32 built-in function. It is
       now expanded as a sequence of swap.b and swap.w instructions
       instead of a library function call.
     * The behavior of the -mieee option has been fixed and the negative
       form -mno-ieee has been added to control the IEEE conformance of
       floating point comparisons. By default -mieee is now enabled and
       the option -ffinite-math-only implicitly sets -mno-ieee.
     * Added support for the built-in functions __builtin_thread_pointer
       and __builtin_set_thread_pointer. This assumes that GBR is used to
       hold the thread pointer of the current thread. Memory loads and
       stores relative to the address returned by __builtin_thread_pointer
       will now also utilize GBR based displacement address modes.
     * The -mdiv= option for targets other than SHmedia has been fixed and
       documented.

  SPARC

     * Added optimized instruction scheduling for Niagara4.

  TILE-Gx

     * Added support for the -mcmodel=MODEL command-line option. The
       models supported are small and large.

  V850

     * This target now supports the E3V5 architecture via the use of the
       new -mv850e3v5 command-line option. It also has experimental
       support for the e3v5 LOOP instruction which can be enabled via the
       new -mloop command-line option.

  XStormy16

     * This target now supports the -fstack-usage command-line option.

Operating Systems

  Windows (Cygwin)

     * Executables are now linked against shared libgcc by default. The
       previous default was to link statically, which can still be done by
       explicitly specifying -static or static-libgcc on the command line.
       However it is strongly advised against, as it will cause problems
       for any application that makes use of DLLs compiled by GCC. It
       should be alright for a monolithic stand-alone application that
       only links against the Windows DLLs, but offers little or no
       benefit.

GCC 4.8.1

   This is the [33]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.8.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   The C++11 <chrono> std::chrono::system_clock and
   std::chrono::steady_clock classes have changed ABI in GCC 4.8.1, they
   both are now separate (never typedefs of each other), both use
   std::chrono::nanoseconds resolution, on most GNU/Linux configurations
   std::chrono::steady_clock is now finally monotonic, and both classes
   are mangled differently than in the previous GCC releases.
   std::chrono::system_clock::now() with std::chrono::microseconds resp.
   std::chrono::seconds resolution is still exported for backwards
   compatibility with default configured libstdc++. Note that libstdc++
   configured with --enable-libstdcxx-time= used to be ABI incompatible
   with default configured libstdc++ for those two classes and no ABI
   compatibility can be offered for those configurations, so any C++11
   code that uses those classes and has been compiled and linked against
   libstdc++ configured with the non-default --enable-libstdcxx-time=
   configuration option needs to be recompiled.

GCC 4.8.2

   This is the [34]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.8.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.8.3

   This is the [35]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.8.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   Support for the new powerpc64le-linux platform has been added. It
   defaults to generating code that conforms to the ELFV2 ABI.


    For questions related to the use of GCC, please consult these web
    pages and the [36]GCC manuals. If that fails, the
    [37]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [38]gcc@gcc.gnu.org. All of [39]our lists have public
    archives.

   Copyright (C) [40]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [41]maintained by the GCC team. Last modified
   2014-05-22[42].

References

   1. http://gcc.gnu.org/wiki/cxx-conversion
   2. ftp://gcc.gnu.org/pub/gcc/infrastructure/
   3. http://www.nongnu.org/avr-libc/
   4. http://gcc.gnu.org/PR54461
   5. http://gcc.gnu.org/gcc-4.8/porting_to.html
   6. https://code.google.com/p/address-sanitizer/
   7. https://code.google.com/p/data-race-test/wiki/ThreadSanitizer
   8. https://lkml.org/lkml/2006/11/28/239
   9. http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
  10. http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
  11. http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
  12. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3276.pdf
  13. http://gcc.gnu.org/gcc-4.8/cxx0x_status.html
  14. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3386.html
  15. http://gcc.gnu.org/projects/cxx1y.html
  16. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
  17. http://gcc.gnu.org/onlinedocs/gfortran/BACKTRACE.html
  18. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
  19. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
  20. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
  21. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
  22. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html
  23. http://gcc.gnu.org/onlinedocs/gfortran/TMPDIR.html
  24. http://gcc.gnu.org/wiki/Fortran2003Status
  25. http://gcc.gnu.org/wiki/TS29113Status
  26. http://gcc.gnu.org/viewcvs/trunk/libgfortran/libgfortran.h?content-type=text%2Fplain&view=co
  27. http://chasm-interop.sourceforge.net/
  28. http://gcc.gnu.org/wiki/avr-gcc#Fixed-Point_Support
  29. http://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html
  30. http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
  31. http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html#X86-Built-in-Functions
  32. http://gcc.gnu.org/wiki/FunctionMultiVersioning
  33. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.1
  34. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.2
  35. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.8.3
  36. http://gcc.gnu.org/onlinedocs/
  37. mailto:gcc-help@gcc.gnu.org
  38. mailto:gcc@gcc.gnu.org
  39. http://gcc.gnu.org/lists.html
  40. http://www.fsf.org/
  41. http://gcc.gnu.org/about.html
  42. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.7/index.html

                             GCC 4.7 Release Series

   April 11, 2013

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.7.3.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.7.2 relative to previous releases of GCC.

Release History

   GCC 4.7.3
          April 11, 2013 ([2]changes, [3]documentation)

   GCC 4.7.2
          September 20, 2012 ([4]changes, [5]documentation)

   GCC 4.7.1
          June 14, 2012 ([6]changes, [7]documentation)

   GCC 4.7.0
          March 22, 2012 ([8]changes, [9]documentation)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [10]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [11]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [12]GCC
   project web site or contact the [13]GCC development mailing list.

   To obtain GCC please use [14]our mirror sites or [15]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [16]GCC manuals. If that fails, the
    [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
    archives.

   Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [21]maintained by the GCC team. Last modified
   2013-04-11[22].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.7/changes.html
   3. http://gcc.gnu.org/onlinedocs/4.7.3/
   4. http://gcc.gnu.org/gcc-4.7/changes.html
   5. http://gcc.gnu.org/onlinedocs/4.7.2/
   6. http://gcc.gnu.org/gcc-4.7/changes.html
   7. http://gcc.gnu.org/onlinedocs/4.7.1/
   8. http://gcc.gnu.org/gcc-4.7/changes.html
   9. http://gcc.gnu.org/onlinedocs/4.7.0/
  10. http://gcc.gnu.org/gcc-4.7/buildstat.html
  11. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  12. http://gcc.gnu.org/index.html
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/mirrors.html
  15. http://gcc.gnu.org/svn.html
  16. http://gcc.gnu.org/onlinedocs/
  17. mailto:gcc-help@gcc.gnu.org
  18. mailto:gcc@gcc.gnu.org
  19. http://gcc.gnu.org/lists.html
  20. http://www.fsf.org/
  21. http://gcc.gnu.org/about.html
  22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.7/changes.html

                             GCC 4.7 Release Series
                        Changes, New Features, and Fixes

Caveats

     * The -fconserve-space flag has been deprecated. The flag had no
       effect for most targets: only targets without a global .bss section
       and without support for switchable sections. Furthermore, the flag
       only had an effect for G++, where it could result in wrong
       semantics (please refer to the GCC manual for further details). The
       flag will be removed in GCC 4.8
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 4.7.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       All GCC ports for the following processor architectures have been
       declared obsolete:
          + picoChip (picochip-*)
       The following ports for individual systems on particular
       architectures have been obsoleted:
          + IRIX 6.5 (mips-sgi-irix6.5)
          + MIPS OpenBSD (mips*-*-openbsd*)
          + Solaris 8 (*-*-solaris2.8). Details can be found in the
            [1]announcement.
          + Tru64 UNIX V5.1 (alpha*-dec-osf5.1*)
     * On ARM, when compiling for ARMv6 (but not ARMv6-M), ARMv7-A,
       ARMv7-R, or ARMv7-M, the new option -munaligned-access is active by
       default, which for some sources generates code that accesses memory
       on unaligned addresses. This requires the kernel of those systems
       to enable such accesses (controlled by CP15 register c1, refer to
       ARM documentation). Alternatively, or for compatibility with
       kernels where unaligned accesses are not supported, all code has to
       be compiled with -mno-unaligned-access. Upstream Linux kernel
       releases have automatically and unconditionally supported unaligned
       accesses as emitted by GCC due to this option being active since
       version 2.6.28.
     * Support on ARM for the legacy floating-point accelerator (FPA) and
       the mixed-endian floating-point format that it used has been
       obsoleted. The ports that still use this format have been obsoleted
       as well. Many legacy ARM ports already provide an alternative that
       uses the VFP floating-point format. The obsolete ports will be
       deleted in the next release.
       The obsolete ports with alternatives are:
          + arm*-*-rtems (use arm*-*-rtemseabi)
          + arm*-*-linux-gnu (use arm*-*-linux-gnueabi)
          + arm*-*-elf (use arm*-*-eabi)
          + arm*-*-uclinux* (use arm*-*-uclinux*eabi)
       Note, however, that these alternatives are not binary compatible
       with their legacy counterparts (although some can support running
       legacy applications).
       The obsolete ports that currently lack a modern alternative are:
          + arm*-*-ecos-elf
          + arm*-*-freebsd
          + arm*-wince-pe*
       New ports that support more recent versions of the architecture are
       welcome.
     * Support for the Maverick co-processor on ARM has been obsoleted.
       Code to support it will be deleted in the next release.
     * Support has been removed for Unix International threads on Solaris
       2, so the --enable-threads=solaris configure option and the
       -threads compiler option don't work any longer.
     * Support has been removed for the Solaris BSD Compatibility Package,
       which lives in /usr/ucbinclude and /usr/ucblib. It has been removed
       from Solaris 11, and was only intended as a migration aid from
       SunOS 4 to SunOS 5. The -compat-bsd compiler option is not
       recognized any longer.
     * The AVR port's libgcc has been improved and its multilib structure
       has been enhanced. As a result, all objects contributing to an
       application must either be compiled with GCC versions up to 4.6.x
       or with GCC versions 4.7.1 or later. If the compiler is used with
       AVR Libc, you need a version that supports the new layout, i.e.
       implements [2]#35407.
     * The AVR port's -mshort-calls command-line option has been
       deprecated. It will be removed in the GCC 4.8 release. See -mrelax
       for a replacement.
     * The AVR port only references startup code that clears .bss and the
       common section resp. initializes the .data and .rodata section
       provided respective sections (or subsections thereof) are not
       empty, see [3]PR18145. Applications that put all static storage
       objects into non-standard sections and / or define all static
       storage objects in assembler modules, must reference __do_clear_bss
       resp. __do_copy_data by hand or undefine the symbol(s) by means of
       -Wl,-u,__do_clear_bss resp. -Wl,-u,__do_copy_data.
     * The ARM port's -mwords-little-endian option has been deprecated. It
       will be removed in a future release.
     * Support has been removed for the NetWare x86 configuration
       obsoleted in GCC 4.6.
     * It is no longer possible to use the "l" constraint in MIPS16 asm
       statements.
     * GCC versions 4.7.0 and 4.7.1 had changes to the C++ standard
       library which affected the ABI in C++11 mode: a data member was
       added to std::list changing its size and altering the definitions
       of some member functions, and std::pair's move constructor was
       non-trivial which altered the calling convention for functions with
       std::pair arguments or return types. The ABI incompatibilities have
       been fixed for GCC version 4.7.2 but as a result C++11 code
       compiled with GCC 4.7.0 or 4.7.1 may be incompatible with C++11
       code compiled with different GCC versions and with C++98/C++03 code
       compiled with any version.
     * On ARM, a bug has been fixed in GCC's implementation of the AAPCS
       rules for the layout of vectors that could lead to wrong code being
       generated. Vectors larger than 8 bytes in size are now by default
       aligned to an 8-byte boundary. This is an ABI change: code that
       makes explicit use of vector types may be incompatible with binary
       objects built with older versions of GCC. Auto-vectorized code is
       not affected by this change. (This change affects GCC versions
       4.7.2 and later.)
     * More information on porting to GCC 4.7 from previous versions of
       GCC can be found in the [4]porting guide for this release.

General Optimizer Improvements

     * Support for a new parameter --param case-values-threshold=n was
       added to allow users to control the cutoff between doing switch
       statements as a series of if statements and using a jump table.
     * Link-time optimization (LTO) improvements:
          + Improved scalability and reduced memory usage. Link time
            optimization of Firefox now requires 3GB of RAM on a 64-bit
            system, while over 8GB was needed previously. Linking time has
            been improved, too. The serial stage of linking Firefox has
            been sped up by about a factor of 10.
          + Reduced size of object files and temporary storage used during
            linking.
          + Streaming performance (both outbound and inbound) has been
            improved.
          + ld -r is now supported with LTO.
          + Several bug fixes, especially in symbol table handling and
            merging.
     * Interprocedural optimization improvements:
          + Heuristics now take into account that after inlining code will
            be optimized out because of known values (or properties) of
            function parameters. For example:
void foo(int a)
{
  if (a > 10)
    ... huge code ...
}
void bar (void)
{
  foo (0);
}

            The call of foo will be inlined into bar even when optimizing
            for code size. Constructs based on __builtin_constant_p are
            now understood by the inliner and code size estimates are
            evaluated a lot more realistically.
          + The representation of C++ virtual thunks and aliases (both
            implicit and defined via the alias attribute) has been
            re-engineered. Aliases no longer pose optimization barriers
            and calls to an alias can be inlined and otherwise optimized.
          + The inter-procedural constant propagation pass has been
            rewritten. It now performs generic function specialization.
            For example when compiling the following:
void foo(bool flag)
{
  if (flag)
    ... do something ...
  else
    ... do something else ...
}
void bar (void)
{
  foo (false);
  foo (true);
  foo (false);
  foo (true);
  foo (false);
  foo (true);
}

            GCC will now produce two copies of foo. One with flag being
            true, while other with flag being false. This leads to
            performance improvements previously possible only by inlining
            all calls. Cloning causes a lot less code size growth.
     * A string length optimization pass has been added. It attempts to
       track string lengths and optimize various standard C string
       functions like strlen, strchr, strcpy, strcat, stpcpy and their
       _FORTIFY_SOURCE counterparts into faster alternatives. This pass is
       enabled by default at -O2 or above, unless optimizing for size, and
       can be disabled by the -fno-optimize-strlen option. The pass can
       e.g. optimize
char *bar (const char *a)
{
  size_t l = strlen (a) + 2;
  char *p = malloc (l); if (p == NULL) return p;
  strcpy (p, a); strcat (p, "/"); return p;
}

       into:
char *bar (const char *a)
{
  size_t tmp = strlen (a);
  char *p = malloc (tmp + 2); if (p == NULL) return p;
  memcpy (p, a, tmp); memcpy (p + tmp, "/", 2); return p;
}

       or for hosted compilations where stpcpy is available in the runtime
       and headers provide its prototype, e.g.
void foo (char *a, const char *b, const char *c, const char *d)
{
  strcpy (a, b); strcat (a, c); strcat (a, d);
}

       can be optimized into:
void foo (char *a, const char *b, const char *c, const char *d)
{
  strcpy (stpcpy (stpcpy (a, b), c), d);
}

New Languages and Language specific improvements

     * Version 3.1 of the [5]OpenMP specification is now supported for the
       C, C++, and Fortran compilers.

  Ada

     * The command-line option -feliminate-unused-debug-types has been
       re-enabled by default, as it is for the other languages, leading to
       a reduction in debug info size of 12.5% and more for relevant
       cases, as well as to a small compilation speedup.

  C family

     * A new built-in, __builtin_assume_aligned, has been added, through
       which the compiler can be hinted about pointer alignment and can
       use it to improve generated code.
     * A new warning option -Wunused-local-typedefs was added for C, C++,
       Objective-C and Objective-C++. This warning diagnoses typedefs
       locally defined in a function, and otherwise not used.
     * A new experimental command-line option -ftrack-macro-expansion was
       added for C, C++, Objective-C, Objective-C++ and Fortran. It allows
       the compiler to emit diagnostic about the current macro expansion
       stack when a compilation error occurs in a macro expansion.
     * Experimental support for transactional memory has been added. It
       includes support in the compiler, as well as a supporting runtime
       library called libitm. To compile code with transactional memory
       constructs, use the -fgnu-tm option.
       Support is currently available for Alpha, ARM, PowerPC, SH, SPARC,
       and 32-bit/64-bit x86 platforms.
       For more details on transactional memory see [6]the GCC WiKi.
     * Support for atomic operations specifying the C++11/C11 memory model
       has been added. These new __atomic routines replace the existing
       __sync built-in routines.
       Atomic support is also available for memory blocks. Lock-free
       instructions will be used if a memory block is the same size and
       alignment as a supported integer type. Atomic operations which do
       not have lock-free support are left as function calls. A set of
       library functions is available on the GCC atomic wiki in the
       "External Atomics Library" section.
       For more details on the memory models and features, see the
       [7]atomic wiki.
     * When a binary operation is performed on vector types and one of the
       operands is a uniform vector, it is possible to replace the vector
       with the generating element. For example:
typedef int v4si __attribute__ ((vector_size (16)));
v4si res, a = {1,2,3,4};
int x;

res = 2 + a;  /* means {2,2,2,2} + a  */
res = a - x;  /* means a - {x,x,x,x}  */

  C

     * There is support for some more features from the C11 revision of
       the ISO C standard. GCC now accepts the options -std=c11 and
       -std=gnu11, in addition to the previous -std=c1x and -std=gnu1x.
          + Unicode strings (previously supported only with options such
            as -std=gnu11, now supported with -std=c11), and the
            predefined macros __STDC_UTF_16__ and __STDC_UTF_32__.
          + Nonreturning functions (_Noreturn and <stdnoreturn.h>).
          + Alignment support (_Alignas, _Alignof, max_align_t,
            <stdalign.h>).
          + A built-in function __builtin_complex is provided to support C
            library implementation of the CMPLX family of macros.

  C++

     * G++ now accepts the -std=c++11, -std=gnu++11, and -Wc++11-compat
       options, which are equivalent to -std=c++0x, -std=gnu++0x, and
       -Wc++0x-compat, respectively.
     * G++ now implements [8]C++11 extended friend syntax:

template<class W>
class Q
{
  static const int I = 2;
public:
  friend W;
};

struct B
{
  int ar[Q<B>::I];
};

     * Thanks to Ville Voutilainen, G++ now implements [9]C++11 explicit
       override control.

struct B {
  virtual void f() const final;
  virtual void f(int);
};

struct D : B {
  void f() const;            // error: D::f attempts to override final B::f
  void f(long) override;     // error: doesn't override anything
  void f(int) override;      // ok
};

struct E final { };
struct F: E { }; // error: deriving from final class

     * G++ now implements [10]C++11 non-static data member initializers.

struct A {
  int i = 42;
} a; // initializes a.i to 42

     * Thanks to Ed Smith-Rowland, G++ now implements [11]C++11
       user-defined literals.

// Not actually a good approximation.  :)
constexpr long double operator"" _degrees (long double d) { return d * 0.0175; }
long double pi = 180.0_degrees;

     * G++ now implements [12]C++11 alias-declarations.

template <class T> using Ptr = T*;
Ptr<int> ip;  // decltype(ip) is int*

     * Thanks to Ville Voutilainen and Pedro Lamarao, G++ now implements
       [13]C++11 delegating constructors.

struct A {
  A(int);
  A(): A(42) { } // delegate to the A(int) constructor
};

     * G++ now fully implements C++11 atomic classes rather than just
       integer derived classes.

class POD {
  int a;
  int b;
};
std::atomic<POD> my_atomic_POD;

     * G++ now sets the predefined macro __cplusplus to the correct value,
       199711L for C++98/03, and 201103L for C++11.
     * G++ now correctly implements the two-phase lookup rules such that
       an unqualified name used in a template must have an appropriate
       declaration found either in scope at the point of definition of the
       template or by argument-dependent lookup at the point of
       instantiation. As a result, code that relies on a second
       unqualified lookup at the point of instantiation to find functions
       declared after the template or in dependent bases will be rejected.
       The compiler will suggest ways to fix affected code, and using the
       -fpermissive compiler flag will allow the code to compile with a
       warning.

template <class T>
void f() { g(T()); } // error, g(int) not found by argument-dependent lookup
void g(int) { } // fix by moving this declaration before the declaration of f

template <class T>
struct A: T {
  // error, B::g(B) not found by argument-dependent lookup
  void f() { g(T()); } // fix by using this->g or A::g
};

struct B { void g(B); };

int main()
{
  f<int>();
  A<B>().f();
}

     * G++ now properly re-uses stack space allocated for temporary
       objects when their lifetime ends, which can significantly lower
       stack consumption for some C++ functions. As a result of this, some
       code with undefined behavior will now break:

const int &f(const int &i) { return i; }
....
const int &x = f(1);
const int &y = f(2);

       Here, x refers to the temporary allocated to hold the 1 argument,
       which only lives until the end of the initialization; it
       immediately becomes a dangling reference. So the next statement
       re-uses the stack slot to hold the 2 argument, and users of x get
       that value instead.
       Note that this should not cause any change of behavior for
       temporaries of types with non-trivial destructors, as they are
       already destroyed at end of full-expression; the change is that now
       the storage is released as well.
     * A new command-line option -Wdelete-non-virtual-dtor has been added
       to warn when delete is used to destroy an instance of a class which
       has virtual functions and non-virtual destructor. It is unsafe to
       delete an instance of a derived class through a pointer to a base
       class if the base class does not have a virtual destructor. This
       warning is enabled by -Wall.
     * A new command-line option -Wzero-as-null-pointer-constant has been
       added to warn when a literal '0' is used as null pointer constant.
       It can be useful to facilitate the conversion to nullptr in C++11.
     * As per C++98, access-declarations are now deprecated by G++.
       Using-declarations are to be used instead. Furthermore, some
       efforts have been made to improve the support of class scope
       using-declarations. In particular, using-declarations referring to
       a dependent type now work as expected ([14]bug c++/14258).
     * The ELF symbol visibility of a template instantiation is now
       properly constrained by the visibility of its template arguments
       ([15]bug c++/35688).

    Runtime Library (libstdc++)

     * [16]Improved experimental support for the new ISO C++ standard,
       C++11, including:
          + using noexcept in most of the library;
          + implementations of pointer_traits, allocator_traits and
            scoped_allocator_adaptor;
          + uses-allocator construction for tuple;
          + vector meets the allocator-aware container requirements;
          + replacing monotonic_clock with steady_clock;
          + enabling the thread support library on most POSIX targets;
          + many small improvements to conform to the FDIS.
     * Added --enable-clocale=newlib configure option.
     * Debug Mode iterators for unordered associative containers.
     * Avoid polluting the global namespace and do not include <unistd.h>.

  Fortran

     * The compile flag [17]-fstack-arrays has been added, which causes
       all local arrays to be put on stack memory. For some programs this
       will improve the performance significantly. If your program uses
       very large local arrays, it is possible that you will have to
       extend your runtime limits for stack memory.
     * The [18]-Ofast flag now also implies [19]-fno-protect-parens and
       [20]-fstack-arrays.
     * Front-end optimizations can now be selected by the
       [21]-ffrontend-optimize option and deselected by the
       -fno-frontend-optimize option.
     * When front-end optimization removes a function call,
       [22]-Wfunction-elimination warns about that.
     * When performing front-end-optimization, the
       [23]-faggressive-function-elimination option allows the removal of
       duplicate function calls even for impure functions.
     * The flag [24]-Wreal-q-constant has been added, which warns if
       floating-point literals have been specified using q (such as
       1.0q0); the q marker is now supported as a vendor extension to
       denote quad precision (REAL(16) or, if not available, REAL(10)).
       Consider using a kind parameter (such as in 1.0_qp) instead, which
       can be obtained via [25]SELECTED_REAL_KIND.
     * The GFORTRAN_USE_STDERR environment variable has been removed. GNU
       Fortran now always prints error messages to standard error. If you
       wish to redirect standard error, please consult the manual for your
       OS, shell, batch environment etc. as appropriate.
     * The -fdump-core option and GFORTRAN_ERROR_DUMPCORE environment
       variable have been removed. When encountering a serious error,
       gfortran will now always abort the program. Whether a core dump is
       generated depends on the user environment settings; see the ulimit
       -c setting for POSIX shells, limit coredumpsize for C shells, and
       the [26]WER user-mode dumps settings on Windows.
     * The [27]-fbacktrace option is now enabled by default. When
       encountering a fatal error, gfortran will attempt to print a
       backtrace to standard error before aborting. It can be disabled
       with -fno-backtrace. Note: On POSIX targets with the addr2line
       utility from GNU binutils, GNU Fortran can print a backtrace with
       function name, file name, line number information in addition to
       the addresses; otherwise only the addresses are printed.
     * [28]Fortran 2003:
          + Generic interface names which have the same name as derived
            types are now supported, which allows to write constructor
            functions. Note that Fortran does not support static
            constructor functions; only default initialization or an
            explicit structure-constructor initialization are available.
          + [29]Polymorphic (class) arrays are now supported.
     * [30]Fortran 2008:
          + Support for the DO CONCURRENT construct has been added, which
            allows the user to specify that individual loop iterations
            have no interdependencies.
          + [31]Coarrays: Full single-image support except for polymorphic
            coarrays. Additionally, preliminary support for multiple
            images via an MPI-based [32]coarray communication library has
            been added. Note: The library version is not yet usable as
            remote coarray access is not yet possible.
     * [33]TS 29113:
          + New flag [34]-std=f2008ts permits programs that are expected
            to conform to the Fortran 2008 standard and the draft
            Technical Specification (TS) 29113 on Further Interoperability
            of Fortran with C.
          + The OPTIONAL attribute is now allowed for dummy arguments of
            BIND(C) procedures.
          + The RANK intrinsic has been added.
          + The implementation of the ASYNCHRONOUS attribute in GCC is
            compatible with the candidate draft of TS 29113 (since GCC
            4.6).

  Go

     * GCC 4.7 implements the [35]Go 1 language standard. The library
       support in 4.7.0 is not quite complete, due to release timing.
       Release 4.7.1 includes complete support for Go 1. The Go library is
       from the Go 1.0.1 release.
     * Go has been tested on GNU/Linux and Solaris platforms. It may work
       on other platforms as well.

New Targets and Target Specific Improvements

  ARM

     * GCC now supports the Cortex-A7 processor implementing the v7-a
       version of the architecture using the option -mcpu=cortex-a7.
     * The default vector size in auto-vectorization for NEON is now 128
       bits. If vectorization fails thusly, the vectorizer tries again
       with 64-bit vectors.
     * A new option -mvectorize-with-neon-double was added to allow users
       to change the vector size to 64 bits.

  AVR

     * GCC now supports the XMEGA architecture. This requires GNU binutils
       2.22 or later.
     * Support for the [36]named address spaces __flash, __flash1, ...,
       __flash5 and __memx has been added. These address spaces locate
       read-only data in flash memory and allow reading from flash memory
       by means of ordinary C code, i.e. without the need of (inline)
       assembler code:

const __flash int values[] = { 42, 31 };

int add_values (const __flash int *p, int i)
{
    return values[i] + *p;
}

     * Support has been added for the AVR-specific configure option
       --with-avrlibc=yes in order to arrange for better integration of
       [37]AVR-Libc. This configure option is supported in avr-gcc 4.7.2
       and newer and will only take effect in non-RTEMS configurations. If
       avr-gcc is configured for RTEMS, the option will be ignored which
       is the same as specifying --with-avrlibc=no. See [38]PR54461 for
       more technical details.
     * Support for AVR-specific [39]built-in functions has been added.
     * Support has been added for the signed and unsigned 24-bit scalar
       integer types __int24 and __uint24.
     * New command-line options -maccumulate-args, -mbranch-cost=cost and
       -mstrict-X were added to allow better fine-tuning of code
       optimization.
     * The command option -fdata-sections now also takes affect on the
       section names of variables with the progmem attribute.
     * A new inline assembler print modifier %i to print a RAM address as
       I/O address has been added:

#include <avr/io.h> /* Port Definitions from AVR-LibC */

void set_portb (uint8_t value)
{
    asm volatile ("out %i0, %1" :: "n" (&PORTB), "r" (value) : "memory");
}

       The offset between an I/O address and the RAM address for that I/O
       location is device-specific. This offset is taken into account when
       printing a RAM address with the %i modifier so that the address is
       suitable to be used as operand in an I/O command. The address must
       be a constant integer known at compile time.
     * The inline assembler constraint "R" to represent integers in the
       range -6 ... 5 has been removed without replacement.
     * Many optimizations to:
          + 64-bit integer arithmetic
          + Widening multiplication
          + Integer division by a constant
          + Avoid constant reloading in multi-byte instructions.
          + Micro-optimizations for special instruction sequences.
          + Generic built-in functions like __builtin_ffs*,
            __builtin_clz*, etc.
          + If-else decision trees generated by switch instructions
          + Merging of data located in flash memory
          + New libgcc variants for devices with 8-bit wide stack pointer
          + ...
     * Better documentation:
          + Handling of EIND and indirect jumps on devices with more than
            128 KiB of program memory.
          + Handling of the RAMPD, RAMPX, RAMPY and RAMPZ special function
            registers.
          + Function attributes OS_main and OS_task.
          + AVR-specific built-in macros.

  C6X

     * Support has been added for the Texas Instruments C6X family of
       processors.

  CR16

     * Support has been added for National Semiconductor's CR16
       architecture.

  Epiphany

     * Support has been added for Adapteva's Epiphany architecture.

  IA-32/x86-64

     * Support for Intel AVX2 intrinsics, built-in functions and code
       generation is available via -mavx2.
     * Support for Intel BMI2 intrinsics, built-in functions and code
       generation is available via -mbmi2.
     * Implementation and automatic generation of __builtin_clz* using the
       lzcnt instruction is available via -mlzcnt.
     * Support for Intel FMA3 intrinsics and code generation is available
       via -mfma.
     * A new -mfsgsbase command-line option is available that makes GCC
       generate new segment register read/write instructions through
       dedicated built-ins.
     * Support for the new Intel rdrnd instruction is available via
       -mrdrnd.
     * Two additional AVX vector conversion instructions are available via
       -mf16c.
     * Support for new Intel processor codename IvyBridge with RDRND,
       FSGSBASE and F16C is available through -march=core-avx-i.
     * Support for the new Intel processor codename Haswell with AVX2,
       FMA, BMI, BMI2, LZCNT is available through -march=core-avx2.
     * Support for new AMD family 15h processors (Piledriver core) is now
       available through -march=bdver2 and -mtune=bdver2 options.
     * Support for [40]the x32 psABI is now available through the -mx32
       option.
     * Windows mingw targets are using the -mms-bitfields option by
       default.
     * Windows x86 targets are using the __thiscall calling convention for
       C++ class-member functions.
     * Support for the configure option --with-threads=posix for Windows
       mingw targets.

  MIPS

     * GCC now supports thread-local storage (TLS) for MIPS16. This
       requires GNU binutils 2.22 or later.
     * GCC can now generate code specifically for the Cavium Octeon+ and
       Octeon2 processors. The associated command-line options are
       -march=octeon+ and -march=octeon2 respectively. Both options
       require GNU binutils 2.22 or later.
     * GCC can now work around certain 24k errata, under the control of
       the command-line option -mfix-24k. These workarounds require GNU
       binutils 2.20 or later.
     * 32-bit MIPS GNU/Linux targets such as mips-linux-gnu can now build
       n32 and n64 multilibs. The result is effectively a 64-bit GNU/Linux
       toolchain that generates 32-bit code by default. Use the
       configure-time option --enable-targets=all to select these extra
       multilibs.
     * Passing -fno-delayed-branch now also stops the assembler from
       automatically filling delay slots.

  PowerPC/PowerPC64

     * Vectors of type vector long long or vector long are passed and
       returned using the same method as other vectors with the VSX
       instruction set. Previously GCC did not adhere to the ABI for
       128-bit vectors with 64-bit integer base types (PR 48857). This
       will also be fixed in the GCC 4.6.1 and 4.5.4 releases.
     * A new option -mno-pointers-to-nested-functions was added to allow
       AIX 32-bit/64-bit and GNU/Linux 64-bit PowerPC users to specify
       that the compiler should not load up the chain register (r11)
       before calling a function through a pointer. If you use this
       option, you cannot call nested functions through a pointer, or call
       other languages that might use the static chain.
     * A new option msave-toc-indirect was added to allow AIX
       32-bit/64-bit and GNU/Linux 64-bit PowerPC users control whether we
       save the TOC in the prologue for indirect calls or generate the
       save inline. This can speed up some programs that call through a
       function pointer a lot, but it can slow down other functions that
       only call through a function pointer in exceptional cases.
     * The PowerPC port will now enable machine-specific built-in
       functions when the user switches the target machine using the
       #pragma GCC target or __attribute__ ((__target__ ("target"))) code
       sequences. In addition, the target macros are updated. However, due
       to the way the -save-temps switch is implemented, you won't see the
       effect of these additional macros being defined in preprocessor
       output.

  SH

     * A new option -msoft-atomic has been added. When it is specified,
       GCC will generate GNU/Linux-compatible gUSA atomic sequences for
       the new __atomic routines.
     * Since it is neither supported by GAS nor officially documented,
       code generation for little endian SH2A has been disabled.
       Specifying -ml with -m2a* will now result in a compiler error.
     * The defunct -mbranch-cost option has been fixed.
     * Some improvements to the generated code of:
          + Utilization of the tst #imm,R0 instruction.
          + Dynamic shift instructions on SH2A.
          + Integer absolute value calculations.
     * The -mdiv= option for targets other than SHmedia has been fixed and
       documented.

  SPARC

     * The option -mflat has been reinstated. When it is specified, the
       compiler will generate code for a single register window model.
       This is essentially a new implementation and the corresponding
       debugger support has been added to GDB 7.4.
     * Support for the options -mtune=native and -mcpu=native has been
       added on selected native platforms (GNU/Linux and Solaris).
     * Support for the SPARC T3 (Niagara 3) processor has been added.
     * VIS:
          + An intrinsics header visintrin.h has been added.
          + Builtin intrinsics for the VIS 1.0 edge handling and pixel
            compare instructions have been added.
          + The little-endian version of alignaddr is now supported.
          + When possible, VIS builtins are marked const, which should
            increase the compiler's ability to optimize VIS operations.
          + The compiler now properly tracks the %gsr register and how it
            behaves as an input for various VIS instructions.
          + Akin to fzero, the compiler can now generate fone instructions
            in order to set all of the bits of a floating-point register
            to 1.
          + The documentation for the VIS intrinsics in the GCC manual has
            been brought up to date and many inaccuracies were fixed.
          + Intrinsics for the VIS 2.0 bmask, bshuffle, and
            non-condition-code setting edge instructions have been added.
            Their availability is controlled by the new -mvis2 and
            -mno-vis2 options. They are enabled by default on
            UltraSPARC-III and later CPUs.
     * Support for UltraSPARC Fused Multiply-Add floating-point extensions
       has been added. These instructions are enabled by default on SPARC
       T3 (Niagara 3) and later CPUs.

  TILE-Gx/TILEPro

     * Support has been added for the Tilera TILE-Gx and TILEPro families
       of processors.

Other significant improvements

     * A new option (-grecord-gcc-switches) was added that appends
       compiler command-line options that might affect code generation to
       the DW_AT_producer attribute string in the DWARF debugging
       information.
     * GCC now supports various new GNU extensions to the DWARF debugging
       information format, like [41]entry value and [42]call site
       information, [43]typed DWARF stack or [44]a more compact macro
       representation. Support for these extensions has been added to GDB
       7.4. They can be disabled through the -gstrict-dwarf command-line
       option.

GCC 4.7.1

   This is the [45]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.7.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   The Go frontend in the 4.7.1 release fully supports the [46]Go 1
   language standard.

GCC 4.7.2

   This is the [47]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.7.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.7.3

   This is the [48]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.7.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [49]GCC manuals. If that fails, the
    [50]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [51]gcc@gcc.gnu.org. All of [52]our lists have public
    archives.

   Copyright (C) [53]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [54]maintained by the GCC team. Last modified
   2013-04-11[55].

References

   1. http://gcc.gnu.org/ml/gcc-patches/2011-03/msg01263.html
   2. http://savannah.nongnu.org/bugs/?35407
   3. http://gcc.gnu.org/PR18145
   4. http://gcc.gnu.org/gcc-4.7/porting_to.html
   5. http://openmp.org/wp/openmp-specifications/
   6. http://gcc.gnu.org/wiki/TransactionalMemory
   7. http://gcc.gnu.org/wiki/Atomic/GCCMM
   8. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
   9. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
  10. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
  11. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
  12. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
  13. http://gcc.gnu.org/gcc-4.7/cxx0x_status.html
  14. http://gcc.gnu.org/PR14258
  15. http://gcc.gnu.org/PR35688
  16. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011
  17. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
  18. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Optimize-Options.html#index-Ofast-689
  19. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfno-protect-parens_007d-270
  20. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfstack-arrays_007d-254
  21. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfrontend-optimize_007d-275
  22. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWfunction-elimination_007d-170
  23. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfaggressive-function-elimination_007d-270
  24. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWreal-q-constant_007d-149
  25. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/SELECTED_005fREAL_005fKIND.html
  26. http://msdn.microsoft.com/en-us/library/bb787181%28v=vs.85%29.aspx
  27. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Debugging-Options.html#index-g_t_0040code_007bfno-backtrace_007d-183
  28. http://gcc.gnu.org/wiki/Fortran2003Status
  29. http://gcc.gnu.org/wiki/OOP
  30. http://gcc.gnu.org/wiki/Fortran2008Status
  31. http://gcc.gnu.org/wiki/Coarray
  32. http://gcc.gnu.org/wiki/CoarrayLib
  33. http://gcc.gnu.org/wiki/TS29113Status
  34. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bstd_003d_007d_0040var_007bstd_007d-option-53
  35. http://weekly.golang.org/doc/go1.html
  36. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Named-Address-Spaces.html
  37. http://nongnu.org/avr-libc/
  38. http://gcc.gnu.org/PR54461
  39. http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/AVR-Built%5f002din-Functions.html
  40. https://sites.google.com/site/x32abi/
  41. http://www.dwarfstd.org/ShowIssue.php?issue=100909.1
  42. http://www.dwarfstd.org/ShowIssue.php?issue=100909.2
  43. http://www.dwarfstd.org/doc/040408.1.html
  44. http://www.dwarfstd.org/ShowIssue.php?issue=110722.1
  45. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.1
  46. http://weekly.golang.org/doc/go1.html
  47. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.2
  48. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.7.3
  49. http://gcc.gnu.org/onlinedocs/
  50. mailto:gcc-help@gcc.gnu.org
  51. mailto:gcc@gcc.gnu.org
  52. http://gcc.gnu.org/lists.html
  53. http://www.fsf.org/
  54. http://gcc.gnu.org/about.html
  55. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.6/index.html

                             GCC 4.6 Release Series

   April 12, 2013

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.6.4.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.6.3 relative to previous releases of GCC.

Release History

   GCC 4.6.4
          April 12, 2013 ([2]changes, [3]documentation)

   GCC 4.6.3
          March 1, 2012 ([4]changes, [5]documentation)

   GCC 4.6.2
          October 26, 2011 ([6]changes, [7]documentation)

   GCC 4.6.1
          June 27, 2011 ([8]changes, [9]documentation)

   GCC 4.6.0
          March 25, 2011 ([10]changes, [11]documentation)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [12]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [13]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [14]GCC
   project web site or contact the [15]GCC development mailing list.

   To obtain GCC please use [16]our mirror sites or [17]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [18]GCC manuals. If that fails, the
    [19]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [20]gcc@gcc.gnu.org. All of [21]our lists have public
    archives.

   Copyright (C) [22]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [23]maintained by the GCC team. Last modified
   2013-04-12[24].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.6/changes.html
   3. http://gcc.gnu.org/onlinedocs/4.6.4/
   4. http://gcc.gnu.org/gcc-4.6/changes.html
   5. http://gcc.gnu.org/onlinedocs/4.6.3/
   6. http://gcc.gnu.org/gcc-4.6/changes.html
   7. http://gcc.gnu.org/onlinedocs/4.6.2/
   8. http://gcc.gnu.org/gcc-4.6/changes.html
   9. http://gcc.gnu.org/onlinedocs/4.6.1/
  10. http://gcc.gnu.org/gcc-4.6/changes.html
  11. http://gcc.gnu.org/onlinedocs/4.6.0/
  12. http://gcc.gnu.org/gcc-4.6/buildstat.html
  13. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  14. http://gcc.gnu.org/index.html
  15. mailto:gcc@gcc.gnu.org
  16. http://gcc.gnu.org/mirrors.html
  17. http://gcc.gnu.org/svn.html
  18. http://gcc.gnu.org/onlinedocs/
  19. mailto:gcc-help@gcc.gnu.org
  20. mailto:gcc@gcc.gnu.org
  21. http://gcc.gnu.org/lists.html
  22. http://www.fsf.org/
  23. http://gcc.gnu.org/about.html
  24. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.6/changes.html

                             GCC 4.6 Release Series
                        Changes, New Features, and Fixes

Caveats

     * The options -b <machine> and -V <version> have been removed because
       they were unreliable. Instead, users should directly run
       <machine>-gcc when cross-compiling, or <machine>-gcc-<version> to
       run a different version of gcc.
     * GCC now has stricter checks for invalid command-line options. In
       particular, when gcc was called to link object files rather than
       compile source code, it would previously accept and ignore all
       options starting with --, including linker options such as
       --as-needed and --export-dynamic, although such options would
       result in errors if any source code was compiled. Such options, if
       unknown to the compiler, are now rejected in all cases; if the
       intent was to pass them to the linker, options such as
       -Wl,--as-needed should be used.
     * Versions of the GNU C library up to and including 2.11.1 included
       an [1]incorrect implementation of the cproj function. GCC optimizes
       its builtin cproj according to the behavior specified and allowed
       by the ISO C99 standard. If you want to avoid discrepancies between
       the C library and GCC's builtin transformations when using cproj in
       your code, use GLIBC 2.12 or later. If you are using an older GLIBC
       and actually rely on the incorrect behavior of cproj, then you can
       disable GCC's transformations using -fno-builtin-cproj.
     * The C-only intermodule optimization framework (IMA, enabled by
       -combine) has been removed in favor of the new generic link-time
       optimization framework (LTO) introduced in [2]GCC 4.5.0.
     * GCC now ships with the LGPL-licensed libquadmath library, which
       provides quad-precision mathematical functions for targets with a
       __float128 datatype. __float128 is available for targets on 32-bit
       x86, x86-64 and Itanium architectures. The libquadmath library is
       automatically built on such targets when building the Fortran
       compiler.
     * New -Wunused-but-set-variable and -Wunused-but-set-parameter
       warnings were added for C, C++, Objective-C and Objective-C++.
       These warnings diagnose variables respective parameters which are
       only set in the code and never otherwise used. Usually such
       variables are useless and often even the value assigned to them is
       computed needlessly, sometimes expensively. The
       -Wunused-but-set-variable warning is enabled by default by -Wall
       flag and -Wunused-but-set-parameter by -Wall -Wextra flags.
     * On ARM, a bug has been fixed in GCC's implementation of the AAPCS
       rules for the layout of vectors that could lead to wrong code being
       generated. Vectors larger than 8 bytes in size are now by default
       aligned to an 8-byte boundary. This is an ABI change: code that
       makes explicit use of vector types may be incompatible with binary
       objects built with older versions of GCC. Auto-vectorized code is
       not affected by this change. (This change affects GCC versions
       4.6.4 and later, with the exception of versions 4.7.0 and 4.7.1.)
     * On AVR, variables with the progmem attribute to locate data in
       flash memory must be qualified as const.
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 4.6.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       All GCC ports for the following processor architectures have been
       declared obsolete:
          + Argonaut ARC (arc-*)
          + National Semiconductor CRX (crx-*)
          + Motorola 68HC11 and 68HC12 (m68hc11-*-*, m6811-*-*,
            m68hc12-*-*, m6812-*-*)
          + Sunplus S+core (score-*)
       The following ports for individual systems on particular
       architectures have been obsoleted:
          + Interix (i[34567]86-*-interix3*)
          + NetWare x86 (i[3456x]86-*-netware*)
          + Generic ARM PE (arm-*-pe* other than arm*-wince-pe*)
          + MCore PE (mcore-*-pe*)
          + SH SymbianOS (sh*-*-symbianelf*)
          + GNU Hurd on Alpha and PowerPC (alpha*-*-gnu*, powerpc*-*-gnu*)
          + M68K uClinux old ABI (m68k-*-uclinuxoldabi*)
          + a.out NetBSD (arm*-*-netbsd*, i[34567]86-*-netbsd*,
            vax-*-netbsd*, but not *-*-netbsdelf*)
       The i[34567]86-*-pe alias for Cygwin targets has also been
       obsoleted; users should configure for i[34567]86-*-cygwin* instead.
       Certain configure options to control the set of libraries built
       with GCC on some targets have been obsoleted. On ARM targets, the
       options --disable-fpu, --disable-26bit, --disable-underscore,
       --disable-interwork, --disable-biendian and --disable-nofmult have
       been obsoleted. On MIPS targets, the options
       --disable-single-float, --disable-biendian and --disable-softfloat
       have been obsoleted.
     * Support has been removed for all the [3]configurations obsoleted in
       GCC 4.5.
     * More information on porting to GCC 4.6 from previous versions of
       GCC can be found in the [4]porting guide for this release.

General Optimizer Improvements

     * A new general optimization level, -Ofast, has been introduced. It
       combines the existing optimization level -O3 with options that can
       affect standards compliance but result in better optimized code.
       For example, -Ofast enables -ffast-math.
     * Link-time optimization improvements:
          + The [5]Scalable Whole Program Optimizer (WHOPR) project has
            stabilized to the point of being usable. It has become the
            default mode when using the LTO optimization model. Link time
            optimization can now split itself into multiple parallel
            compilations. Parallelism is controlled with -flto=n (where n
            specifies the number of compilations to execute in parallel).
            GCC can also cooperate with a GNU make job server by
            specifying the -flto=jobserver option and adding + to the
            beginning of the Makefile rule executing the linker.
            Classical LTO mode can be enforced by -flto-partition=none.
            This may result in small code quality improvements.
          + A large number of bugs were fixed. GCC itself, Mozilla Firefox
            and other large applications can be built with LTO enabled.
          + The linker plugin support improvements
               o Linker plugin is now enabled by default when the linker
                 is detected to have plugin support. This is the case for
                 GNU ld 2.21.51 or newer (on ELF and Cygwin targets) and
                 the Gold linker on ELF targets. Plugin support of the
                 Apple linker on Darwin is not compatible with GCC. The
                 linker plugin can also be controlled by the
                 -fuse-linker-plugin command line option.
               o Resolution information from the linker plugin is used to
                 drive whole program assumptions. Use of the linker plugin
                 results in more aggressive optimization on binaries and
                 on shared libraries that use the hidden visibility
                 attribute. Consequently the use of -fwhole-program is not
                 necessary in addition to LTO.
          + Hidden symbols used from non-LTO objects now have to be
            explicitly annotated with externally_visible when the linker
            plugin is not used.
          + C++ inline functions and virtual tables are now privatized
            more aggressively, leading to better inter-procedural
            optimization and faster dynamic linking.
          + Memory usage and intermediate language streaming performance
            have been improved.
          + Static constructors and destructors from individual units are
            inlined into a single function. This can significantly improve
            startup times of large C++ applications where static
            constructors are very common. For example, static constructors
            are used when including the iostream header.
          + Support for the Ada language has been added.
     * Interprocedural optimization improvements
          + The interprocedural framework was re-tuned for link time
            optimization. Several scalability issues were resolved.
          + Improved auto-detection of const and pure functions. Newly,
            noreturn functions are auto-detected.
            The [6]-Wsuggest-attribute=[const|pure|noreturn] flag is
            available that informs users when adding attributes to headers
            might improve code generation.
          + A number of inlining heuristic improvements. In particular:
               o Partial inlining is now supported and enabled by default
                 at -O2 and greater. The feature can be controlled via
                 -fpartial-inlining.
                 Partial inlining splits functions with short hot path to
                 return. This allows more aggressive inlining of the hot
                 path leading to better performance and often to code size
                 reductions (because cold parts of functions are not
                 duplicated).
               o Scalability for large compilation units was improved
                 significantly.
               o Inlining of callbacks is now more aggressive.
               o Virtual methods are considered for inlining when the
                 caller is inlined and devirtualization is then possible.
               o Inlining when optimizing for size (either in cold regions
                 of a program or when compiling with -Os) was improved to
                 better handle C++ programs with larger abstraction
                 penalty, leading to smaller and faster code.
          + The IPA reference optimization pass detecting global variables
            used or modified by functions was strengthened and sped up.
          + Functions whose address was taken are now optimized out when
            all references to them are dead.
          + A new inter-procedural static profile estimation pass detects
            functions that are executed once or unlikely to be executed.
            Unlikely executed functions are optimized for size. Functions
            executed once are optimized for size except for the inner
            loops.
          + On most targets with named section support, functions used
            only at startup (static constructors and main), functions used
            only at exit and functions detected to be cold are placed into
            separate text segment subsections. This extends the
            -freorder-functions feature and is controlled by the same
            switch. The goal is to improve the startup time of large C++
            programs.
            Proper function placement requires linker support. GNU ld
            2.21.51 on ELF targets was updated to place those functions
            together within the text section leading to better code
            locality and faster startup times of large C++ programs. The
            feature is also supported in the Apple linker. Support in the
            gold linker is planned.
     * A new switch -fstack-usage has been added. It makes the compiler
       output stack usage information for the program, on a per-function
       basis, in an auxiliary file.
     * A new switch -fcombine-stack-adjustments has been added. It can be
       used to enable or disable the compiler's stack-slot combining pass
       which before was enabled automatically at -O1 and above, but could
       not be controlled on its own.
     * A new switch -fstrict-volatile-bitfields has been added. Using it
       indicates that accesses to volatile bitfields should use a single
       access of the width of the field's type. This option can be useful
       for precisely defining and accessing memory-mapped peripheral
       registers from C or C++.

Compile time and memory usage improvements

     * Datastructures used by the dataflow framework in GCC were
       reorganized for better memory usage and more cache locality.
       Compile time is improved especially on units with large functions
       (possibly resulting from a lot of inlining) not fitting into the
       processor cache. The compile time of the GCC C compiler binary with
       link-time optimization went down by over 10% (benchmarked on x86-64
       target).

New Languages and Language specific improvements

  Ada

     * Stack checking has been improved on selected architectures (Alpha,
       IA-32/x86-64, RS/6000 and SPARC): it now will detect stack
       overflows in all cases on these architectures.
     * Initial support for Ada 2012 has been added.

  C family

     * A new warning, enabled by -Wdouble-promotion, has been added that
       warns about cases where a value of type float is implicitly
       promoted to double. This is especially helpful for CPUs that handle
       the former in hardware, but emulate the latter in software.
     * A new function attribute leaf was introduced. This attribute allows
       better inter-procedural optimization across calls to functions that
       return to the current unit only via returning or exception
       handling. This is the case for most library functions that have no
       callbacks.
     * Support for a new data type __int128 for targets having wide enough
       machine-mode support.
     * The new function attribute callee_pop_aggregate allows to specify
       if the caller or callee is responsible for popping the aggregate
       return pointer value from the stack.
     * Support for selectively enabling and disabling warnings via #pragma
       GCC diagnostic has been added. For instance:
#pragma GCC diagnostic error "-Wuninitialized"
  foo(a);                       /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
  foo(b);                       /* no diagnostic for this one */
#pragma GCC diagnostic pop
  foo(c);                       /* error is given for this one */
#pragma GCC diagnostic pop
  foo(d);                       /* depends on command line options */

     * The -fmax-errors=N option is now supported. Using this option
       causes the compiler to exit after N errors have been issued.

  C

     * There is now experimental support for some features from the
       upcoming C1X revision of the ISO C standard. This support may be
       selected with -std=c1x, or -std=gnu1x for C1X with GNU extensions.
       Note that this support is experimental and may change incompatibly
       in future releases for consistency with changes to the C1X standard
       draft. The following features are newly supported as described in
       the N1539 draft of C1X (with changes agreed at the March 2011 WG14
       meeting); some other features were already supported with no
       compiler changes being needed, or have some support but not in full
       accord with N1539 (as amended).
          + Static assertions (_Static_assert keyword)
          + Typedef redefinition
          + New macros in <float.h>
          + Anonymous structures and unions
     * The new -fplan9-extensions option directs the compiler to support
       some extensions for anonymous struct fields which are implemented
       by the Plan 9 compiler. A pointer to a struct may be automatically
       converted to a pointer to an anonymous field when calling a
       function, in order to make the types match. An anonymous struct
       field whose type is a typedef name may be referred to using the
       typedef name.

  C++

     * Improved [7]experimental support for the upcoming C++0x ISO C++
       standard, including support for constexpr (thanks to Gabriel Dos
       Reis and Jason Merrill), nullptr (thanks to Magnus Fromreide),
       noexcept, unrestricted unions, range-based for loops (thanks to
       Rodrigo Rivas Costa), opaque enum declarations (thanks also to
       Rodrigo), implicitly deleted functions and implicit move
       constructors.
     * When an extern declaration within a function does not match a
       declaration in the enclosing context, G++ now properly declares the
       name within the namespace of the function rather than the namespace
       which was open just before the function definition ([8]c++/43145).
     * GCC now warns by default when casting integers to larger pointer
       types. These warnings can be disabled with the option
       -Wno-int-to-pointer-cast, which is now also available in C++.
     * G++ no longer optimizes using the assumption that a value of
       enumeration type will fall within the range specified by the
       standard, since that assumption is easily violated with a
       conversion from integer type ([9]c++/43680). The old behavior can
       be restored with -fstrict-enums.
     * The new -fnothrow-opt flag changes the semantics of a throw()
       exception specification to match the proposed semantics of the
       noexcept specification: just call terminate if an exception tries
       to propagate out of a function with such an exception
       specification. This dramatically reduces or eliminates the code
       size overhead from adding the exception specification.
     * The new -Wnoexcept flag will suggest adding a noexcept qualifier to
       a function that the compiler can tell doesn't throw if it would
       change the value of a noexcept expression.
     * The -Wshadow option now warns if a local variable or type
       declaration shadows another type in C++. Note that the compiler
       will not warn if a local variable shadows a struct/class/enum, but
       will warn if it shadows an explicit typedef.
     * When an identifier is not found in the current scope, G++ now
       offers suggestions about which identifier might have been intended.
     * G++ now issues clearer diagnostics for missing semicolons after
       class, struct, and union definitions.
     * G++ now issues clearer diagnostics for missing semicolons after
       class member declarations.
     * G++ now issues clearer diagnostics when a colon is used in a place
       where a double-colon was intended.
     * G++ no longer accepts mutable on reference members ([10]c++/33558).
       Use -fpermissive to allow the old, non-conforming behaviour.
     * A few mangling fixes have been made, to attribute const/volatile on
       function pointer types, decltype of a plain decl, and use of a
       function parameter in the declaration of another parameter. By
       default the compiler still uses the old mangling, but emits aliases
       with the new mangling on targets that support strong aliases. Users
       can switch over entirely to the new mangling with -fabi-version=5
       or -fabi-version=0. -Wabi will now warn about code that uses the
       old mangling.
     * In 4.6.0 and 4.6.1 G++ no longer allows objects of const-qualified
       type to be default initialized unless the type has a user-declared
       default constructor. In 4.6.2 G++ implements the proposed
       resolution of [11]DR 253, so default initialization is allowed if
       it initializes all subobjects. Code that fails to compile can be
       fixed by providing an initializer e.g.
    struct A { A(); };
    struct B : A { int i; };
    const B b = B();
       Use -fpermissive to allow the old, non-conforming behaviour.

    Runtime Library (libstdc++)

     * [12]Improved experimental support for the upcoming ISO C++
       standard, C++0x, including using constexpr and nullptr.
     * Performance improvements to the [13]Debug Mode, thanks to Franc,ois
       Dumont.
     * Atomic operations used for reference-counting are annotated so that
       they can be understood by race detectors such as Helgrind, see
       [14]Data Race Hunting.
     * Most libstdc++ standard headers have been changed to no longer
       include the cstddef header as an implementation detail. Code that
       relied on that header being included as side-effect of including
       other standard headers will need to include cstddef explicitly.

  Fortran

     * On systems supporting the libquadmath library, GNU Fortran now also
       supports a quad-precision, kind=16 floating-point data type
       (REAL(16), COMPLEX(16)). As the data type is not fully supported in
       hardware, calculations might be one to two orders of magnitude
       slower than with the 4, 8 or 10 bytes floating-point data types.
       This change does not affect systems which support REAL(16) in
       hardware nor those which do not support libquadmath.
     * Much improved compile time for large array constructors.
     * In order to reduce execution time and memory consumption, use of
       temporary arrays in assignment expressions is avoided for many
       cases. The compiler now reverses loops in order to avoid generating
       a temporary array where possible.
     * Improved diagnostics, especially with -fwhole-file.
     * The -fwhole-file flag is now enabled by default. This improves code
       generation and diagnostics. It can be disabled using the deprecated
       -fno-whole-file flag.
     * Support the generation of Makefile dependencies via the [15]-M...
       flags of GCC; you may need to specify the -cpp option in addition.
       The dependencies take modules, Fortran's include, and CPP's
       #include into account. Note: Using -M for the module path is no
       longer supported, use -J instead.
     * The flag -Wconversion has been modified to only issue warnings
       where a conversion leads to information loss. This drastically
       reduces the number of warnings; -Wconversion is thus now enabled
       with -Wall. The flag -Wconversion-extra has been added and also
       warns about other conversions; -Wconversion-extra typically issues
       a huge number of warnings, most of which can be ignored.
     * A new command-line option -Wunused-dummy-argument warns about
       unused dummy arguments and is included in -Wall. Before,
       -Wunused-variable also warned about unused dummy arguments.
     * Fortran 2003 support has been extended:
          + Improved support for polymorphism between libraries and
            programs and for complicated inheritance patterns (cf.
            [16]object-oriented programming).
          + Experimental support of the ASSOCIATE construct.
          + In pointer assignments it is now possible to specify the lower
            bounds of the pointer and, for a rank-1 or a simply contiguous
            data-target, to remap the bounds.
          + Automatic (re)allocation: In intrinsic assignments to
            allocatable variables the left-hand side will be automatically
            allocated (if unallocated) or reallocated (if the shape or
            type parameter is different). To avoid the small performance
            penalty, you can use a(:) = ... instead of a = ... for arrays
            and character strings - or disable the feature using -std=f95
            or -fno-realloc-lhs.
          + Deferred type parameter: For scalar allocatable and pointer
            variables the character length can be deferred.
          + Namelist variables with allocatable and pointer attribute and
            nonconstant length type parameter are supported.
     * Fortran 2008 support has been extended:
          + Experimental [17]coarray support (for one image only, i.e.
            num_images() == 1); use the [18]-fcoarray=single flag to
            enable it.
          + The STOP and the new ERROR STOP statements now support all
            constant expressions.
          + Support for the CONTIGUOUS attribute.
          + Support for ALLOCATE with MOLD.
          + Support for the STORAGE_SIZE intrinsic inquiry function.
          + Support of the NORM2 and PARITY intrinsic functions.
          + The following bit intrinsics were added: POPCNT and POPPAR for
            counting the number of 1 bits and returning the parity; BGE,
            BGT, BLE, and BLT for bitwise comparisons; DSHIFTL and DSHIFTR
            for combined left and right shifts, MASKL and MASKR for simple
            left and right justified masks, MERGE_BITS for a bitwise merge
            using a mask, SHIFTA, SHIFTL and SHIFTR for shift operations,
            and the transformational bit intrinsics IALL, IANY and
            IPARITY.
          + Support of the EXECUTE_COMMAND_LINE intrinsic subroutine.
          + Support for the IMPURE attribute for procedures, which allows
            for ELEMENTAL procedures without the restrictions of PURE.
          + Null pointers (including NULL()) and not allocated variables
            can be used as actual argument to optional non-pointer,
            non-allocatable dummy arguments, denoting an absent argument.
          + Non-pointer variables with TARGET attribute can be used as
            actual argument to POINTER dummies with INTENT(IN)
          + Pointers including procedure pointers and those in a derived
            type (pointer components) can now be initialized by a target
            instead of only by NULL.
          + The EXIT statement (with construct-name) can now be used to
            leave not only the DO but also the ASSOCIATE, BLOCK, IF,
            SELECT CASE and SELECT TYPE constructs.
          + Internal procedures can now be used as actual argument.
          + The named constants INTEGER_KINDS, LOGICAL_KINDS, REAL_KINDS
            and CHARACTER_KINDS of the intrinsic module ISO_FORTRAN_ENV
            have been added; these arrays contain the supported kind
            values for the respective types.
          + The module procedures C_SIZEOF of the intrinsic module
            ISO_C_BINDINGS and COMPILER_VERSION and COMPILER_OPTIONS of
            ISO_FORTRAN_ENV have been implemented.
          + Minor changes: obsolescence diagnostics for ENTRY was added
            for -std=f2008; a line may start with a semicolon; for
            internal and module procedures END can be used instead of END
            SUBROUTINE and END FUNCTION; SELECTED_REAL_KIND now also takes
            a RADIX argument; intrinsic types are supported for
            TYPE(intrinsic-type-spec); multiple type-bound procedures can
            be declared in a single PROCEDURE statement; implied-shape
            arrays are supported for named constants (PARAMETER). The
            transformational, three argument versions of BESSEL_JN and
            BESSEL_YN were added - the elemental, two-argument version had
            been added in GCC 4.4; note that the transformational
            functions use a recurrence algorithm.

  Go

   Support for the [19]Go programming language has been added to GCC. It
   is not enabled by default when you build GCC; use the
   --enable-languages configure option to build it. The driver program for
   compiling Go code is gccgo.

   Go is currently known to work on GNU/Linux and RTEMS. Solaris support
   is in progress. It may or may not work on other platforms.

  Objective-C and Objective-C++

     * The -fobjc-exceptions flag is now required to enable Objective-C
       exception and synchronization syntax (introduced by the keywords
       @try, @catch, @finally and @synchronized).
     * A number of Objective-C 2.0 features and extensions are now
       supported by GCC. These features are enabled by default; you can
       disable them by using the new -fobjc-std=objc1 command-line option.
     * The Objective-C 2.0 dot-syntax is now supported. It is an
       alternative syntax for using getters and setters; object.count is
       automatically converted into [object count] or [object setCount:
       ...] depending on context; for example if (object.count > 0) is
       automatically compiled into the equivalent of if ([object count] >
       0) while object.count = 0; is automatically compiled into the
       equivalent ot [object setCount: 0];. The dot-syntax can be used
       with instance and class objects and with any setters or getters, no
       matter if they are part of a declared property or not.
     * Objective-C 2.0 declared properties are now supported. They are
       declared using the new @property keyword, and are most commonly
       used in conjunction with the new Objective-C 2.0 dot-syntax. The
       nonatomic, readonly, readwrite, assign, retain, copy, setter and
       getter attributes are all supported. Marking declared properties
       with __attribute__ ((deprecated)) is supported too.
     * The Objective-C 2.0 @synthesize and @dynamic keywords are
       supported. @synthesize causes the compiler to automatically
       synthesize a declared property, while @dynamic is used to disable
       all warnings for a declared property for which no implementation is
       provided at compile time. Synthesizing declared properties requires
       runtime support in most useful cases; to be able to use it with the
       GNU runtime, appropriate helper functions have been added to the
       GNU Objective-C runtime ABI, and are implemented by the GNU
       Objective-C runtime library shipped with GCC.
     * The Objective-C 2.0 fast enumeration syntax is supported in
       Objective-C. This is currently not yet available in Objective-C++.
       Fast enumeration requires support in the runtime, and such support
       has been added to the GNU Objective-C runtime library (shipped with
       GCC).
     * The Objective-C 2.0 @optional keyword is supported. It allows you
       to mark methods or properties in a protocol as optional as opposed
       to required.
     * The Objective-C 2.0 @package keyword is supported. It has currently
       the same effect as the @public keyword.
     * Objective-C 2.0 method attributes are supported. Currently the
       supported attributes are deprecated, sentinel, noreturn and format.
     * Objective-C 2.0 method argument attributes are supported. The most
       widely used attribute is unused, to mark an argument as unused in
       the implementation.
     * Objective-C 2.0 class and protocol attributes are supported.
       Currently the only supported attribute is deprecated.
     * Objective-C 2.0 class extensions are supported. A class extension
       has the same syntax as a category declaration with no category
       name, and the methods and properties declared in it are added
       directly to the main class. It is mostly used as an alternative to
       a category to add methods to a class without advertising them in
       the public headers, with the advantage that for class extensions
       the compiler checks that all the privately declared methods are
       actually implemented.
     * As a result of these enhancements, GCC can now be used to build
       Objective-C and Objective-C++ software that uses Foundation and
       other important system frameworks with the NeXT runtime on Darwin 9
       and Darwin 10 (OSX 10.5 and 10.6).
     * Many bugs in the compiler have been fixed in this release; in
       particular, LTO can now be used when compiling Objective-C and
       Objective-C++ and the parser is much more robust in dealing with
       invalid code.

    Runtime Library (libobjc)

     * The GNU Objective-C runtime library now defines the macro
       __GNU_LIBOBJC__ (with a value that is increased at every release
       where there is any change to the API) in objc/objc.h, making it
       easy to determine if the GNU Objective-C runtime library is being
       used, and if so, which version. Previous versions of the GNU
       Objective-C runtime library (and other Objective-C runtime
       libraries such as the Apple one) do not define this macro.
     * A new Objective-C 2.0 API, almost identical to the one implemented
       by the Apple Objective-C runtime, has been implemented in the GNU
       Objective-C runtime library. The new API hides the internals of
       most runtime structures but provides a more extensive set of
       functions to operate on them. It is much easier, for example, to
       create or modify classes at runtime. The new API also makes it
       easier to port software from Apple to GNU as almost no changes
       should be required. The old API is still supported for backwards
       compatibility; including the old objc/objc-api.h header file
       automatically selects the old API, while including the new
       objc/runtime.h header file automatically selects the new API.
       Support for the old API is being phased out and upgrading the
       software to use the new API is strongly recommended. To check for
       the availability of the new API, the __GNU_LIBOBJC__ macro can be
       used as older versions of the GNU Objective-C runtime library,
       which do not support the new API, do not define such a macro.
     * Runtime support for @synchronized has been added.
     * Runtime support for Objective-C 2.0 synthesized property accessors
       has been added.
     * Runtime support for Objective-C 2.0 fast enumeration has been
       added.

New Targets and Target Specific Improvements

  ARM

     * GCC now supports the Cortex-M4 processor implementing the v7-em
       version of the architecture using the option -mcpu=cortex-m4.
     * Scheduling descriptions for the Cortex-M4, the Neon and the
       floating point units of the Cortex-A9 and a pipeline description
       for the Cortex-A5 have been added.
     * Synchronization primitives such as __sync_fetch_and_add and friends
       are now inlined for supported architectures rather than calling
       into a kernel helper function.
     * SSA loop prefetching is enabled by default for the Cortex-A9 at
       -O3.
     * Several improvements were committed to improve code generation for
       the ARM architecture including a rewritten implementation for load
       and store multiples.
     * Several enhancements were committed to improve SIMD code generation
       for NEON by adding support for widening instructions, misaligned
       loads and stores, vector conditionals and support for 64 bit
       arithmetic.
     * Support was added for the Faraday cores fa526, fa606te, fa626te,
       fmp626te, fmp626 and fa726te and can be used with the respective
       names as parameters to the -mcpu= option.
     * Basic support was added for Cortex-A15 and is available through
       -mcpu=cortex-a15.
     * GCC for AAPCS configurations now more closely adheres to the AAPCS
       specification by enabling -fstrict-volatile-bitfields by default.

  IA-32/x86-64

     * The new -fsplit-stack option permits programs to use a
       discontiguous stack. This is useful for threaded programs, in that
       it is no longer necessary to specify the maximum stack size when
       creating a thread. This feature is currently only implemented for
       32-bit and 64-bit x86 GNU/Linux targets.
     * Support for emitting profiler counter calls before function
       prologues. This is enabled via a new command-line option -mfentry.
     * Optimization for the Intel Core 2 processors is now available
       through the -march=core2 and -mtune=core2 options.
     * Support for Intel Core i3/i5/i7 processors is now available through
       the -march=corei7 and -mtune=corei7 options.
     * Support for Intel Core i3/i5/i7 processors with AVX is now
       available through the -march=corei7-avx and -mtune=corei7-avx
       options.
     * Support for AMD Bobcat (family 14) processors is now available
       through the -march=btver1 and -mtune=btver1 options.
     * Support for AMD Bulldozer (family 15) processors is now available
       through the -march=bdver1 and -mtune=bdver1 options.
     * The default setting (when not optimizing for size) for 32-bit
       GNU/Linux and Darwin x86 targets has been changed to
       -fomit-frame-pointer. The default can be reverted to
       -fno-omit-frame-pointer by configuring GCC with the
       --enable-frame-pointer configure option.
     * Darwin, FreeBSD, Solaris 2, MinGW and Cygwin now all support
       __float128 on 32-bit and 64-bit x86 targets.
     * AVX floating-point arithmetic can now be enabled by default at
       configure time with the new --with-fpmath=avx option.
     * The SSA loop prefetching pass is enabled when using -O3 when
       optimizing for CPUs where prefetching is beneficial (AMD CPUs newer
       than K6).
     * Support for TBM (Trailing Bit Manipulation) built-in functions and
       code generation is available via -mtbm.
     * Support for AMD's BMI (Bit Manipulation) built-in functions and
       code generation is available via -mbmi.

  MicroBlaze

     * Support has been added for the Xilinx MicroBlaze softcore processor
       (microblaze-elf) embedded target. This configurable processor is
       supported on several Xilinx Spartan and Virtex FPGAs.

  MIPS

     * GCC now supports the Loongson 3A processor. Its canonical -march=
       and -mtune= name is loongson3a.

  MN10300 / AM33

     * The inline assembly register constraint "A" has been renamed "c".
       This constraint is used to select a floating-point register that
       can be used as the destination of a multiply-accumulate
       instruction.
     * New inline assembly register constraints "A" and "D" have been
       added. These constraint letters resolve to all general registers
       when compiling for AM33, and resolve to address registers only or
       data registers only when compiling for MN10300.
     * The MDR register is represented in the compiler. One can access the
       register via the "z" constraint in inline assembly. It can be
       marked as clobbered or used as a local register variable via the
       "mdr" name. The compiler uses the RETF instruction if the function
       does not modify the MDR register, so it is important that inline
       assembly properly annotate any usage of the register.

  PowerPC/PowerPC64

     * GCC now supports the Applied Micro Titan processor with
       -mcpu=titan.
     * The -mrecip option has been added, which indicates whether the
       reciprocal and reciprocal square root instructions should be used.
     * The -mveclibabi=mass option can be used to enable the compiler to
       autovectorize mathematical functions using the Mathematical
       Acceleration Subsystem library.
     * The -msingle-pic-base option has been added, which instructs the
       compiler to avoid loading the PIC base register in function
       prologues. The PIC base register must be initialized by the runtime
       system.
     * The -mblock-move-inline-limit option has been added, which enables
       the user to control the maximum size of inlined memcpy calls and
       similar.
     * PowerPC64 GNU/Linux support for applications requiring a large TOC
       section has been improved. A new command-line option,
       -mcmodel=MODEL, controls this feature; valid values for MODEL are
       small, medium, or large.
     * The Altivec builtin functions vec_ld and vec_st have been modified
       to generate the Altivec memory instructions LVX and STVX, even if
       the -mvsx option is used. In the initial GCC 4.5 release, these
       builtin functions were changed to generate VSX memory reference
       instructions instead of Altivec memory instructions, but there are
       differences between the two instructions. If the VSX instruction
       set is available, you can now use the new builtin functions
       vec_vsx_ld and vec_vsx_st which always generates the VSX memory
       instructions.
     * The GCC compiler on AIX now defaults to a process layout with a
       larger data space allowing larger programs to be compiled.
     * The GCC long double type on AIX 6.1 and above has reverted to 64
       bit double precision, matching the AIX XL compiler default, because
       of missing C99 symbols required by the GCC runtime.
     * The default processor scheduling model and tuning for PowerPC64
       GNU/Linux and for AIX 6.1 and above now is POWER7.
     * Starting with GCC 4.6.1, vectors of type vector long long or vector
       long are passed and returned in the same method as other vectors
       with the VSX instruction set. Previously the GCC compiler did not
       adhere to the ABI for 128-bit vectors with 64-bit integer base
       types (PR 48857). This is also fixed in the GCC 4.5.4 release.

  S/390, zSeries and System z9/z10, IBM zEnterprise z196

     * Support for the zEnterprise z196 processor has been added. When
       using the -march=z196 option, the compiler will generate code
       making use of the following instruction facilities:
          + Conditional load/store
          + Distinct-operands
          + Floating-point-extension
          + Interlocked-access
          + Population-count
       The -mtune=z196 option avoids the compare and branch instructions
       as well as the load address instruction with an index register as
       much as possible and performs instruction scheduling appropriate
       for the new out-of-order pipeline architecture.
     * When using the -m31 -mzarch options the generated code still
       conforms to the 32-bit ABI but uses the general purpose registers
       as 64-bit registers internally. This requires a Linux kernel saving
       the whole 64-bit registers when doing a context switch. Kernels
       providing that feature indicate that by the 'highgprs' string in
       /proc/cpuinfo.
     * The SSA loop prefetching pass is enabled when using -O3.

  SPARC

     * GCC now supports the LEON series of SPARC V8 processors. The code
       generated by the compiler can either be tuned to it by means of the
       --with-tune=leon configure option and -mtune=leon compilation
       option, or the compiler can be built for the sparc-leon-{elf,linux}
       and sparc-leon3-{elf,linux} targets directly.
     * GCC has stopped sign/zero-extending parameter registers in the
       callee for functions taking parameters with sub-word size in 32-bit
       mode, since this is redundant with the specification of the ABI.
       GCC has never done so in 64-bit mode since this is also redundant.
     * The command line option -mfix-at697f has been added to enable the
       documented workaround for the single erratum of the Atmel AT697F
       processor.

Operating Systems

  Android

     * GCC now supports the Bionic C library and provides a convenient way
       of building native libraries and applications for the Android
       platform. Refer to the documentation of the -mandroid and -mbionic
       options for details on building native code. At the moment, Android
       support is enabled only for ARM.

  Darwin/Mac OS X

     * General
          + Initial support for CFString types has been added.
            This allows GCC to build projects including the system Core
            Foundation frameworks. The GCC Objective-C family supports
            CFString "toll-free bridged" as per the Mac OS X system tools.
            CFString is also recognized in the context of format
            attributes and arguments (see the documentation for format
            attributes for limitations). At present, 8-bit character types
            are supported.
          + Object file size reduction.
            The Darwin zeroed memory allocators have been re-written to
            make more use of .zerofill sections. For non-debug code, this
            can reduce object file size significantly.
          + Objective-C family 64-bit support (NeXT ABI 2).
            Initial support has been added to support 64-bit Objective-C
            code using the Darwin/OS X native (NeXT) runtime. ABI version
            2 will be selected automatically when 64-bit code is built.
          + Objective-C family 32-bit ABI 1.
            For 32-bit code ABI 1 is also now also allowed. At present it
            must be selected manually using -fobjc-abi-version=1 where
            applicable - i.e. on Darwin 9/10 (OS X 10.5/10.6).
     * x86 Architecture
          + The -mdynamic-no-pic option has been enabled.
            Code supporting -mdynamic-no-pic optimization has been added
            and is applicable to -m32 builds. The compiler bootstrap uses
            the option where appropriate.
          + The default value for -mtune= has been changed.
            Since Darwin systems are primarily Xeon, Core-2 or similar the
            default tuning has been changed to -mtune=core2.
          + Enable 128-bit long double (__float128) support on Darwin.
     * PPC Architecture
          + Darwin64 ABI.
            Several significant bugs have been fixed, such that GCC now
            produces code compatible with the Darwin64 PowerPC ABI.
          + libffi and boehm-gc.
            The Darwin ports of the libffi and boehm-gc libraries have
            been upgraded to include a Darwin64 implementation. This means
            that powerpc*-*-darwin9 platforms may now, for example, build
            Java applications with -m64 enabled.
          + Plug-in support has been enabled.
          + The -fsection-anchors option is now available although,
            presently, not heavily tested.

  Solaris 2

    New Features

     * Support symbol versioning with the Sun linker.
     * Allow libstdc++ to leverage full ISO C99 support on Solaris 10+.
     * Support thread-local storage (TLS) with the Sun assembler on
       Solaris 2/x86.
     * Support TLS on Solaris 8/9 if prerequisites are met.
     * Support COMDAT group with the GNU assembler and recent Sun linker.
     * Support the Sun assembler visibility syntax.
     * Default Solaris 2/x86 to -march=pentium4 (Solaris 10+) resp.
       -march=pentiumpro (Solaris 8/9).
     * Don't use SSE on Solaris 8/9 x86 by default.
     * Enable 128-bit long double (__float128) support on Solaris 2/x86.

    ABI Change

     * Change the ABI for returning 8-byte vectors like __m64 in MMX
       registers on Solaris 10+/x86 to match the Sun Studio 12.1+
       compilers. This is an incompatible change. If you use such types,
       you must either recompile all your code with the new compiler or
       use the new -mvect8-ret-in-mem option to remain compatible with
       previous versions of GCC and Sun Studio.

  Windows x86/x86_64

     * Initial support for decimal floating point.
     * Support for the __thiscall calling-convention.
     * Support for hot-patchable function prologues via the
       ms_hook_prologue attribute for x86_64 in addition to 32-bit x86.
     * Improvements of stack-probing and stack-allocation mechanisms.
     * Support of push/pop-macro pragma as preprocessor command.
       With #pragma push_macro("macro-name") the current definition of
       macro-name is saved and can be restored with #pragma
       pop_macro("macro-name") to its saved definition.
     * Enable 128-bit long double (__float128) support on MinGW and
       Cygwin.

Other significant improvements

  Installation changes

     * An install-strip make target is provided that installs stripped
       executables, and may install libraries with unneeded or debugging
       sections stripped.
     * On Power7 systems, there is a potential problem if you build the
       GCC compiler with a host compiler using options that enable the VSX
       instruction set generation. If the host compiler has been patched
       so that the vec_ld and vec_st builtin functions generate Altivec
       memory instructions instead of VSX memory instructions, then you
       should be able to build the compiler with VSX instruction
       generation.

Changes for GCC Developers

   Note: these changes concern developers that develop GCC itself or
   software that integrates with GCC, such as plugins, and not the general
   GCC users.
     * The gengtype utility, which previously was internal to the GCC
       build process, has been enchanced to provide GC root information
       for plugins as necessary.
     * The old GC allocation interface of ggc_alloc and friends was
       replaced with a type-safe alternative.

GCC 4.6.1

   This is the [20]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.6.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.6.2

   This is the [21]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.6.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.6.3

   This is the [22]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.6.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.6.4

   This is the [23]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.6.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [24]GCC manuals. If that fails, the
    [25]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [26]gcc@gcc.gnu.org. All of [27]our lists have public
    archives.

   Copyright (C) [28]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [29]maintained by the GCC team. Last modified
   2013-04-12[30].

References

   1. http://sourceware.org/bugzilla/show_bug.cgi?id=10401
   2. http://gcc.gnu.org/gcc-4.5/changes.html
   3. http://gcc.gnu.org/gcc-4.5/changes.html#obsoleted
   4. http://gcc.gnu.org/gcc-4.6/porting_to.html
   5. http://gcc.gnu.org/projects/lto/whopr.pdf
   6. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
   7. http://gcc.gnu.org/gcc-4.6/cxx0x_status.html
   8. http://gcc.gnu.org/PR43145
   9. http://gcc.gnu.org/PR43680
  10. http://gcc.gnu.org/PR33558
  11. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253
  12. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
  13. http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html
  14. http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug.html#debug.races
  15. http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
  16. http://gcc.gnu.org/wiki/OOP
  17. http://gcc.gnu.org/wiki/Coarray
  18. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcoarray_007d-233
  19. http://golang.org/
  20. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.1
  21. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.2
  22. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.3
  23. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.6.4
  24. http://gcc.gnu.org/onlinedocs/
  25. mailto:gcc-help@gcc.gnu.org
  26. mailto:gcc@gcc.gnu.org
  27. http://gcc.gnu.org/lists.html
  28. http://www.fsf.org/
  29. http://gcc.gnu.org/about.html
  30. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.5/index.html

                             GCC 4.5 Release Series

   Jul 2, 2012

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.5.4.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.5.3 relative to previous releases of GCC.

Release History

   GCC 4.5.4
          Jul 2, 2012 ([2]changes)

   GCC 4.5.3
          Apr 28, 2011 ([3]changes)

   GCC 4.5.2
          Dec 16, 2010 ([4]changes)

   GCC 4.5.1
          Jul 31, 2010 ([5]changes)

   GCC 4.5.0
          April 14, 2010 ([6]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [7]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [8]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [9]GCC project
   web site or contact the [10]GCC development mailing list.

   To obtain GCC please use [11]our mirror sites or [12]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [13]GCC manuals. If that fails, the
    [14]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [15]gcc@gcc.gnu.org. All of [16]our lists have public
    archives.

   Copyright (C) [17]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [18]maintained by the GCC team. Last modified
   2012-11-02[19].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.5/changes.html
   3. http://gcc.gnu.org/gcc-4.5/changes.html
   4. http://gcc.gnu.org/gcc-4.5/changes.html
   5. http://gcc.gnu.org/gcc-4.5/changes.html
   6. http://gcc.gnu.org/gcc-4.5/changes.html
   7. http://gcc.gnu.org/gcc-4.5/buildstat.html
   8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   9. http://gcc.gnu.org/index.html
  10. mailto:gcc@gcc.gnu.org
  11. http://gcc.gnu.org/mirrors.html
  12. http://gcc.gnu.org/svn.html
  13. http://gcc.gnu.org/onlinedocs/
  14. mailto:gcc-help@gcc.gnu.org
  15. mailto:gcc@gcc.gnu.org
  16. http://gcc.gnu.org/lists.html
  17. http://www.fsf.org/
  18. http://gcc.gnu.org/about.html
  19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.5/changes.html

                             GCC 4.5 Release Series
                        Changes, New Features, and Fixes

Caveats

     * GCC now requires the [1]MPC library in order to build. See the
       [2]prerequisites page for version requirements.
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 4.5.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       The following ports for individual systems on particular
       architectures have been obsoleted:
          + IRIX releases before 6.5 (mips-sgi-irix5*,
            mips-sgi-irix6.[0-4])
          + Solaris 7 (*-*-solaris2.7)
          + Tru64 UNIX releases before V5.1 (alpha*-dec-osf4*,
            alpha-dec-osf5.0*)
          + Details for the IRIX, Solaris 7, and Tru64 UNIX obsoletions
            can be found in the [3]announcement.
       Support for the classic POWER architecture implemented in the
       original RIOS and RIOS2 processors of the old IBM RS/6000 product
       line has been obsoleted in the rs6000 port. This does not affect
       the new generation Power and PowerPC architectures.
     * Support has been removed for all the [4]configurations obsoleted in
       GCC 4.4.
     * Support has been removed for the protoize and unprotoize utilities,
       obsoleted in GCC 4.4.
     * Support has been removed for tuning for Itanium1 (Merced) variants.
       Note that code tuned for Itanium2 should also run correctly on
       Itanium1.
     * GCC now generates unwind info also for epilogues. DWARF debuginfo
       generated by GCC now uses more features of DWARF3 than before, and
       also some DWARF4 features. GDB older than 7.0 is not able to handle
       either of these, so to debug GCC 4.5 generated binaries or
       libraries GDB 7.0 or later is needed. You can disable use of DWARF4
       features with the -gdwarf-3 -gstrict-dwarf options, or use
       -gdwarf-2 -gstrict-dwarf to restrict GCC to just DWARF2, but
       epilogue unwind info is emitted unconditionally whenever unwind
       info is emitted.
     * On x86 targets, code containing floating-point calculations may run
       significantly slower when compiled with GCC 4.5 in strict C99
       conformance mode than they did with earlier GCC versions. This is
       due to stricter standard conformance of the compiler and can be
       avoided by using the option -fexcess-precision=fast; also see
       [5]below.
     * The function attribute noinline no longer prevents GCC from cloning
       the function. A new attribute noclone has been introduced for this
       purpose. Cloning a function means that it is duplicated and the new
       copy is specialized for certain contexts (for example when a
       parameter is a known constant).

General Optimizer Improvements

     * The -save-temps now takes an optional argument. The -save-temps and
       -save-temps=cwd switches write the temporary files in the current
       working directory based on the original source file. The
       -save-temps=obj switch will write files into the directory
       specified with the -o option, and the intermediate filenames are
       based on the output file. This will allow the user to get the
       compiler intermediate files when doing parallel builds without two
       builds of the same filename located in different directories from
       interfering with each other.
     * Debugging dumps are now created in the same directory as the object
       file rather than in the current working directory. This allows the
       user to get debugging dumps when doing parallel builds without two
       builds of the same filename interfering with each other.
     * GCC has been integrated with the [6]MPC library. This allows GCC to
       evaluate complex arithmetic at compile time [7]more accurately. It
       also allows GCC to evaluate calls to complex built-in math
       functions having constant arguments and replace them at compile
       time with their mathematically equivalent results. In doing so, GCC
       can generate correct results regardless of the math library
       implementation or floating point precision of the host platform.
       This also allows GCC to generate identical results regardless of
       whether one compiles in native or cross-compile configurations to a
       particular target. The following built-in functions take advantage
       of this new capability: cacos, cacosh, casin, casinh, catan,
       catanh, ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctan,
       and ctanh. The float and long double variants of these functions
       (e.g. csinf and csinl) are also handled.
     * A new link-time optimizer has been added ([8]-flto). When this
       option is used, GCC generates a bytecode representation of each
       input file and writes it to specially-named sections in each object
       file. When the object files are linked together, all the function
       bodies are read from these named sections and instantiated as if
       they had been part of the same translation unit. This enables
       interprocedural optimizations to work across different files (and
       even different languages), potentially improving the performance of
       the generated code. To use the link-timer optimizer, -flto needs to
       be specified at compile time and during the final link. If the
       program does not require any symbols to be exported, it is possible
       to combine -flto and the experimental [9]-fwhopr with
       [10]-fwhole-program to allow the interprocedural optimizers to use
       more aggressive assumptions.
     * The automatic parallelization pass was enhanced to support
       parallelization of outer loops.
     * Automatic parallelization can be enabled as part of Graphite. In
       addition to -ftree-parallelize-loops=, specify
       -floop-parallelize-all to enable the Graphite-based optimization.
     * The infrastructure for optimizing based on [11]restrict qualified
       pointers has been rewritten and should result in code generation
       improvements. Optimizations based on restrict qualified pointers
       are now also available when using -fno-strict-aliasing.
     * There is a new optimization pass that attempts to change prototype
       of functions to avoid unused parameters, pass only relevant parts
       of structures and turn arguments passed by reference to arguments
       passed by value when possible. It is enabled by -O2 and above as
       well as -Os and can be manually invoked using the new command-line
       switch -fipa-sra.
     * GCC now optimize exception handling code. In particular cleanup
       regions that are proved to not have any effect are optimized out.

New Languages and Language specific improvements

  All languages

     * The -fshow-column option is now on by default. This means error
       messages now have a column associated with them.

  Ada

     * Compilation of programs heavily using discriminated record types
       with variant parts has been sped up and generates more compact
       code.
     * Stack checking now works reasonably well on most plaforms. In some
       specific cases, stack overflows may still fail to be detected, but
       a compile-time warning will be issued for these cases.

  C family

     * If a header named in a #include directive is not found, the
       compiler exits immediately. This avoids a cascade of errors arising
       from declarations expected to be found in that header being
       missing.
     * A new built-in function __builtin_unreachable() has been added that
       tells the compiler that control will never reach that point. It may
       be used after asm statements that terminate by transferring control
       elsewhere, and in other places that are known to be unreachable.
     * The -Wlogical-op option now warns for logical expressions such as
       (c == 1 && c == 2) and (c != 1 || c != 2), which are likely to be
       mistakes. This option is disabled by default.
     * An asm goto feature has been added to allow asm statements that
       jump to C labels.
     * C++0x raw strings are supported for C++ and for C with -std=gnu99.
     * The deprecated attribute now takes an optional string argument, for
       example, __attribute__((deprecated("text string"))), that will be
       printed together with the deprecation warning.

  C

     * The -Wenum-compare option, which warns when comparing values of
       different enum types, now works for C. It formerly only worked for
       C++. This warning is enabled by -Wall. It may be avoided by using a
       type cast.
     * The -Wcast-qual option now warns about casts which are unsafe in
       that they permit const-correctness to be violated without further
       warnings. Specifically, it warns about cases where a qualifier is
       added when all the lower types are not const. For example, it warns
       about a cast from char ** to const char **.
     * The -Wc++-compat option is significantly improved. It issues new
       warnings for:
          + Using C++ reserved operator names as identifiers.
          + Conversions to enum types without explicit casts.
          + Using va_arg with an enum type.
          + Using different enum types in the two branches of ?:.
          + Using ++ or -- on a variable of enum type.
          + Using the same name as both a struct, union or enum tag and a
            typedef, unless the typedef refers to the tagged type itself.
          + Using a struct, union, or enum which is defined within another
            struct or union.
          + A struct field defined using a typedef if there is a field in
            the struct, or an enclosing struct, whose name is the typedef
            name.
          + Duplicate definitions at file scope.
          + Uninitialized const variables.
          + A global variable with an anonymous struct, union, or enum
            type.
          + Using a string constant to initialize a char array whose size
            is the length of the string.
     * The new -Wjump-misses-init option warns about cases where a goto or
       switch skips the initialization of a variable. This sort of branch
       is an error in C++ but not in C. This warning is enabled by
       -Wc++-compat.
     * GCC now ensures that a C99-conforming <stdint.h> is present on most
       targets, and uses information about the types in this header to
       implement the Fortran bindings to those types. GCC does not ensure
       the presence of such a header, and does not implement the Fortran
       bindings, on the following targets: NetBSD, VxWorks, VMS,
       SymbianOS, WinCE, LynxOS, Netware, QNX, Interix, TPF.
     * GCC now implements C90- and C99-conforming rules for constant
       expressions. This may cause warnings or errors for some code using
       expressions that can be folded to a constant but are not constant
       expressions as defined by ISO C.
     * All known target-independent C90 and C90 Amendment 1 conformance
       bugs, and all known target-independent C99 conformance bugs not
       related to floating point or extended identifiers, have been fixed.
     * The C decimal floating point support now includes support for the
       FLOAT_CONST_DECIMAL64 pragma.
     * The named address space feature from ISO/IEC TR 18037 is now
       supported. This is currently only implemented for the SPU
       processor.

  C++

     * Improved [12]experimental support for the upcoming C++0x ISO C++
       standard, including support for raw strings, lambda expressions and
       explicit type conversion operators.
     * When printing the name of a class template specialization, G++ will
       now omit any template arguments which come from default template
       arguments. This behavior (and the pretty-printing of function
       template specializations as template signature and arguments) can
       be disabled with the -fno-pretty-templates option.
     * Access control is now applied to typedef names used in a template,
       which may cause G++ to reject some ill-formed code that was
       accepted by earlier releases. The -fno-access-control option can be
       used as a temporary workaround until the code is corrected.
     * Compilation time for code that uses templates should now scale
       linearly with the number of instantiations rather than
       quadratically, as template instantiations are now looked up using
       hash tables.
     * Declarations of functions that look like builtin declarations of
       library functions are only considered to be redeclarations if they
       are declared with extern "C". This may cause problems with code
       that omits extern "C" on hand-written declarations of C library
       functions such as abort or memcpy. Such code is ill-formed, but was
       accepted by earlier releases.
     * Diagnostics that used to complain about passing non-POD types to
       ... or jumping past the declaration of a non-POD variable now check
       for triviality rather than PODness, as per C++0x.
     * In C++0x mode local and anonymous classes are now allowed as
       template arguments, and in declarations of variables and functions
       with linkage, so long as any such declaration that is used is also
       defined ([13]DR 757).
     * Labels may now have attributes, as has been permitted for a while
       in C. This is only permitted when the label definition and the
       attribute specifier is followed by a semicolon--i.e., the label
       applies to an empty statement. The only useful attribute for a
       label is unused.
     * G++ now implements [14]DR 176. Previously G++ did not support using
       the injected-class-name of a template base class as a type name,
       and lookup of the name found the declaration of the template in the
       enclosing scope. Now lookup of the name finds the
       injected-class-name, which can be used either as a type or as a
       template, depending on whether or not the name is followed by a
       template argument list. As a result of this change, some code that
       was previously accepted may be ill-formed because
         1. The injected-class-name is not accessible because it's from a
            private base, or
         2. The injected-class-name cannot be used as an argument for a
            template template parameter.
       In either of these cases, the code can be fixed by adding a
       nested-name-specifier to explicitly name the template. The first
       can be worked around with -fno-access-control; the second is only
       rejected with -pedantic.
     * A new standard mangling for SIMD vector types has been added, to
       avoid name clashes on systems with vectors of varying length. By
       default the compiler still uses the old mangling, but emits aliases
       with the new mangling on targets that support strong aliases. Users
       can switch over entirely to the new mangling with -fabi-version=4
       or -fabi-version=0. -Wabi will now warn about code that uses the
       old mangling.
     * The command-line option -ftemplate-depth-N is now written as
       -ftemplate-depth=N and the old form is deprecated.
     * Conversions between NULL and non-pointer types are now warned by
       default. The new option -Wno-conversion-null disables these
       warnings. Previously these warnings were only available when using
       -Wconversion explicitly.

    Runtime Library (libstdc++)

     * [15]Improved experimental support for the upcoming ISO C++
       standard, C++0x, including:
          + Support for <future>, <functional>, and <random>.
          + Existing facilities now exploit explicit operators and the
            newly implemented core C++0x features.
     * An experimental [16]profile mode has been added. This is an
       implementation of many C++ standard library constructs with an
       additional analysis layer that gives performance improvement advice
       based on recognition of suboptimal usage patterns. For example,
#include <vector>
int main()
{
  std::vector<int> v;
  for (int k = 0; k < 1024; ++k)
    v.insert(v.begin(), k);
}

       When instrumented via the profile mode, can return suggestions
       about the initial size and choice of the container used as follows:
vector-to-list: improvement = 5: call stack = 0x804842c ...
    : advice = change std::vector to std::list
vector-size: improvement = 3: call stack = 0x804842c ...
    : advice = change initial container size from 0 to 1024

       These constructs can be substituted for the normal libstdc++
       constructs on a piecemeal basis, or all existing components can be
       transformed via the -D_GLIBCXX_PROFILE macro.
     * [17]Support for decimal floating-point arithmetic (aka ISO C++ TR
       24733) has been added. This support is in header file
       <decimal/decimal>, uses namespace std::decimal, and includes
       classes decimal32, decimal64, and decimal128.
     * Sources have been audited for application of function attributes
       nothrow, const, pure, and noreturn.
     * Python pretty-printers have been added for many standard library
       components that simplify the internal representation and present a
       more intuitive view of components when used with
       appropriately-advanced versions of GDB. For more information,
       please consult the more [18]detailed description.
     * The default behavior for comparing typeinfo names has changed, so
       in <typeinfo>, __GXX_MERGED_TYPEINFO_NAMES now defaults to zero.
     * The new -static-libstdc++ option directs g++ to link the C++
       library statically, even if the default would normally be to link
       it dynamically.

  Fortran

     * The COMMON default padding has been changed - instead of adding the
       padding before a variable it is now added afterwards, which
       increases the compatibility with other vendors and helps to obtain
       the correct output in some cases. Cf. also the -falign-commons
       option ([19]added in 4.4).
     * The -finit-real= option now also supports the value snan for
       signalling not-a-number; to be effective, one additionally needs to
       enable trapping (e.g. via -ffpe-trap=). Note: Compile-time
       optimizations can turn a signalling NaN into a quiet one.
     * The new option -fcheck= has been added with the options bounds,
       array-temps, do, pointer, and recursive. The bounds and array-temps
       options are equivalent to -fbounds-check and
       -fcheck-array-temporaries. The do option checks for invalid
       modification of loop iteration variables, and the recursive option
       tests for recursive calls to subroutines/functions which are not
       marked as recursive. With pointer pointer association checks in
       calls are performed; however, neither undefined pointers nor
       pointers in expressions are handled. Using -fcheck=all enables all
       these run-time checks.
     * The run-time checking -fcheck=bounds now warns about invalid string
       lengths of character dummy arguments. Additionally, more
       compile-time checks have been added.
     * The new option [20]-fno-protect-parens has been added; if set, the
       compiler may reorder REAL and COMPLEX expressions without regard to
       parentheses.
     * GNU Fortran no longer links against libgfortranbegin. As before,
       MAIN__ (assembler symbol name) is the actual Fortran main program,
       which is invoked by the main function. However, main is now
       generated and put in the same object file as MAIN__. For the time
       being, libgfortranbegin still exists for backward compatibility.
       For details see the new [21]Mixed-Language Programming chapter in
       the manual.
     * The I/O library was restructured for performance and cleaner code.
     * Array assignments and WHERE are now run in parallel when OpenMP's
       WORKSHARE is used.
     * The experimental option -fwhole-file was added. The option allows
       whole-file checking of procedure arguments and allows for better
       optimizations. It can also be used with -fwhole-program, which is
       now also supported in gfortran.
     * More Fortran 2003 and Fortran 2008 mathematical functions can now
       be used as initialization expressions.
     * Some extended attributes such as STDCALL are now supported via the
       [22]GCC$ compiler directive.
     * For Fortran 77 compatibility: If -fno-sign-zero is used, the SIGN
       intrinsic behaves now as if zero were always positive.
     * For legacy compatibiliy: On Cygwin and MinGW, the special files
       CONOUT$ and CONIN$ (and CONERR$ which maps to CONOUT$) are now
       supported.
     * Fortran 2003 support has been extended:
          + Procedure-pointer function results and procedure-pointer
            components (including PASS),
          + allocatable scalars (experimental),
          + DEFERRED type-bound procedures,
          + the ERRMSG= argument of the ALLOCATE and DEALLOCATE statements
            have been implemented.
          + The ALLOCATE statement supports type-specs and the SOURCE=
            argument.
          + OPERATOR(*) and ASSIGNMENT(=) are now allowed as GENERIC
            type-bound procedure (i.e. as type-bound operators).
          + Rounding (ROUND=, RZ, ...) for output is now supported.
          + The INT_FAST{8,16,32,64,128}_T kind type parameters of the
            intrinsic module ISO_C_BINDING are now supported, except for
            the targets listed above as ones where GCC does not have
            <stdint.h> type information.
          + Extensible derived types with type-bound procedure or
            procedure pointer with PASS attribute now have to use CLASS in
            line with the Fortran 2003 standard; the workaround to use
            TYPE is no longer supported.
          + [23]Experimental, incomplete support for polymorphism,
            including CLASS, SELECT TYPE and dynamic dispatch of
            type-bound procedure calls. Some features do not work yet such
            as unlimited polymorphism (CLASS(*)).
     * Fortran 2008 support has been extended:
          + The OPEN statement now supports the NEWUNIT= option, which
            returns a unique file unit, thus preventing inadvertent use of
            the same unit in different parts of the program.
          + Support for unlimited format items has been added.
          + The INT{8,16,32} and REAL{32,64,128} kind type parameters of
            the intrinsic module ISO_FORTRAN_ENV are now supported.
          + Using complex arguments with TAN, SINH, COSH, TANH, ASIN,
            ACOS, and ATAN is now possible; the functions ASINH, ACOSH,
            and ATANH have been added (for real and complex arguments) and
            ATAN(Y,X) is now an alias for ATAN2(Y,X).
          + The BLOCK construct has been implemented.

New Targets and Target Specific Improvements

  AIX

     * Full cross-toolchain support now available with GNU Binutils

  ARM

     * GCC now supports the Cortex-M0 and Cortex-A5 processors.
     * GCC now supports the ARM v7E-M architecture.
     * GCC now supports VFPv4-based FPUs and FPUs with
       single-precision-only VFP.
     * GCC has many improvements to optimization for other ARM processors,
       including scheduling support for the integer pipeline on Cortex-A9.
     * GCC now supports the IEEE 754-2008 half-precision floating-point
       type, and a variant ARM-specific half-precision type. This type is
       specified using __fp16, with the layout determined by
       -mfp16-format. With appropriate -mfpu options, the Cortex-A9 and
       VFPv4 half-precision instructions will be used.
     * GCC now supports the variant of AAPCS that uses VFP registers for
       parameter passing and return values.

  AVR

     * The -mno-tablejump option has been removed because it has the same
       effect as the -fno-jump-tables option.
     * Added support for these new AVR devices:
          + ATmega8U2
          + ATmega16U2
          + ATmega32U2

  IA-32/x86-64

     * GCC now will set the default for -march= based on the configure
       target.
     * GCC now supports handling floating-point excess precision arising
       from use of the x87 floating-point unit in a way that conforms to
       ISO C99. This is enabled with -fexcess-precision=standard and with
       standards conformance options such as -std=c99, and may be disabled
       using -fexcess-precision=fast.
     * Support for the Intel Atom processor is now available through the
       -march=atom and -mtune=atom options.
     * A new -mcrc32 option is now available to enable crc32 intrinsics.
     * A new -mmovbe option is now available to enable GCC to use the
       movbe instruction to implement __builtin_bswap32 and
       __builtin_bswap64.
     * SSE math now can be enabled by default at configure time with the
       new --with-fpmath=sse option.
     * There is a new intrinsic header file, <x86intrin.h>. It should be
       included before using any IA-32/x86-64 intrinsics.
     * Support for the XOP, FMA4, and LWP instruction sets for the AMD
       Orochi processors are now available with the -mxop, -mfma4, and
       -mlwp options.
     * The -mabm option enables GCC to use the popcnt and lzcnt
       instructions on AMD processors.
     * The -mpopcnt option enables GCC to use the popcnt instructions on
       both AMD and Intel processors.

  M68K/ColdFire

     * GCC now supports ColdFire 51xx, 5221x, 5225x, 52274, 52277, 5301x
       and 5441x devices.
     * GCC now supports thread-local storage (TLS) on M68K and ColdFire
       processors.

  MeP

   Support has been added for the Toshiba Media embedded Processor (MeP,
   or mep-elf) embedded target.

  MIPS

     * GCC now supports MIPS 1004K processors.
     * GCC can now be configured with options --with-arch-32,
       --with-arch-64, --with-tune-32 and --with-tune-64 to control the
       default optimization separately for 32-bit and 64-bit modes.
     * MIPS targets now support an alternative _mcount interface, in which
       register $12 points to the function's save slot for register $31.
       This interface is selected by the -mcount-ra-address option; see
       the documentation for more details.
     * GNU/Linux targets can now generate read-only .eh_frame sections.
       This optimization requires GNU binutils 2.20 or above, and is only
       available if GCC is configured with a suitable version of binutils.
     * GNU/Linux targets can now attach special relocations to indirect
       calls, so that the linker can turn them into direct jumps or
       branches. This optimization requires GNU binutils 2.20 or later,
       and is automatically selected if GCC is configured with an
       appropriate version of binutils. It can be explicitly enabled or
       disabled using the -mrelax-pic-calls command-line option.
     * GCC now generates more heavily-optimized atomic operations on
       Octeon processors.
     * MIPS targets now support the -fstack-protector option.
     * GCC now supports an -msynci option, which specifies that synci is
       enough to flush the instruction cache, without help from the
       operating system. GCC uses this information to optimize
       automatically-generated cache flush operations, such as those used
       for nested functions in C. There is also a --with-synci
       configure-time option, which makes -msynci the default.
     * GCC supports four new function attributes for interrupt handlers:
       interrupt, use_shadow_register_set, keep_interrupts_masked and
       use_debug_exception_return. See the documentation for more details
       about these attributes.

  RS/6000 (POWER/PowerPC)

     * GCC now supports the Power ISA 2.06, which includes the VSX
       instructions that add vector 64-bit floating point support, new
       population count instructions, and conversions between floating
       point and unsigned types.
     * Support for the power7 processor is now available through the
       -mcpu=power7 and -mtune=power7.
     * GCC will now vectorize loops that contain simple math functions
       like copysign when generating code for altivec or VSX targets.
     * Support for the A2 processor is now available through the -mcpu=a2
       and -mtune=a2 options.
     * Support for the 476 processor is now available through the
       -mcpu={476,476fp} and -mtune={476,476fp} options.
     * Support for the e500mc64 processor is now available through the
       -mcpu=e500mc64 and -mtune=e500mc64 options.
     * GCC can now be configured with options --with-cpu-32,
       --with-cpu-64, --with-tune-32 and --with-tune-64 to control the
       default optimization separately for 32-bit and 64-bit modes.
     * Starting with GCC 4.5.4, vectors of type vector long long or vector
       long are passed and returned in the same method as other vectors
       with the VSX instruction set. Previously the GCC compiler did not
       adhere to the ABI for 128-bit vectors with 64-bit integer base
       types (PR 48857). This is also fixed in the GCC 4.6.1 release.

  RX

   Support has been added for the Renesas RX Processor (rx-elf) target.

Operating Systems

  Windows (Cygwin and MinGW)

     * GCC now installs all the major language runtime libraries as DLLs
       when configured with the --enable-shared option.
     * GCC now makes use of the new support for aligned common variables
       in versions of binutils >= 2.20 to fix bugs in the support for SSE
       data types.
     * Improvements to the libffi support library increase the reliability
       of code generated by GCJ on all Windows platforms. Libgcj is
       enabled by default for the first time.
     * Libtool improvements simplify installation by placing the generated
       DLLs in the correct binaries directory.
     * Numerous other minor bugfixes and improvements, and substantial
       enhancements to the Fortran language support library.

   >

Other significant improvements

  Plugins

     * It is now possible to extend the compiler without having to modify
       its source code. A new option -fplugin=file.so tells GCC to load
       the shared object file.so and execute it as part of the compiler.
       The internal documentation describes the details on how plugins can
       interact with the compiler.

  Installation changes

     * The move to newer autotools changed default installation
       directories and switches to control them: The --with-datarootdir,
       --with-docdir, --with-pdfdir, and --with-htmldir switches are not
       used any more. Instead, you can now use --datarootdir, --docdir,
       --htmldir, and --pdfdir. The default installation directories have
       changed as follows according to the GNU Coding Standards:

       datarootdir read-only architecture-independent data root [PREFIX/share]
       localedir   locale-specific message catalogs [DATAROOTDIR/locale]
       docdir      documentation root [DATAROOTDIR/doc/PACKAGE]
       htmldir     html documentation [DOCDIR]
       dvidir      dvi documentation [DOCDIR]
       pdfdir      pdf documentation [DOCDIR]
       psdir       ps documentation [DOCDIR]
       The following variables have new default values:

       datadir read-only architecture-independent data [DATAROOTDIR]
       infodir info documentation [DATAROOTDIR/info]
       mandir  man documentation [DATAROOTDIR/man]

GCC 4.5.1

   This is the [24]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.5.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

  All languages

     * GCC's new link-time optimizer ([25]-flto) now also works on a few
       non-ELF targets:
          + Cygwin (*-cygwin*)
          + MinGW (*-mingw*)
          + Darwin on x86-64 (x86_64-apple-darwin*)
       LTO is not enabled by default for these targets. To enable LTO, you
       should configure with the --enable-lto option.

GCC 4.5.2

   This is the [26]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.5.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.5.3

   This is the [27]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.5.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   On the PowerPC compiler, the Altivec builtin functions vec_ld and
   vec_st have been modified to generate the Altivec memory instructions
   LVX and STVX, even if the -mvsx option is used. In the initial GCC 4.5
   release, these builtin functions were changed to generate VSX memory
   reference instructions instead of Altivec memory instructions, but
   there are differences between the two instructions. If the VSX
   instruction set is available, you can now use the new builtin functions
   vec_vsx_ld and vec_vsx_st which always generates the VSX memory
   instructions.

GCC 4.5.4

   This is the [28]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.5.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [29]GCC manuals. If that fails, the
    [30]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [31]gcc@gcc.gnu.org. All of [32]our lists have public
    archives.

   Copyright (C) [33]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [34]maintained by the GCC team. Last modified
   2012-11-02[35].

References

   1. http://www.multiprecision.org/
   2. http://gcc.gnu.org/install/prerequisites.html
   3. http://gcc.gnu.org/ml/gcc/2010-01/msg00510.html
   4. http://gcc.gnu.org/gcc-4.4/changes.html#obsoleted
   5. http://gcc.gnu.org/gcc-4.5/changes.html#x86
   6. http://www.multiprecision.org/
   7. http://gcc.gnu.org/PR30789
   8. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
   9. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhopr-802
  10. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fwhole-program-800
  11. http://gcc.gnu.org/onlinedocs/gcc/Restricted-Pointers.html
  12. http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
  13. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#757
  14. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176
  15. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x
  16. http://gcc.gnu.org/onlinedocs/libstdc++/manual/profile_mode.html
  17. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr24733
  18. http://sourceware.org/gdb/wiki/STLSupport
  19. http://gcc.gnu.org/gcc-4.4/changes.html
  20. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html
  21. http://gcc.gnu.org/onlinedocs/gfortran/Mixed-Language-Programming.html
  22. http://gcc.gnu.org/onlinedocs/gfortran/GNU-Fortran-Compiler-Directives.html
  23. http://gcc.gnu.org/wiki/OOP
  24. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.1
  25. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-flto-801
  26. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.2
  27. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.3
  28. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.5.4
  29. http://gcc.gnu.org/onlinedocs/
  30. mailto:gcc-help@gcc.gnu.org
  31. mailto:gcc@gcc.gnu.org
  32. http://gcc.gnu.org/lists.html
  33. http://www.fsf.org/
  34. http://gcc.gnu.org/about.html
  35. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.4/index.html

                             GCC 4.4 Release Series

   March 13, 2012

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.4.7.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.4.6 relative to previous releases of GCC.

Release History

   GCC 4.4.7
          March 13, 2012 ([2]changes)

   GCC 4.4.6
          April 16, 2011 ([3]changes)

   GCC 4.4.5
          October 1, 2010 ([4]changes)

   GCC 4.4.4
          April 29, 2010 ([5]changes)

   GCC 4.4.3
          January 21, 2010 ([6]changes)

   GCC 4.4.2
          October 15, 2009 ([7]changes)

   GCC 4.4.1
          July 22, 2009 ([8]changes)

   GCC 4.4.0
          April 21, 2009 ([9]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [10]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [11]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [12]GCC
   project web site or contact the [13]GCC development mailing list.

   To obtain GCC please use [14]our mirror sites or [15]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [16]GCC manuals. If that fails, the
    [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
    archives.

   Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [21]maintained by the GCC team. Last modified
   2012-11-02[22].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.4/changes.html
   3. http://gcc.gnu.org/gcc-4.4/changes.html
   4. http://gcc.gnu.org/gcc-4.4/changes.html
   5. http://gcc.gnu.org/gcc-4.4/changes.html
   6. http://gcc.gnu.org/gcc-4.4/changes.html
   7. http://gcc.gnu.org/gcc-4.4/changes.html
   8. http://gcc.gnu.org/gcc-4.4/changes.html
   9. http://gcc.gnu.org/gcc-4.4/changes.html
  10. http://gcc.gnu.org/gcc-4.4/buildstat.html
  11. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  12. http://gcc.gnu.org/index.html
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/mirrors.html
  15. http://gcc.gnu.org/svn.html
  16. http://gcc.gnu.org/onlinedocs/
  17. mailto:gcc-help@gcc.gnu.org
  18. mailto:gcc@gcc.gnu.org
  19. http://gcc.gnu.org/lists.html
  20. http://www.fsf.org/
  21. http://gcc.gnu.org/about.html
  22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.4/changes.html

                             GCC 4.4 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 4.4 release series is [1]GCC 4.4.7.

Caveats

     * __builtin_stdarg_start has been completely removed from GCC.
       Support for <varargs.h> had been deprecated since GCC 4.0. Use
       __builtin_va_start as a replacement.
     * Some of the errors issued by the C++ front end that could be
       downgraded to warnings in previous releases by using -fpermissive
       are now warnings by default. They can be converted into errors by
       using -pedantic-errors.
     * Use of the cpp assertion extension will now emit a warning when
       -Wdeprecated or -pedantic is used. This extension has been
       deprecated for many years, but never warned about.
     * Packed bit-fields of type char were not properly bit-packed on many
       targets prior to GCC 4.4. On these targets, the fix in GCC 4.4
       causes an ABI change. For example there is no longer a 4-bit
       padding between field a and b in this structure:
    struct foo
    {
      char a:4;
      char b:8;
    } __attribute__ ((packed));
       There is a new warning to help identify fields that are affected:
    foo.c:5: note: Offset of packed bit-field 'b' has changed in GCC 4.4
       The warning can be disabled with -Wno-packed-bitfield-compat.
     * On ARM EABI targets, the C++ mangling of the va_list type has been
       changed to conform to the current revision of the EABI. This does
       not affect the libstdc++ library included with GCC.
     * The SCOUNT and POS bits of the MIPS DSP control register are now
       treated as global. Previous versions of GCC treated these fields as
       call-clobbered instead.
     * The MIPS port no longer recognizes the h asm constraint. It was
       necessary to remove this constraint in order to avoid generating
       unpredictable code sequences.
       One of the main uses of the h constraint was to extract the high
       part of a multiplication on 64-bit targets. For example:
    asm ("dmultu\t%1,%2" : "=h" (result) : "r" (x), "r" (y));
       You can now achieve the same effect using 128-bit types:
    typedef unsigned int uint128_t __attribute__((mode(TI)));
    result = ((uint128_t) x * y) >> 64;
       The second sequence is better in many ways. For example, if x and y
       are constants, the compiler can perform the multiplication at
       compile time. If x and y are not constants, the compiler can
       schedule the runtime multiplication better than it can schedule an
       asm statement.
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 4.4.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       The following ports for individual systems on particular
       architectures have been obsoleted:
          + Generic a.out on IA32 and m68k (i[34567]86-*-aout*,
            m68k-*-aout*)
          + Generic COFF on ARM, H8300, IA32, m68k and SH (arm-*-coff*,
            armel-*-coff*, h8300-*-*, i[34567]86-*-coff*, m68k-*-coff*,
            sh-*-*). This does not affect other more specific targets
            using the COFF object format on those architectures, or the
            more specific H8300 and SH targets (h8300-*-rtems*,
            h8300-*-elf*, sh-*-elf*, sh-*-symbianelf*, sh-*-linux*,
            sh-*-netbsdelf*, sh-*-rtems*, sh-wrs-vxworks).
          + 2BSD on PDP-11 (pdp11-*-bsd)
          + AIX 4.1 and 4.2 on PowerPC (rs6000-ibm-aix4.[12]*,
            powerpc-ibm-aix4.[12]*)
          + Tuning support for Itanium1 (Merced) variants. Note that code
            tuned for Itanium2 should also run correctly on Itanium1.
     * The protoize and unprotoize utilities have been obsoleted and will
       be removed in GCC 4.5. These utilities have not been installed by
       default since GCC 3.0.
     * Support has been removed for all the [2]configurations obsoleted in
       GCC 4.3.
     * Unknown -Wno-* options are now silently ignored by GCC if no other
       diagnostics are issued. If other diagnostics are issued, then GCC
       warns about the unknown options.
     * More information on porting to GCC 4.4 from previous versions of
       GCC can be found in the [3]porting guide for this release.

General Optimizer Improvements

     * A new command-line switch -findirect-inlining has been added. When
       turned on it allows the inliner to also inline indirect calls that
       are discovered to have known targets at compile time thanks to
       previous inlining.
     * A new command-line switch -ftree-switch-conversion has been added.
       This new pass turns simple initializations of scalar variables in
       switch statements into initializations from a static array, given
       that all the values are known at compile time and the ratio between
       the new array size and the original switch branches does not exceed
       the parameter --param switch-conversion-max-branch-ratio (default
       is eight).
     * A new command-line switch -ftree-builtin-call-dce has been added.
       This optimization eliminates unnecessary calls to certain builtin
       functions when the return value is not used, in cases where the
       calls can not be eliminated entirely because the function may set
       errno. This optimization is on by default at -O2 and above.
     * A new command-line switch -fconserve-stack directs the compiler to
       minimize stack usage even if it makes the generated code slower.
       This affects inlining decisions.
     * When the assembler supports it, the compiler will now emit unwind
       information using assembler .cfi directives. This makes it possible
       to use such directives in inline assembler code. The new option
       -fno-dwarf2-cfi-asm directs the compiler to not use .cfi
       directives.
     * The [4]Graphite branch has been merged. This merge has brought in a
       new framework for loop optimizations based on a polyhedral
       intermediate representation. These optimizations apply to all the
       languages supported by GCC. The following new code transformations
       are available in GCC 4.4:
          + -floop-interchange performs loop interchange transformations
            on loops. Interchanging two nested loops switches the inner
            and outer loops. For example, given a loop like:
          DO J = 1, M
            DO I = 1, N
              A(J, I) = A(J, I) * C
            ENDDO
          ENDDO

            loop interchange will transform the loop as if the user had
            written:
          DO I = 1, N
            DO J = 1, M
              A(J, I) = A(J, I) * C
            ENDDO
          ENDDO

            which can be beneficial when N is larger than the caches,
            because in Fortran, the elements of an array are stored in
            memory contiguously by column, and the original loop iterates
            over rows, potentially creating at each access a cache miss.
          + -floop-strip-mine performs loop strip mining transformations
            on loops. Strip mining splits a loop into two nested loops.
            The outer loop has strides equal to the strip size and the
            inner loop has strides of the original loop within a strip.
            For example, given a loop like:
          DO I = 1, N
            A(I) = A(I) + C
          ENDDO

            loop strip mining will transform the loop as if the user had
            written:
          DO II = 1, N, 4
            DO I = II, min (II + 3, N)
              A(I) = A(I) + C
            ENDDO
          ENDDO

          + -floop-block performs loop blocking transformations on loops.
            Blocking strip mines each loop in the loop nest such that the
            memory accesses of the element loops fit inside caches. For
            example, given a loop like:
          DO I = 1, N
            DO J = 1, M
              A(J, I) = B(I) + C(J)
            ENDDO
          ENDDO

            loop blocking will transform the loop as if the user had
            written:
          DO II = 1, N, 64
            DO JJ = 1, M, 64
              DO I = II, min (II + 63, N)
                DO J = JJ, min (JJ + 63, M)
                  A(J, I) = B(I) + C(J)
                ENDDO
              ENDDO
            ENDDO
          ENDDO

            which can be beneficial when M is larger than the caches,
            because the innermost loop will iterate over a smaller amount
            of data that can be kept in the caches.
     * A new register allocator has replaced the old one. It is called
       integrated register allocator (IRA) because coalescing, register
       live range splitting, and hard register preferencing are done
       on-the-fly during coloring. It also has better integration with the
       reload pass. IRA is a regional register allocator which uses modern
       Chaitin-Briggs coloring instead of Chow's priority coloring used in
       the old register allocator. More info about IRA internals and
       options can be found in the GCC manuals.
     * A new instruction scheduler and software pipeliner, based on the
       selective scheduling approach, has been added. The new pass
       performs instruction unification, register renaming, substitution
       through register copies, and speculation during scheduling. The
       software pipeliner is able to pipeline non-countable loops. The new
       pass is targeted at scheduling-eager in-order platforms. In GCC 4.4
       it is available for the Intel Itanium platform working by default
       as the second scheduling pass (after register allocation) at the
       -O3 optimization level.
     * When using -fprofile-generate with a multi-threaded program, the
       profile counts may be slightly wrong due to race conditions. The
       new -fprofile-correction option directs the compiler to apply
       heuristics to smooth out the inconsistencies. By default the
       compiler will give an error message when it finds an inconsistent
       profile.
     * The new -fprofile-dir=PATH option permits setting the directory
       where profile data files are stored when using -fprofile-generate
       and friends, and the directory used when reading profile data files
       using -fprofile-use and friends.

New warning options

     * The new -Wframe-larger-than=NUMBER option directs GCC to emit a
       warning if any stack frame is larger than NUMBER bytes. This may be
       used to help ensure that code fits within a limited amount of stack
       space.
     * The command-line option -Wlarger-than-N is now written as
       -Wlarger-than=N and the old form is deprecated.
     * The new -Wno-mudflap option disables warnings about constructs
       which can not be instrumented when using -fmudflap.

New Languages and Language specific improvements

     * Version 3.0 of the [5]OpenMP specification is now supported for the
       C, C++, and Fortran compilers.
     * New character data types, per [6]TR 19769: New character types in
       C, are now supported for the C compiler in -std=gnu99 mode, as
       __CHAR16_TYPE__ and __CHAR32_TYPE__, and for the C++ compiler in
       -std=c++0x and -std=gnu++0x modes, as char16_t and char32_t too.

  C family

     * A new optimize attribute was added to allow programmers to change
       the optimization level and particular optimization options for an
       individual function. You can also change the optimization options
       via the GCC optimize pragma for functions defined after the pragma.
       The GCC push_options pragma and the GCC pop_options pragma allow
       you temporarily save and restore the options used. The GCC
       reset_options pragma restores the options to what was specified on
       the command line.
     * Uninitialized warnings do not require enabling optimization
       anymore, that is, -Wuninitialized can be used together with -O0.
       Nonetheless, the warnings given by -Wuninitialized will probably be
       more accurate if optimization is enabled.
     * -Wparentheses now warns about expressions such as (!x | y) and (!x
       & y). Using explicit parentheses, such as in ((!x) | y), silences
       this warning.
     * -Wsequence-point now warns within if, while,do while and for
       conditions, and within for begin/end expressions.
     * A new option -dU is available to dump definitions of preprocessor
       macros that are tested or expanded.

  C++

     * [7]Improved experimental support for the upcoming ISO C++ standard,
       C++0x. Including support for auto, inline namespaces, generalized
       initializer lists, defaulted and deleted functions, new character
       types, and scoped enums.
     * Those errors that may be downgraded to warnings to build legacy
       code now mention -fpermissive when -fdiagnostics-show-option is
       enabled.
     * -Wconversion now warns if the result of a static_cast to enumeral
       type is unspecified because the value is outside the range of the
       enumeral type.
     * -Wuninitialized now warns if a non-static reference or non-static
       const member appears in a class without constructors.
     * G++ now properly implements value-initialization, so objects with
       an initializer of () and an implicitly defined default constructor
       will be zero-initialized before the default constructor is called.

    Runtime Library (libstdc++)

     * [8]Improved experimental support for the upcoming ISO C++ standard,
       C++0x, including:
          + Support for <chrono>, <condition_variable>, <cstdatomic>,
            <forward_list>, <initializer_list>, <mutex>, <ratio>,
            <system_error>, and <thread>.
          + unique_ptr, <algorithm> additions, exception propagation, and
            support for the new character types in <string> and <limits>.
          + Existing facilities now exploit initializer lists, defaulted
            and deleted functions, and the newly implemented core C++0x
            features.
          + Some standard containers are more efficient together with
            stateful allocators, i.e., no allocator is constructed on the
            fly at element construction time.
     * Experimental support for non-standard pointer types in containers.
     * The long standing libstdc++/30928 has been fixed for targets
       running glibc 2.10 or later.
     * As usual, many small and larger bug fixes, in particular quite a
       few corner cases in <locale>.

  Fortran

     * GNU Fortran now employs libcpp directly instead of using cc1 as an
       external preprocessor. The [9]-cpp option was added to allow manual
       invocation of the preprocessor without relying on filename
       extensions.
     * The [10]-Warray-temporaries option warns about array temporaries
       generated by the compiler, as an aid to optimization.
     * The [11]-fcheck-array-temporaries option has been added, printing a
       notification at run time, when an array temporary had to be created
       for an function argument. Contrary to -Warray-temporaries the
       warning is only printed if the array is noncontiguous.
     * Improved generation of DWARF debugging symbols
     * If using an intrinsic not part of the selected standard (via -std=
       and -fall-intrinsics) gfortran will now treat it as if this
       procedure were declared EXTERNAL and try to link to a user-supplied
       procedure. -Wintrinsics-std will warn whenever this happens. The
       now-useless option -Wnonstd-intrinsic was removed.
     * The flag -falign-commons has been added to control the alignment of
       variables in COMMON blocks, which is enabled by default in line
       with previous GCC version. Using -fno-align-commons one can force
       commons to be contiguous in memory as required by the Fortran
       standard, however, this slows down the memory access. The option
       -Walign-commons, which is enabled by default, warns when padding
       bytes were added for alignment. The proper solution is to sort the
       common objects by decreasing storage size, which avoids the
       alignment problems.
     * Fortran 2003 support has been extended:
          + Wide characters (ISO 10646, UCS-4, kind=4) and UTF-8 I/O is
            now supported (except internal reads from/writes to wide
            strings). [12]-fbackslash now supports also \unnnn and
            \Unnnnnnnn to enter Unicode characters.
          + Asynchronous I/O (implemented as synchronous I/O) and the
            decimal=, size=, sign=, pad=, blank=, and delim= specifiers
            are now supported in I/O statements.
          + Support for Fortran 2003 structure constructors and for array
            constructor with typespec has been added.
          + Procedure Pointers (but not yet as component in derived types
            and as function results) are now supported.
          + Abstract types, type extension, and type-bound procedures
            (both PROCEDURE and GENERIC but not as operators). Note: As
            CLASS/polymorphyic types are not implemented, type-bound
            procedures with PASS accept as non-standard extension TYPE
            arguments.
     * Fortran 2008 support has been added:
          + The -std=f2008 option and support for the file extensions
            .f2008 and .F2008 has been added.
          + The g0 format descriptor is now supported.
          + The Fortran 2008 mathematical intrinsics ASINH, ACOSH, ATANH,
            ERF, ERFC, GAMMA, LOG_GAMMA, BESSEL_*, HYPOT, and ERFC_SCALED
            are now available (some of them existed as GNU extension
            before). Note: The hyperbolic functions are not yet supporting
            complex arguments and the three- argument version of BESSEL_*N
            is not available.
          + The bit intrinsics LEADZ and TRAILZ have been added.

  Java (GCJ)

  Ada

     * The Ada runtime now supports multilibs on many platforms including
       x86_64, SPARC and PowerPC. Their build is enabled by default.

New Targets and Target Specific Improvements

  ARM

     * GCC now supports optimizing for the Cortex-A9, Cortex-R4 and
       Cortex-R4F processors and has many other improvements to
       optimization for ARM processors.
     * GCC now supports the VFPv3 variant with 16 double-precision
       registers with -mfpu=vfpv3-d16. The option -mfpu=vfp3 has been
       renamed to -mfpu=vfpv3.
     * GCC now supports the -mfix-cortex-m3-ldrd option to work around an
       erratum on Cortex-M3 processors.
     * GCC now supports the __sync_* atomic operations for ARM EABI
       GNU/Linux.
     * The section anchors optimization is now enabled by default when
       optimizing for ARM.
     * GCC now uses a new EABI-compatible profiling interface for EABI
       targets. This requires a function __gnu_mcount_nc, which is
       provided by GNU libc versions 2.8 and later.

  AVR

     * The -mno-tablejump option has been deprecated because it has the
       same effect as the -fno-jump-tables option.
     * Added support for these new AVR devices:
          + ATA6289
          + ATtiny13A
          + ATtiny87
          + ATtiny167
          + ATtiny327
          + ATmega8C1
          + ATmega16C1
          + ATmega32C1
          + ATmega8M1
          + ATmega16M1
          + ATmega32M1
          + ATmega32U4
          + ATmega16HVB
          + ATmega4HVD
          + ATmega8HVD
          + ATmega64C1
          + ATmega64M1
          + ATmega16U4
          + ATmega32U6
          + ATmega128RFA1
          + AT90PWM81
          + AT90SCR100
          + M3000F
          + M3000S
          + M3001B

  IA-32/x86-64

     * Support for Intel AES built-in functions and code generation is
       available via -maes.
     * Support for Intel PCLMUL built-in function and code generation is
       available via -mpclmul.
     * Support for Intel AVX built-in functions and code generation is
       available via -mavx.
     * Automatically align the stack for local variables with alignment
       requirement.
     * GCC can now utilize the SVML library for vectorizing calls to a set
       of C99 functions if -mveclibabi=svml is specified and you link to
       an SVML ABI compatible library.
     * On x86-64, the ABI has been changed in the following cases to
       conform to the x86-64 ABI:
          + Passing/returning structures with flexible array member:
  struct foo
    {
      int i;
      int flex[];
    };
          + Passing/returning structures with complex float member:
  struct foo
    {
      int i;
      __complex__ float f;
    };
          + Passing/returning unions with long double member:
  union foo
    {
      int x;
      long double ld;
    };
       Code built with previous versions of GCC that uses any of these is
       not compatible with code built with GCC 4.4.0 or later.
     * A new target attribute was added to allow programmers to change the
       target options like -msse2 or -march=k8 for an individual function.
       You can also change the target options via the GCC target pragma
       for functions defined after the pragma.
     * GCC can now be configured with options --with-arch-32,
       --with-arch-64, --with-cpu-32, --with-cpu-64, --with-tune-32 and
       --with-tune-64 to control the default optimization separately for
       32-bit and 64-bit modes.

  IA-32/IA64

     * Support for __float128 (TFmode) IEEE quad type and corresponding
       TCmode IEEE complex quad type is available via the soft-fp library
       on IA-32/IA64 targets. This includes basic arithmetic operations
       (addition, subtraction, negation, multiplication and division) on
       __float128 real and TCmode complex values, the full set of IEEE
       comparisons between __float128 values, conversions to and from
       float, double and long double floating point types, as well as
       conversions to and from signed or unsigned integer, signed or
       unsigned long integer and signed or unsigned quad (TImode, IA64
       only) integer types. Additionally, all operations generate the full
       set of IEEE exceptions and support the full set of IEEE rounding
       modes.

  M68K/ColdFire

     * GCC now supports instruction scheduling for ColdFire V1, V3 and V4
       processors. (Scheduling support for ColdFire V2 processors was
       added in GCC 4.3.)
     * GCC now supports the -mxgot option to support programs requiring
       many GOT entries on ColdFire.
     * The m68k-*-linux-gnu target now builds multilibs by default.

  MIPS

     * MIPS Technologies have extended the original MIPS SVR4 ABI to
       include support for procedure linkage tables (PLTs) and copy
       relocations. These extensions allow GNU/Linux executables to use a
       significantly more efficient code model than the one defined by the
       original ABI.
       GCC support for this code model is available via a new command-line
       option, -mplt. There is also a new configure-time option,
       --with-mips-plt, to make -mplt the default.
       The new code model requires support from the assembler, the linker,
       and the runtime C library. This support is available in binutils
       2.19 and GLIBC 2.9.
     * GCC can now generate MIPS16 code for 32-bit GNU/Linux executables
       and 32-bit GNU/Linux shared libraries. This feature requires GNU
       binutils 2.19 or above.
     * Support for RMI's XLR processor is now available through the
       -march=xlr and -mtune=xlr options.
     * 64-bit targets can now perform 128-bit multiplications inline,
       instead of relying on a libgcc function.
     * Native GNU/Linux toolchains now support -march=native and
       -mtune=native, which select the host processor.
     * GCC now supports the R10K, R12K, R14K and R16K processors. The
       canonical -march= and -mtune= names for these processors are
       r10000, r12000, r14000 and r16000 respectively.
     * GCC can now work around the side effects of speculative execution
       on R10K processors. Please see the documentation of the
       -mr10k-cache-barrier option for details.
     * Support for the MIPS64 Release 2 instruction set has been added.
       The option -march=mips64r2 enables generation of these
       instructions.
     * GCC now supports Cavium Networks' Octeon processor. This support is
       available through the -march=octeon and -mtune=octeon options.
     * GCC now supports STMicroelectronics' Loongson 2E/2F processors. The
       canonical -march= and -mtune= names for these processors are
       loongson2e and loongson2f.

  picochip

   Picochip is a 16-bit processor. A typical picoChip contains over 250
   small cores, each with small amounts of memory. There are three
   processor variants (STAN, MEM and CTRL) with different instruction sets
   and memory configurations and they can be chosen using the -mae option.

   This port is intended to be a "C" only port.

  Power Architecture and PowerPC

     * GCC now supports the e300c2, e300c3 and e500mc processors.
     * GCC now supports Xilinx processors with a single-precision FPU.
     * Decimal floating point is now supported for e500 processors.

  S/390, zSeries and System z9/z10

     * Support for the IBM System z10 EC/BC processor has been added. When
       using the -march=z10 option, the compiler will generate code making
       use of instructions provided by the General-Instruction-Extension
       Facility and the Execute-Extension Facility.

  VxWorks

     * GCC now supports the thread-local storage mechanism used on
       VxWorks.

  Xtensa

     * GCC now supports thread-local storage (TLS) for Xtensa processor
       configurations that include the Thread Pointer option. TLS also
       requires support from the assembler and linker; this support is
       provided in the GNU binutils beginning with version 2.19.

Documentation improvements

Other significant improvements

GCC 4.4.1

   This is the [13]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.2

   This is the [14]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.3

   This is the [15]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.4

   This is the [16]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.5

   This is the [17]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.5 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.6

   This is the [18]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.6 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.4.7

   This is the [19]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.4.7 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [20]GCC manuals. If that fails, the
    [21]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [22]gcc@gcc.gnu.org. All of [23]our lists have public
    archives.

   Copyright (C) [24]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [25]maintained by the GCC team. Last modified
   2012-11-02[26].

References

   1. http://gcc.gnu.org/gcc-4.4/changes.html#4.4.7
   2. http://gcc.gnu.org/gcc-4.3/changes.html#obsoleted
   3. http://gcc.gnu.org/gcc-4.4/porting_to.html
   4. http://gcc.gnu.org/wiki/Graphite
   5. http://openmp.org/wp/openmp-specifications/
   6. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1040.pdf
   7. http://gcc.gnu.org/gcc-4.4/cxx0x_status.html
   8. http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#id476343
   9. http://gcc.gnu.org/onlinedocs/gfortran/Preprocessing-Options.html
  10. http://gcc.gnu.org/onlinedocs/gfortran/Error-and-Warning-Options.html#index-g_t_0040code_007bWarray-temporaries_007d-125
  11. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfcheck-array-temporaries_007d-221
  12. http://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html#index-g_t_0040code_007bbackslash_007d-34
  13. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.1
  14. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.2
  15. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.3
  16. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.4
  17. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.5
  18. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.6
  19. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.4.7
  20. http://gcc.gnu.org/onlinedocs/
  21. mailto:gcc-help@gcc.gnu.org
  22. mailto:gcc@gcc.gnu.org
  23. http://gcc.gnu.org/lists.html
  24. http://www.fsf.org/
  25. http://gcc.gnu.org/about.html
  26. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.3/index.html

                             GCC 4.3 Release Series

   Jun 27, 2011

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.3.6.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.3.5 relative to previous releases of GCC.

Release History

   GCC 4.3.6
          Jun 27, 2011 ([2]changes)

   GCC 4.3.5
          May 22, 2010 ([3]changes)

   GCC 4.3.4
          August 4, 2009 ([4]changes)

   GCC 4.3.3
          January 24, 2009 ([5]changes)

   GCC 4.3.2
          August 27, 2008 ([6]changes)

   GCC 4.3.1
          June 6, 2008 ([7]changes)

   GCC 4.3.0
          March 5, 2008 ([8]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [9]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [10]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [11]GCC
   project web site or contact the [12]GCC development mailing list.

   To obtain GCC please use [13]our mirror sites or [14]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [15]GCC manuals. If that fails, the
    [16]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [17]gcc@gcc.gnu.org. All of [18]our lists have public
    archives.

   Copyright (C) [19]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [20]maintained by the GCC team. Last modified
   2012-11-02[21].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.3/changes.html
   3. http://gcc.gnu.org/gcc-4.3/changes.html
   4. http://gcc.gnu.org/gcc-4.3/changes.html
   5. http://gcc.gnu.org/gcc-4.3/changes.html
   6. http://gcc.gnu.org/gcc-4.3/changes.html
   7. http://gcc.gnu.org/gcc-4.3/changes.html
   8. http://gcc.gnu.org/gcc-4.3/changes.html
   9. http://gcc.gnu.org/gcc-4.3/buildstat.html
  10. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  11. http://gcc.gnu.org/index.html
  12. mailto:gcc@gcc.gnu.org
  13. http://gcc.gnu.org/mirrors.html
  14. http://gcc.gnu.org/svn.html
  15. http://gcc.gnu.org/onlinedocs/
  16. mailto:gcc-help@gcc.gnu.org
  17. mailto:gcc@gcc.gnu.org
  18. http://gcc.gnu.org/lists.html
  19. http://www.fsf.org/
  20. http://gcc.gnu.org/about.html
  21. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.3/changes.html

                             GCC 4.3 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 4.3 release series is [1]GCC 4.3.5.

Caveats

     * GCC requires the [2]GMP and [3]MPFR libraries for building all the
       various front-end languages it supports. See the [4]prerequisites
       page for version requirements.
     * ColdFire targets now treat long double as having the same format as
       double. In earlier versions of GCC, they used the 68881 long double
       format instead.
     * The m68k-uclinux target now uses the same calling conventions as
       m68k-linux-gnu. You can select the original calling conventions by
       configuring for m68k-uclinuxoldabi instead. Note that
       m68k-uclinuxoldabi also retains the original 80-bit long double on
       ColdFire targets.
     * The -fforce-mem option has been removed because it has had no
       effect in the last few GCC releases.
     * The i386 -msvr3-shlib option has been removed since it is no longer
       used.
     * Fastcall for i386 has been changed not to pass aggregate arguments
       in registers, following Microsoft compilers.
     * Support for the AOF assembler has been removed from the ARM back
       end; this affects only the targets arm-semi-aof and armel-semi-aof,
       which are no longer recognized. We removed these targets without a
       deprecation period because we discovered that they have been
       unusable since GCC 4.0.0.
     * Support for the TMS320C3x/C4x processor (targets c4x-* and tic4x-*)
       has been removed. This support had been deprecated since GCC 4.0.0.
     * Support for a number of older systems and recently unmaintained or
       untested target ports of GCC has been declared obsolete in GCC 4.3.
       Unless there is activity to revive them, the next release of GCC
       will have their sources permanently removed.
       All GCC ports for the following processor architectures have been
       declared obsolete:
          + Morpho MT (mt-*)
       The following aliases for processor architectures have been
       declared obsolete. Users should use the indicated generic target
       names instead, with compile-time options such as -mcpu or
       configure-time options such as --with-cpu to control the
       configuration more precisely.
          + strongarm*-*-*, ep9312*-*-*, xscale*-*-* (use arm*-*-*
            instead).
          + parisc*-*-* (use hppa*-*-* instead).
          + m680[012]0-*-* (use m68k-*-* instead).
       All GCC ports for the following operating systems have been
       declared obsolete:
          + BeOS (*-*-beos*)
          + kaOS (*-*-kaos*)
          + GNU/Linux using the a.out object format (*-*-linux*aout*)
          + GNU/Linux using version 1 of the GNU C Library
            (*-*-linux*libc1*)
          + Solaris versions before Solaris 7 (*-*-solaris2.[0-6],
            *-*-solaris2.[0-6].*)
          + Miscellaneous System V (*-*-sysv*)
          + WindISS (*-*-windiss*)
       Also, those for some individual systems on particular architectures
       have been obsoleted:
          + UNICOS/mk on DEC Alpha (alpha*-*-unicosmk*)
          + CRIS with a.out object format (cris-*-aout)
          + BSD 4.3 on PA-RISC (hppa1.1-*-bsd*)
          + OSF/1 on PA-RISC (hppa1.1-*-osf*)
          + PRO on PA-RISC (hppa1.1-*-pro*)
          + Sequent PTX on IA32 (i[34567]86-sequent-ptx4*,
            i[34567]86-sequent-sysv4*)
          + SCO Open Server 5 on IA32 (i[34567]86-*-sco3.2v5*)
          + UWIN on IA32 (i[34567]86-*-uwin*) (support for UWIN as a host
            was previously [5]removed in 2001, leaving only the support
            for UWIN as a target now being deprecated)
          + ChorusOS on PowerPC (powerpc-*-chorusos*)
          + All VAX configurations apart from NetBSD and OpenBSD
            (vax-*-bsd*, vax-*-sysv*, vax-*-ultrix*)
     * The [6]-Wconversion option has been modified. Its purpose now is to
       warn for implicit conversions that may alter a value. This new
       behavior is available for both C and C++. Warnings about
       conversions between signed and unsigned integers can be disabled by
       using -Wno-sign-conversion. In C++, they are disabled by default
       unless -Wsign-conversion is explicitly requested. The old behavior
       of -Wconversion, that is, warn for prototypes causing a type
       conversion that is different from what would happen to the same
       argument in the absence of a prototype, has been moved to a new
       option -Wtraditional-conversion, which is only available for C.
     * The -m386, -m486, -mpentium and -mpentiumpro tuning options have
       been removed because they were deprecated for more than 3 GCC major
       releases. Use -mtune=i386, -mtune=i486, -mtune=pentium or
       -mtune=pentiumpro as a replacement.
     * The -funsafe-math-optimizations option now automatically turns on
       -fno-trapping-math in addition to -fno-signed-zeros, as it enables
       reassociation and thus may introduce or remove traps.
     * The -ftree-vectorize option is now on by default under -O3. In
       order to generate code for a SIMD extension, it has to be enabled
       as well: use -maltivec for PowerPC platforms and -msse/-msse2 for
       i?86 and x86_64.
     * More information on porting to GCC 4.3 from previous versions of
       GCC can be found in the [7]porting guide for this release.

General Optimizer Improvements

     * The GCC middle-end has been integrated with the [8]MPFR library.
       This allows GCC to evaluate and replace at compile-time calls to
       built-in math functions having constant arguments with their
       mathematically equivalent results. In making use of [9]MPFR, GCC
       can generate correct results regardless of the math library
       implementation or floating point precision of the host platform.
       This also allows GCC to generate identical results regardless of
       whether one compiles in native or cross-compile configurations to a
       particular target. The following built-in functions take advantage
       of this new capability: acos, acosh, asin, asinh, atan2, atan,
       atanh, cbrt, cos, cosh, drem, erf, erfc, exp10, exp2, exp, expm1,
       fdim, fma, fmax, fmin, gamma_r, hypot, j0, j1, jn, lgamma_r, log10,
       log1p, log2, log, pow10, pow, remainder, remquo, sin, sincos, sinh,
       tan, tanh, tgamma, y0, y1 and yn. The float and long double
       variants of these functions (e.g. sinf and sinl) are also handled.
       The sqrt and cabs functions with constant arguments were already
       optimized in prior GCC releases. Now they also use [10]MPFR.
     * A new forward propagation pass on RTL was added. The new pass
       replaces several slower transformations, resulting in compile-time
       improvements as well as better code generation in some cases.
     * A new command-line switch -frecord-gcc-switches has been added to
       GCC, although it is only enabled for some targets. The switch
       causes the command line that was used to invoke the compiler to be
       recorded into the object file that is being created. The exact
       format of this recording is target and binary file format
       dependent, but it usually takes the form of a note section
       containing ASCII text. The switch is related to the -fverbose-asm
       switch, but that one only records the information in the assembler
       output file as comments, so the information never reaches the
       object file.
     * The inliner heuristic is now aware of stack frame consumption. New
       command-line parameters --param large-stack-frame and --param
       large-stack-frame-growth can be used to limit stack frame size
       growth caused by inlining.
     * During feedback directed optimizations, the expected block size the
       memcpy, memset and bzero functions operate on is discovered and for
       cases of commonly used small sizes, specialized inline code is
       generated.
     * __builtin_expect no longer requires its argument to be a compile
       time constant.
     * Interprocedural optimization was reorganized to work on functions
       in SSA form. This enables more precise and cheaper dataflow
       analysis and makes writing interprocedural optimizations easier.
       The following improvements have been implemented on top of this
       framework:
          + Pre-inline optimization: Selected local optimization passes
            are run before the inliner (and other interprocedural passes)
            are executed. This significantly improves the accuracy of code
            growth estimates used by the inliner and reduces the overall
            memory footprint for large compilation units.
          + Early inlining (a simple bottom-up inliner pass inlining only
            functions whose body is smaller than the expected call
            overhead) is now executed with the early optimization passes,
            thus inlining already optimized function bodies into an
            unoptimized function that is subsequently optimized by early
            optimizers. This enables the compiler to quickly eliminate
            abstraction penalty in C++ programs.
          + Interprocedural constant propagation now operate on SSA form
            increasing accuracy of the analysis.
     * A new internal representation for GIMPLE statements has been
       contributed, resulting in compile-time memory savings.
     * The vectorizer was enhanced to support vectorization of outer
       loops, intra-iteration parallelism (loop-aware SLP), vectorization
       of strided accesses and loops with multiple data-types. Run-time
       dependency testing using loop versioning was added. The cost model,
       turned on by -fvect-cost-model, was developed.

New Languages and Language specific improvements

     * We have added new command-line options
       -finstrument-functions-exclude-function-list and
       -finstrument-functions-exclude-file-list. They provide more control
       over which functions are annotated by the -finstrument-functions
       option.

  C family

     * Implicit conversions between generic vector types are now only
       permitted when the two vectors in question have the same number of
       elements and compatible element types. (Note that the restriction
       involves compatible element types, not implicitly-convertible
       element types: thus, a vector type with element type int may not be
       implicitly converted to a vector type with element type unsigned
       int.) This restriction, which is in line with specifications for
       SIMD architectures such as AltiVec, may be relaxed using the flag
       -flax-vector-conversions. This flag is intended only as a
       compatibility measure and should not be used for new code.
     * -Warray-bounds has been added and is now enabled by default for
       -Wall . It produces warnings for array subscripts that can be
       determined at compile time to be always out of bounds.
       -Wno-array-bounds will disable the warning.
     * The constructor and destructor function attributes now accept
       optional priority arguments which control the order in which the
       constructor and destructor functions are run.
     * New [11]command-line options -Wtype-limits,
       -Wold-style-declaration, -Wmissing-parameter-type, -Wempty-body,
       -Wclobbered and -Wignored-qualifiers have been added for finer
       control of the diverse warnings enabled by -Wextra.
     * A new function attribute alloc_size has been added to mark up
       malloc style functions. For constant sized allocations this can be
       used to find out the size of the returned pointer using the
       __builtin_object_size() function for buffer overflow checking and
       similar. This supplements the already built-in malloc and calloc
       constant size handling.
     * Integer constants written in binary are now supported as a GCC
       extension. They consist of a prefix 0b or 0B, followed by a
       sequence of 0 and 1 digits.
     * A new predefined macro __COUNTER__ has been added. It expands to
       sequential integral values starting from 0. In conjunction with the
       ## operator, this provides a convenient means to generate unique
       identifiers.
     * A new command-line option -fdirectives-only has been added. It
       enables a special preprocessing mode which improves the performance
       of applications like distcc and ccache.
     * Fixed-point data types and operators have been added. They are
       based on Chapter 4 of the Embedded-C specification (n1169.pdf).
       Currently, only MIPS targets are supported.
     * Decimal floating-point arithmetic based on draft ISO/IEC TR 24732,
       N1241, is now supported as a GCC extension to C for targets
       i[34567]86-*-linux-gnu, powerpc*-*-linux-gnu, s390*-ibm-linux-gnu,
       and x86_64-*-linux-gnu. The feature introduces new data types
       _Decimal32, _Decimal64, and _Decimal128 with constant suffixes DF,
       DD, and DL.

  C++

     * [12]Experimental support for the upcoming ISO C++ standard, C++0x.
     * -Wc++0x-compat has been added and is now enabled by default for
       -Wall. It produces warnings for constructs whose meaning differs
       between ISO C++ 1998 and C++0x.
     * The -Wparentheses option now works for C++ as it does for C. It
       warns if parentheses are omitted when operators with confusing
       precedence are nested. It also warns about ambiguous else
       statements. Since -Wparentheses is enabled by -Wall, this may cause
       additional warnings with existing C++ code which uses -Wall. These
       new warnings may be disabled by using -Wall -Wno-parentheses.
     * The -Wmissing-declarations now works for C++ as it does for C.
     * The -fvisibility-ms-compat flag was added, to make it easier to
       port larger projects using shared libraries from Microsoft's Visual
       Studio to ELF and Mach-O systems.
     * C++ attribute handling has been overhauled for template arguments
       (ie dependent types). In particular, __attribute__((aligned(T)));
       works for C++ types.

    Runtime Library (libstdc++)

     * [13]Experimental support for the upcoming ISO C++ standard, C++0x.
     * Support for TR1 mathematical special functions and regular
       expressions. ([14]Implementation status of TR1)
     * Default what implementations give more elaborate exception strings
       for bad_cast, bad_typeid, bad_exception, and bad_alloc.
     * Header dependencies have been streamlined, reducing unnecessary
       includes and pre-processed bloat.
     * Variadic template implementations of items in <tuple> and
       <functional>.
     * An experimental [15]parallel mode has been added. This is a
       parallel implementation of many C++ Standard library algorithms,
       like std::accumulate, std::for_each, std::transform, or std::sort,
       to give but four examples. These algorithms can be substituted for
       the normal (sequential) libstdc++ algorithms on a piecemeal basis,
       or all existing algorithms can be transformed via the
       -D_GLIBCXX_PARALLEL macro.
     * Debug mode versions of classes in <unordered_set> and
       <unordered_map>.
     * Formal deprecation of <ext/hash_set> and <ext/hash_map>, which are
       now <backward/hash_set> and <backward/hash_map>. This code:
    #include <ext/hash_set>
    __gnu_cxx::hash_set<int> s;

       Can be transformed (in order of preference) to:
    #include <tr1/unordered_set>
    std::tr1::unordered_set<int> s;

       or
    #include <backward/hash_set>
    __gnu_cxx::hash_set<int> s;

       Similar transformations apply to __gnu_cxx::hash_map,
       __gnu_cxx::hash_multimap, __gnu_cxx::hash_set,
       __gnu_cxx::hash_multiset.

  Fortran

     * Due to the fact that the [16]GMP and [17]MPFR libraries are
       required for all languages, Fortran is no longer special in this
       regard and is available by default.
     * The [18]-fexternal-blas option has been added, which generates
       calls to BLAS routines for intrinsic matrix operations such as
       matmul rather than using the built-in algorithms.
     * Support to give a backtrace (compiler flag -fbacktrace or
       environment variable GFORTRAN_ERROR_BACKTRACE; on glibc systems
       only) or a core dump (-fdump-core, GFORTRAN_ERROR_DUMPCORE) when a
       run-time error occured.
     * GNU Fortran now defines __GFORTRAN__ when it runs the C
       preprocessor (CPP).
     * The [19]-finit-local-zero, -finit-real, -finit-integer,
       -finit-character, and -finit-logical options have been added, which
       can be used to initialize local variables.
     * The intrinsic procedures [20]GAMMA and [21]LGAMMA have been added,
       which calculate the Gamma function and its logarithm. Use EXTERNAL
       gamma if you want to use your own gamma function.
     * GNU Fortran now regards the backslash character as literal (as
       required by the Fortran 2003 standard); using [22]-fbackslash GNU
       Fortran interprets backslashes as C-style escape characters.
     * The [23]interpretation of binary, octal and hexadecimal (BOZ)
       literal constants has been changed. Before they were always
       interpreted as integer; now they are bit-wise transferred as
       argument of INT, REAL, DBLE and CMPLX as required by the Fortran
       2003 standard, and for real and complex variables in DATA
       statements or when directly assigned to real and complex variables.
       Everywhere else and especially in expressions they are still
       regarded as integer constants.
     * Fortran 2003 support has been extended:
          + Intrinsic statements IMPORT, PROTECTED, VALUE and VOLATILE
          + Pointer intent
          + Intrinsic module ISO_ENV_FORTRAN
          + Interoperability with C (ISO C Bindings)
          + ABSTRACT INTERFACES and PROCEDURE statements (without POINTER
            attribute)
          + Fortran 2003 BOZ

  Java (GCJ)

     * GCJ now uses the Eclipse Java compiler for its Java parsing needs.
       This enables the use of all 1.5 language features, and fixes most
       existing front end bugs.
     * libgcj now supports all 1.5 language features which require runtime
       support: foreach, enum, annotations, generics, and auto-boxing.
     * We've made many changes to the tools shipped with gcj.
          + The old jv-scan tool has been removed. This tool never really
            worked properly. There is no replacement.
          + gcjh has been rewritten. Some of its more obscure options no
            longer work, but are still recognized in an attempt at
            compatibility. gjavah is a new program with similar
            functionality but different command-line options.
          + grmic and grmiregistry have been rewritten. grmid has been
            added.
          + gjar replaces the old fastjar.
          + gjarsigner (used for signing jars), gkeytool (used for key
            management), gorbd (for CORBA), gserialver (computes
            serialization UIDs), and gtnameserv (also for CORBA) are now
            installed.
     * The ability to dump the contents of the java run time heap to a
       file for off-line analysis has been added. The heap dumps may be
       analyzed with the new gc-analyze tool. They may be generated on
       out-of-memory conditions or on demand and are controlled by the new
       run time class gnu.gcj.util.GCInfo.
     * java.util.TimeZone can now read files from /usr/share/zoneinfo to
       provide correct, updated, timezone information. This means that
       packagers no longer have to update libgcj when a time zone change
       is published.

New Targets and Target Specific Improvements

  IA-32/x86-64

     * Tuning for Intel Core 2 processors is available via -mtune=core2
       and -march=core2.
     * Tuning for AMD Geode processors is available via -mtune=geode and
       -march=geode.
     * Code generation of block move (memcpy) and block set (memset) was
       rewritten. GCC can now pick the best algorithm (loop, unrolled
       loop, instruction with rep prefix or a library call) based on the
       size of the block being copied and the CPU being optimized for. A
       new option -minline-stringops-dynamically has been added. With this
       option string operations of unknown size are expanded such that
       small blocks are copied by in-line code, while for large blocks a
       library call is used. This results in faster code than
       -minline-all-stringops when the library implementation is capable
       of using cache hierarchy hints. The heuristic choosing the
       particular algorithm can be overwritten via -mstringop-strategy.
       Newly also memset of values different from 0 is inlined.
     * GCC no longer places the cld instruction before string operations.
       Both i386 and x86-64 ABI documents mandate the direction flag to be
       clear at the entry of a function. It is now invalid to set the flag
       in asm statement without reseting it afterward.
     * Support for SSSE3 built-in functions and code generation are
       available via -mssse3.
     * Support for SSE4.1 built-in functions and code generation are
       available via -msse4.1.
     * Support for SSE4.2 built-in functions and code generation are
       available via -msse4.2.
     * Both SSE4.1 and SSE4.2 support can be enabled via -msse4.
     * A new set of options -mpc32, -mpc64 and -mpc80 have been added to
       allow explicit control of x87 floating point precision.
     * Support for __float128 (TFmode) IEEE quad type and corresponding
       TCmode IEEE complex quad type is available via the soft-fp library
       on x86_64 targets. This includes basic arithmetic operations
       (addition, subtraction, negation, multiplication and division) on
       __float128 real and TCmode complex values, the full set of IEEE
       comparisons between __float128 values, conversions to and from
       float, double and long double floating point types, as well as
       conversions to and from signed or unsigned integer, signed or
       unsigned long integer and signed or unsigned quad (TImode) integer
       types. Additionally, all operations generate the full set of IEEE
       exceptions and support the full set of IEEE rounding modes.
     * GCC can now utilize the ACML library for vectorizing calls to a set
       of C99 functions on x86_64 if -mveclibabi=acml is specified and you
       link to an ACML ABI compatible library.

  ARM

     * Compiler and Library support for Thumb-2 and the ARMv7 architecture
       has been added.

  CRIS

    New features

     * Compiler and Library support for the CRIS v32 architecture, as
       found in Axis Communications ETRAX FS and ARTPEC-3 chips, has been
       added.

    Configuration changes

     * The cris-*-elf target now includes support for CRIS v32, including
       libraries, through the -march=v32 option.
     * A new crisv32-*-elf target defaults to generate code for CRIS v32.
     * A new crisv32-*-linux* target defaults to generate code for CRIS
       v32.
     * The cris-*-aout target has been obsoleted.

    Improved support for built-in functions

     * GCC can now use the lz and swapwbr instructions to implement the
       __builtin_clz, __builtin_ctz and __builtin_ffs family of functions.
     * __builtin_bswap32 is now implemented using the swapwb instruction,
       when available.

  m68k and ColdFire

    New features

     * Support for several new ColdFire processors has been added. You can
       generate code for them using the new -mcpu option.
     * All targets now support ColdFire processors.
     * m68k-uclinux targets have improved support for C++ constructors and
       destructors, and for shared libraries.
     * It is now possible to set breakpoints on the first or last line of
       a function, even if there are no statements on that line.

    Optimizations

     * Support for sibling calls has been added.
     * More use is now made of the ColdFire mov3q instruction.
     * __builtin_clz is now implemented using the ff1 ColdFire
       instruction, when available.
     * GCC now honors the -m68010 option. 68010 code now uses clr rather
       than move to zero volatile memory.
     * 68020 targets and above can now use symbol(index.size*scale)
       addresses for indexed array accesses. Earlier compilers would
       always load the symbol into a base register first.

    Configuration changes

     * All m68k and ColdFire targets now allow the default processor to be
       set at configure time using --with-cpu.
     * A --with-arch configuration option has been added. This option
       allows you to restrict a target to ColdFire or non-ColdFire
       processors.

    Preprocessor macros

     * An __mcfv*__ macro is now defined for all ColdFire targets.
       (Earlier versions of GCC only defined __mcfv4e__.)
     * __mcf_cpu_*, __mcf_family_* and __mcffpu__ macros have been added.
     * All targets now define __mc68010 and __mc68010__ when generating
       68010 code.

    Command-line changes

     * New command-line options -march, -mcpu, -mtune and -mhard-float
       have been added. These options apply to both m68k and ColdFire
       targets.
     * -mno-short, -mno-bitfield and -mno-rtd are now accepted as negative
       versions of -mshort, etc.
     * -fforce-addr has been removed. It is now ignored by the compiler.

    Other improvements

     * ColdFire targets now try to maintain a 4-byte-aligned stack where
       possible.
     * m68k-uclinux targets now try to avoid situations that lead to the
       load-time error: BINFMT_FLAT: reloc outside program.

  MIPS

    Changes to existing configurations

     * libffi and libjava now support all three GNU/Linux ABIs: o32, n32
       and n64. Every GNU/Linux configuration now builds these libraries
       by default.
     * GNU/Linux configurations now generate -mno-shared code unless
       overridden by -fpic, -fPIC, -fpie or -fPIE.
     * mipsisa32*-linux-gnu configurations now generate hard-float code by
       default, just like other mipsisa32* and mips*-linux-gnu
       configurations. You can build a soft-float version of any
       mips*-linux-gnu configuration by passing --with-float=soft to
       configure.
     * mips-wrs-vxworks now supports run-time processes (RTPs).

    Changes to existing command-line options

     * The -march and -mtune options no longer accept 24k as a processor
       name. Please use 24kc, 24kf2_1 or 24kf1_1 instead.
     * The -march and -mtune options now accept 24kf2_1, 24kef2_1 and
       34kf2_1 as synonyms for 24kf, 24kef and 34kf respectively. The
       options also accept 24kf1_1, 24kef1_1 and 34kf1_1 as synonyms for
       24kx, 24kex and 34kx.

    New configurations

   GCC now supports the following configurations:
     * mipsisa32r2*-linux-gnu*, which generates MIPS32 revision 2 code by
       default. Earlier releases also recognized this configuration, but
       they treated it in the same way as mipsisa32*-linux-gnu*. Note that
       you can customize any mips*-linux-gnu* configuration to a
       particular ISA or processor by passing an appropriate --with-arch
       option to configure.
     * mipsisa*-sde-elf*, which provides compatibility with MIPS
       Technologies' SDE toolchains. The configuration uses the SDE
       libraries by default, but you can use it like other newlib-based
       ELF configurations by passing --with-newlib to configure. It is the
       only configuration besides mips64vr*-elf* to build MIPS16 as well
       as non-MIPS16 libraries.
     * mipsisa*-elfoabi*, which is similar to the general mipsisa*-elf*
       configuration, but uses the o32 and o64 ABIs instead of the 32-bit
       and 64-bit forms of the EABI.

    New processors and application-specific extensions

     * Support for the SmartMIPS ASE is available through the new
       -msmartmips option.
     * Support for revision 2 of the DSP ASE is available through the new
       -mdspr2 option. A new preprocessor macro called __mips_dsp_rev
       indicates the revision of the ASE in use.
     * Support for the 4KS and 74K families of processors is available
       through the -march and -mtune options.

    Improved support for built-in functions

     * GCC can now use load-linked, store-conditional and sync
       instructions to implement atomic built-in functions such as
       __sync_fetch_and_add. The memory reference must be 4 bytes wide for
       32-bit targets and either 4 or 8 bytes wide for 64-bit targets.
     * GCC can now use the clz and dclz instructions to implement the
       __builtin_ctz and __builtin_ffs families of functions.
     * There is a new __builtin___clear_cache function for flushing the
       instruction cache. GCC expands this function inline on MIPS32
       revision 2 targets, otherwise it calls the function specified by
       -mcache-flush-func.

    MIPS16 improvements

     * GCC can now compile objects that contain a mixture of MIPS16 and
       non-MIPS16 code. There are two new attributes, mips16 and nomips16,
       for specifying which mode a function should use.
     * A new option called -minterlink-mips16 makes non-MIPS16 code
       link-compatible with MIPS16 code.
     * After many bug fixes, the long-standing MIPS16 -mhard-float support
       should now work fairly reliably.
     * GCC can now use the MIPS16e save and restore instructions.
     * -fsection-anchors now works in MIPS16 mode. MIPS16 code compiled
       with -G0 -fsection-anchors is often smaller than code compiled with
       -G8. However, please note that you must usually compile all objects
       in your application with the same -G option; see the documentation
       of -G for details.
     * A new option called-mcode-readable specifies which instructions are
       allowed to load from the code segment. -mcode-readable=yes is the
       default and says that any instruction may load from the code
       segment. The other alternatives are -mcode-readable=pcrel, which
       says that only PC-relative MIPS16 instructions may load from the
       code segment, and -mcode-readable=no, which says that no
       instruction may do so. Please see the documentation for more
       details, including example uses.

    Small-data improvements

   There are three new options for controlling small data:
     * -mno-extern-sdata, which disables small-data accesses for
       externally-defined variables. Code compiled with -Gn
       -mno-extern-sdata will be link-compatible with any -G setting
       between -G0 and -Gn inclusive.
     * -mno-local-sdata, which disables the use of small-data sections for
       data that is not externally visible. This option can be a useful
       way of reducing small-data usage in less performance-critical parts
       of an application.
     * -mno-gpopt, which disables the use of the $gp register while still
       honoring the -G limit when placing externally-visible data. This
       option implies -mno-extern-sdata and -mno-local-sdata and it can be
       useful in situations where $gp does not necessarily hold the
       expected value.

    Miscellaneous improvements

     * There is a new option called -mbranch-cost for tweaking the
       perceived cost of branches.
     * If GCC is configured to use a version of GAS that supports the
       .gnu_attribute directive, it will use that directive to record
       certain properties of the output code. .gnu_attribute is new to GAS
       2.18.
     * There are two new function attributes, near and far, for overriding
       the command-line setting of -mlong-calls on a function-by-function
       basis.
     * -mfp64, which previously required a 64-bit target, now works with
       MIPS32 revision 2 targets as well. The mipsisa*-elfoabi* and
       mipsisa*-sde-elf* configurations provide suitable library support.
     * GCC now recognizes the -mdmx and -mmt options and passes them down
       to the assembler. It does nothing else with the options at present.

  SPU (Synergistic Processor Unit) of the Cell Broadband Engine Architecture
  (BEA)

     * Support has been added for this new architecture.

  RS6000 (POWER/PowerPC)

     * Support for the PowerPC 750CL paired-single instructions has been
       added with a new powerpc-*-linux*paired* target configuration. It
       is enabled by an associated -mpaired option and can be accessed
       using new built-in functions.
     * Support for auto-detecting architecture and system configuration to
       auto-select processor optimization tuning.
     * Support for VMX on AIX 5.3 has been added.
     * Support for AIX Version 6.1 has been added.

  S/390, zSeries and System z9

     * Support for the IBM System z9 EC/BC processor (z9 GA3) has been
       added. When using the -march=z9-ec option, the compiler will
       generate code making use of instructions provided by the decimal
       floating point facility and the floating point conversion facility
       (pfpo). Besides the instructions used to implement decimal floating
       point operations these facilities also contain instructions to move
       between general purpose and floating point registers and to modify
       and copy the sign-bit of floating point values.
     * When the -march=z9-ec option is used the new
       -mhard-dfp/-mno-hard-dfp options can be used to specify whether the
       decimal floating point hardware instructions will be used or not.
       If none of them is given the hardware support is enabled by
       default.
     * The -mstack-guard option can now be omitted when using stack
       checking via -mstack-size in order to let GCC choose a sensible
       stack guard value according to the frame size of each function.
     * Various changes to improve performance of generated code have been
       implemented, including:
          + The condition code set by an add logical with carry
            instruction is now available for overflow checks like: a + b +
            carry < b.
          + The test data class instruction is now used to implement
            sign-bit and infinity checks of binary and decimal floating
            point numbers.

  SPARC

     * Support for the Sun UltraSPARC T2 (Niagara 2) processor has been
       added.

  Xtensa

     * Stack unwinding for exception handling now uses by default a
       specialized version of DWARF unwinding. This is not
       binary-compatible with the setjmp/longjmp (sjlj) unwinding used for
       Xtensa with previous versions of GCC.
     * For Xtensa processors that include the Conditional Store option,
       the built-in functions for atomic memory access are now implemented
       using S32C1I instructions.
     * If the Xtensa NSA option is available, GCC will use it to implement
       the __builtin_ctz and __builtin_clz functions.

Documentation improvements

     * Existing libstdc++ documentation has been edited and restructured
       into a single DocBook XML manual. The results can be viewed online
       [24]here.

Other significant improvements

     * The compiler's --help command-line option has been extended so that
       it now takes an optional set of arguments. These arguments restrict
       the information displayed to specific classes of command-line
       options, and possibly only a subset of those options. It is also
       now possible to replace the descriptive text associated with each
       displayed option with an indication of its current value, or for
       binary options, whether it has been enabled or disabled.
       Here are some examples. The following will display all the options
       controlling warning messages:
      --help=warnings

       Whereas this will display all the undocumented, target specific
       options:
      --help=target,undocumented

       This sequence of commands will display the binary optimizations
       that are enabled by -O3:
      gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
      gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
      diff /tmp/O2-opts /tmp/O3-opts | grep enabled

     * The configure options --with-pkgversion and --with-bugurl have been
       added. These allow distributors of GCC to include a
       distributor-specific string in manuals and --version output and to
       specify the URL for reporting bugs in their versions of GCC.

GCC 4.3.1

   This is the [25]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

Target Specific Changes

  IA-32/x86-64

    ABI changes

     * Starting with GCC 4.3.1, decimal floating point variables are
       aligned to their natural boundaries when they are passed on the
       stack for i386.

    Command-line changes

     * Starting with GCC 4.3.1, the -mcld option has been added to
       automatically generate a cld instruction in the prologue of
       functions that use string instructions. This option is used for
       backward compatibility on some operating systems and can be enabled
       by default for 32-bit x86 targets by configuring GCC with the
       --enable-cld configure option.

GCC 4.3.2

   This is the [26]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.3.3

   This is the [27]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.3.4

   This is the [28]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.3.5

   This is the [29]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.5 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.3.6

   This is the [30]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.3.6 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [31]GCC manuals. If that fails, the
    [32]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [33]gcc@gcc.gnu.org. All of [34]our lists have public
    archives.

   Copyright (C) [35]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [36]maintained by the GCC team. Last modified
   2012-11-02[37].

References

   1. http://gcc.gnu.org/gcc-4.3/changes.html#4.3.5
   2. http://gmplib.org/
   3. http://www.mpfr.org/
   4. http://gcc.gnu.org/install/prerequisites.html
   5. http://gcc.gnu.org/ml/gcc-announce/2001/msg00000.html
   6. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
   7. http://gcc.gnu.org/gcc-4.3/porting_to.html
   8. http://www.mpfr.org/
   9. http://www.mpfr.org/
  10. http://www.mpfr.org/
  11. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
  12. http://gcc.gnu.org/gcc-4.3/cxx0x_status.html
  13. http://gcc.gnu.org/gcc-4.3/cxx0x_status.html
  14. http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#m anual.intro.status.standard.tr1
  15. http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
  16. http://gmplib.org/
  17. http://www.mpfr.org/
  18. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#Code-Gen-Options
  19. http://gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html#index-g_t_0040code_007bfinit-local-zero_007d-167
  20. http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/GAMMA.html
  21. http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gfortran/LGAMMA.html
  22. http://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html
  23. http://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html
  24. http://gcc.gnu.org/onlinedocs/libstdc++/
  25. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.1
  26. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.2
  27. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.3
  28. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.4
  29. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.5
  30. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.3.6
  31. http://gcc.gnu.org/onlinedocs/
  32. mailto:gcc-help@gcc.gnu.org
  33. mailto:gcc@gcc.gnu.org
  34. http://gcc.gnu.org/lists.html
  35. http://www.fsf.org/
  36. http://gcc.gnu.org/about.html
  37. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.2/index.html

                             GCC 4.2 Release Series

   May 19, 2008

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.2.4.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.2.3 relative to previous releases of GCC.

Release History

   GCC 4.2.4
          May 19, 2008 ([2]changes)

   GCC 4.2.3
          February 1, 2008 ([3]changes)

   GCC 4.2.2
          October 7, 2007 ([4]changes)

   GCC 4.2.1
          July 18, 2007 ([5]changes)

   GCC 4.2.0
          May 13, 2007 ([6]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [7]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [8]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [9]GCC project
   web site or contact the [10]GCC development mailing list.

   To obtain GCC please use [11]our mirror sites or [12]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [13]GCC manuals. If that fails, the
    [14]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [15]gcc@gcc.gnu.org. All of [16]our lists have public
    archives.

   Copyright (C) [17]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [18]maintained by the GCC team. Last modified
   2012-11-02[19].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.2/changes.html
   3. http://gcc.gnu.org/gcc-4.2/changes.html
   4. http://gcc.gnu.org/gcc-4.2/changes.html
   5. http://gcc.gnu.org/gcc-4.2/changes.html
   6. http://gcc.gnu.org/gcc-4.2/changes.html
   7. http://gcc.gnu.org/gcc-4.2/buildstat.html
   8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   9. http://gcc.gnu.org/index.html
  10. mailto:gcc@gcc.gnu.org
  11. http://gcc.gnu.org/mirrors.html
  12. http://gcc.gnu.org/svn.html
  13. http://gcc.gnu.org/onlinedocs/
  14. mailto:gcc-help@gcc.gnu.org
  15. mailto:gcc@gcc.gnu.org
  16. http://gcc.gnu.org/lists.html
  17. http://www.fsf.org/
  18. http://gcc.gnu.org/about.html
  19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.2/changes.html

                             GCC 4.2 Release Series
                        Changes, New Features, and Fixes

Caveats

     * GCC no longer accepts the -fshared-data option. This option has had
       no effect in any GCC 4 release; the targets to which the option
       used to apply had been removed before GCC 4.0.

General Optimizer Improvements

     * New command-line options specify the possible relationships among
       parameters and between parameters and global data. For example,
       -fargument-noalias-anything specifies that arguments do not alias
       any other storage.
       Each language will automatically use whatever option is required by
       the language standard. You should not need to use these options
       yourself.

New Languages and Language specific improvements

     * [1]OpenMP is now supported for the C, C++ and Fortran compilers.
     * New command-line options -fstrict-overflow and -Wstrict-overflow
       have been added. -fstrict-overflow tells the compiler that it may
       assume that the program follows the strict signed overflow
       semantics permitted for the language: for C and C++ this means that
       the compiler may assume that signed overflow does not occur. For
       example, a loop like
      for (i = 1; i > 0; i *= 2)

       is presumably intended to continue looping until i overflows. With
       -fstrict-overflow, the compiler may assume that signed overflow
       will not occur, and transform this into an infinite loop.
       -fstrict-overflow is turned on by default at -O2, and may be
       disabled via -fno-strict-overflow. The -Wstrict-overflow option may
       be used to warn about cases where the compiler assumes that signed
       overflow will not occur. It takes five different levels:
       -Wstrict-overflow=1 to 5. See the [2]documentation for details.
       -Wstrict-overflow=1 is enabled by -Wall.
     * The new command-line option -fno-toplevel-reorder directs GCC to
       emit top-level functions, variables, and asm statements in the same
       order that they appear in the input file. This is intended to
       support existing code which relies on a particular ordering (for
       example, code which uses top-level asm statements to switch
       sections). For new code, it is generally better to use function and
       variable attributes. The -fno-toplevel-reorder option may be used
       for most cases which currently use -fno-unit-at-a-time. The
       -fno-unit-at-a-time option will be removed in some future version
       of GCC. If you know of a case which requires -fno-unit-at-a-time
       which is not fixed by -fno-toplevel-reorder, please open a bug
       report.

  C family

     * The pragma redefine_extname will now macro expand its tokens for
       compatibility with SunPRO.
     * In the next release of GCC, 4.3, -std=c99 or -std=gnu99 will direct
       GCC to handle inline functions as specified in the C99 standard. In
       preparation for this, GCC 4.2 will warn about any use of non-static
       inline functions in gnu99 or c99 mode. This new warning may be
       disabled with the new gnu_inline function attribute or the new
       -fgnu89-inline command-line option. Also, GCC 4.2 and later will
       define one of the preprocessor macros __GNUC_GNU_INLINE__ or
       __GNUC_STDC_INLINE__ to indicate the semantics of inline functions
       in the current compilation.
     * A new command-line option -Waddress has been added to warn about
       suspicious uses of memory addresses as, for example, using the
       address of a function in a conditional expression, and comparisons
       against the memory address of a string literal. This warning is
       enabled by -Wall.

  C++

     * C++ visibility handling has been overhauled.
       Restricted visiblity is propagated from classes to members, from
       functions to local statics, and from templates and template
       arguments to instantiations, unless the latter has explicitly
       declared visibility.
       The visibility attribute for a class must come between the
       class-key and the name, not after the closing brace.
       Attributes are now allowed for enums and elaborated-type-specifiers
       that only declare a type.
       Members of the anonymous namespace are now local to a particular
       translation unit, along with any other declarations which use them,
       though they are still treated as having external linkage for
       language semantics.
     * The (undocumented) extension which permitted templates with default
       arguments to be bound to template template parameters with fewer
       parameters has been removed. For example:
        template <template <typename> class C>
        void f(C<double>) {}

        template <typename T, typename U = int>
        struct S {};

        template void f(S<double>);

       is no longer accepted by G++. The reason this code is not accepted
       is that S is a template with two parameters; therefore, it cannot
       be bound to C which has only one parameter.
     * The <?, >?, <?=, and >?= operators, deprecated in previous GCC
       releases, have been removed.
     * The command-line option -fconst-strings, deprecated in previous GCC
       releases, has been removed.
     * The configure variable enable-__cxa_atexit is now enabled by
       default for more targets. Enabling this variable is necessary in
       order for static destructors to be executed in the correct order,
       but it depends upon the presence of a non-standard C library in the
       target library in order to work. The variable is now enabled for
       more targets which are known to have suitable C libraries.
     * -Wextra will produce warnings for if statements with a semicolon as
       the only body, to catch code like:
         if (a);
            return 1;
         return 0;

       To suppress the warning in valid cases, use { } instead.
     * The C++ frontend now also produces strict aliasing warnings when
       -fstrict-aliasing -Wstrict-aliasing is in effect.

    Runtime Library (libstdc++)

     * Added support for TR1 <random>, <complex>, and C compatibility
       headers. In addition, a lock-free version of shared_ptr was
       contributed as part of Phillip Jordan's Google Summer of Code
       project on lock-free containers. ([3]Implementation status of TR1)
     * In association with the Summer of Code work on lock-free
       containers, the interface for atomic builtins was adjusted,
       creating simpler alternatives for non-threaded code paths. Also,
       usage was consolidated and all elements were moved from namespace
       std to namespace__gnu_cxx. Affected interfaces are the functions
       __exchange_and_add, __atomic_add, and the objects __mutex,
       __recursive_mutex, and __scoped_lock.
     * Support for versioning weak symbol names via namespace association
       was added. However, as this changes the names of exported symbols,
       this is turned off by default in the current ABI. Intrepid users
       can enable this feature by using
       --enable-symvers=gnu-versioned-namespace during configuration.
     * Revised, simplified, and expanded policy-based associative
       containers, including data types for tree and trie forms
       (basic_tree, tree, trie), lists (list_update), and both
       collision-chaining and probing hash-based containers
       (basic_hash_table, cc_hash_table, gp_hash_table). More details per
       the [4]documentation.
     * The implementation of the debug mode was modified, whereby the
       debug namespaces were nested inside of namespace std and namespace
       __gnu_cxx in order to resolve some long standing corner cases
       involving name lookup. Debug functionality from the policy-based
       data structures was consolidated and enabled with the single macro,
       _GLIBCXX_DEBUG. See PR 26142 for more information.
     * Added extensions for type traits: __conditional_type,
       __numeric_traits, __add_unsigned, __removed_unsigned, __enable_if.
     * Added a typelist implementation for compile-time meta-programming.
       Elements for typelist construction and operation can be found
       within namespace __gnu_cxx::typelist.
     * Added a new allocator, __gnu_cxx::throw_allocator, for testing
       exception-safety.
     * Enabled library-wide visibility control, allowing -fvisibility to
       be used.
     * Consolidated all nested namespaces and the conversion of
       __gnu_internal implementation-private details to anonymous
       namespaces whenever possible.
     * Implemented LWG resolutions DR 431 and DR 538.

  Fortran

     * Support for allocatable components has been added (TR 15581 and
       Fortran 2003).
     * Support for the Fortran 2003 streaming IO extension has been added.
     * The GNU Fortran compiler now uses 4-byte record markers by default
       for unformatted files to be compatible with g77 and most other
       compilers. The implementation allows for records greater than 2 GB
       and is compatible with several other compilers. Older versions of
       gfortran used 8-byte record markers by default (on most systems).
       In order to change the length of the record markers, e.g. to read
       unformatted files created by older gfortran versions, the
       [5]-frecord-marker=8 option can be used.

  Java (GCJ)

     * A new command-line option -static-libgcj has been added for targets
       that use a linker compatible with GNU Binutils. As its name
       implies, this causes libgcj to be linked statically. In some cases
       this causes the resulting executable to start faster and use less
       memory than if the shared version of libgcj were used. However
       caution should be used as it can also cause essential parts of the
       library to be omitted. Some of these issues are discussed in:
       [6]http://gcc.gnu.org/wiki/Statically_linking_libgcj
     * fastjar is no longer bundled with GCC. To build libgcj, you will
       need either InfoZIP (both zip and unzip) or an external jar
       program. In the former case, the GCC build will install a jar shell
       script that is based on InfoZIP and provides the same functionality
       as fastjar.

New Targets and Target Specific Improvements

  IA-32/x86-64

     * -mtune=generic can now be used to generate code running well on
       common x86 chips. This includes AMD Athlon, AMD Opteron, Intel
       Pentium-M, Intel Pentium 4 and Intel Core 2.
     * -mtune=native and -march=native will produce code optimized for the
       host architecture as detected using the cpuid instruction.
     * Added a new command-line option -fstackrealign and and
       __attribute__ ((force_align_arg_pointer)) to realign the stack at
       runtime. This allows functions compiled with a vector-aligned stack
       to be invoked from legacy objects that keep only word-alignment.

  SPARC

     * The default CPU setting has been changed from V7 to V9 in 32-bit
       mode on Solaris 7 and above. This is already the case in 64-bit
       mode. It can be overridden by specifying --with-cpu at configure
       time.
     * Back-end support of built-in functions for atomic memory access has
       been implemented.
     * Support for the Sun UltraSPARC T1 (Niagara) processor has been
       added.

  M32C

     * Various bug fixes have made some functions (notably, functions
       returning structures) incompatible with previous releases.
       Recompiling all libraries is recommended. Note that code quality
       has considerably improved since 4.1, making a recompile even more
       beneficial.

  MIPS

     * Added support for the Broadcom SB-1A core.

  IA-64

     * Added support for IA-64 data and control speculation. By default
       speculation is enabled only during second scheduler pass. A number
       of machine flags was introduced to control the usage of speculation
       for both scheduler passes.

  HPPA

     * Added Java language support (libffi and libjava) for 32-bit HP-UX
       11 target.

Obsolete Systems

Documentation improvements

  PDF Documentation

     * A make pdf target has been added to the top-level makefile,
       enabling automated production of PDF documentation files.
       (Front-ends external to GCC should modify their Make-lang.in file
       to add a lang.pdf: target.)

Other significant improvements

  Build system improvements

     * All the components of the compiler are now bootstrapped by default.
       This improves the resilience to bugs in the system compiler or
       binary compatibility problems, as well as providing better testing
       of GCC 4.2 itself. In addition, if you build the compiler from a
       combined tree, the assembler, linker, etc. will also be
       bootstrapped (i.e. built with themselves).
       You can disable this behavior, and go back to the pre-GCC 4.2 set
       up, by configuring GCC with --disable-bootstrap.
     * The rules that configure follows to find target tools resemble more
       closely the locations that the built compiler will search. In
       addition, you can use the new configure option --with-target-tools
       to specify where to find the target tools used during the build,
       without affecting what the built compiler will use.
       This can be especially useful when building packages of GCC. For
       example, you may want to build GCC with GNU as or ld, even if the
       resulting compiler to work with the native assembler and linker. To
       do so, you can use --with-target-tools to point to the native
       tools.

  Incompatible changes to the build system

     * Front-ends external to GCC should modify their Make-lang.in file to
       replace double-colon rules (e.g. dvi::) with normal rules (like
       lang.dvi:). Front-end makefile hooks do not use double-colon rules
       anymore.
     * Up to GCC 4.1, a popular way to specify the target tools used
       during the build was to create directories named gas, binutils,
       etc. in the build tree, and create links to the tools from there.
       This does not work any more when the compiler is bootstrapped. The
       new configure option --with-target-tools provides a better way to
       achieve the same effect, and works for all native and cross
       settings.


    For questions related to the use of GCC, please consult these web
    pages and the [7]GCC manuals. If that fails, the
    [8]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [9]gcc@gcc.gnu.org. All of [10]our lists have public
    archives.

   Copyright (C) [11]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [12]maintained by the GCC team. Last modified
   2012-11-02[13].

References

   1. http://gcc.gnu.org/projects/gomp/
   2. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
   3. http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.tr1
   4. http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/index.html
   5. http://gcc.gnu.org/onlinedocs/gfortran/Runtime-Options.html
   6. http://gcc.gnu.org/wiki/Statically_linking_libgcj
   7. http://gcc.gnu.org/onlinedocs/
   8. mailto:gcc-help@gcc.gnu.org
   9. mailto:gcc@gcc.gnu.org
  10. http://gcc.gnu.org/lists.html
  11. http://www.fsf.org/
  12. http://gcc.gnu.org/about.html
  13. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.1/index.html

                             GCC 4.1 Release Series

   February 13, 2007

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.1.2.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.1.1 relative to previous releases of GCC.

Release History

   GCC 4.1.2
          February 13, 2007 ([2]changes)

   GCC 4.1.1
          May 24, 2006 ([3]changes)

   GCC 4.1.0
          February 28, 2006 ([4]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [5]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [6]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [7]GCC project
   web site or contact the [8]GCC development mailing list.

   To obtain GCC please use [9]our mirror sites or [10]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [11]GCC manuals. If that fails, the
    [12]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [13]gcc@gcc.gnu.org. All of [14]our lists have public
    archives.

   Copyright (C) [15]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [16]maintained by the GCC team. Last modified
   2012-11-02[17].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.1/changes.html#4.1.2
   3. http://gcc.gnu.org/gcc-4.1/changes.html
   4. http://gcc.gnu.org/gcc-4.1/changes.html
   5. http://gcc.gnu.org/gcc-4.1/buildstat.html
   6. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   7. http://gcc.gnu.org/index.html
   8. mailto:gcc@gcc.gnu.org
   9. http://gcc.gnu.org/mirrors.html
  10. http://gcc.gnu.org/svn.html
  11. http://gcc.gnu.org/onlinedocs/
  12. mailto:gcc-help@gcc.gnu.org
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/lists.html
  15. http://www.fsf.org/
  16. http://gcc.gnu.org/about.html
  17. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.1/changes.html

                             GCC 4.1 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 4.1 release series is [1]GCC 4.1.2.

Caveats

General Optimizer Improvements

     * GCC now has infrastructure for inter-procedural optimizations and
       the following inter-procedural optimizations are implemented:
          + Profile guided inlining. When doing profile feedback guided
            optimization, GCC can now use the profile to make better
            informed decisions on whether inlining of a function is
            profitable or not. This means that GCC will no longer inline
            functions at call sites that are not executed very often, and
            that functions at hot call sites are more likely to be
            inlined.
            A new parameter min-inline-recursive-probability is also now
            available to throttle recursive inlining of functions with
            small average recursive depths.
          + Discovery of pure and const functions, a form of side-effects
            analysis. While older GCC releases could also discover such
            special functions, the new IPA-based pass runs earlier so that
            the results are available to more optimizers. The pass is also
            simply more powerful than the old one.
          + Analysis of references to static variables and type escape
            analysis, also forms of side-effects analysis. The results of
            these passes allow the compiler to be less conservative about
            call-clobbered variables and references. This results in more
            redundant loads being eliminated and in making static
            variables candidates for register promotion.
          + Improvement of RTL-based alias analysis. The results of type
            escape analysis are fed to the RTL type-based alias analyzer,
            allowing it to disambiguate more memory references.
          + Interprocedural constant propagation and function versioning.
            This pass looks for functions that are always called with the
            same constant value for one or more of the function arguments,
            and propagates those constants into those functions.
          + GCC will now eliminate static variables whose usage was
            optimized out.
          + -fwhole-program --combine can now be used to make all
            functions in program static allowing whole program
            optimization. As an exception, the main function and all
            functions marked with the new externally_visible attribute are
            kept global so that programs can link with runtime libraries.
     * GCC can now do a form of partial dead code elimination (PDCE) that
       allows code motion of expressions to the paths where the result of
       the expression is actually needed. This is not always a win, so the
       pass has been limited to only consider profitable cases. Here is an
       example:
    int foo (int *, int *);
    int
    bar (int d)
    {
      int a, b, c;
      b = d + 1;
      c = d + 2;
      a = b + c;
      if (d)
        {
          foo (&b, &c);
          a = b + c;
        }
      printf ("%d\n", a);
    }

       The a = b + c can be sunk to right before the printf. Normal code
       sinking will not do this, it will sink the first one above into the
       else-branch of the conditional jump, which still gives you two
       copies of the code.
     * GCC now has a value range propagation pass. This allows the
       compiler to eliminate bounds checks and branches. The results of
       the pass can also be used to accurately compute branch
       probabilities.
     * The pass to convert PHI nodes to straight-line code (a form of
       if-conversion for GIMPLE) has been improved significantly. The two
       most significant improvements are an improved algorithm to
       determine the order in which the PHI nodes are considered, and an
       improvement that allow the pass to consider if-conversions of basic
       blocks with more than two predecessors.
     * Alias analysis improvements. GCC can now differentiate between
       different fields of structures in Tree-SSA's virtual operands form.
       This lets stores/loads from non-overlapping structure fields not
       conflict. A new algorithm to compute points-to sets was contributed
       that can allows GCC to see now that p->a and p->b, where p is a
       pointer to a structure, can never point to the same field.
     * Various enhancements to auto-vectorization:
          + Incrementally preserve SSA form when vectorizing.
          + Incrementally preserve loop-closed form when vectorizing.
          + Improvements to peeling for alignment: generate better code
            when the misalignment of an access is known at compile time,
            or when different accesses are known to have the same
            misalignment, even if the misalignment amount itself is
            unknown.
          + Consider dependence distance in the vectorizer.
          + Externalize generic parts of data reference analysis to make
            this analysis available to other passes.
          + Vectorization of conditional code.
          + Reduction support.
     * GCC can now partition functions in sections of hot and cold code.
       This can significantly improve performance due to better
       instruction cache locality. This feature works best together with
       profile feedback driven optimization.
     * A new pass to avoid saving of unneeded arguments to the stack in
       vararg functions if the compiler can prove that they will not be
       needed.
     * Transition of basic block profiling to tree level implementation
       has been completed. The new implementation should be considerably
       more reliable (hopefully avoiding profile mismatch errors when
       using -fprofile-use or -fbranch-probabilities) and can be used to
       drive higher level optimizations, such as inlining.
       The -ftree-based-profiling command-line option was removed and
       -fprofile-use now implies disabling old RTL level loop optimizer
       (-fno-loop-optimize). Speculative prefetching optimization
       (originally enabled by -fspeculative-prefetching) was removed.

New Languages and Language specific improvements

  C and Objective-C

     * The old Bison-based C and Objective-C parser has been replaced by a
       new, faster hand-written recursive-descent parser.

  Ada

     * The build infrastructure for the Ada runtime library and tools has
       been changed to be better integrated with the rest of the build
       infrastructure of GCC. This should make doing cross builds of Ada a
       bit easier.

  C++

     * ARM-style name-injection of friend declarations is no longer the
       default. For example:
          struct S {
            friend void f();
          };

          void g() { f(); }
       will not be accepted; instead a declaration of f will need to be
       present outside of the scope of S. The new -ffriend-injection
       option will enable the old behavior.
     * The (undocumented) extension which permitted templates with default
       arguments to be bound to template template parameters with fewer
       parameters has been deprecated, and will be removed in the next
       major release of G++. For example:
       template <template <typename> class C>
       void f(C<double>) {}

       template <typename T, typename U = int>
       struct S {};

       template void f(S<double>);

       makes use of the deprecated extension. The reason this code is not
       valid ISO C++ is that S is a template with two parameters;
       therefore, it cannot be bound to C which has only one parameter.

    Runtime Library (libstdc++)

     * Optimization work:
          + A new implementation of std::search_n is provided, better
            performing in case of random access iterators.
          + Added further efficient specializations of istream functions,
            i.e., character array and string extractors.
          + Other smaller improvements throughout.
     * Policy-based associative containers, designed for high-performance,
       flexibility and semantic safety are delivered in ext/pb_assoc.
     * A versatile string class, __gnu_cxx::__versa_string, providing
       facilities conforming to the standard requirements for
       basic_string, is delivered in <ext/vstring.h>. In particular:
          + Two base classes are provided: the default one avoids
            reference counting and is optimized for short strings; the
            alternate one, still uses it while improving in a few low
            level areas (e.g., alignment). See vstring_fwd.h for some
            useful typedefs.
          + Various algorithms have been rewritten (e.g., replace), the
            code streamlined and simple optimizations added.
          + Option 3 of DR 431 is implemented for both available bases,
            thus improving the support for stateful allocators.
     * As usual, many bugs have been fixed (e.g., libstdc++/13583,
       libstdc++/23953) and LWG resolutions put into effect for the first
       time (e.g., DR 280, DR 464, N1780 recommendations for DR 233, TR1
       Issue 6.19). The implementation status of TR1 is now tracked in the
       docs in tr1.html.

  Objective-C++

     * A new language front end for Objective-C++ has been added. This
       language allows users to mix the object oriented features of
       Objective-C with those of C++.

  Java (GCJ)

     * Core library (libgcj) updates based on GNU Classpath 0.15 - 0.19
       features (plus some 0.20 bug-fixes)
          + Networking
               o The java.net.HttpURLConnection implementation no longer
                 buffers the entire response body in memory. This means
                 that response bodies larger than available memory can now
                 be handled.
          + (N)IO
               o NIO FileChannel.map implementation, fast bulk put
                 implementation for DirectByteBuffer (speeds up this
                 method 10x).
               o FileChannel.lock() and FileChannel.force() implemented.
          + XML
               o gnu.xml fix for nodes created outside a namespace
                 context.
               o Add support for output indenting and
                 cdata-section-elements output instruction in
                 xml.transform.
               o xml.xpath corrections for cases where elements/attributes
                 might have been created in non-namespace-aware mode.
                 Corrections to handling of XSL variables and minor
                 conformance updates.
          + AWT
               o GNU JAWT implementation, the AWT Native Interface, which
                 allows direct access to native screen resources from
                 within a Canvas's paint method. GNU Classpath Examples
                 comes with a Demo, see libjava/classpath/examples/README.
               o awt.datatransfer updated to 1.5 with support for
                 FlavorEvents. The gtk+ awt peers now allow copy/paste of
                 text, images, URIs/files and serialized objects with
                 other applications and tracking clipboard change events
                 with gtk+ 2.6 (for gtk+ 2.4 only text and serialized
                 objects are supported). A GNU Classpath Examples
                 datatransfer Demo was added to show the new
                 functionality.
               o Split gtk+ awt peers event handling in two threads and
                 improve gdk lock handling (solves several awt lock ups).
               o Speed up awt Image loading.
               o Better gtk+ scrollbar peer implementation when using gtk+
                 >= 2.6.
               o Handle image loading errors correctly for gdkpixbuf and
                 MediaTracker.
               o Better handle GDK lock. Properly prefix gtkpeer native
                 functions (cp_gtk).
               o GdkGraphics2D has been updated to use Cairo 0.5.x or
                 higher.
               o BufferedImage and GtkImage rewrites. All image drawing
                 operations should now work correctly (flipping requires
                 gtk+ >= 2.6)
               o Future Graphics2D, image and text work is documented at:
                 [2]http://developer.classpath.org/mediation/ClasspathGrap
                 hicsImagesText
               o When gtk+ 2.6 or higher is installed the default log
                 handler will produce stack traces whenever a WARNING,
                 CRITICAL or ERROR message is produced.
          + Free Swing
               o The RepaintManager has been reworked for more efficient
                 painting, especially for large GUIs.
               o The layout manager OverlayLayout has been implemented,
                 the BoxLayout has been rewritten to make use of the
                 SizeRequirements utility class and caching for more
                 efficient layout.
               o Improved accessibility support.
               o Significant progress has been made in the implementation
                 of the javax.swing.plaf.metal package, with most UI
                 delegates in a working state now. Please test this with
                 your own applications and provide feedback that will help
                 us to improve this package.
               o The GUI demo (gnu.classpath.examples.swing.Demo) has been
                 extended to highlight various features in our Free Swing
                 implementation. And it includes a look and feel switcher
                 for Metal (default), Ocean and GNU themes.
               o The javax.swing.plaf.multi package is now implemented.
               o Editing and several key actions for JTree and JTable were
                 implemented.
               o Lots of icons and look and feel improvements for Free
                 Swing basic and metal themes were added. Try running the
                 GNU Classpath Swing Demo in examples
                 (gnu.classpath.examples.swing.Demo) with:
                 -Dswing.defaultlaf=javax.swing.plaf.basic.BasicLookAndFee
                 l or
                 -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFee
                 l
               o Start of styled text capabilites for java.swing.text.
               o DefaultMutableTreeNode pre-order, post-order, depth-first
                 and breadth-first traversal enumerations implemented.
               o JInternalFrame colors and titlebar draw properly.
               o JTree is working up to par (icons, selection and keyboard
                 traversal).
               o JMenus were made more compatible in visual and
                 programmatic behavior.
               o JTable changeSelection and multiple selections
                 implemented.
               o JButton and JToggleButton change states work properly
                 now.
               o JFileChooser fixes.
               o revalidate() and repaint() fixes which make Free Swing
                 much more responsive.
               o MetalIconFactory implemented.
               o Free Swing Top-Level Compatibility. JFrame, JDialog,
                 JApplet, JInternalFrame, and JWindow are now 1.5
                 compatible in the sense that you can call add() and
                 setLayout() directly on them, which will have the same
                 effect as calling getContentPane().add() and
                 getContentPane().setLayout().
               o The JTree interface has been completed. JTrees now
                 recognizes mouse clicks and selections work.
               o BoxLayout works properly now.
               o Fixed GrayFilter to actually work.
               o Metal SplitPane implemented.
               o Lots of Free Swing text and editor stuff work now.
          + Free RMI and Corba
               o Andrew Watson, Vice President and Technical Director of
                 the Object Management Group, has officially assigned us
                 20 bit Vendor Minor Code Id: 0x47430 ("GC") that will
                 mark remote classpath-specific system exceptions.
                 Obtaining the VMCID means that GNU Classpath now is a
                 recogniseable type of node in a highly interoperable
                 CORBA world.
               o GNU Classpath now includes the first working draft to
                 support the RMI over IIOP protocol. The current
                 implementation is capable of remote invocations,
                 transferring various Serializables and Externalizables
                 via RMI-IIOP protocol. It can flatten graphs and, at
                 least for the simple cases, is interoperable with 1.5
                 JDKs.
               o org.omg.PortableInterceptor and related functionality in
                 other packages is now implemented:
                    # The sever and client interceptors work as required
                      since 1.4.
                    # The IOR interceptor works as needed for 1.5.
               o The org.omg.DynamicAny package is completed and passes
                 the prepared tests.
               o The Portable Object Adapter should now support the output
                 of the recent IDL to java compilers. These compilers now
                 generate servants and not CORBA objects as before, making
                 the output depend on the existing POA implementation.
                 Completing POA means that such code can already be tried
                 to run on Classpath. Our POA is tested for the following
                 usager scenarios:
                    # POA converts servant to the CORBA object.
                    # Servant provides to the CORBA object.
                    # POA activates new CORBA object with the given Object
                      Id (byte array) that is later accessible for the
                      servant.
                    # During the first call, the ServantActivator provides
                      servant for this and all subsequent calls on the
                      current object.
                    # During each call, the ServantLocator provides
                      servant for this call only.
                    # ServantLocator or ServantActivator forwards call to
                      another server.
                    # POA has a single servant, responsible for all
                      objects.
                    # POA has a default servant, but some objects are
                      explicitly connected to they specific servants.
                 The POA is verified using tests from the former
                 cost.omg.org.
               o The CORBA implementation is now a working prototype that
                 should support features up to 1.3 inclusive. We invite
                 groups writing CORBA dependent applications to try
                 Classpath implementation, reporting any possible bugs.
                 The CORBA prototype is interoperable with Sun's
                 implementation v 1.4, transferring object references,
                 primitive types, narrow and wide strings, arrays,
                 structures, trees, abstract interfaces and value types
                 (feature of CORBA 2.3) between these two platforms.
                 Remote exceptions are transferred and handled correctly.
                 The stringified object references (IORs) from various
                 sources are parsed as required. The transient (for
                 current session) and permanent (till jre restart)
                 redirections work. Both Little and Big Endian encoded
                 messages are accepted. The implementation is verified
                 using tests from the former cost.omg.org. The current
                 release includes working examples (see the examples
                 directory), demonstrating the client-server
                 communication, using either CORBA Request or IDL-based
                 stub (usually generated by a IDL to java compiler). These
                 examples also show how to use the Classpath CORBA naming
                 service. The IDL to java compiler is not yet written, but
                 as our library must be compatible, it naturally accepts
                 the output of other idlj implementations.
          + Misc
               o Updated TimeZone data against Olson tzdata2005l.
               o Make zip and jar packages UTF-8 clean.
               o "native" code builds and compiles (warning free) on
                 Darwin and Solaris.
               o java.util.logging.FileHandler now rotates files.
               o Start of a generic JDWP framework in gnu/classpath/jdwp.
                 This is unfinished, but feedback (at classpath@gnu.org)
                 from runtime hackers is greatly appreciated. Although
                 most of the work is currently being done around gcj/gij
                 we want this framework to be as VM neutral as possible.
                 Early design is described in:
                 [3]http://gcc.gnu.org/ml/java/2005-05/msg00260.html
               o QT4 AWT peers, enable by giving configure
                 --enable-qt-peer. Included, but not ready for production
                 yet. They are explicitly disabled and not supported. But
                 if you want to help with the development of these new
                 features we are interested in feedback. You will have to
                 explicitly enable them to try them out (and they will
                 most likely contain bugs).
               o Documentation fixes all over the place. See
                 [4]http://developer.classpath.org/doc/

New Targets and Target Specific Improvements

  IA-32/x86-64

     * The x86-64 medium model (that allows building applications whose
       data segment exceeds 4GB) was redesigned to match latest ABI draft.
       New implementation split large datastructures into separate segment
       improving performance of accesses to small datastructures and also
       allows linking of small model libraries into medium model programs
       as long as the libraries are not accessing the large datastructures
       directly. Medium model is also supported in position independent
       code now.
       The ABI change results in partial incompatibility among medium
       model objects. Linking medium model libraries (or objects) compiled
       with new compiler into medium model program compiled with older
       will likely result in exceeding ranges of relocations.
       Binutils 2.16.91 or newer are required for compiling medium model
       now.

  RS6000 (POWER/PowerPC)

     * The AltiVec vector primitives in <altivec.h> are now implemented in
       a way that puts a smaller burden on the preprocessor, instead
       processing the "overloading" in the front ends. This should benefit
       compilation speed on AltiVec vector code.
     * AltiVec initializers now are generated more efficiently.
     * The popcountb instruction available on POWER5 now is generated.
     * The floating point round to integer instructions available on
       POWER5+ now is generated.
     * Floating point divides can be synthesized using the floating point
       reciprocal estimate instructions.
     * Double precision floating point constants are initialized as single
       precision values if they can be represented exactly.

  S/390, zSeries and System z9

     * Support for the IBM System z9 109 processor has been added. When
       using the -march=z9-109 option, the compiler will generate code
       making use of instructions provided by the extended immediate
       facility.
     * Support for 128-bit IEEE floating point has been added. When using
       the -mlong-double-128 option, the compiler will map the long double
       data type to 128-bit IEEE floating point. Using this option
       constitutes an ABI change, and requires glibc support.
     * Various changes to improve performance of generated code have been
       implemented, including:
          + In functions that do not require a literal pool, register %r13
            (which is traditionally reserved as literal pool pointer), can
            now be freely used for other purposes by the compiler.
          + More precise tracking of register use allows the compiler to
            generate more efficient function prolog and epilog code in
            certain cases.
          + The SEARCH STRING, COMPARE LOGICAL STRING, and MOVE STRING
            instructions are now used to implement C string functions.
          + The MOVE CHARACTER instruction with single byte overlap is now
            used to implement the memset function with non-zero fill byte.
          + The LOAD ZERO instructions are now used where appropriate.
          + The INSERT CHARACTERS UNDER MASK, STORE CHARACTERS UNDER MASK,
            and INSERT IMMEDIATE instructions are now used more frequently
            to optimize bitfield operations.
          + The BRANCH ON COUNT instruction is now used more frequently.
            In particular, the fact that a loop contains a subroutine call
            no longer prevents the compiler from using this instruction.
          + The compiler is now aware that all shift and rotate
            instructions implicitly truncate the shift count to six bits.
     * Back-end support for the following generic features has been
       implemented:
          + The full set of [5]built-in functions for atomic memory
            access.
          + The -fstack-protector feature.
          + The optimization pass avoiding unnecessary stores of incoming
            argument registers in functions with variable argument list.

  SPARC

     * The default code model in 64-bit mode has been changed from
       Medium/Anywhere to Medium/Middle on Solaris.
     * TLS support is disabled by default on Solaris prior to release 10.
       It can be enabled on TLS-capable Solaris 9 versions (4/04 release
       and later) by specifying --enable-tls at configure time.

  MorphoSys

     * Support has been added for this new architecture.

Obsolete Systems

Documentation improvements

Other significant improvements

     * GCC can now emit code for protecting applications from
       stack-smashing attacks. The protection is realized by buffer
       overflow detection and reordering of stack variables to avoid
       pointer corruption.
     * Some built-in functions have been fortified to protect them against
       various buffer overflow (and format string) vulnerabilities.
       Compared to the mudflap bounds checking feature, the safe builtins
       have far smaller overhead. This means that programs built using
       safe builtins should not experience any measurable slowdown.

GCC 4.1.2

   This is the [6]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.1.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   When generating code for a shared library, GCC now recognizes that
   global functions may be replaced when the program runs. Therefore, it
   is now more conservative in deducing information from the bodies of
   functions. For example, in this example:
    void f() {}
    void g() {
     try { f(); }
     catch (...) {
       cout << "Exception";
     }
    }

   G++ would previously have optimized away the catch clause, since it
   would have concluded that f cannot throw exceptions. Because users may
   replace f with another function in the main body of the program, this
   optimization is unsafe, and is no longer performed. If you wish G++ to
   continue to optimize as before, you must add a throw() clause to the
   declaration of f to make clear that it does not throw exceptions.


    For questions related to the use of GCC, please consult these web
    pages and the [7]GCC manuals. If that fails, the
    [8]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [9]gcc@gcc.gnu.org. All of [10]our lists have public
    archives.

   Copyright (C) [11]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [12]maintained by the GCC team. Last modified
   2012-11-02[13].

References

   1. http://gcc.gnu.org/gcc-4.1/changes.html#4.1.2
   2. http://developer.classpath.org/mediation/ClasspathGraphicsImagesText
   3. http://gcc.gnu.org/ml/java/2005-05/msg00260.html
   4. http://developer.classpath.org/doc/
   5. http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html
   6. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.1.2
   7. http://gcc.gnu.org/onlinedocs/
   8. mailto:gcc-help@gcc.gnu.org
   9. mailto:gcc@gcc.gnu.org
  10. http://gcc.gnu.org/lists.html
  11. http://www.fsf.org/
  12. http://gcc.gnu.org/about.html
  13. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.0/index.html

                             GCC 4.0 Release Series

   January 31, 2007

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 4.0.4.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 4.0.3 relative to previous releases of GCC.

Release History

   GCC 4.0.4
          January 31, 2007 ([2]changes)

   GCC 4.0.3
          March 10, 2006 ([3]changes)

   GCC 4.0.2
          September 28, 2005 ([4]changes)

   GCC 4.0.1
          July 7, 2005 ([5]changes)

   GCC 4.0.0
          April 20, 2005 ([6]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [7]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [8]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [9]GCC project
   web site or contact the [10]GCC development mailing list.

   To obtain GCC please use [11]our mirror sites, or [12]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [13]GCC manuals. If that fails, the
    [14]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [15]gcc@gcc.gnu.org. All of [16]our lists have public
    archives.

   Copyright (C) [17]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [18]maintained by the GCC team. Last modified
   2012-11-02[19].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.4
   3. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.3
   4. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.2
   5. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.1
   6. http://gcc.gnu.org/gcc-4.0/changes.html
   7. http://gcc.gnu.org/gcc-4.0/buildstat.html
   8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   9. http://gcc.gnu.org/index.html
  10. mailto:gcc@gcc.gnu.org
  11. http://gcc.gnu.org/mirrors.html
  12. http://gcc.gnu.org/svn.html
  13. http://gcc.gnu.org/onlinedocs/
  14. mailto:gcc-help@gcc.gnu.org
  15. mailto:gcc@gcc.gnu.org
  16. http://gcc.gnu.org/lists.html
  17. http://www.fsf.org/
  18. http://gcc.gnu.org/about.html
  19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-4.0/changes.html

                             GCC 4.0 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 4.0 release series is [1]GCC 4.0.4.

Caveats

     * GCC now generates location lists by default when compiling with
       debug info and optimization.
          + GDB 6.0 and older crashes when it sees location lists. GDB 6.1
            or later is needed to debug binaries containing location
            lists.
          + When you are trying to view a value of a variable in a part of
            a function where it has no location (for example when the
            variable is no longer used and thus its location was used for
            something else) GDB will say that it is not available.
       You can disable generating location lists by -fno-var-tracking.
     * GCC no longer accepts the -fwritable-strings option. Use named
       character arrays when you need a writable string.
     * The options -freduce-all-givs and -fmove-all-movables have been
       discontinued. They were used to circumvent a shortcoming in the
       heuristics of the old loop optimization code with respect to common
       Fortran constructs. The new (tree) loop optimizer works differently
       and doesn't need those work-arounds.
     * The graph-coloring register allocator, formerly enabled by the
       option -fnew-ra, has been discontinued.
     * -I- has been deprecated. -iquote is meant to replace the need for
       this option.
     * The MIPS -membedded-pic and -mrnames options have been removed.
     * All MIPS targets now require the GNU assembler. In particular, IRIX
       configurations can no longer use the MIPSpro assemblers, although
       they do still support the MIPSpro linkers.
     * The SPARC option -mflat has been removed.
     * English-language diagnostic messages will now use Unicode quotation
       marks in UTF-8 locales. (Non-English messages already used the
       quotes appropriate for the language in previous releases.) If your
       terminal does not support UTF-8 but you are using a UTF-8 locale
       (such locales are the default on many GNU/Linux systems) then you
       should set LC_CTYPE=C in the environment to disable that locale.
       Programs that parse diagnostics and expect plain ASCII
       English-language messages should set LC_ALL=C. See [2]Markus Kuhn's
       explanation of Unicode quotation marks for more information.
     * The specs file is no longer installed on most platforms. Most users
       will be totally unaffected. However, if you are accustomed to
       editing the specs file yourself, you will now have to use the
       -dumpspecs option to generate the specs file, and then edit the
       resulting file.

General Optimizer Improvements

     * The [3]tree ssa branch has been merged. This merge has brought in a
       completely new optimization framework based on a higher level
       intermediate representation than the existing RTL representation.
       Numerous new code transformations based on the new framework are
       available in GCC 4.0, including:
          + Scalar replacement of aggregates
          + Constant propagation
          + Value range propagation
          + Partial redundancy elimination
          + Load and store motion
          + Strength reduction
          + Dead store elimination
          + Dead and unreachable code elimination
          + [4]Autovectorization
          + Loop interchange
          + Tail recursion by accumulation
       Many of these passes outperform their counterparts from previous
       GCC releases.
     * [5]Swing Modulo Scheduling (SMS). An RTL level instruction
       scheduling optimization intended for loops that perform heavy
       computations.

New Languages and Language specific improvements

  C family

     * The sentinel attribute has been added to GCC. This function
       attribute allows GCC to warn when variadic functions such as execl
       are not NULL terminated. See the GCC manual for a complete
       description of its behavior.
     * Given __attribute__((alias("target"))) it is now an error if target
       is not a symbol, defined in the same translation unit. This also
       applies to aliases created by #pragma weak alias=target. This is
       because it's meaningless to define an alias to an undefined symbol.
       On Solaris, the native assembler would have caught this error, but
       GNU as does not.

  C and Objective-C

     * The -Wstrict-aliasing=2 option has been added. This warning catches
       all unsafe cases, but it may also give a warning for some cases
       that are safe.
     * The cast-as-lvalue, conditional-expression-as-lvalue and
       compound-expression-as-lvalue extensions, which were deprecated in
       3.3.4 and 3.4, have been removed.
     * The -fwritable-strings option, which was deprecated in 3.4, has
       been removed.
     * #pragma pack() semantics have been brought closer to those used by
       other compilers. This also applies to C++.
     * Taking the address of a variable with register storage is invalid
       in C. GCC now issues an error instead of a warning.
     * Arrays of incomplete element type are invalid in C. GCC now issues
       an error for such arrays. Declarations such as extern struct s x[];
       (where struct s has not been defined) can be moved after the
       definition of struct s. Function parameters declared as arrays of
       incomplete type can instead be declared as pointers.

  C++

     * When compiling without optimizations (-O0), the C++ frontend is
       much faster than in any previous versions of GCC. Independent
       testers have measured speed-ups up to 25% in real-world production
       code, compared to the 3.4 family (which was already the fastest
       version to date). Upgrading from older versions might show even
       bigger improvements.
     * ELF visibility attributes can now be applied to a class type, so
       that it affects every member function of a class at once, without
       having to specify each individually:
class __attribute__ ((visibility("hidden"))) Foo
{
   int foo1();
   void foo2();
};
       The syntax is deliberately similar to the __declspec() system used
       by Microsoft Windows based compilers, allowing cross-platform
       projects to easily reuse their existing macro system for denoting
       exports and imports. By explicitly marking internal classes never
       used outside a binary as hidden, one can completely avoid PLT
       indirection overheads during their usage by the compiler. You can
       find out more about the advantages of this at
       [6]http://www.akkadia.org/drepper/dsohowto.pdf
     * The -fvisibility-inlines-hidden option has been added which marks
       all inlineable functions as having hidden ELF visibility, thus
       removing their symbol and typeinfo from the exported symbol table
       of the output ELF binary. Using this option can reduce the exported
       symbol count of template-heavy code by up to 40% with no code
       change at all, thus notably improving link and load times for the
       binary as well as a reduction in size of up to 10%. Also, check the
       new [7]-fvisibility option.
     * The compiler now uses the library interface specified by the [8]C++
       ABI for thread-safe initialization of function-scope static
       variables. Most users should leave this alone, but embedded
       programmers may want to disable this by specifying
       -fno-threadsafe-statics for a small savings in code size.
     * Taking the address of an explicit register variable is no longer
       supported. Note that C++ allows taking the address of variables
       with register storage so this will continue to compile with a
       warning. For example, assuming that r0 is a machine register:
register int foo asm ("r0");
register int bar;
&foo; // error, no longer accepted
&bar; // OK, with a warning
     * G++ has an undocumented extension to virtual function covariancy
       rules that allowed the overrider to return a type that was
       implicitly convertable to the overridden function's return type.
       For instance a function returning void * could be overridden by a
       function returning T *. This is now deprecated and will be removed
       in a future release.
     * The G++ minimum and maximum operators (<? and >?) and their
       compound forms (<?=) and >?=) have been deprecated and will be
       removed in a future version. Code using these operators should be
       modified to use std::min and std::max instead.
     * Declaration of nested classes of class templates as friends are
       supported:
template <typename T> struct A {
  class B {};
};
class C {
  template <typename T> friend class A<T>::B;
};
       This complements the feature member functions of class templates as
       friends introduced in GCC 3.4.0.
     * When declaring a friend class using an unqualified name, classes
       outside the innermost non-class scope are not searched:
class A;
namespace N {
  class B {
    friend class A;   // Refer to N::A which has not been declared yet
                      // because name outside namespace N are not searched
    friend class ::A; // Refer to ::A
  };
}
       Hiding the friend name until declaration is still not implemented.
     * Friends of classes defined outside their namespace are correctly
       handled:
namespace N {
  class A;
}
class N::A {
  friend class B; // Refer to N::B in GCC 4.0.0
                  // but ::B in earlier versions of GCC
};

    Runtime Library (libstdc++)

     * Optimization work:
          + Added efficient specializations of istream functions for char
            and wchar_t.
          + Further performance tuning of strings, in particular wrt
            single-char append and getline.
          + iter_swap - and therefore most of the mutating algorithms -
            now makes an unqualified call to swap when the value_type of
            the two iterators is the same.
     * A large subset of the features in Technical Report 1 (TR1 for
       short) is experimentally delivered (i.e., no guarantees about the
       implementation are provided. In particular it is not promised that
       the library will remain link-compatible when code using TR1 is
       used):
          + General utilities such as reference_wrapper and shared_ptr.
          + Function objects, i.e., result_of, mem_fn, bind, function.
          + Support for metaprogramming.
          + New containers such as tuple, array, unordered_set,
            unordered_map, unordered_multiset, unordered_multimap.
     * As usual, many bugs have been fixed and LWG resolutions implemented
       for the first time (e.g., DR 409).

  Java

     * In order to prevent naming conflicts with other implementations of
       these tools, some GCJ binaries have been renamed:
          + rmic is now grmic,
          + rmiregistry is now grmiregistry, and
          + jar is now fastjar.
       In particular, these names were problematic for the jpackage.org
       packaging conventions which install symlinks in /usr/bin that point
       to the preferred versions of these tools.
     * The -findirect-dispatch argument to the compiler now works and
       generates code following a new "binary compatibility" ABI. Code
       compiled this way follows the binary compatibility rules of the
       Java Language Specification.
     * libgcj now has support for using GCJ as a JIT, using the
       gnu.gcj.jit family of system properties.
     * libgcj can now find a shared library corresponding to the bytecode
       representation of a class. See the documentation for the new
       gcj-dbtool program, and the new gnu.gcj.precompiled.db.path system
       property.
     * There have been many improvements to the class library. Here are
       some highlights:
          + Much more of AWT and Swing exist.
          + Many new packages and classes were added, including
            java.util.regex, java.net.URI, javax.crypto,
            javax.crypto.interfaces, javax.crypto.spec, javax.net,
            javax.net.ssl, javax.security.auth,
            javax.security.auth.callback, javax.security.auth.login,
            javax.security.auth.x500, javax.security.sasl, org.ietf.jgss,
            javax.imageio, javax.imageio.event, javax.imageio.spi,
            javax.print, javax.print.attribute,
            javax.print.attribute.standard, javax.print.event, and
            javax.xml
          + Updated SAX and DOM, and imported GNU JAXP

  Fortran

     * A new [9]Fortran front end has replaced the aging GNU Fortran 77
       front end. The new front end supports Fortran 90 and Fortran 95. It
       may not yet be as stable as the old Fortran front end.

  Ada

     * Ada (with tasking and Zero Cost Exceptions) is now available on
       many more targets, including but not limited to: alpha-linux,
       hppa-hpux, hppa-linux, powerpc-darwin, powerpc-linux, s390-linux,
       s390x-linux, sparc-linux.
     * Some of the new Ada 2005 features are now implemented like
       Wide_Wide_Character and Ada.Containers.
     * Many bugs have been fixed, tools and documentation improved.
     * To compile Ada from the sources, install an older working Ada
       compiler and then use --enable-languages=ada at configuration time,
       since the Ada frontend is not currently activated by default. See
       the [10]Installing GCC for details.

New Targets and Target Specific Improvements

  H8/300

     * The frame layout has changed. In the new layout, the prologue of a
       function first saves registers and then allocate space for locals,
       resulting in an 1% improvement on code size.

  IA-32/x86-64 (AMD64)

     * The acos, asin, drem, exp10, exp2, expm1, fmod, ilogb, log10,
       log1p, log2, logb and tan mathematical builtins (and their float
       and long double variants) are now implemented as inline x87
       intrinsics when using -ffast-math.
     * The ceil, floor, nearbyint, rint and trunc mathematical builtins
       (and their float and long double variants) are now implemented as
       inline x87 intrinsics when using -ffast-math.
     * The x87's fsincos instruction is now used automatically with
       -ffast-math when calculating both the sin and cos of the same
       argument.
     * Instruction selection for multiplication and division by constants
       has been improved.

  IA-64

     * Floating point division, integer division and sqrt are now inlined,
       resulting in significant performance improvements on some codes.

  MIPS

     * Division by zero checks now use conditional traps if the target
       processor supports them. This decreases code size by one word per
       division operation. The old behavior (branch and break) can be
       obtained either at configure time by passing --with-divide=breaks
       to configure or at runtime by passing -mdivide-breaks to GCC.
     * Support for MIPS64 paired-single instructions has been added. It is
       enabled by -mpaired-single and can be accessed using both the
       target-independent vector extensions and new MIPS-specific built-in
       functions.
     * Support for the MIPS-3D ASE has been added. It is enabled by
       -mips3d and provides new MIPS-3D-specific built-in functions.
     * The -mexplicit-relocs option now supports static n64 code (as is
       used, for example, in 64-bit linux kernels). -mexplicit-relocs
       should now be feature-complete and is enabled by default when GCC
       is configured to use a compatible assembler.
     * Support for the NEC VR4130 series has been added. This support
       includes the use of VR-specific instructions and a new VR4130
       scheduler. Full VR4130 support can be selected with -march=vr4130
       while code for any ISA can be tuned for the VR4130 using
       -mtune=vr4130. There is also a new -mvr4130-align option that
       produces better schedules at the cost of increased code size.
     * Support for the Broadcom SB-1 has been extended. There is now an
       SB-1 scheduler as well as support for the SB-1-specific
       paired-single instructions. Full SB-1 support can be selected with
       -march=sb1 while code for any ISA can be optimized for the SB-1
       using -mtune=sb1.
     * The compiler can now work around errata in R4000, R4400, VR4120 and
       VR4130 processors. These workarounds are enabled by -mfix-r4000,
       -mfix-r4400, -mfix-vr4120 and -mfix-vr4130 respectively. The VR4120
       and VR4130 workarounds need binutils 2.16 or above.
     * IRIX shared libraries are now installed into the standard library
       directories: o32 libraries go into lib/, n32 libraries go into
       lib32/ and n64 libraries go into lib64/.
     * The compiler supports a new -msym32 option. It can be used to
       optimize n64 code in which all symbols are known to have 32-bit
       values.

  S/390 and zSeries

     * New command-line options help to generate code intended to run in
       an environment where stack space is restricted, e.g. Linux kernel
       code:
          + -mwarn-framesize and -mwarn-dynamicstack trigger compile-time
            warnings for single functions that require large or dynamic
            stack frames.
          + -mstack-size and -mstack-guard generate code that checks for
            stack overflow at run time.
          + -mpacked-stack generates code that reduces the stack frame
            size of many functions by reusing unneeded parts of the stack
            bias area.
     * The -msoft-float option now ensures that generated code never
       accesses floating point registers.
     * The s390x-ibm-tpf target now fully supports C++, including
       exceptions and threads.
     * Various changes to improve performance of the generated code have
       been implemented, including:
          + GCC now uses sibling calls where possible.
          + Condition code handling has been optimized, allowing GCC to
            omit redundant comparisons in certain cases.
          + The cost function guiding many optimizations has been refined
            to more accurately represent the z900 and z990 processors.
          + The ADD LOGICAL WITH CARRY and SUBTRACT LOGICAL WITH BORROW
            instructions are now used to avoid conditional branches in
            certain cases.
          + The back end now uses the LEGITIMIZE_RELOAD_ADDRESS feature to
            optimize address arithmetic required to access large stack
            frames.
          + GCC now makes more efficient use of memory-to-memory type
            instructions (MVC, CLC, ...).
          + More precise tracking of special register use allows better
            instruction scheduling, in particular of the function prologue
            and epilogue sequences.
          + The Java front end now generates inline code to implement
            integer division, instead of calling library routines.

  SPARC

     * The options -mv8, -msparclite, -mcypress, -msupersparc, -mf930 and
       -mf934 have been removed. They have been replaced with -mcpu=xxx.
     * The internal model used to estimate the relative cost of each
       instruction has been updated. It is expected to give better results
       on recent UltraSPARC processors.
     * Code generation for function prologues and epilogues has been
       improved, resulting in better scheduling and allowing multiple exit
       points in functions.
     * Support for Sun's Visual Instruction Set (VIS) has been enhanced.
       It is enabled by -mvis and provides new built-in functions for VIS
       instructions on UltraSPARC processors.
     * The option -mapp-regs has been turned on by default on Solaris too.

  NetWare

     * Novell NetWare (on ix86, no other hardware platform was ever really
       supported by this OS) has been re-enabled and the ABI supported by
       GCC has been brought into sync with that of MetroWerks CodeWarrior
       (the ABI previously supported was that of some Unix systems, which
       NetWare never tried to support).

Obsolete Systems

   Support for a number of older systems has been declared obsolete in GCC
   4.0. Unless there is activity to revive them, the next release of GCC
   will have their sources permanently removed.

   All GCC ports for the following processor architectures have been
   declared obsolete:
     * Intel i860
     * Ubicom IP2022
     * National Semiconductor NS32K
     * Texas Instruments TMS320C[34]x

   Also, those for some individual systems have been obsoleted:
     * SPARC family
          + SPARClite-based systems (sparclite-*-coff, sparclite-*-elf,
            sparc86x-*-elf)
          + OpenBSD 32-bit (sparc-*-openbsd*)

Documentation improvements

Other significant improvements

     * Location lists are now generated by default when compiling with
       debug info and optimization. Location lists provide more accurate
       debug info about locations of variables and they allow debugging
       code compiled with -fomit-frame-pointer.
     * The -fvisibility option has been added which allows the default ELF
       visibility of all symbols to be set per compilation and the new
       #pragma GCC visibility preprocessor command allows the setting of
       default ELF visibility for a region of code. Using
       -fvisibility=hidden especially in combination with the new
       -fvisibility-inlines-hidden can yield substantial improvements in
       output binary quality including avoiding PLT indirection overheads,
       reduction of the exported symbol count by up to 60% (with resultant
       improvements to link and load times), better scope for the
       optimizer to improve code and up to a 20% reduction in binary size.
       Using these options correctly yields a binary with a similar symbol
       count to a Windows DLL.
       Perhaps more importantly, this new feature finally allows (with
       careful planning) complete avoidance of symbol clashes when
       manually loading shared objects with RTLD_GLOBAL, thus finally
       solving problems many projects such as python were forced to use
       RTLD_LOCAL for (with its resulting issues for C++ correctness). You
       can find more information about using these options at
       [11]http://gcc.gnu.org/wiki/Visibility.
     __________________________________________________________________

GCC 4.0.1

   This is the [12]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.0.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

GCC 4.0.2

   This is the [13]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.0.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   Unfortunately, due to a release engineering failure, this release has a
   regression on Solaris that will affect some C++ programs. We suggest
   that Solaris users apply a [14]patch that corrects the problem. Users
   who do not wish to apply the patch should explicitly link C++ programs
   with the -pthreads option, even if they do not use threads. This
   problem has been corrected in the current 4.0 branch sources and will
   not be present in GCC 4.0.3.

GCC 4.0.3

   Starting with this release, the function getcontext is recognized by
   the compiler as having the same semantics as the setjmp function. In
   particular, the compiler will ensure that all registers are dead before
   calling such a function and will emit a warning about the variables
   that may be clobbered after the second return from the function.

GCC 4.0.4

   This is the [15]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 4.0.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

   The 4.0.4 release is provided for those that require a high degree of
   binary compatibility with previous 4.0.x releases. For most users, the
   GCC team recommends that version 4.1.1 or later be used instead."


    For questions related to the use of GCC, please consult these web
    pages and the [16]GCC manuals. If that fails, the
    [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
    archives.

   Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [21]maintained by the GCC team. Last modified
   2012-11-02[22].

References

   1. http://gcc.gnu.org/gcc-4.0/changes.html#4.0.4
   2. http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
   3. http://gcc.gnu.org/projects/tree-ssa/
   4. http://gcc.gnu.org/projects/tree-ssa/vectorization.html
   5. http://gcc.gnu.org/news/sms.html
   6. http://www.akkadia.org/drepper/dsohowto.pdf
   7. http://gcc.gnu.org/gcc-4.0/changes.html#visibility
   8. http://mentorembedded.github.com/cxx-abi/
   9. http://gcc.gnu.org/fortran/
  10. http://gcc.gnu.org/install/
  11. http://gcc.gnu.org/wiki/Visibility
  12. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.1
  13. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.2
  14. http://gcc.gnu.org/ml/gcc-cvs/2005-09/msg00984.html
  15. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=4.0.4
  16. http://gcc.gnu.org/onlinedocs/
  17. mailto:gcc-help@gcc.gnu.org
  18. mailto:gcc@gcc.gnu.org
  19. http://gcc.gnu.org/lists.html
  20. http://www.fsf.org/
  21. http://gcc.gnu.org/about.html
  22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.4/index.html

                             GCC 3.4 Release Series

   May 26, 2006

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.4.6.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 3.4.4 relative to previous releases of GCC. This is the last of the
   3.4.x series.

   The GCC 3.4 release series includes numerous [2]new features,
   improvements, bug fixes, and other changes, thanks to an [3]amazing
   group of volunteers.

Release History

   GCC 3.4.6
          March 6, 2006 ([4]changes)

   GCC 3.4.5
          November 30, 2005 ([5]changes)

   GCC 3.4.4
          May 18, 2005 ([6]changes)

   GCC 3.4.3
          November 4, 2004 ([7]changes)

   GCC 3.4.2
          September 6, 2004 ([8]changes)

   GCC 3.4.1
          July 1, 2004 ([9]changes)

   GCC 3.4.0
          April 18, 2004 ([10]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [11]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [12]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [13]GCC
   project web site or contact the [14]GCC development mailing list.

   To obtain GCC please use [15]our mirror sites, or [16]our SVN server.


    For questions related to the use of GCC, please consult these web
    pages and the [17]GCC manuals. If that fails, the
    [18]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [19]gcc@gcc.gnu.org. All of [20]our lists have public
    archives.

   Copyright (C) [21]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [22]maintained by the GCC team. Last modified
   2012-11-02[23].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-3.4/changes.html
   3. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   4. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.6
   5. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.5
   6. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.4
   7. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.3
   8. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.2
   9. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.1
  10. http://gcc.gnu.org/gcc-3.4/changes.html
  11. http://gcc.gnu.org/gcc-3.4/buildstat.html
  12. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  13. http://gcc.gnu.org/index.html
  14. mailto:gcc@gcc.gnu.org
  15. http://gcc.gnu.org/mirrors.html
  16. http://gcc.gnu.org/svn.html
  17. http://gcc.gnu.org/onlinedocs/
  18. mailto:gcc-help@gcc.gnu.org
  19. mailto:gcc@gcc.gnu.org
  20. http://gcc.gnu.org/lists.html
  21. http://www.fsf.org/
  22. http://gcc.gnu.org/about.html
  23. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.4/changes.html

                             GCC 3.4 Release Series
                        Changes, New Features, and Fixes

   The final release in the 3.4 release series is [1]GCC 3.4.6. The series
   is now closed.

   GCC 3.4 has [2]many improvements in the C++ frontend. Before reporting
   a bug, please make sure it's really GCC, and not your code, that is
   broken.

Caveats

     * GNU Make is now required to build GCC.
     * With -nostdinc the preprocessor used to ignore both standard
       include paths and include paths contained in environment variables.
       It was neither documented nor intended that environment variable
       paths be ignored, so this has been corrected.
     * GCC no longer accepts the options -fvolatile, -fvolatile-global and
       -fvolatile-static. It is unlikely that they worked correctly in any
       3.x release.
     * GCC no longer ships <varargs.h>. Use <stdarg.h> instead.
     * Support for all the systems [3]obsoleted in GCC 3.3 has been
       removed from GCC 3.4. See below for a [4]list of systems which are
       obsoleted in this release.
     * GCC now requires an ISO C90 (ANSI C89) C compiler to build. K&R C
       compilers will not work.
     * The implementation of the [5]MIPS ABIs has changed. As a result,
       the code generated for certain MIPS targets will not be binary
       compatible with earlier releases.
     * In previous releases, the MIPS port had a fake "hilo" register with
       the user-visible name accum. This register has been removed.
     * The implementation of the [6]SPARC ABIs has changed. As a result,
       the code generated will not be binary compatible with earlier
       releases in certain cases.
     * The configure option --enable-threads=pthreads has been removed;
       use --enable-threads=posix instead, which should have the same
       effect.
     * Code size estimates used by inlining heuristics for C, Objective-C,
       C++ and Java have been redesigned significantly. As a result the
       parameters of -finline-insns, --param max-inline-insns-single and
       --param max-inline-insns-auto need to be reconsidered.
     * --param max-inline-slope and --param min-inline-insns have been
       removed; they are not needed for the new bottom-up inlining
       heuristics.
     * The new unit-at-a-time compilation scheme has several compatibility
       issues:
          + The order in which functions, variables, and top-level asm
            statements are emitted may have changed. Code relying on some
            particular ordering needs to be updated. The majority of such
            top-level asm statements can be replaced by section
            attributes.
          + Unreferenced static variables and functions are removed. This
            may result in undefined references when an asm statement
            refers to the variable/function directly. In that case either
            the variable/function shall be listed in asm statement operand
            or in the case of top-level asm statements the attribute used
            shall be used to force function/variable to be always output
            and considered as a possibly used by unknown code.
            For variables the attribute is accepted only by GCC 3.4 and
            newer, while for earlier versions it is sufficient to use
            unused to silence warnings about the variables not being
            referenced. To keep code portable across different GCC
            versions, you can use appropriate preprocessor conditionals.
          + Static functions now can use non-standard passing conventions
            that may break asm statements calling functions directly.
            Again the attribute used shall be used to prevent this
            behavior.
       As a temporary workaround, -fno-unit-at-a-time can be used, but
       this scheme may not be supported by future releases of GCC.
     * GCC 3.4 automatically places zero-initialized variables in the .bss
       section on some operating systems. Versions of GNU Emacs up to (and
       including) 21.3 will not work correctly when using this
       optimization; you can use -fno-zero-initialized-in-bss to disable
       it.
     * If GCC 3.4 is configured with --enable-threads=posix (the default
       on most targets that support pthreads) then _REENTRANT will be
       defined unconditionally by some libstdc++ headers. C++ code which
       relies on that macro to detect whether multi-threaded code is being
       compiled might change in meaning, possibly resulting in linker
       errors for single-threaded programs. Affected users of [7]Boost
       should compile single-threaded code with -DBOOST_DISABLE_THREADS.
       See Bugzilla for [8]more information.

General Optimizer Improvements

     * Usability of the profile feedback and coverage testing has been
       improved.
          + Performance of profiled programs has been improved by faster
            profile merging code.
          + Better use of the profile feedback for optimization (loop
            unrolling and loop peeling).
          + File locking support allowing fork() calls and parallel runs
            of profiled programs.
          + Coverage file format has been redesigned.
          + gcov coverage tool has been improved.
          + make profiledbootstrap available to build a faster compiler.
            Experiments made on i386 hardware showed an 11% speedup on -O0
            and a 7.5% speedup on -O2 compilation of a [9]large C++
            testcase.
          + New value profiling pass enabled via -fprofile-values
          + New value profile transformations pass enabled via -fvpt aims
            to optimize some code sequences by exploiting knowledge about
            value ranges or other properties of the operands. At the
            moment a conversion of expensive divisions into cheaper
            operations has been implemented.
          + New -fprofile-generate and -fprofile-use command-line options
            to simplify the use of profile feedback.
     * A new unit-at-a-time compilation scheme for C, Objective-C, C++ and
       Java which is enabled via -funit-at-a-time (and implied by -O2). In
       this scheme a whole file is parsed first and optimized later. The
       following basic inter-procedural optimizations are implemented:
          + Removal of unreachable functions and variables
          + Discovery of local functions (functions with static linkage
            whose address is never taken)
          + On i386, these local functions use register parameter passing
            conventions.
          + Reordering of functions in topological order of the call graph
            to enable better propagation of optimizing hints (such as the
            stack alignments needed by functions) in the back end.
          + Call graph based out-of-order inlining heuristics which allows
            to limit overall compilation unit growth (--param
            inline-unit-growth).
       Overall, the unit-at-a-time scheme produces a 1.3% improvement for
       the SPECint2000 benchmark on the i386 architecture (AMD Athlon
       CPU).
     * More realistic code size estimates used by inlining for C,
       Objective-C, C++ and Java. The growth of large functions can now be
       limited via --param large-function-insns and --param
       large-function-growth.
     * A new cfg-level loop optimizer pass replaces the old loop unrolling
       pass and adds two other loop transformations -- loop peeling and
       loop unswitching -- and also uses the profile feedback to limit
       code growth. (The three optimizations are enabled by
       -funroll-loops, -fpeel-loops and -funswitch-loops flags,
       respectively).
       The old loop unroller still can be enabled by -fold-unroll-loops
       and may produce better code in some cases, especially when the
       webizer optimization pass is not run.
     * A new web construction pass enabled via -fweb (and implied by -O3)
       improves the quality of register allocation, CSE, first scheduling
       pass and some other optimization passes by avoiding re-use of
       pseudo registers with non-overlapping live ranges. The pass almost
       always improves code quality but does make debugging difficult and
       thus is not enabled by default by -O2
       The pass is especially effective as cleanup after code duplication
       passes, such as the loop unroller or the tracer.
     * Experimental implementations of superblock or trace scheduling in
       the second scheduling pass can be enabled via
       -fsched2-use-superblocks and -fsched2-use-traces, respectively.

New Languages and Language specific improvements

  Ada

     * The Ada front end has been updated to include numerous bug fixes
       and enhancements. These include:
          + Improved project file support
          + Additional set of warnings about potential wrong code
          + Improved error messages
          + Improved code generation
          + Improved cross reference information
          + Improved inlining
          + Better run-time check elimination
          + Better error recovery
          + More efficient implementation of unbounded strings
          + Added features in GNAT.Sockets, GNAT.OS_Lib, GNAT.Debug_Pools,
            ...
          + New GNAT.xxxx packages (e.g. GNAT.Strings,
            GNAT.Exception_Action)
          + New pragmas
          + New -gnatS switch replacing gnatpsta
          + Implementation of new Ada features (in particular limited
            with, limited aggregates)

  C/Objective-C/C++

     * Precompiled headers are now supported. Precompiled headers can
       dramatically speed up compilation of some projects. There are some
       known defects in the current precompiled header implementation that
       will result in compiler crashes in relatively rare situations.
       Therefore, precompiled headers should be considered a "technology
       preview" in this release. Read the manual for details about how to
       use precompiled headers.
     * File handling in the preprocessor has been rewritten. GCC no longer
       gets confused by symlinks and hardlinks, and now has a correct
       implementation of #import and #pragma once. These two directives
       have therefore been un-deprecated.
     * The undocumented extension that allowed C programs to have a label
       at the end of a compound statement, which has been deprecated since
       GCC 3.0, has been removed.
     * The cast-as-lvalue extension has been removed for C++ and
       deprecated for C and Objective-C. In particular, code like this:
        int i;
        (char) i = 5;

       or this:
        char *p;
        ((int *) p)++;

       is no longer accepted for C++ and will not be accepted for C and
       Objective-C in a future version.
     * The conditional-expression-as-lvalue extension has been deprecated
       for C and Objective-C. In particular, code like this:
        int a, b, c;
        (a ? b : c) = 2;

       will not be accepted for C and Objective-C in a future version.
     * The compound-expression-as-lvalue extension has been deprecated for
       C and Objective-C. In particular, code like this:
        int a, b;
        (a, b) = 2;

       will not be accepted for C and Objective-C in a future version. A
       possible non-intrusive workaround is the following:
        (*(a, &b)) = 2;

     * Several [10]built-in functions such as __builtin_popcount for
       counting bits, finding the highest and lowest bit in a word, and
       parity have been added.
     * The -fwritable-strings option has been deprecated and will be
       removed.
     * Many C math library functions are now recognized as built-ins and
       optimized.
     * The C, C++, and Objective-C compilers can now handle source files
       written in any character encoding supported by the host C library.
       The default input character set is taken from the current locale,
       and may be overridden with the -finput-charset command line option.
       In the future we will add support for inline encoding markers.

  C++

     * G++ is now much closer to full conformance to the ISO/ANSI C++
       standard. This means, among other things, that a lot of invalid
       constructs which used to be accepted in previous versions will now
       be rejected. It is very likely that existing C++ code will need to
       be fixed. This document lists some of the most common issues.
     * A hand-written recursive-descent C++ parser has replaced the
       YACC-derived C++ parser from previous GCC releases. The new parser
       contains much improved infrastructure needed for better parsing of
       C++ source codes, handling of extensions, and clean separation
       (where possible) between proper semantics analysis and parsing. The
       new parser fixes many bugs that were found in the old parser.
     * You must now use the typename and template keywords to disambiguate
       dependent names, as required by the C++ standard.
        struct K {
          typedef int mytype_t;
        };

        template <class T1> struct A {
          template <class T2> struct B {
              void callme(void);
            };

          template <int N> void bar(void)
          {
            // Use 'typename' to tell the parser that T1::mytype_t names
            //  a type. This is needed because the name is dependent (in
            //  this case, on template parameter T1).
            typename T1::mytype_t x;
            x = 0;
          }
        };

        template <class T> void template_func(void)
        {
          // Use 'template' to prefix member templates within
          //  dependent types (a has type A<T>, which depends on
          //  the template parameter T).
          A<T> a;
          a.template bar<0>();

          // Use 'template' to tell the parser that B is a nested
          //  template class (dependent on template parameter T), and
          //  'typename' because the whole A<T>::B<int> is
          //  the name of a type (again, dependent).
          typename A<T>::template B<int> b;
          b.callme();
        }

        void non_template_func(void)
        {
          // Outside of any template class or function, no names can be
          //  dependent, so the use of the keyword 'typename' and 'template'
          //  is not needed (and actually forbidden).
          A<K> a;
          a.bar<0>();
          A<K>::B<float> b;
          b.callme();
        }
     * In a template definition, unqualified names will no longer find
       members of a dependent base (as specified by [temp.dep]/3 in the
       C++ standard). For example,
        template <typename T> struct B {
          int m;
          int n;
          int f ();
          int g ();
        };
        int n;
        int g ();
        template <typename T> struct C : B<T> {
          void h ()
          {
            m = 0; // error
            f ();  // error
            n = 0; // ::n is modified
            g ();  // ::g is called
          }
        };
       You must make the names dependent, e.g. by prefixing them with
       this->. Here is the corrected definition of C<T>::h,
        template <typename T> void C<T>::h ()
        {
          this->m = 0;
          this->f ();
          this->n = 0
          this->g ();
        }
       As an alternative solution (unfortunately not backwards compatible
       with GCC 3.3), you may use using declarations instead of this->:
        template <typename T> struct C : B<T> {
          using B<T>::m;
          using B<T>::f;
          using B<T>::n;
          using B<T>::g;
          void h ()
          {
            m = 0;
            f ();
            n = 0;
            g ();
          }
        };
     * In templates, all non-dependent names are now looked up and bound
       at definition time (while parsing the code), instead of later when
       the template is instantiated. For instance:
        void foo(int);

        template <int> struct A {
          static void bar(void){
            foo('a');
          }
        };

        void foo(char);

        int main()
        {
          A<0>::bar();    // Calls foo(int), used to call foo(char).
        }

     * In an explicit instantiation of a class template, you must use
       class or struct before the template-id:
        template <int N>
        class A {};

        template A<0>;         // error, not accepted anymore
        template class A<0>;   // OK
     * The "named return value" and "implicit typename" extensions have
       been removed.
     * Default arguments in function types have been deprecated and will
       be removed.
     * ARM-style name-injection of friend declarations has been deprecated
       and will be removed. For example: struct S { friend void f(); };
       void g() { f(); } will not be accepted by future versions of G++;
       instead a declaration of "f" will need to be present outside of the
       scope of "S".
     * Covariant returns are implemented for all but varadic functions
       that require an adjustment.
     * When -pedantic is used, G++ now issues errors about spurious
       semicolons. For example,
        namespace N {}; // Invalid semicolon.
        void f() {}; // Invalid semicolon.
     * G++ no longer accepts attributes for a declarator after the
       initializer associated with that declarator. For example,
        X x(1) __attribute__((...));
       is no longer accepted. Instead, use:
        X x __attribute__((...)) (1);
     * Inside the scope of a template class, the name of the class itself
       can be treated as either a class or a template. So GCC used to
       accept the class name as argument of type template, and template
       template parameter. However this is not C++ standard compliant. Now
       the name is not treated as a valid template template argument
       unless you qualify the name by its scope. For example, the code
       below no longer compiles.
        template <template <class> class TT> class X {};
        template <class T> class Y {
          X<Y> x; // Invalid, Y is always a type template parameter.
        };
       The valid code for the above example is
          X< ::Y> x; // Valid.
       (Notice the space between < and : to prevent GCC to interpret this
       as a digraph for [.)
     * Friend declarations that refer to template specializations are
       rejected if the template has not already been declared. For
       example,
        template <typename T>
        class C {
          friend void f<> (C&);
        };
       is rejected. You must first declare f as a template,
        template <typename T>
        void f(T);
     * In case of friend declarations, every name used in the friend
       declaration must be accessible at the point of that declaration.
       Previous versions of G++ used to be less strict about this and
       allowed friend declarations for private class members, for example.
       See the ISO C++ Standard Committee's [11]defect report #209 for
       details.
     * Declaration of member functions of class templates as friends are
       supported. For example,
        template <typename T> struct A {
          void f();
        };
        class C {
          template <typename T> friend void A<T>::f();
        };
     * You must use template <> to introduce template specializations, as
       required by the standard. For example,
        template <typename T>
        struct S;

        struct S<int> { };
       is rejected. You must write,
        template <> struct S<int> {};
     * G++ used to accept code like this,
        struct S {
          int h();
          void f(int i = g());
          int g(int i = h());
        };
       This behavior is not mandated by the standard. Now G++ issues an
       error about this code. To avoid the error, you must move the
       declaration of g before the declaration of f. The default arguments
       for g must be visible at the point where it is called.
     * The C++ ABI Section 3.3.3 specifications for the array construction
       routines __cxa_vec_new2 and __cxa_vec_new3 were changed to return
       NULL when the allocator argument returns NULL. These changes are
       incorporated into the libstdc++ runtime library.
     * Using a name introduced by a typedef in a friend declaration or in
       an explicit instantiation is now rejected, as specified by the ISO
       C++ standard.
        class A;
        typedef A B;
        class C {
          friend class B;      // error, no typedef name here
          friend B;            // error, friend always needs class/struct/enum
          friend class A;      // OK
        };

        template <int> class Q {};
        typedef Q<0> R;
        template class R;      // error, no typedef name here
        template class Q<0>;   // OK
     * When allocating an array with a new expression, GCC used to allow
       parentheses around the type name. This is actually ill-formed and
       it is now rejected:
        int* a = new (int)[10];    // error, not accepted anymore
        int* a = new int[10];      // OK
     * When binding an rvalue of class type to a reference, the copy
       constructor of the class must be accessible. For instance, consider
       the following code:
        class A
        {
        public:
          A();

        private:
          A(const A&);   // private copy ctor
        };

        A makeA(void);
        void foo(const A&);

        void bar(void)
        {
          foo(A());       // error, copy ctor is not accessible
          foo(makeA());   // error, copy ctor is not accessible

          A a1;
          foo(a1);        // OK, a1 is a lvalue
        }
       This might be surprising at first sight, especially since most
       popular compilers do not correctly implement this rule ([12]further
       details).
     * When forming a pointer to member or a pointer to member function,
       access checks for class visibility (public, protected, private) are
       now performed using the qualifying scope of the name itself. This
       is better explained with an example:
        class A
        {
        public:
          void pub_func();
        protected:
          void prot_func();
        private:
          void priv_func();
        };

        class B : public A
        {
        public:
          void foo()
          {
            &A::pub_func;   // OK, pub_func is accessible through A
            &A::prot_func;  // error, cannot access prot_func through A
            &A::priv_func;  // error, cannot access priv_func through A

            &B::pub_func;   // OK, pub_func is accessible through B
            &B::prot_func;  // OK, can access prot_func through B (within B)
            &B::priv_func;  // error, cannot access priv_func through B
          }
        };

    Runtime Library (libstdc++)

     * Optimization work:
          + Streamlined streambuf, filebuf, separate synched with C
            Standard I/O streambuf.
          + All formatted I/O now uses cached locale information.
          + STL optimizations (memory/speed for list, red-black trees as
            used by sets and maps).
          + More use of GCC builtins.
          + String optimizations (avoid contention on
            increment/decrement-and-test of the reference count in the
            empty-string object, constructor from input_iterators
            speedup).
     * Static linkage size reductions.
     * Large File Support (files larger than 2 GB on 32-bit systems).
     * Wide character and variable encoding filebuf work (UTF-8, Unicode).
     * Generic character traits.
     * Also support wchar_t specializations on Mac OS 10.3.x, FreeBSD 5.x,
       Solaris 2.7 and above, AIX 5.x, Irix 6.5.
     * The allocator class is now standard-conformant, and two additional
       extension allocators have been added, mt_alloc and
       bitmap_allocator.
     * PCH support: -include bits/stdc++.h (2x compile speedup).
     * Rewrote __cxa_demangle with support for C++ style allocators.
     * New debug modes for STL containers and iterators.
     * Testsuite rewrite: five times as many tests, plus increasingly
       sophisticated tests, including I/O, MT, multi-locale, wide and
       narrow characters.
     * Use current versions of GNU "autotools" for build/configuration.

  Objective-C

     * The Objective-C front end has been updated to include the numerous
       bug fixes and enhancements previously available only in Apple's
       version of GCC. These include:
          + Structured exception (@try... @catch... @finally, @throw) and
            synchronization (@synchronized) support. These are accessible
            via the -fobjc-exceptions switch; as of this writing, they may
            only be used in conjunction with -fnext-runtime on Mac OS X
            10.3 and later. See [13]Options Controlling Objective-C
            Dialect for more information.
          + An overhaul of @encode logic. The C99 _Bool and C++ bool type
            may now be encoded as 'B'. In addition, the back-end/codegen
            dependencies have been removed.
          + An overhaul of message dispatch construction, ensuring that
            the various receiver types (and casts thereof) are handled
            properly, and that correct diagnostics are issued.
          + Support for "Zero-Link" (-fzero-link) and "Fix-and-Continue"
            (-freplace-objc-classes) debugging modes, currently available
            on Mac OS X 10.3 and later. See [14]Options Controlling
            Objective-C Dialect for more information.
          + Access to optimized runtime entry points (-fno-nil-receivers )
            on the assumption that message receivers are never nil. This
            is currently available on Mac OS X 10.3 and later. See
            [15]Options Controlling Objective-C Dialect for more
            information.

  Java

     * Compiling a .jar file will now cause non-.class entries to be
       automatically compiled as resources.
     * libgcj has been ported to Darwin.
     * Jeff Sturm has adapted Jan Hubicka's call graph optimization code
       to gcj.
     * libgcj has a new gcjlib URL type; this lets URLClassLoader load
       code from shared libraries.
     * libgcj has been much more completely merged with [16]GNU Classpath.
     * Class loading is now much more correct; in particular the caller's
       class loader is now used when that is required.
     * [17]Eclipse 2.x will run out of the box using gij.
     * Parts of java.nio have been implemented. Direct and indirect
       buffers work, as do fundamental file and socket operations.
     * java.awt has been improved, though it is still not ready for
       general use.
     * The HTTP protocol handler now uses HTTP/1.1 and can handle the POST
       method.
     * The MinGW port has matured. Enhancements include socket timeout
       support, thread interruption, improved Runtime.exec() handling and
       support for accented characters in filenames.

  Fortran

     * Fortran improvements are listed in the [18]Fortran documentation.

New Targets and Target Specific Improvements

  Alpha

     * Several [19]built-in functions have been added such as
       __builtin_alpha_zap to allow utilizing the more obscure
       instructions of the CPU.
     * Parameter passing of complex arguments has changed to match the
       [20]ABI. This change is incompatible with previous GCC versions,
       but does fix compatibility with the Tru64 compiler and several
       corner cases where GCC was incompatible with itself.

  ARM

     * Nicolas Pitre has contributed his hand-coded floating-point support
       code for ARM. It is both significantly smaller and faster than the
       existing C-based implementation, even when building applications
       for Thumb. The arm-elf configuration has been converted to use the
       new code.
     * Support for the Intel's iWMMXt architecture, a second generation
       XScale processor, has been added. Enabled at run time with the
       -mcpu=iwmmxt command line switch.
     * A new ARM target has been added: arm-wince-pe. This is similar to
       the arm-pe target, but it defaults to using the APCS32 ABI.
     * The existing ARM pipeline description has been converted to the use
       the [21]DFA processor pipeline model. There is not much change in
       code performance, but the description is now [22]easier to
       understand.
     * Support for the Cirrus EP9312 Maverick floating point co-processor
       added. Enabled at run time with the -mcpu=ep9312 command line
       switch. Note however that the multilibs to support this chip are
       currently disabled in gcc/config/arm/t-arm-elf, so if you want to
       enable their production you will have to uncomment the entries in
       that file.

  H8/300

     * Support for long long has been added.
     * Support for saveall attribute has been added.
     * Pavel Pisa contributed hand-written 32-bit-by-32-bit division code
       for H8/300H and H8S, which is much faster than the previous
       implementation.
     * A lot of small performance improvements.

  IA-32/AMD64 (x86-64)

     * Tuning for K8 (AMD Opteron/Athlon64) core is available via
       -march=k8 and -mcpu=k8.
     * Scalar SSE code generation carefully avoids reformatting penalties,
       hidden dependencies and minimizes the number of uops generated on
       both Intel and AMD CPUs.
     * Vector MMX and SSE operands are now passed in registers to improve
       performance and match the argument passing convention used by the
       Intel C++ Compiler. As a result it is not possible to call
       functions accepting vector arguments compiled by older GCC version.
     * Conditional jump elimination is now more aggressive on modern CPUs.
     * The Athlon ports has been converted to use the DFA processor
       pipeline description.
     * Optimization of indirect tail calls is now possible in a similar
       fashion as direct sibcall optimization.
     * Further small performance improvements.
     * -m128bit-long-double is now less buggy.
     * __float128 support in 64-bit compilation.
     * Support for data structures exceeding 2GB in 64-bit mode.
     * -mcpu has been renamed to -mtune.

  IA-64

     * Tuning code for the Itanium 2 processor has been added. The
       generation of code tuned for Itanium 2 (option -mtune=itanium2) is
       enabled by default now. To generate code tuned for Itanium 1 the
       option -mtune=itanium1 should be used.
     * [23]DFA processor pipeline descriptions for the IA-64 processors
       have been added. This resulted in about 3% improvement on the
       SPECInt2000 benchmark for Itanium 2.
     * Instruction bundling for the IA-64 processors has been rewritten
       using the DFA pipeline hazard recognizer. It resulted in about 60%
       compiler speedup on the SPECInt2000 C programs.

  M32R

     * Support for the M32R/2 processor has been added by Renesas.
     * Support for an M32R GNU/Linux target and PIC code generation has
       been added by Renesas.

  M68000

     * Bernardo Innocenti (Develer S.r.l.) has contributed the
       m68k-uclinux target, based on former work done by Paul Dale
       (SnapGear Inc.). Code generation for the ColdFire processors family
       has been enhanced and extended to support the MCF 53xx and MCF 54xx
       cores, integrating former work done by Peter Barada (Motorola).

  MIPS

    Processor-specific changes

     * Support for the RM7000 and RM9000 processors has been added. It can
       be selected using the -march compiler option and should work with
       any MIPS I (mips-*) or MIPS III (mips64-*) configuration.
     * Support for revision 2 of the MIPS32 ISA has been added. It can be
       selected with the command-line option -march=mips32r2.
     * There is a new option, -mfix-sb1, to work around certain SB-1
       errata.

    Configuration

     * It is possible to customize GCC using the following configure-time
       options:
          + --with-arch, which specifies the default value of the -march
            option.
          + --with-tune, which specifies the default value of the -mtune
            option.
          + --with-abi, which specifies the default ABI.
          + --with-float=soft, which tells GCC to use software floating
            point by default.
          + --with-float=hard, which tells GCC to use hardware floating
            point by default.
     * A 64-bit GNU/Linux port has been added. The associated
       configurations are mips64-linux-gnu and mips64el-linux-gnu.
     * The 32-bit GNU/Linux port now supports Java.
     * The IRIX 6 configuration now supports the o32 ABI and will build
       o32 multilibs by default. This support is compatible with both
       binutils and the SGI tools, but note that several features,
       including debugging information and DWARF2 exception handling, are
       only available when using the GNU assembler. Use of the GNU
       assembler and linker (version 2.15 or above) is strongly
       recommended.
     * The IRIX 6 configuration now supports 128-bit long doubles.
     * There are two new RTEMS-specific configurations, mips-rtems and
       mipsel-rtems.
     * There are two new *-elf configurations, mipsisa32r2-elf and
       mipsisa32r2el-elf.

    General

     * Several [24]ABI bugs have been fixed. Unfortunately, these changes
       will break binary compatibility with earlier releases.
     * GCC can now use explicit relocation operators when generating
       -mabicalls code. This behavior is controlled by -mexplicit-relocs
       and can have several performance benefits. For example:
          + It allows for more optimization of GOT accesses, including
            better scheduling and redundancy elimination.
          + It allows sibling calls to be implemented as jumps.
          + n32 and n64 leaf functions can use a call-clobbered global
            pointer instead of $28.
          + The code to set up $gp can be removed from functions that
            don't need it.
     * A new option, -mxgot, allows the GOT to be bigger than 64k. This
       option is equivalent to the assembler's -xgot option and should be
       used instead of -Wa,-xgot.
     * Frame pointer elimination is now supported when generating 64-bit
       MIPS16 code.
     * Inline block moves have been optimized to take more account of
       alignment information.
     * Many internal changes have been made to the MIPS port, mostly aimed
       at reducing the reliance on assembler macros.

  PowerPC

     * GCC 3.4 releases have a number of fixes for PowerPC and PowerPC64
       [25]ABI incompatibilities regarding the way parameters are passed
       during functions calls. These changes may result in incompatibility
       between code compiled with GCC 3.3 and GCC 3.4.

    PowerPC Darwin

     * Support for shared/dylib gcc libraries has been added. It is
       enabled by default on powerpc-apple-darwin7.0.0 and up.
     * Libgcj is enabled by default. On systems older than
       powerpc-apple-darwin7.0.0 you need to install dlcompat.
     * 128-bit IBM extended precision format support added for long
       double.

    PowerPC64 GNU/Linux

     * By default, PowerPC64 GNU/Linux now uses natural alignment of
       structure elements. The old four byte alignment for double, with
       special rules for a struct starting with a double, can be chosen
       with -malign-power. This change may result in incompatibility
       between code compiled with GCC 3.3 and GCC 3.4.
     * -mabi=altivec is now the default rather than -mabi=no-altivec.
     * 128-bit IBM extended precision format support added for long
       double.

  S/390 and zSeries

     * New command-line options allow to specify the intended execution
       environment for generated code:
          + -mesa/-mzarch allows to specify whether to generate code
            running in ESA/390 mode or in z/Architecture mode (this is
            applicable to 31-bit code only).
          + -march allows to specify a minimum processor architecture
            level (g5, g6, z900, or z990).
          + -mtune allows to specify which processor to tune for.
     * It is possible to customize GCC using the following configure-time
       options:
          + --with-mode, which specifies whether to default to assuming
            ESA/390 or z/Architecture mode.
          + --with-arch, which specifies the default value of the -march
            option.
          + --with-tune, which specifies the default value of the -mtune
            option.
     * Support for the z990 processor has been added, and can be selected
       using -march=z990 or -mtune=z990. This includes instruction
       scheduling tuned for the superscalar instruction pipeline of the
       z990 processor as well as support for all new instructions provided
       by the long-displacement facility.
     * Support to generate 31-bit code optimized for zSeries processors
       (running in ESA/390 or in z/Architecture mode) has been added. This
       can be selected using -march=z900 and -mzarch respectively.
     * Instruction scheduling for the z900 and z990 processors now uses
       the DFA pipeline hazard recognizer.
     * GCC no longer generates code to maintain a stack backchain,
       previously used to generate stack backtraces for debugging
       purposes. As replacement that does not incur runtime overhead,
       DWARF-2 call frame information is provided by GCC; this is
       supported by GDB 6.1. The old behavior can be restored using the
       -mbackchain option.
     * The stack frame size of functions may now exceed 2 GB in 64-bit
       code.
     * A port for the 64-bit IBM TPF operating system has been added; the
       configuration is s390x-ibm-tpf. This configuration is supported as
       cross-compilation target only.
     * Various changes to improve the generated code have been
       implemented, including:
          + GCC now uses the MULTIPLY AND ADD and MULTIPLY AND SUBTRACT
            instructions to significantly speed up many floating-point
            applications.
          + GCC now uses the ADD LOGICAL WITH CARRY and SUBTRACT LOGICAL
            WITH BORROW instructions to speed up long long arithmetic.
          + GCC now uses the SEARCH STRING instruction to implement
            strlen().
          + In many cases, function call overhead for 31-bit code has been
            reduced by placing the literal pool after the function code
            instead of after the function prolog.
          + Register 14 is no longer reserved in 64-bit code.
          + Handling of global register variables has been improved.

  SPARC

     * The option -mflat is deprecated.
     * Support for large (> 2GB) frames has been added to the 64-bit port.
     * Several [26]ABI bugs have been fixed. Unfortunately, these changes
       will break binary compatibility with earlier releases.
     * The default debugging format has been switched from STABS to
       DWARF-2 for 32-bit code on Solaris 7 and later. DWARF-2 is already
       the default debugging format for 64-bit code on Solaris.

  SuperH

     * Support for the SH2E processor has been added. Enabled at run time
       with the -m2e command line switch, or at configure time by
       specifying sh2e as the machine part of the target triple.

  V850

     * Support for the Mitsubishi V850E1 processor has been added. This is
       a variant of the V850E processor with some additional debugging
       instructions.

  Xtensa

     * Several ABI bugs have been fixed. Unfortunately, these changes
       break binary compatibility with earlier releases.
          + For big-endian processors, the padding of aggregate return
            values larger than a word has changed. If the size of an
            aggregate return value is not a multiple of 32 bits, previous
            versions of GCC inserted padding in the most-significant bytes
            of the first return value register. Aggregates larger than a
            word are now padded in the least-significant bytes of the last
            return value register used. Aggregates smaller than a word are
            still padded in the most-significant bytes. The return value
            padding has not changed for little-endian processors.
          + Function arguments with 16-byte alignment are now properly
            aligned.
          + The implementation of the va_list type has changed. A va_list
            value created by va_start from a previous release cannot be
            used with va_arg from this release, or vice versa.
     * More processor configuration options for Xtensa processors are
       supported:
          + the ABS instruction is now optional;
          + the ADDX* and SUBX* instructions are now optional;
          + an experimental CONST16 instruction can be used to synthesize
            constants instead of loading them from constant pools.
       These and other Xtensa processor configuration options can no
       longer be enabled or disabled by command-line options; the
       processor configuration must be specified by the xtensa-config.h
       header file when building GCC. Additionally, the
       -mno-serialize-volatile option is no longer supported.

Obsolete Systems

   Support for a number of older systems has been declared obsolete in GCC
   3.4. Unless there is activity to revive them, the next release of GCC
   will have their sources permanently removed.

   All configurations of the following processor architectures have been
   declared obsolete:
     * Mitsubishi D30V, d30v-*
     * AT&T DSP1600 and DSP1610, dsp16xx-*
     * Intel 80960, i960

   Also, some individual systems have been obsoleted:
     * ARM Family
          + Support for generating code for operation in APCS/26 mode
            (-mapcs-26).
     * IBM ESA/390
          + "Bigfoot" port, i370-*. (The other port, s390-*, is actively
            maintained and supported.)
     * Intel 386 family
          + MOSS, i?86-moss-msdos and i?86-*-moss*
          + NCR 3000 running System V r.4, i?86-ncr-sysv4*
          + FreeBSD with a.out object format, i?86-*-freebsd*aout* and
            i?86-*-freebsd2*
          + GNU/Linux with a.out object format, i?86-linux*aout*
          + GNU/Linux with libc5, a.k.a. glibc1, i?86-linux*libc1*
          + Interix versions before Interix 3, i?86-*-interix
          + Mach microkernel, i?86-mach*
          + SCO UnixWare with UDK, i?86-*-udk*
          + Generic System V releases 1, 2, and 3, i?86-*-sysv[123]*
          + VSTa microkernel, i386-*-vsta
     * Motorola M68000 family
          + HPUX, m68k-hp-hpux* and m68000-hp-hpux*
          + NetBSD with a.out object format (before NetBSD 1.4),
            m68k-*-*-netbsd* except m68k-*-*-netbsdelf*
          + Generic System V r.4, m68k-*-sysv4*
     * VAX
          + Generic VAX, vax-*-* (This is generic VAX only; we have not
            obsoleted any VAX triples for specific operating systems.)

Documentation improvements

Other significant improvements

     * The build system has undergone several significant cleanups.
       Subdirectories will only be configured if they are being built, and
       all subdirectory configures are run from the make command. The top
       level has been autoconfiscated.
     * Building GCC no longer writes to its source directory. This should
       help those wishing to share a read-only source directory over NFS
       or build from a CD. The exceptions to this feature are if you
       configure with either --enable-maintainer-mode or
       --enable-generated-files-in-srcdir.
     * The -W warning option has been renamed to -Wextra, which is more
       easily understood. The older spelling will be retained for
       backwards compatibility.
     * Substantial improvements in compile time have been made,
       particularly for non-optimizing compilations.
     __________________________________________________________________

GCC 3.4.0

  Bug Fixes

   A vast number of bugs have been fixed in 3.4.0, too many to publish a
   complete list here. [27]Follow this link to query the Bugzilla database
   for the list of over 900 bugs fixed in 3.4.0. This is the list of all
   bugs marked as resolved and fixed in 3.4.0 that are not flagged as 3.4
   regressions.
     __________________________________________________________________

GCC 3.4.1

  Bug Fixes

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

    Bootstrap failures

     * [28]10129 Ada bootstrap fails on PPC-Darwin - invalid assembler
       emitted - PIC related
     * [29]14576 [ARM] ICE in libiberty when building gcc-3.4 for arm-elf
     * [30]14760 A bug in configure.in prevents using both
       --program-suffix and --program-prefix
     * [31]14671 [hppa64] bootstrap fails: ICE in
       save_call_clobbered_regs, in caller_save.c
     * [32]15093 [alpha][Java] make bootstrap fails to configure libffi on
       Alpha
     * [33]15178 Solaris 9/x86 fails linking after stage 3

    Multi-platform internal compiler errors (ICEs)

     * [34]12753 (preprocessor) Memory corruption in preprocessor on bad
       input
     * [35]13985 ICE in gcc.c-torture/compile/930621-1.c
     * [36]14810 (c++) tree check failures with invalid code involving
       templates
     * [37]14883 (c++) ICE on invalid code, in cp_parser_lookup_name, in
       cp/parser.c
     * [38]15044 (c++) ICE on syntax error, template header
     * [39]15057 (c++) Compiling of conditional value throw constructs
       cause a segmentation violation
     * [40]15064 (c++) typeid of template parameter gives ICE
     * [41]15142 (c++) ICE when passing a string where a char* is expected
       in a throw statement
     * [42]15159 ICE in rtl_verify_flow_info_1
     * [43]15165 (c++) ICE in instantiate_template
     * [44]15193 Unary minus using pointer to V4SF vector causes
       -fforce-mem to exhaust all memory
     * [45]15209 (c++) Runs out of memory with packed structs
     * [46]15227 (c++) Trouble with invalid function definition
     * [47]15285 (c++) instantiate_type ICE when forming pointer to
       template function
     * [48]15299 (c++) ICE in resolve_overloaded_unification
     * [49]15329 (c++) ICE on constructor of member template
     * [50]15550 ICE in extract_insn, in recog.c
     * [51]15554 (c++) ICE in tsubst_copy, in cp/pt.c
     * [52]15640 (c++) ICE on invalid code in arg_assoc, in
       cp/name-lookup.c
     * [53]15666 [unit-at-a-time] Gcc abort on valid code
     * [54]15696 (c++) ICE with bad pointer-to-member code
     * [55]15701 (c++) ICE with friends and template template parameter
     * [56]15761 ICE in do_SUBST, in combine.c
     * [57]15829 (c++) ICE on Botan-1.3.13 due to -funroll-loops

    Ada

     * [58]14538 All RTEMS targets broken for gnat

    C front end

     * [59]12391 missing warning about assigning to an incomplete type
     * [60]14649 atan(1.0) should not be a constant expression
     * [61]15004 [unit-at-a-time] no warning for unused paramater in
       static function
     * [62]15749 --pedantic-errors behaves differently from --pedantic
       with C-compiler on GNU/Linux

    C++ compiler and library

     * [63]10646 non-const reference is incorrectly matched in a "const T"
       partial specialization
     * [64]12077 wcin.rdbuf()->in_avail() return value too high
     * [65]13598 enc_filebuf doesn't work
     * [66]14211 const_cast returns lvalue but should be rvalue
     * [67]14220 num_put::do_put() undesired float/double behavior
     * [68]14245 problem with user-defined allocators in std::basic_string
     * [69]14340 libstdc++ Debug mode: failure to convert iterator to
       const_iterator
     * [70]14600 __gnu_cxx::stdio_sync_filebuf should expose internal
       FILE*
     * [71]14668 no warning anymore for reevaluation of declaration
     * [72]14775 LFS (large file support) tests missing
     * [73]14821 Duplicate namespace alias declaration should not conflict
     * [74]14930 Friend declaration ignored
     * [75]14932 cannot use offsetof to get offsets of array elements in
       g++ 3.4.0
     * [76]14950 [non unit-at-a-time] always_inline does not mix with
       templates and -O0
     * [77]14962 g++ ignores #pragma redefine_extname
     * [78]14975 Segfault on low-level write error during imbue
     * [79]15002 Linewise stream input is unusably slow (std::string slow)
     * [80]15025 compiler accepts redeclaration of template as
       non-template
     * [81]15046 [arm] Math functions misdetected by cross configuration
     * [82]15069 a bit test on a variable of enum type is miscompiled
     * [83]15074 g++ -lsupc++ still links against libstdc++
     * [84]15083 spurious "statement has no effect" warning
     * [85]15096 parse error with templates and pointer to const member
     * [86]15287 combination of operator[] and operator .* fails in
       templates
     * [87]15317 __attribute__ unused in first parameter of constructor
       gives error
     * [88]15337 sizeof on incomplete type diagnostic
     * [89]15361 bitset<>::_Find_next fails
     * [90]15412 _GLIBCXX_ symbols symbols defined and used in different
       namespaces
     * [91]15427 valid code results in incomplete type error
     * [92]15471 Incorrect member pointer offsets in anonymous
       structs/unions
     * [93]15503 nested template problem
     * [94]15507 compiler hangs while laying out union
     * [95]15542 operator & and template definitions
     * [96]15565 SLES9: leading + sign for unsigned int with showpos
     * [97]15625 friend defined inside a template fails to find static
       function
     * [98]15629 Function templates, overloads, and friend name injection
     * [99]15742 'noreturn' attribute ignored in method of template
       functions.
     * [100]15775 Allocator::pointer consistently ignored
     * [101]15821 Duplicate namespace alias within namespace rejected
     * [102]15862 'enum yn' fails (confict with undeclared builtin)
     * [103]15875 rejects pointer to member in template
     * [104]15877 valid code using templates and anonymous enums is
       rejected
     * [105]15947 Puzzling error message for wrong destructor declaration
       in template class
     * [106]16020 cannot copy __gnu_debug::bitset
     * [107]16154 input iterator concept too restrictive
     * [108]16174 deducing top-level consts

    Java

     * [109]14315 Java compiler is not parallel make safe

    Fortran

     * [110]15151 [g77] incorrect logical i/o in 64-bit mode

    Objective-C

     * [111]7993 private variables cannot be shadowed in subclasses

    Optimization bugs

     * [112]15228 useless copies of floating point operands
     * [113]15345 [non-unit-at-a-time] unreferenced nested inline
       functions not optimized away
     * [114]15945 Incorrect floating point optimization
     * [115]15526 ftrapv aborts on 0 * (-1)
     * [116]14690 Miscompiled POOMA tests
     * [117]15112 GCC generates code to write to unchanging memory

    Preprocessor

     * [118]15067 Minor glitch in the source of cpp

    Main driver program bugs

     * [119]1963 collect2 interprets -oldstyle_liblookup as -o
       ldstyle_liblookup

    x86-specific (Intel/AMD)

     * [120]15717 Error: can't resolve `L0' {*ABS* section} - `xx' {*UND*
       section}

    HPPA-specific

     * [121]14782 GCC produces an unaligned data access at -O2
     * [122]14828 FAIL: gcc.c-torture/execute/20030408-1.c execution, -O2
     * [123]15202 ICE in reload_cse_simplify_operands, in postreload.c

    IA64-specific

     * [124]14610 __float80 constants incorrectly emitted
     * [125]14813 init_array sections are initialized in the wrong order
     * [126]14857 GCC segfault on duplicated asm statement
     * [127]15598 Gcc 3.4 ICE on valid code
     * [128]15653 Gcc 3.4 ICE on valid code

    MIPS-specific

     * [129]15189 wrong filling of delay slot with -march=mips1 -G0
       -mno-split-addresses -mno-explicit-relocs
     * [130]15331 Assembler error building gnatlib on IRIX 6.5 with GNU as
       2.14.91
     * [131]16144 Bogus reference to __divdf3 when -O1
     * [132]16176 Miscompilation of unaligned data in MIPS backend

    PowerPC-specific

     * [133]11591 ICE in gcc.dg/altivec-5.c
     * [134]12028 powerpc-eabispe produces bad sCOND operation
     * [135]14478 rs6000 geu/ltu patterns generate incorrect code
     * [136]14567 long double and va_arg complex args
     * [137]14715 Altivec stack layout may overlap gpr save with stack
       temps
     * [138]14902 (libstdc++) Stream checking functions fail when -pthread
       option is used.
     * [139]14924 Compiler ICE on valid code
     * [140]14960 -maltivec affects vector return with -mabi=no-altivec
     * [141]15106 vector varargs failure passing from altivec to
       non-altivec code for -m32
     * [142]16026 ICE in function.c:4804, assign_parms, when -mpowerpc64 &
       half-word operation
     * [143]15191 -maltivec -mabi=no-altivec results in mis-aligned lvx
       and stvx
     * [144]15662 Segmentation fault when an exception is thrown - even if
       try and catch are specified

    s390-specific

     * [145]15054 Bad code due to overlapping stack temporaries

    SPARC-specific

     * [146]15783 ICE with union assignment in 64-bit mode
     * [147]15626 GCC 3.4 emits "ld: warning: relocation error:
       R_SPARC_UA32"

    x86-64-specific

     * [148]14326 boehm-gc hardcodes to 3DNow! prefetch for x86_64
     * [149]14723 Backported -march=nocona from mainline
     * [150]15290 __float128 failed to pass to function properly

    Cygwin/Mingw32-specific

     * [151]15250 Option -mms-bitfields support on GCC 3.4 is not
       conformant to MS layout
     * [152]15551 -mtune=pentium4 -O2 with sjlj EH breaks stack probe
       worker on windows32 targets

    Bugs specific to embedded processors

     * [153]8309 [m68k] -m5200 produces erroneous SImode set of short
       varaible on stack
     * [154]13250 [SH] Gcc code for rotation clobbers the register, but
       gcc continues to use the register as if it was not clobbered
     * [155]13803 [coldfire] movqi operand constraints too restrictivefor
       TARGET_COLDFIRE
     * [156]14093 [SH] ICE for code when using -mhitachi option in SH
     * [157]14457 [m6811hc] ICE with simple c++ source
     * [158]14542 [m6811hc] ICE on simple source
     * [159]15100 [SH] cc1plus got hang-up on
       libstdc++-v3/testsuite/abi_check.cc
     * [160]15296 [CRIS] Delayed branch scheduling causing invalid code on
       cris-*
     * [161]15396 [SH] ICE with -O2 -fPIC
     * [162]15782 [coldfire] m68k_output_mi_thunk emits wrong code for
       ColdFire

    Testsuite problems (compiler not affected)

     * [163]11610 libstdc++ testcases 27_io/* don't work properly remotely
     * [164]15488 (libstdc++) possibly insufficient file permissions for
       executing test suite
     * [165]15489 (libstdc++) testsuite_files determined incorrectly

    Documentation bugs

     * [166]13928 (libstdc++) no whatis info in some man pages generated
       by doxygen
     * [167]14150 Ada documentation out of date
     * [168]14949 (c++) Need to document method visibility changes
     * [169]15123 libstdc++-doc: Allocators.3 manpage is empty
     __________________________________________________________________

GCC 3.4.2

  Bug Fixes

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

    Bootstrap failures and issues

     * [170]16469 [mips-sgi-irix5.3] bootstrap fails in
       libstdc++-v3/testsuite
     * [171]16344 [hppa-linux-gnu] libstdc++'s PCH built by
       profiledbootstrap does not work with the built compiler
     * [172]16842 [Solaris/x86] mkheaders can not find mkheaders.conf

    Multi-platform internal compiler errors (ICEs)

     * [173]12608 (c++) ICE: expected class 't', have 'x' (error_mark) in
       cp_parser_class_specifier, in cp/parser.c
     * [174]14492 ICE in loc_descriptor_from_tree, in dwarf2out.c
     * [175]15461 (c++) ICE due to NRV and inlining
     * [176]15890 (c++) ICE in c_expand_expr, in c-common.c
     * [177]16180 ICE: segmentation fault in RTL optimization
     * [178]16224 (c++) ICE in write_unscoped_name (template/namespace)
     * [179]16408 ICE: in delete_insn, in cfgrtl.c
     * [180]16529 (c++) ICE for: namespace-alias shall not be declared as
       the name of any other entity
     * [181]16698 (c++) ICE with exceptions and declaration of __cxa_throw
     * [182]16706 (c++) ICE in finish_member_declaration, in
       cp/semantics.c
     * [183]16810 (c++) Legal C++ program with cast gives ICE in
       build_ptrmemfunc
     * [184]16851 (c++) ICE when throwing a comma expression
     * [185]16870 (c++) Boost.Spirit causes ICE in tsubst, in cp/pt.c
     * [186]16904 (c++) ICE in finish_class_member_access_expr, in
       cp/typeck.c
     * [187]16905 (c++) ICE (segfault) with exceptions
     * [188]16964 (c++) ICE in cp_parser_class_specifier due to
       redefinition
     * [189]17068 (c++) ICE: tree check: expected class 'd', have 'x'
       (identifier_node) in dependent_template_p, in cp/pt.c

    Preprocessor bugs

     * [190]16366 Preprocessor option -remap causes memory corruption

    Optimization

     * [191]15345 unreferenced nested inline functions not optimized away
     * [192]16590 Incorrect execution when compiling with -O2
     * [193]16693 Bitwise AND is lost when used within a cast to an enum
       of the same precision
     * [194]17078 Jump into if(0) substatement fails

    Problems in generated debug information

     * [195]13956 incorrect stabs for nested local variables

    C front end bugs

     * [196]16684 GCC should not warn about redundant redeclarations of
       built-ins

    C++ compiler and library

     * [197]12658 Thread safety problems in locale::global() and
       locale::locale()
     * [198]13092 g++ accepts invalid pointer-to-member conversion
     * [199]15320 Excessive memory consumption
     * [200]16246 Incorrect template argument deduction
     * [201]16273 Memory exhausted when using nested classes and virtual
       functions
     * [202]16401 ostringstream in gcc 3.4.x very slow for big data
     * [203]16411 undefined reference to
       __gnu_cxx::stdio_sync_filebuf<char, std::char_traits<char>
       >::file()
     * [204]16489 G++ incorrectly rejects use of a null constant integral
       expression as a null constant pointer
     * [205]16618 offsetof fails with constant member
     * [206]16637 syntax error reported for valid input code
     * [207]16717 __attribute__((constructor)) broken in C++
     * [208]16813 compiler error in DEBUG version of range insertion
       std::map::insert
     * [209]16853 pointer-to-member initialization from incompatible one
       accepted
     * [210]16889 ambiguity is not detected
     * [211]16959 Segmentation fault in ios_base::sync_with_stdio

    Java compiler and library

     * [212]7587 direct threaded interpreter not thread-safe
     * [213]16473 ServerSocket accept() leaks file descriptors
     * [214]16478 Hash synchronization deadlock with finalizers

    Alpha-specific

     * [215]10695 ICE in dwarf2out_frame_debug_expr, in dwarf2out.c
     * [216]16974 could not split insn (ice in final_scan_insn, in
       final.c)

    x86-specific

     * [217]16298 ICE in output_operand
     * [218]17113 ICE with SSE2 intrinsics

    x86-64 specific

     * [219]14697 libstdc++ couldn't find 32bit libgcc_s

    MIPS-specific

     * [220]15869 [mips64] No NOP after LW (with -mips1 -O0)
     * [221]16325 [mips64] value profiling clobbers gp on mips
     * [222]16357 [mipsisa64-elf] ICE copying 7 bytes between extern
       char[]s
     * [223]16380 [mips64] Use of uninitialised register after dbra
       conversion
     * [224]16407 [mips64] Unaligned access to local variables
     * [225]16643 [mips64] verify_local_live_at_start ICE after
       crossjumping & cfgcleanup

    ARM-specific

     * [226]15927 THUMB -O2: strength-reduced iteration variable ends up
       off by 1
     * [227]15948 THUMB: ICE with non-commutative cbranch
     * [228]17019 THUMB: bad switch statement in md code for
       addsi3_cbranch_scratch

    IA64-specific

     * [229]16130 ICE on valid code: in bundling, in config/ia64/ia64.c
       (-mtune=merced)
     * [230]16142 ICE on valid code: in bundling, in config/ia64/ia64.c
       (-mtune=itanium)
     * [231]16278 Gcc failed to build Linux kernel with -mtune=merced
     * [232]16414 ICE on valid code: typo in comparison of asm_noperands
       result
     * [233]16445 ICE on valid code: don't count ignored insns
     * [234]16490 ICE (segfault) while compiling with -fprofile-use
     * [235]16683 ia64 does not honor SUBTARGET_EXTRA_SPECS

    PowerPC-specific

     * [236]16195 (ppc64): Miscompilation of GCC 3.3.x by 3.4.x
     * [237]16239 ICE on ppc64 (mozilla 1.7 compile, -O1 -fno-exceptions
       issue)

    SPARC-specific

     * [238]16199 ICE while compiling apache 2.0.49
     * [239]16416 -m64 doesn't imply -mcpu=v9 anymore
     * [240]16430 ICE when returning non-C aggregates larger than 16 bytes

    Bugs specific to embedded processors

     * [241]16379 [m32r] can't output large model function call of memcpy
     * [242]17093 [m32r] ICE with -msdata=use -O0
     * [243]17119 [m32r] ICE at switch case 0x8000

    DJGPP-specific

     * [244]15928 libstdc++ in 3.4.x doesn't cross-compile for djgpp

    Alpha Tru64-specific

     * [245]16210 libstdc++ gratuitously omits "long long" I/O

    Testsuite, documentation issues (compiler is not affected):

     * [246]15488 (libstdc++) possibly insufficient file permissions for
       executing test suite
     * [247]16250 ada/doctools runs makeinfo even in release tarball
     __________________________________________________________________

GCC 3.4.3

   This is the [248]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

    Bootstrap failures

     * [249]17369 [ia64] Bootstrap failure with binutils-2.15.90.0.1.1
     * [250]17850 [arm-elf] bootstrap failure - libstdc++ uses strtold
       when undeclared

    Internal compiler errors (ICEs) affecting multiple platforms

     * [251]13948 (java) GCJ segmentation fault while compiling GL4Java
       .class files
     * [252]14492 ICE in loc_descriptor_from_tree, in dwarf2out.c
     * [253]16301 (c++) ICE when "strong" attribute is attached to a using
       directive
     * [254]16566 ICE with flexible arrays
     * [255]17023 ICE with nested functions in parameter declaration
     * [256]17027 ICE with noreturn function in loop at -O2
     * [257]17524 ICE in grokdeclarator, in cp/decl.c
     * [258]17826 (c++) ICE in cp_tree_equal

    C and optimization bugs

     * [259]15526 -ftrapv aborts on 0 * (-1)
     * [260]16999 #ident stopped working
     * [261]17503 quadratic behaviour in invalid_mode_change_p
     * [262]17581 Long long arithmetic fails inside a switch/case
       statement when compiled with -O2
     * [263]18129 -fwritable-strings doesn't work

    C++ compiler and library bugs

     * [264]10975 incorrect initial ostringstream::tellp()
     * [265]11722 Unbuffered filebuf::sgetn is slow
     * [266]14534 Unrecognizing static function as a template parameter
       when its return value is also templated
     * [267]15172 Copy constructor optimization in aggregate
       initialization
     * [268]15786 Bad error message for frequently occuring error.
     * [269]16162 Rejects valid member-template-definition
     * [270]16612 empty basic_strings can't live in shared memory
     * [271]16715 std::basic_iostream is instantiated when used, even
       though instantiations are already contained in libstdc++
     * [272]16848 code in /ext/demangle.h appears broken
     * [273]17132 GCC fails to eliminate function template specialization
       when argument deduction fails
     * [274]17259 One more _S_leaf incorrectly qualified with _RopeRep::
       in ropeimpl.h
     * [275]17327 use of `enumeral_type' in template type unification
     * [276]17393 "unused variable '._0'" warning with -Wall
     * [277]17501 Confusion with member templates
     * [278]17537 g++ not passing -lstdc++ to linker when all command line
       arguments are libraries
     * [279]17585 usage of unqualified name of static member from within
       class not allowed
     * [280]17821 Poor diagnostic for using "." instead of "->"
     * [281]17829 wrong error: call of overloaded function is ambiguous
     * [282]17851 Misleading diagnostic for invalid function declarations
       with undeclared types
     * [283]17976 Destructor is called twice
     * [284]18020 rejects valid definition of enum value in template
     * [285]18093 bogus conflict in namespace aliasing
     * [286]18140 C++ parser bug when using >> in templates

    Fortran

     * [287]17541 data statements with double precision constants fail

    x86-specific

     * [288]17853 -O2 ICE for MMX testcase

    SPARC-specific

     * [289]17245 ICE compiling gsl-1.5 statistics/lag1.c

    Darwin-specific

     * [290]17167 FATAL:Symbol L_foo$stub already defined.

    AIX-specific

     * [291]17277 could not catch an exception when specified -maix64

    Solaris-specific

     * [292]17505 <cmath> calls acosf(), ceilf(), and other functions
       missing from system libraries

    HP/UX specific:

     * [293]17684 /usr/ccs/bin/ld: Can't create libgcc_s.sl

    ARM-specific

     * [294]17384 ICE with mode attribute on structures

    MIPS-specific

     * [295]17770 No NOP after LWL with -mips1

    Other embedded target specific

     * [296]11476 [arc-elf] gcc ICE on newlib's vfprintf.c
     * [297]14064 [avr-elf] -fdata-sections triggers ICE
     * [298]14678 [m68hc11-elf] gcc ICE
     * [299]15583 [powerpc-rtems] powerpc-rtems lacks __USE_INIT_FINI__
     * [300]15790 [i686-coff] Alignment error building gcc with i686-coff
       target
     * [301]15886 [SH] Miscompilation with -O2 -fPIC
     * [302]16884 [avr-elf] [fweb related] bug while initializing
       variables

    Bugs relating to debugger support

     * [303]13841 missing debug info for _Complex function arguments
     * [304]15860 [big-endian targets] No DW_AT_location debug info is
       emitted for formal arguments to a function that uses "register"
       qualifiers

    Testsuite issues (compiler not affected)

     * [305]17465 Testsuite in libffi overrides LD_LIBRARY_PATH
     * [306]17469 Testsuite in libstdc++ overrides LD_LIBRARY_PATH
     * [307]18138 [mips-sgi-irix6.5] libgcc_s.so.1 not found by 64-bit
       testsuite

    Documentation

     * [308]15498 typo in gcc manual: non-existing locale example en_UK,
       should be en_GB
     * [309]15747 [mips-sgi-irix5.3] /bin/sh hangs during bootstrap:
       document broken shell
     * [310]16406 USE_LD_AS_NEEDED undocumented
     __________________________________________________________________

GCC 3.4.4

   This is the [311]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).
     __________________________________________________________________

GCC 3.4.5

   This is the [312]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.5 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

    Bootstrap issues

     * [313]24688 sco_math fixincl breaks math.h

    C compiler bugs

     * [314]17188 struct Foo { } redefinition
     * [315]20187 wrong code for ((unsigned char)(unsigned long
       long)((a?a:1)&(a*b)))?0:1)
     * [316]21873 infinite warning loop on bad array initializer
     * [317]21899 enum definition accepts values to be overriden
     * [318]22061 ICE in find_function_data, in function.c
     * [319]22308 Failure to diagnose violation of constraint 6.516p2
     * [320]22458 ICE on missing brace
     * [321]22589 ICE casting to long long
     * [322]24101 Segfault with preprocessed source

    C++ compiler and library bugs

     * [323]10611 operations on vector mode not recognized in C++
     * [324]13377 unexpected behavior of namespace usage directive
     * [325]16002 Strange error message with new parser
     * [326]17413 local classes as template argument
     * [327]17609 spurious error message after using keyword
     * [328]17618 ICE in cp_convert_to_pointer, in cp/cvt.c
     * [329]18124 ICE with invalid template template parameter
     * [330]18155 typedef in template declaration not rejected
     * [331]18177 ICE with const_cast for undeclared variable
     * [332]18368 C++ error message regression
     * [333]16378 ICE when returning a copy of a packed member
     * [334]18466 int ::i; accepted
     * [335]18512 ICE on invalid usage of template base class
     * [336]18454 ICE when returning undefined type
     * [337]18738 typename not allowed with non-dependent qualified name
     * [338]18803 rejects access to operator() in template
     * [339]19004 ICE in uses_template_parms, in cp/pt.c
     * [340]19208 Spurious error about variably modified type
     * [341]18253 bad error message / ICE for invalid template parameter
     * [342]19608 ICE after friend function definition in local class
     * [343]19884 ICE on explicit instantiation of a non-template
       constructor
     * [344]20153 ICE when C++ template function contains anonymous union
     * [345]20563 Infinite loop in diagnostic (and ice after error
       message)
     * [346]20789 ICE with incomplete type in template
     * [347]21336 Internal compiler error when using custom new operators
     * [348]21768 ICE in error message due to violation of coding
       conventions
     * [349]21853 constness of pointer to data member ignored
     * [350]21903 Default argument of template function causes a
       compile-time error
     * [351]21983 multiple diagnostics
     * [352]21987 New testsuite failure
       g++.dg/warn/conversion-function-1.C
     * [353]22153 ICE on invalid template specialization
     * [354]22172 Internal compiler error, seg fault.
     * [355]21286 filebuf::xsgetn vs pipes
     * [356]22233 ICE with wrong number of template parameters
     * [357]22508 ICE after invalid operator new
     * [358]22545 ICE with pointer to class member & user defined
       conversion operator
     * [359]23528 Wrong default allocator in ext/hash_map
     * [360]23550 char_traits requirements/1.cc test bad math
     * [361]23586 Bad diagnostic for invalid namespace-name
     * [362]23624 ICE in invert_truthvalue, in fold-const.c
     * [363]23639 Bad error message: not a member of '<declaration error>'
     * [364]23797 ICE on typename outside template
     * [365]23965 Bogus error message: no matching function for call to
       'foo(<type error>)'
     * [366]24052 &#`label_decl' not supported by dump_expr#<expression
       error>
     * [367]24580 virtual base class cause exception not to be caught

    Problems in generated debug information

     * [368]24267 Bad DWARF for altivec vectors

    Optimizations issues

     * [369]17810 ICE in verify_local_live_at_start
     * [370]17860 Wrong generated code for loop with varying bound
     * [371]21709 ICE on compile-time complex NaN
     * [372]21964 broken tail call at -O2 or more
     * [373]22167 Strange optimization bug when using -Os
     * [374]22619 Compilation failure for real_const_1.f and
       real_const_2.f90
     * [375]23241 Invalid code generated for comparison of uchar to 255
     * [376]23478 Miscompilation due to reloading of a var that is also
       used in EH pad
     * [377]24470 segmentation fault in cc1plus when compiling with -O
     * [378]24950 ICE in operand_subword_force

    Precompiled headers problems

     * [379]14400 Cannot compile qt-x11-free-3.3.0
     * [380]14940 PCH largefile test fails on various platforms

    Preprocessor bugs

     * [381]20239 ICE on empty preprocessed input
     * [382]15220 "gcc -E -MM -MG" reports missing system headers in
       source directory

    Testsuite issues

     * [383]19275 gcc.dg/20020919-1.c fails with -fpic/-fPIC on
       i686-pc-linux-gnu

    Alpha specific

     * [384]21888 bootstrap failure with linker relaxation enabled

    ARM specific

     * [385]15342 [arm-linux]: ICE in verify_local_live_at_start
     * [386]23985 Memory aliasing information incorrect in inlined memcpy

    ColdFile specific

     * [387]16719 Illegal move of byte into address register causes
       compiler to ICE

    HPPA specific

     * [388]21723 ICE while building libgfortran
     * [389]21841 -mhp-ld/-mgnu-ld documentation

    IA-64 specific

     * [390]23644 IA-64 hardware models and configuration options
       documentation error
     * [391]24718 Shared libgcc not used for linking by default

    M68000 specific

     * [392]18421 ICE in reload_cse_simplify_operands, in postreload.c

    MIPS specific

     * [393]20621 ICE in change_address_1, in emit-rtl.c

    PowerPC and PowerPC64 specific

     * [394]18583 error on valid code: const
       __attribute__((altivec(vector__))) doesn't work in arrays
     * [395]20191 ICE in reload_cse_simplify_operands
     * [396]22083 AIX: TARGET_C99_FUNCTIONS is wrongly defined
     * [397]23070 CALL_V4_CLEAR_FP_ARGS flag not properly set
     * [398]23404 gij trashes args of functions with more than 8 fp args
     * [399]23539 C & C++ compiler generating misaligned references
       regardless of compiler flags
     * [400]24102 floatdisf2_internal2 broken
     * [401]24465 -mminimal-toc miscompilation of __thread vars

    Solaris specific

     * [402]19933 Problem with define of HUGE_VAL in math_c99
     * [403]21889 Native Solaris assembler cannot grok DTP-relative debug
       symbols

    SPARC specific

     * [404]19300 PCH failures on sparc-linux
     * [405]20301 Assembler labels have a leading "-"
     * [406]20673 C PCH testsuite assembly comparison failure

    x86 and x86_64 specific

     * [407]18582 ICE with arrays of type V2DF
     * [408]19340 Compilation SEGFAULTs with -O1 -fschedule-insns2
       -fsched2-use-traces
     * [409]21716 ICE in reg-stack.c's swap_rtx_condition
     * [410]24315 amd64 fails -fpeephole2
     __________________________________________________________________

GCC 3.4.6

   This is the [411]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.4.6 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [412]GCC manuals. If that fails, the
    [413]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [414]gcc@gcc.gnu.org. All of [415]our lists have public
    archives.

   Copyright (C) [416]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [417]maintained by the GCC team. Last modified
   2012-11-02[418].

References

   1. http://gcc.gnu.org/gcc-3.4/changes.html#3.4.6
   2. http://gcc.gnu.org/gcc-3.4/changes.html#cplusplus
   3. http://gcc.gnu.org/gcc-3.3/changes.html#obsolete_systems
   4. http://gcc.gnu.org/gcc-3.4/changes.html#obsolete_systems
   5. http://gcc.gnu.org/gcc-3.4/mips-abi.html
   6. http://gcc.gnu.org/gcc-3.4/sparc-abi.html
   7. http://www.boost.org/
   8. http://gcc.gnu.org/PR11953
   9. http://gcc.gnu.org/PR8361
  10. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Other-Builtins.html#Other%20Builtins
  11. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#209
  12. http://gcc.gnu.org/bugs/#cxx_rvalbind
  13. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
  14. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
  15. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Objective-C-Dialect-Options.html
  16. http://www.gnu.org/software/classpath/
  17. http://www.eclipse.org/
  18. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/g77/News.html
  19. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Alpha-Built-in-Functions.html
  20. http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V51A_HTML/ARH9MBTE/DTMNPLTN.HTM#normal-argument-list-structure
  21. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
  22. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Comparison-of-the-two-descriptions.html
  23. http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gccint/Processor-pipeline-description.html
  24. http://gcc.gnu.org/gcc-3.4/mips-abi.html
  25. http://gcc.gnu.org/gcc-3.4/powerpc-abi.html
  26. http://gcc.gnu.org/gcc-3.4/sparc-abi.html
  27. http://gcc.gnu.org/bugzilla/buglist.cgi?short_desc_type=notregexp&short_desc=%5C%5B3%5C.4.*%5BRr%5Degression&target_milestone=3.4.0&bug_status=RESOLVED&resolution=FIXED
  28. http://gcc.gnu.org/PR10129
  29. http://gcc.gnu.org/PR14576
  30. http://gcc.gnu.org/PR14760
  31. http://gcc.gnu.org/PR14671
  32. http://gcc.gnu.org/PR15093
  33. http://gcc.gnu.org/PR15178
  34. http://gcc.gnu.org/PR12753
  35. http://gcc.gnu.org/PR13985
  36. http://gcc.gnu.org/PR14810
  37. http://gcc.gnu.org/PR14883
  38. http://gcc.gnu.org/PR15044
  39. http://gcc.gnu.org/PR15057
  40. http://gcc.gnu.org/PR15064
  41. http://gcc.gnu.org/PR15142
  42. http://gcc.gnu.org/PR15159
  43. http://gcc.gnu.org/PR15165
  44. http://gcc.gnu.org/PR15193
  45. http://gcc.gnu.org/PR15209
  46. http://gcc.gnu.org/PR15227
  47. http://gcc.gnu.org/PR15285
  48. http://gcc.gnu.org/PR15299
  49. http://gcc.gnu.org/PR15329
  50. http://gcc.gnu.org/PR15550
  51. http://gcc.gnu.org/PR15554
  52. http://gcc.gnu.org/PR15640
  53. http://gcc.gnu.org/PR15666
  54. http://gcc.gnu.org/PR15696
  55. http://gcc.gnu.org/PR15701
  56. http://gcc.gnu.org/PR15761
  57. http://gcc.gnu.org/PR15829
  58. http://gcc.gnu.org/PR14538
  59. http://gcc.gnu.org/PR12391
  60. http://gcc.gnu.org/PR14649
  61. http://gcc.gnu.org/PR15004
  62. http://gcc.gnu.org/PR15749
  63. http://gcc.gnu.org/PR10646
  64. http://gcc.gnu.org/PR12077
  65. http://gcc.gnu.org/PR13598
  66. http://gcc.gnu.org/PR14211
  67. http://gcc.gnu.org/PR14220
  68. http://gcc.gnu.org/PR14245
  69. http://gcc.gnu.org/PR14340
  70. http://gcc.gnu.org/PR14600
  71. http://gcc.gnu.org/PR14668
  72. http://gcc.gnu.org/PR14775
  73. http://gcc.gnu.org/PR14821
  74. http://gcc.gnu.org/PR14930
  75. http://gcc.gnu.org/PR14932
  76. http://gcc.gnu.org/PR14950
  77. http://gcc.gnu.org/PR14962
  78. http://gcc.gnu.org/PR14975
  79. http://gcc.gnu.org/PR15002
  80. http://gcc.gnu.org/PR15025
  81. http://gcc.gnu.org/PR15046
  82. http://gcc.gnu.org/PR15069
  83. http://gcc.gnu.org/PR15074
  84. http://gcc.gnu.org/PR15083
  85. http://gcc.gnu.org/PR15096
  86. http://gcc.gnu.org/PR15287
  87. http://gcc.gnu.org/PR15317
  88. http://gcc.gnu.org/PR15337
  89. http://gcc.gnu.org/PR15361
  90. http://gcc.gnu.org/PR15412
  91. http://gcc.gnu.org/PR15427
  92. http://gcc.gnu.org/PR15471
  93. http://gcc.gnu.org/PR15503
  94. http://gcc.gnu.org/PR15507
  95. http://gcc.gnu.org/PR15542
  96. http://gcc.gnu.org/PR15565
  97. http://gcc.gnu.org/PR15625
  98. http://gcc.gnu.org/PR15629
  99. http://gcc.gnu.org/PR15742
 100. http://gcc.gnu.org/PR15775
 101. http://gcc.gnu.org/PR15821
 102. http://gcc.gnu.org/PR15862
 103. http://gcc.gnu.org/PR15875
 104. http://gcc.gnu.org/PR15877
 105. http://gcc.gnu.org/PR15947
 106. http://gcc.gnu.org/PR16020
 107. http://gcc.gnu.org/PR16154
 108. http://gcc.gnu.org/PR16174
 109. http://gcc.gnu.org/PR14315
 110. http://gcc.gnu.org/PR15151
 111. http://gcc.gnu.org/PR7993
 112. http://gcc.gnu.org/PR15228
 113. http://gcc.gnu.org/PR15345
 114. http://gcc.gnu.org/PR15945
 115. http://gcc.gnu.org/PR15526
 116. http://gcc.gnu.org/PR14690
 117. http://gcc.gnu.org/PR15112
 118. http://gcc.gnu.org/PR15067
 119. http://gcc.gnu.org/PR1963
 120. http://gcc.gnu.org/PR15717
 121. http://gcc.gnu.org/PR14782
 122. http://gcc.gnu.org/PR14828
 123. http://gcc.gnu.org/PR15202
 124. http://gcc.gnu.org/PR14610
 125. http://gcc.gnu.org/PR14813
 126. http://gcc.gnu.org/PR14857
 127. http://gcc.gnu.org/PR15598
 128. http://gcc.gnu.org/PR15653
 129. http://gcc.gnu.org/PR15189
 130. http://gcc.gnu.org/PR15331
 131. http://gcc.gnu.org/PR16144
 132. http://gcc.gnu.org/PR16176
 133. http://gcc.gnu.org/PR11591
 134. http://gcc.gnu.org/PR12028
 135. http://gcc.gnu.org/PR14478
 136. http://gcc.gnu.org/PR14567
 137. http://gcc.gnu.org/PR14715
 138. http://gcc.gnu.org/PR14902
 139. http://gcc.gnu.org/PR14924
 140. http://gcc.gnu.org/PR14960
 141. http://gcc.gnu.org/PR15106
 142. http://gcc.gnu.org/PR16026
 143. http://gcc.gnu.org/PR15191
 144. http://gcc.gnu.org/PR15662
 145. http://gcc.gnu.org/PR15054
 146. http://gcc.gnu.org/PR15783
 147. http://gcc.gnu.org/PR15626
 148. http://gcc.gnu.org/PR14326
 149. http://gcc.gnu.org/PR14723
 150. http://gcc.gnu.org/PR15290
 151. http://gcc.gnu.org/PR15250
 152. http://gcc.gnu.org/PR15551
 153. http://gcc.gnu.org/PR8309
 154. http://gcc.gnu.org/PR13250
 155. http://gcc.gnu.org/PR13803
 156. http://gcc.gnu.org/PR14093
 157. http://gcc.gnu.org/PR14457
 158. http://gcc.gnu.org/PR14542
 159. http://gcc.gnu.org/PR15100
 160. http://gcc.gnu.org/PR15296
 161. http://gcc.gnu.org/PR15396
 162. http://gcc.gnu.org/PR15782
 163. http://gcc.gnu.org/PR11610
 164. http://gcc.gnu.org/PR15488
 165. http://gcc.gnu.org/PR15489
 166. http://gcc.gnu.org/PR13928
 167. http://gcc.gnu.org/PR14150
 168. http://gcc.gnu.org/PR14949
 169. http://gcc.gnu.org/PR15123
 170. http://gcc.gnu.org/PR16469
 171. http://gcc.gnu.org/PR16344
 172. http://gcc.gnu.org/PR16842
 173. http://gcc.gnu.org/PR12608
 174. http://gcc.gnu.org/PR14492
 175. http://gcc.gnu.org/PR15461
 176. http://gcc.gnu.org/PR15890
 177. http://gcc.gnu.org/PR16180
 178. http://gcc.gnu.org/PR16224
 179. http://gcc.gnu.org/PR16408
 180. http://gcc.gnu.org/PR16529
 181. http://gcc.gnu.org/PR16698
 182. http://gcc.gnu.org/PR16706
 183. http://gcc.gnu.org/PR16810
 184. http://gcc.gnu.org/PR16851
 185. http://gcc.gnu.org/PR16870
 186. http://gcc.gnu.org/PR16904
 187. http://gcc.gnu.org/PR16905
 188. http://gcc.gnu.org/PR16964
 189. http://gcc.gnu.org/PR17068
 190. http://gcc.gnu.org/PR16366
 191. http://gcc.gnu.org/PR15345
 192. http://gcc.gnu.org/PR16590
 193. http://gcc.gnu.org/PR16693
 194. http://gcc.gnu.org/PR17078
 195. http://gcc.gnu.org/PR13956
 196. http://gcc.gnu.org/PR16684
 197. http://gcc.gnu.org/PR12658
 198. http://gcc.gnu.org/PR13092
 199. http://gcc.gnu.org/PR15320
 200. http://gcc.gnu.org/PR16246
 201. http://gcc.gnu.org/PR16273
 202. http://gcc.gnu.org/PR16401
 203. http://gcc.gnu.org/PR16411
 204. http://gcc.gnu.org/PR16489
 205. http://gcc.gnu.org/PR16618
 206. http://gcc.gnu.org/PR16637
 207. http://gcc.gnu.org/PR16717
 208. http://gcc.gnu.org/PR16813
 209. http://gcc.gnu.org/PR16853
 210. http://gcc.gnu.org/PR16889
 211. http://gcc.gnu.org/PR16959
 212. http://gcc.gnu.org/PR7587
 213. http://gcc.gnu.org/PR16473
 214. http://gcc.gnu.org/PR16478
 215. http://gcc.gnu.org/PR10695
 216. http://gcc.gnu.org/PR16974
 217. http://gcc.gnu.org/PR16298
 218. http://gcc.gnu.org/PR17113
 219. http://gcc.gnu.org/PR14697
 220. http://gcc.gnu.org/PR15869
 221. http://gcc.gnu.org/PR16325
 222. http://gcc.gnu.org/PR16357
 223. http://gcc.gnu.org/PR16380
 224. http://gcc.gnu.org/PR16407
 225. http://gcc.gnu.org/PR16643
 226. http://gcc.gnu.org/PR15927
 227. http://gcc.gnu.org/PR15948
 228. http://gcc.gnu.org/PR17019
 229. http://gcc.gnu.org/PR16130
 230. http://gcc.gnu.org/PR16142
 231. http://gcc.gnu.org/PR16278
 232. http://gcc.gnu.org/PR16414
 233. http://gcc.gnu.org/PR16445
 234. http://gcc.gnu.org/PR16490
 235. http://gcc.gnu.org/PR16683
 236. http://gcc.gnu.org/PR16195
 237. http://gcc.gnu.org/PR16239
 238. http://gcc.gnu.org/PR16199
 239. http://gcc.gnu.org/PR16416
 240. http://gcc.gnu.org/PR16430
 241. http://gcc.gnu.org/PR16379
 242. http://gcc.gnu.org/PR17093
 243. http://gcc.gnu.org/PR17119
 244. http://gcc.gnu.org/PR15928
 245. http://gcc.gnu.org/PR16210
 246. http://gcc.gnu.org/PR15488
 247. http://gcc.gnu.org/PR16250
 248. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.3
 249. http://gcc.gnu.org/PR17369
 250. http://gcc.gnu.org/PR17850
 251. http://gcc.gnu.org/PR13948
 252. http://gcc.gnu.org/PR14492
 253. http://gcc.gnu.org/PR16301
 254. http://gcc.gnu.org/PR16566
 255. http://gcc.gnu.org/PR17023
 256. http://gcc.gnu.org/PR17027
 257. http://gcc.gnu.org/PR17524
 258. http://gcc.gnu.org/PR17826
 259. http://gcc.gnu.org/PR15526
 260. http://gcc.gnu.org/PR16999
 261. http://gcc.gnu.org/PR17503
 262. http://gcc.gnu.org/PR17581
 263. http://gcc.gnu.org/PR18129
 264. http://gcc.gnu.org/PR10975
 265. http://gcc.gnu.org/PR11722
 266. http://gcc.gnu.org/PR14534
 267. http://gcc.gnu.org/PR15172
 268. http://gcc.gnu.org/PR15786
 269. http://gcc.gnu.org/PR16162
 270. http://gcc.gnu.org/PR16612
 271. http://gcc.gnu.org/PR16715
 272. http://gcc.gnu.org/PR16848
 273. http://gcc.gnu.org/PR17132
 274. http://gcc.gnu.org/PR17259
 275. http://gcc.gnu.org/PR17327
 276. http://gcc.gnu.org/PR17393
 277. http://gcc.gnu.org/PR17501
 278. http://gcc.gnu.org/PR17537
 279. http://gcc.gnu.org/PR17585
 280. http://gcc.gnu.org/PR17821
 281. http://gcc.gnu.org/PR17829
 282. http://gcc.gnu.org/PR17851
 283. http://gcc.gnu.org/PR17976
 284. http://gcc.gnu.org/PR18020
 285. http://gcc.gnu.org/PR18093
 286. http://gcc.gnu.org/PR18140
 287. http://gcc.gnu.org/PR17541
 288. http://gcc.gnu.org/PR17853
 289. http://gcc.gnu.org/PR17245
 290. http://gcc.gnu.org/PR17167
 291. http://gcc.gnu.org/PR17277
 292. http://gcc.gnu.org/PR17505
 293. http://gcc.gnu.org/PR17684
 294. http://gcc.gnu.org/PR17384
 295. http://gcc.gnu.org/PR17770
 296. http://gcc.gnu.org/PR11476
 297. http://gcc.gnu.org/PR14064
 298. http://gcc.gnu.org/PR14678
 299. http://gcc.gnu.org/PR15583
 300. http://gcc.gnu.org/PR15790
 301. http://gcc.gnu.org/PR15886
 302. http://gcc.gnu.org/PR16884
 303. http://gcc.gnu.org/PR13841
 304. http://gcc.gnu.org/PR15860
 305. http://gcc.gnu.org/PR17465
 306. http://gcc.gnu.org/PR17469
 307. http://gcc.gnu.org/PR18138
 308. http://gcc.gnu.org/PR15498
 309. http://gcc.gnu.org/PR15747
 310. http://gcc.gnu.org/PR16406
 311. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.4
 312. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.5
 313. http://gcc.gnu.org/PR24688
 314. http://gcc.gnu.org/PR17188
 315. http://gcc.gnu.org/PR20187
 316. http://gcc.gnu.org/PR21873
 317. http://gcc.gnu.org/PR21899
 318. http://gcc.gnu.org/PR22061
 319. http://gcc.gnu.org/PR22208
 320. http://gcc.gnu.org/PR22458
 321. http://gcc.gnu.org/PR22589
 322. http://gcc.gnu.org/PR24101
 323. http://gcc.gnu.org/PR10611
 324. http://gcc.gnu.org/PR13377
 325. http://gcc.gnu.org/PR16002
 326. http://gcc.gnu.org/PR17413
 327. http://gcc.gnu.org/PR17609
 328. http://gcc.gnu.org/PR17618
 329. http://gcc.gnu.org/PR18124
 330. http://gcc.gnu.org/PR18155
 331. http://gcc.gnu.org/PR18177
 332. http://gcc.gnu.org/PR18368
 333. http://gcc.gnu.org/PR18378
 334. http://gcc.gnu.org/PR18466
 335. http://gcc.gnu.org/PR18512
 336. http://gcc.gnu.org/PR18545
 337. http://gcc.gnu.org/PR18738
 338. http://gcc.gnu.org/PR18803
 339. http://gcc.gnu.org/PR19004
 340. http://gcc.gnu.org/PR19208
 341. http://gcc.gnu.org/PR19253
 342. http://gcc.gnu.org/PR19608
 343. http://gcc.gnu.org/PR19884
 344. http://gcc.gnu.org/PR20153
 345. http://gcc.gnu.org/PR20563
 346. http://gcc.gnu.org/PR20789
 347. http://gcc.gnu.org/PR21336
 348. http://gcc.gnu.org/PR21768
 349. http://gcc.gnu.org/PR21853
 350. http://gcc.gnu.org/PR21903
 351. http://gcc.gnu.org/PR21983
 352. http://gcc.gnu.org/PR21987
 353. http://gcc.gnu.org/PR22153
 354. http://gcc.gnu.org/PR22172
 355. http://gcc.gnu.org/PR21286
 356. http://gcc.gnu.org/PR22233
 357. http://gcc.gnu.org/PR22508
 358. http://gcc.gnu.org/PR22545
 359. http://gcc.gnu.org/PR23528
 360. http://gcc.gnu.org/PR23550
 361. http://gcc.gnu.org/PR23586
 362. http://gcc.gnu.org/PR23624
 363. http://gcc.gnu.org/PR23639
 364. http://gcc.gnu.org/PR23797
 365. http://gcc.gnu.org/PR23965
 366. http://gcc.gnu.org/PR24052
 367. http://gcc.gnu.org/PR24580
 368. http://gcc.gnu.org/PR24267
 369. http://gcc.gnu.org/PR17810
 370. http://gcc.gnu.org/PR17860
 371. http://gcc/gnu.org/PR21709
 372. http://gcc.gnu.org/PR21964
 373. http://gcc.gnu.org/PR22167
 374. http://gcc.gnu.org/PR22619
 375. http://gcc.gnu.org/PR23241
 376. http://gcc.gnu.org/PR23478
 377. http://gcc.gnu.org/PR24470
 378. http://gcc.gnu.org/PR24950
 379. http://gcc.gnu.org/PR14400
 380. http://gcc.gnu.org/PR14940
 381. http://gcc.gnu.org/PR20239
 382. http://gcc.gnu.org/PR15220
 383. http://gcc.gnu.org/PR19275
 384. http://gcc.gnu.org/PR21888
 385. http://gcc.gnu.org/PR15342
 386. http://gcc.gnu.org/PR23985
 387. http://gcc.gnu.org/PR16719
 388. http://gcc.gnu.org/PR21723
 389. http://gcc.gnu.org/PR21841
 390. http://gcc.gnu.org/PR23644
 391. http://gcc.gnu.org/PR24718
 392. http://gcc.gnu.org/PR18421
 393. http://gcc.gnu.org/PR20621
 394. http://gcc.gnu.org/PR18583
 395. http://gcc.gnu.org/PR20191
 396. http://gcc.gnu.org/PR22083
 397. http://gcc.gnu.org/PR23070
 398. http://gcc.gnu.org/PR23404
 399. http://gcc.gnu.org/PR23539
 400. http://gcc.gnu.org/PR24102
 401. http://gcc.gnu.org/PR24465
 402. http://gcc.gnu.org/PR19933
 403. http://gcc.gnu.org/PR21889
 404. http://gcc.gnu.org/PR19300
 405. http://gcc.gnu.org/PR20301
 406. http://gcc.gnu.org/PR20673
 407. http://gcc.gnu.org/PR18582
 408. http://gcc.gnu.org/PR19340
 409. http://gcc.gnu.org/PR21716
 410. http://gcc.gnu.org/PR24315
 411. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.4.6
 412. http://gcc.gnu.org/onlinedocs/
 413. mailto:gcc-help@gcc.gnu.org
 414. mailto:gcc@gcc.gnu.org
 415. http://gcc.gnu.org/lists.html
 416. http://www.fsf.org/
 417. http://gcc.gnu.org/about.html
 418. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.3/index.html

                             GCC 3.3 Release Series

   May 03, 2005

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.3.6.

   This release is a bug-fix release, containing fixes for regressions in
   GCC 3.3.5 relative to previous releases of GCC.

   This release is the last of the series 3.3.x.

   The GCC 3.3 release series includes numerous [2]new features,
   improvements, bug fixes, and other changes, thanks to an [3]amazing
   group of volunteers.

Release History

   GCC 3.3.6
          May 3, 2005 ([4]changes)

   GCC 3.3.5
          September 30, 2004 ([5]changes)

   GCC 3.3.4
          May 31, 2004 ([6]changes)

   GCC 3.3.3
          February 14, 2004 ([7]changes)

   GCC 3.3.2
          October 16, 2003 ([8]changes)

   GCC 3.3.1
          August 8, 2003 ([9]changes)

   GCC 3.3
          May 14, 2003 ([10]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [11]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [12]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [13]GCC
   project web site or contact the [14]GCC development mailing list.

   To obtain GCC please use [15]our mirror sites, or our CVS server.


    For questions related to the use of GCC, please consult these web
    pages and the [16]GCC manuals. If that fails, the
    [17]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [18]gcc@gcc.gnu.org. All of [19]our lists have public
    archives.

   Copyright (C) [20]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [21]maintained by the GCC team. Last modified
   2012-11-02[22].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-3.3/changes.html
   3. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   4. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.6
   5. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.5
   6. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.4
   7. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.3
   8. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.2
   9. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.1
  10. http://gcc.gnu.org/gcc-3.3/changes.html
  11. http://gcc.gnu.org/gcc-3.3/buildstat.html
  12. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
  13. http://gcc.gnu.org/index.html
  14. mailto:gcc@gcc.gnu.org
  15. http://gcc.gnu.org/mirrors.html
  16. http://gcc.gnu.org/onlinedocs/
  17. mailto:gcc-help@gcc.gnu.org
  18. mailto:gcc@gcc.gnu.org
  19. http://gcc.gnu.org/lists.html
  20. http://www.fsf.org/
  21. http://gcc.gnu.org/about.html
  22. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.3/changes.html

                             GCC 3.3 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 3.3 release series is [1]GCC 3.3.6.

Caveats

     * The preprocessor no longer accepts multi-line string literals. They
       were deprecated in 3.0, 3.1, and 3.2.
     * The preprocessor no longer supports the -A- switch when appearing
       alone. -A- followed by an assertion is still supported.
     * Support for all the systems [2]obsoleted in GCC 3.1 has been
       removed from GCC 3.3. See below for a [3]list of systems which are
       obsoleted in this release.
     * Checking for null format arguments has been decoupled from the rest
       of the format checking mechanism. Programs which use the format
       attribute may regain this functionality by using the new [4]nonnull
       function attribute. Note that all functions for which GCC has a
       built-in format attribute, an appropriate built-in nonnull
       attribute is also applied.
     * The DWARF (version 1) debugging format has been deprecated and will
       be removed in a future version of GCC. Version 2 of the DWARF
       debugging format will continue to be supported for the foreseeable
       future.
     * The C and Objective-C compilers no longer accept the "Naming Types"
       extension (typedef foo = bar); it was already unavailable in C++.
       Code which uses it will need to be changed to use the "typeof"
       extension instead: typedef typeof(bar) foo. (We have removed this
       extension without a period of deprecation because it has caused the
       compiler to crash since version 3.0 and no one noticed until very
       recently. Thus we conclude it is not in widespread use.)
     * The -traditional C compiler option has been removed. It was
       deprecated in 3.1 and 3.2. (Traditional preprocessing remains
       available.) The <varargs.h> header, used for writing variadic
       functions in traditional C, still exists but will produce an error
       message if used.
     * GCC 3.3.1 automatically places zero-initialized variables in the
       .bss section on some operating systems. Versions of GNU Emacs up to
       (and including) 21.3 will not work correctly when using this
       optimization; you can use -fno-zero-initialized-in-bss to disable
       it.

General Optimizer Improvements

     * A new scheme for accurately describing processor pipelines, the
       [5]DFA scheduler, has been added.
     * Pavel Nejedly, Charles University Prague, has contributed new file
       format used by the edge coverage profiler (-fprofile-arcs).
       The new format is robust and diagnoses common mistakes where
       profiles from different versions (or compilations) of the program
       are combined resulting in nonsensical profiles and slow code to
       produced with profile feedback. Additionally this format allows
       extra data to be gathered. Currently, overall statistics are
       produced helping optimizers to identify hot spots of a program
       globally replacing the old intra-procedural scheme and resulting in
       better code. Note that the gcov tool from older GCC versions will
       not be able to parse the profiles generated by GCC 3.3 and vice
       versa.
     * Jan Hubicka, SuSE Labs, has contributed a new superblock formation
       pass enabled using -ftracer. This pass simplifies the control flow
       of functions allowing other optimizations to do better job.
       He also contributed the function reordering pass
       (-freorder-functions) to optimize function placement using profile
       feedback.

New Languages and Language specific improvements

  C/ObjC/C++

     * The preprocessor now accepts directives within macro arguments. It
       processes them just as if they had not been within macro arguments.
     * The separate ISO and traditional preprocessors have been completely
       removed. The front end handles either type of preprocessed output
       if necessary.
     * In C99 mode preprocessor arithmetic is done in the precision of the
       target's intmax_t, as required by that standard.
     * The preprocessor can now copy comments inside macros to the output
       file when the macro is expanded. This feature, enabled using the
       -CC option, is intended for use by applications which place
       metadata or directives inside comments, such as lint.
     * The method of constructing the list of directories to be searched
       for header files has been revised. If a directory named by a -I
       option is a standard system include directory, the option is
       ignored to ensure that the default search order for system
       directories and the special treatment of system header files are
       not defeated.
     * A few more [6]ISO C99 features now work correctly.
     * A new function attribute, nonnull, has been added which allows
       pointer arguments to functions to be specified as requiring a
       non-null value. The compiler currently uses this information to
       issue a warning when it detects a null value passed in such an
       argument slot.
     * A new type attribute, may_alias, has been added. Accesses to
       objects with types with this attribute are not subjected to
       type-based alias analysis, but are instead assumed to be able to
       alias any other type of objects, just like the char type.

  C++

     * Type based alias analysis has been implemented for C++ aggregate
       types.

  Objective-C

     * Generate an error if Objective-C objects are passed by value in
       function and method calls.
     * When -Wselector is used, check the whole list of selectors at the
       end of compilation, and emit a warning if a @selector() is not
       known.
     * Define __NEXT_RUNTIME__ when compiling for the NeXT runtime.
     * No longer need to include objc/objc-class.h to compile self calls
       in class methods (NeXT runtime only).
     * New -Wundeclared-selector option.
     * Removed selector bloating which was causing object files to be 10%
       bigger on average (GNU runtime only).
     * Using at run time @protocol() objects has been fixed in certain
       situations (GNU runtime only).
     * Type checking has been fixed and improved in many situations
       involving protocols.

  Java

     * The java.sql and javax.sql packages now implement the JDBC 3.0 (JDK
       1.4) API.
     * The JDK 1.4 assert facility has been implemented.
     * The bytecode interpreter is now direct threaded and thus faster.

  Fortran

     * Fortran improvements are listed in [7]the Fortran documentation.

  Ada

     * Ada tasking now works with glibc 2.3.x threading libraries.

New Targets and Target Specific Improvements

     * The following changes have been made to the HP-PA port:
          + The port now defaults to scheduling for the PA8000 series of
            processors.
          + Scheduling support for the PA7300 processor has been added.
          + The 32-bit port now supports weak symbols under HP-UX 11.
          + The handling of initializers and finalizers has been improved
            under HP-UX 11. The 64-bit port no longer uses collect2.
          + Dwarf2 EH support has been added to the 32-bit GNU/Linux port.
          + ABI fixes to correct the passing of small structures by value.
     * The SPARC, HP-PA, SH4, and x86/pentium ports have been converted to
       use the DFA processor pipeline description.
     * The following NetBSD configurations for the SuperH processor family
       have been added:
          + SH3, big-endian, sh-*-netbsdelf*
          + SH3, little-endian, shle-*-netbsdelf*
          + SH5, SHmedia, big-endian, 32-bit default, sh5-*-netbsd*
          + SH5, SHmedia, little-endian, 32-bit default, sh5le-*-netbsd*
          + SH5, SHmedia, big-endian, 64-bit default, sh64-*-netbsd*
          + SH5, SHmedia, little-endian, 64-bit default, sh64le-*-netbsd*
     * The following changes have been made to the IA-32/x86-64 port:
          + SSE2 and 3dNOW! intrinsics are now supported.
          + Support for thread local storage has been added to the IA-32
            and x86-64 ports.
          + The x86-64 port has been significantly improved.
     * The following changes have been made to the MIPS port:
          + All configurations now accept the -mabi switch. Note that you
            will need appropriate multilibs for this option to work
            properly.
          + ELF configurations will always pass an ABI flag to the
            assembler, except when the MIPS EABI is selected.
          + -mabi=64 no longer selects MIPS IV code.
          + The -mcpu option, which was deprecated in 3.1 and 3.2, has
            been removed from this release.
          + -march now changes the core ISA level. In previous releases,
            it would change the use of processor-specific extensions, but
            would leave the core ISA unchanged. For example, mips64-elf
            -march=r8000 will now generate MIPS IV code.
          + Under most configurations, -mipsN now acts as a synonym for
            -march.
          + There are some new preprocessor macros to describe the -march
            and -mtune settings. See the documentation of those options
            for details.
          + Support for the NEC VR-Series processors has been added. This
            includes the 54xx, 5500, and 41xx series.
          + Support for the Sandcraft sr71k processor has been added.
     * The following changes have been made to the S/390 port:
          + Support to build the Java runtime libraries has been added.
            Java is now enabled by default on s390-*-linux* and
            s390x-*-linux* targets.
          + Multilib support for the s390x-*-linux* target has been added;
            this allows to build 31-bit binaries using the -m31 option.
          + Support for thread local storage has been added.
          + Inline assembler code may now use the 'Q' constraint to
            specify memory operands without index register.
          + Various platform-specific performance improvements have been
            implemented; in particular, the compiler now uses the BRANCH
            ON COUNT family of instructions and makes more frequent use of
            the TEST UNDER MASK family of instructions.
     * The following changes have been made to the PowerPC port:
          + Support for IBM Power4 processor added.
          + Support for Motorola e500 SPE added.
          + Support for AIX 5.2 added.
          + Function and Data sections now supported on AIX.
          + Sibcall optimizations added.
     * The support for H8 Tiny is added to the H8/300 port with -mn.

Obsolete Systems

   Support for a number of older systems has been declared obsolete in GCC
   3.3. Unless there is activity to revive them, the next release of GCC
   will have their sources permanently removed.

   All configurations of the following processor architectures have been
   declared obsolete:
     * Matsushita MN10200, mn10200-*-*
     * Motorola 88000, m88k-*-*
     * IBM ROMP, romp-*-*

   Also, some individual systems have been obsoleted:
     * Alpha
          + Interix, alpha*-*-interix*
          + Linux libc1, alpha*-*-linux*libc1*
          + Linux ECOFF, alpha*-*-linux*ecoff*
     * ARM
          + Generic a.out, arm*-*-aout*
          + Conix, arm*-*-conix*
          + "Old ABI," arm*-*-oabi
          + StrongARM/COFF, strongarm-*-coff*
     * HPPA (PA-RISC)
          + Generic OSF, hppa1.0-*-osf*
          + Generic BSD, hppa1.0-*-bsd*
          + HP/UX versions 7, 8, and 9, hppa1.[01]-*-hpux[789]*
          + HiUX, hppa*-*-hiux*
          + Mach Lites, hppa*-*-lites*
     * Intel 386 family
          + Windows NT 3.x, i?86-*-win32
     * MC68000 family
          + HP systems, m68000-hp-bsd* and m68k-hp-bsd*
          + Sun systems, m68000-sun-sunos*, m68k-sun-sunos*, and
            m68k-sun-mach*
          + AT&T systems, m68000-att-sysv*
          + Atari systems, m68k-atari-sysv*
          + Motorola systems, m68k-motorola-sysv*
          + NCR systems, m68k-ncr-sysv*
          + Plexus systems, m68k-plexus-sysv*
          + Commodore systems, m68k-cbm-sysv*
          + Citicorp TTI, m68k-tti-*
          + Unos, m68k-crds-unos*
          + Concurrent RTU, m68k-ccur-rtu*
          + Linux a.out, m68k-*-linux*aout*
          + Linux libc1, m68k-*-linux*libc1*
          + pSOS, m68k-*-psos*
     * MIPS
          + Generic ECOFF, mips*-*-ecoff*
          + SINIX, mips-sni-sysv4
          + Orion RTEMS, mips64orion-*-rtems*
     * National Semiconductor 32000
          + OpenBSD, ns32k-*-openbsd*
     * POWER (aka RS/6000) and PowerPC
          + AIX versions 1, 2, and 3, rs6000-ibm-aix[123]*
          + Bull BOSX, rs6000-bull-bosx
          + Generic Mach, rs6000-*-mach*
          + Generic SysV, powerpc*-*-sysv*
          + Linux libc1, powerpc*-*-linux*libc1*
     * Sun SPARC
          + Generic a.out, sparc-*-aout*, sparclet-*-aout*,
            sparclite-*-aout*, and sparc86x-*-aout*
          + NetBSD a.out, sparc-*-netbsd*aout*
          + Generic BSD, sparc-*-bsd*
          + ChorusOS, sparc-*-chorusos*
          + Linux a.out, sparc-*-linux*aout*
          + Linux libc1, sparc-*-linux*libc1*
          + LynxOS, sparc-*-lynxos*
          + Solaris on HAL hardware, sparc-hal-solaris2*
          + SunOS versions 3 and 4, sparc-*-sunos[34]*
     * NEC V850
          + RTEMS, v850-*-rtems*
     * VAX
          + VMS, vax-*-vms*

Documentation improvements

Other significant improvements

     * Almost all front-end dependencies in the compiler have been
       separated out into a set of language hooks. This should make adding
       a new front end clearer and easier.
     * One effect of removing the separate preprocessor is a small
       increase in the robustness of the compiler in general, and the
       maintainability of target descriptions. Previously target-specific
       built-in macros and others, such as __FAST_MATH__, had to be
       handled with so-called specs that were hard to maintain. Often they
       would fail to behave properly when conflicting options were
       supplied on the command line, and define macros in the user's
       namespace even when strict ISO compliance was requested.
       Integrating the preprocessor has cleanly solved these issues.
     * The Makefile suite now supports redirection of make install by
       means of the variable DESTDIR.
     __________________________________________________________________

GCC 3.3

   Detailed release notes for the GCC 3.3 release follow.

  Bug Fixes

    bootstrap failures

     * [8]10140 cross compiler build failures: missing __mempcpy (DUP:
       [9]10198,[10]10338)

    Internal compiler errors (multi-platform)

     * [11]3581 large string causes segmentation fault in cc1
     * [12]4382 __builtin_{set,long}jmp with -O3 can crash the compiler
     * [13]5533 (c++) ICE when processing std::accumulate(begin, end,
       init, invalid_op)
     * [14]6387 -fpic -gdwarf-2 -g1 combination gives ICE in dwarf2out
     * [15]6412 (c++) ICE in retrieve_specialization
     * [16]6620 (c++) partial template specialization causes an ICE
       (segmentation fault)
     * [17]6663 (c++) ICE with attribute aligned
     * [18]7068 ICE with incomplete types
     * [19]7083 (c++) ICE using -gstabs with dodgy class derivation
     * [20]7647 (c++) ICE when data member has the name of the enclosing
       class
     * [21]7675 ICE in fixup_var_refs_1
     * [22]7718 'complex' template instantiation causes ICE
     * [23]8116 (c++) ICE in member template function
     * [24]8358 (ada) Ada compiler accesses freed memory, crashes
     * [25]8511 (c++) ICE: (hopefully) reproducible cc1plus segmentation
       fault
     * [26]8564 (c++) ICE in find_function_data, in function.c
     * [27]8660 (c++) template overloading ICE in tsubst_expr, in cp/pt.c
     * [28]8766 (c++) ICE after failed initialization of static template
       variable
     * [29]8803 ICE in instantiate_virtual_regs_1, in function.c
     * [30]8846 (c++) ICE after diagnostic if fr_FR@euro locale is set
     * [31]8906 (c++) ICE (Segmentation fault) when parsing nested-class
       definition
     * [32]9216 (c++) ICE on missing template parameter
     * [33]9261 (c++) ICE in arg_assoc, in cp/decl2.c
     * [34]9263 (fortran) ICE caused by invalid PARAMETER in implied DO
       loop
     * [35]9429 (c++) ICE in template instantiation with a pointered new
       operator
     * [36]9516 Internal error when using a big array
     * [37]9600 (c++) ICE with typedefs in template class
     * [38]9629 (c++) virtual inheritance segfault
     * [39]9672 (c++) ICE: Error reporting routines re-entered
     * [40]9749 (c++) ICE in write_expression on invalid function
       prototype
     * [41]9794 (fortran) ICE: floating point exception during constant
       folding
     * [42]9829 (c++) Missing colon in nested namespace usage causes ICE
     * [43]9916 (c++) ICE with noreturn function in ?: statement
     * [44]9936 ICE with local function and variable-length 2d array
     * [45]10262 (c++) cc1plus crashes with large generated code
     * [46]10278 (c++) ICE in parser for invalid code
     * [47]10446 (c++) ICE on definition of nonexistent member function of
       nested class in a class template
     * [48]10451 (c++) ICE in grokdeclarator on spurious mutable
       declaration
     * [49]10506 (c++) ICE in build_new at cp/init.c with
       -fkeep-inline-functions and multiple inheritance
     * [50]10549 (c++) ICE in store_bit_field on bitfields that exceed the
       precision of the declared type

    Optimization bugs

     * [51]2001 Inordinately long compile times in reload CSE regs
     * [52]2391 Exponential compilation time explosion in combine
     * [53]2960 Duplicate loop conditions even with -Os
     * [54]4046 redundant conditional branch
     * [55]6405 Loop-unrolling related performance regressions
     * [56]6798 very long compile time with large case-statement
     * [57]6871 const objects shouldn't be moved to .bss
     * [58]6909 problem w/ -Os on modified loop-2c.c test case
     * [59]7189 gcc -O2 -Wall does not print ``control reaches end of
       non-void function'' warning
     * [60]7642 optimization problem with signbit()
     * [61]8634 incorrect code for inlining of memcpy under -O2
     * [62]8750 Cygwin prolog generation erroneously emitting __alloca as
       regular function call

    C front end

     * [63]2161 long if-else cascade overflows parser stack
     * [64]4319 short accepted on typedef'd char
     * [65]8602 incorrect line numbers in warning messages when using
       inline functions
     * [66]9177 -fdump-translation-unit: C front end deletes function_decl
       AST nodes and breaks debugging dumps
     * [67]9853 miscompilation of non-constant structure initializer

    c++ compiler and library

     * [68]45 legal template specialization code is rejected (DUP:
       [69]3784)
     * [70]764 lookup failure: friend operator and dereferencing a pointer
       and templates (DUP: [71]5116)
     * [72]2862 gcc accepts invalid explicit instantiation syntax (DUP:
       2863)
     * [73]3663 G++ doesn't check access control during template
       instantiation
     * [74]3797 gcc fails to emit explicit specialization of a template
       member
     * [75]3948 Two destructors are called when no copy destructor is
       defined (ABI change)
     * [76]4137 Conversion operator within template is not accepted
     * [77]4361 bogus ambiguity taking the address of a member template
     * [78]4802 g++ accepts illegal template code (access to private
       member; DUP: [79]5837)
     * [80]4803 inline function is used but never defined, and g++ does
       not object
     * [81]5094 Partial specialization cannot be friend?
     * [82]5730 complex<double>::norm() -- huge slowdown from egcs-2.91.66
     * [83]6713 Regression wrt 3.0.4: g++ -O2 leads to seg fault at run
       time
     * [84]7015 certain __asm__ constructs rejected
     * [85]7086 compile time regression (quadratic behavior in
       fixup_var_refs)
     * [86]7099 G++ doesn't set the noreturn attribute on std::exit and
       std::abort
     * [87]7247 copy constructor missing when inlining enabled (invalid
       optimization?)
     * [88]7441 string array initialization compilation time regression
       from seconds to minutes
     * [89]7768 __PRETTY_FUNCTION__ for template destructor is wrong
     * [90]7804 bad printing of floating point constant in warning message
     * [91]8099 Friend classes and template specializations
     * [92]8117 member function pointers and multiple inheritance
     * [93]8205 using declaration and multiple inheritance
     * [94]8645 unnecessary non-zero checks in stl_tree.h
     * [95]8724 explicit destructor call for incomplete class allowed
     * [96]8805 compile time regression with many member variables
     * [97]8691 -O3 and -fno-implicit-templates are incompatible
     * [98]8700 unhelpful error message for binding temp to reference
     * [99]8724 explicit destructor call for incomplete class allowed
     * [100]8949 numeric_limits<>::denorm_min() and is_iec559 problems
     * [101]9016 Failure to consistently constant fold "constant" C++
       objects
     * [102]9053 g++ confused about ambiguity of overloaded function
       templates
     * [103]9152 undefined virtual thunks
     * [104]9182 basic_filebuf<> does not report errors in codecvt<>::out
     * [105]9297 data corruption due to codegen bug (when copying.)
     * [106]9318 i/ostream::operator>>/<<(streambuf*) broken
     * [107]9320 Incorrect usage of traits_type::int_type in stdio_filebuf
     * [108]9400 bogus -Wshadow warning: shadowed declaration of this in
       local classes
     * [109]9424 i/ostream::operator>>/<<(streambuf*) drops characters
     * [110]9425 filebuf::pbackfail broken (DUP: [111]9439)
     * [112]9474 GCC freezes in compiling a weird code mixing <iostream>
       and <iostream.h>
     * [113]9548 Incorrect results from setf(ios::fixed) and precision(-1)
       [114][DR 231]
     * [115]9555 ostream inserters fail to set badbit on exception
     * [116]9561 ostream inserters rethrow exception of wrong type
     * [117]9563 ostream::sentry returns true after a failed preparation
     * [118]9582 one-definition rule violation in std::allocator
     * [119]9622 __PRETTY_FUNCTION__ incorrect in template destructors
     * [120]9683 bug in initialization chains for static const variables
       from template classes
     * [121]9791 -Woverloaded-virtual reports hiding of destructor
     * [122]9817 collate::compare doesn't handle nul characters
     * [123]9825 filebuf::sputbackc breaks sbumpc
     * [124]9826 operator>>(basic_istream, basic_string) fails to compile
       with custom traits
     * [125]9924 Multiple using statements for builtin functions not
       allowed
     * [126]9946 destructor is not called for temporary object
     * [127]9964 filebuf::close() sometimes fails to close file
     * [128]9988 filebuf::overflow writes EOF to file
     * [129]10033 optimization breaks polymorphic references w/ typeid
       operator
     * [130]10097 filebuf::underflow drops characters
     * [131]10132 filebuf destructor can throw exceptions
     * [132]10180 gcc fails to warn about non-inlined function
     * [133]10199 method parametrized by template does not work everywhere
     * [134]10300 use of array-new (nothrow) in segfaults on NULL return
     * [135]10427 Stack corruption with variable-length automatic arrays
       and virtual destructors
     * [136]10503 Compilation never stops in fixed_type_or_null

    Objective-C

     * [137]5956 selectors aren't matched properly when added to the
       selector table

    Fortran compiler and library

     * [138]1832 list directed i/o overflow hangs, -fbounds-check doesn't
       detect
     * [139]3924 g77 generates code that is rejected by GAS if COFF debug
       info requested
     * [140]5634 doc: explain that configure --prefix=~/... does not work
     * [141]6367 multiple repeat counts confuse namelist read into array
     * [142]6491 Logical operations error on logicals when using
       -fugly-logint
     * [143]6742 Generation of C++ Prototype for FORTRAN and extern "C"
     * [144]7113 Failure of g77.f-torture/execute/f90-intrinsic-bit.f -Os
       on irix6.5
     * [145]7236 OPEN(...,RECL=nnn,...) without ACCESS='DIRECT' should
       assume a direct access file
     * [146]7278 g77 "bug"; the executable misbehaves (with -O2
       -fno-automatic)
     * [147]7384 DATE_AND_TIME milliseconds field inactive on Windows
     * [148]7388 Incorrect output with 0-based array of characters
     * [149]8587 Double complex zero ** double precision number -> NaN
       instead of zero
     * [150]9038 -ffixed-line-length-none -x f77-cpp-input gives: Warning:
       unknown register name line-length-none
     * [151]10197 Direct access files not unformatted by default

    Java compiler and library

     * [152]6005 gcj fails to build rhug on alpha
     * [153]6389 System.getProperty("") should always throw an
       IllegalArgumentException
     * [154]6576 java.util.ResourceBundle.getResource ignores locale
     * [155]6652 new java.io.File("").getCanonicalFile() throws exception
     * [156]7060 getMethod() doesn't search super interface
     * [157]7073 bytecode interpreter gives wrong answer for interface
       getSuperclass()
     * [158]7180 possible bug in
       javax.naming.spi.NamingManager.getPlusPath()
     * [159]7416 java.security startup refs "GNU libgcj.security"
     * [160]7570 Runtime.exec with null envp: child doesn't inherit parent
       env (DUP: [161]7578)
     * [162]7611 Internal error while compiling libjava with -O
     * [163]7709 NullPointerException in _Jv_ResolvePoolEntry
     * [164]7766 ZipInputStream.available returns 0 immediately after
       construction
     * [165]7785 Calendar.getTimeInMillis/setTimeInMillis should be public
     * [166]7786 TimeZone.getDSTSavings() from JDK1.4 not implemented
     * [167]8142 '$' in class names vs. dlopen 'dynamic string tokens'
     * [168]8234 ZipInputStream chokes when InputStream.read() returns
       small chunks
     * [169]8415 reflection bug: exception info for Method
     * [170]8481 java.Random.nextInt(int) may return negative
     * [171]8593 Error reading GZIPped files with BufferedReader
     * [172]8759 java.beans.Introspector has no flushCaches() or
       flushFromCaches() methods
     * [173]8997 spin() calls Thread.sleep
     * [174]9253 on win32, java.io.File.listFiles("C:\\") returns pwd
       instead of the root content of C:
     * [175]9254 java::lang::Object::wait(), threads-win32.cc returns
       wrong return codes
     * [176]9271 Severe bias in java.security.SecureRandom

    Ada compiler and library

     * [177]6767 make gnatlib-shared fails on -laddr2line
     * [178]9911 gnatmake fails to link when GCC configured with
       --with-sjlj-exceptions=yes
     * [179]10020 Can't bootstrap gcc on AIX with Ada enabled
     * [180]10546 Ada tasking not working on Red Hat 9

    preprocessor

     * [181]7029 preprocessor should ignore #warning with -M

    ARM-specific

     * [182]2903 [arm] Optimization bug with long long arithmetic
     * [183]7873 arm-linux-gcc fails when assigning address to a bit field

    FreeBSD-specific

     * [184]7680 float functions undefined in math.h/cmath with #define
       _XOPEN_SOURCE

    HP-UX or HP-PA-specific

     * [185]8705 [HP-PA] ICE in emit_move_insn_1, in expr.c
     * [186]9986 [HP-UX] Incorrect transformation of fputs_unlocked to
       fputc_unlocked
     * [187]10056 [HP-PA] ICE at -O2 when building c++ code from doxygen

    m68hc11-specific

     * [188]6744 Bad assembler code generated: reference to pseudo
       register z
     * [189]7361 Internal compiler error in reload_cse_simplify_operands,
       in reload1.c

    MIPS-specific

     * [190]9496 [mips-linux] bug in optimizer?

    PowerPC-specific

     * [191]7067 -Os with -mcpu=powerpc optimizes for speed (?) instead of
       space
     * [192]8480 reload ICEs for LAPACK code on powerpc64-linux
     * [193]8784 [AIX] Internal compiler error in simplify_gen_subreg
     * [194]10315 [powerpc] ICE: in extract_insn, in recog.c

    SPARC-specific

     * [195]10267 (documentation) Wrong build instructions for
       *-*-solaris2*

    x86-specific (Intel/AMD)

     * [196]7916 ICE in instantiate_virtual_register_1
     * [197]7926 (c++) i486 instructions in header files make c++ programs
       crash on i386
     * [198]8555 ICE in gen_split_1231
     * [199]8994 ICE with -O -march=pentium4
     * [200]9426 ICE with -fssa -funroll-loops -fprofile-arcs
     * [201]9806 ICE in inline assembly with -fPIC flag
     * [202]10077 gcc -msse2 generates movd to move dwords between xmm
       regs
     * [203]10233 64-bit comparison only comparing bottom 32-bits
     * [204]10286 type-punning doesn't work with __m64 and -O
     * [205]10308 [x86] ICE with -O -fgcse or -O2
     __________________________________________________________________

GCC 3.3.1

  Bug Fixes

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.3.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).

    Bootstrap failures

     * [206]11272 [Solaris] make bootstrap fails while building libstdc++

    Internal compiler errors (multi-platform)

     * [207]5754 ICE on invalid nested template class
     * [208]6597 ICE in set_mem_alias_set compiling Qt with -O2 on ia64
       and --enable-checking
     * [209]6949 (c++) ICE in tsubst_decl, in cp/pt.c
     * [210]7053 (c++) ICE when declaring a function already defined as a
       friend method of a template class
     * [211]8164 (c++) ICE when using different const expressions as
       template parameter
     * [212]8384 (c++) ICE in is_base_type, in dwarf2out.c
     * [213]9559 (c++) ICE with invalid initialization of a static const
     * [214]9649 (c++) ICE in finish_member_declaration, in cp/semantics.c
       when redeclaring a static member variable
     * [215]9864 (fortran) ICE in add_abstract_origin_attribute, in
       dwarfout.c with -g -O -finline-functions
     * [216]10432 (c++) ICE in poplevel, in cp/decl.c
     * [217]10475 ICE in subreg_highpart_offset for code with long long
     * [218]10635 (c++) ICE when dereferencing an incomplete type casted
       from a void pointer
     * [219]10661 (c++) ICE in instantiate_decl, in cp/pt.c while
       instantiating static member variables
     * [220]10700 ICE in copy_to_mode_reg on 64-bit targets
     * [221]10712 (c++) ICE in constructor_name_full, in cp/decl2.c
     * [222]10796 (c++) ICE when defining an enum with two values: -1 and
       MAX_INT_64BIT
     * [223]10890 ICE in merge_assigned_reloads building Linux 2.4.2x
       sched.c
     * [224]10939 (c++) ICE with template code
     * [225]10956 (c++) ICE when specializing a template member function
       of a template class, in tsubst, in cp/pt.c
     * [226]11041 (c++) ICE: const myclass &x = *x; (when operator*()
       defined)
     * [227]11059 (c++) ICE with empty union
     * [228]11083 (c++) ICE in commit_one_edge_insertion, in cfgrtl.c with
       -O2 -fnon-call-exceptions
     * [229]11105 (c++) ICE in mangle_conv_op_name_for_type
     * [230]11149 (c++) ICE on error when instantiation with call function
       of a base type
     * [231]11228 (c++) ICE on new-expression using array operator new and
       default-initialization
     * [232]11282 (c++) Infinite memory usage after syntax error
     * [233]11301 (fortran) ICE with -fno-globals
     * [234]11308 (c++) ICE when using an enum type name as if it were a
       class or namespace
     * [235]11473 (c++) ICE with -gstabs when empty struct inherits from
       an empty struct
     * [236]11503 (c++) ICE when instantiating template with ADDR_EXPR
     * [237]11513 (c++) ICE in push_template_decl_real, in cp/pt.c:
       template member functions

    Optimization bugs

     * [238]11198 -O2 -frename-registers generates wrong code (aliasing
       problem)
     * [239]11304 Wrong code production with -fomit-frame-pointer
     * [240]11381 volatile memory access optimized away
     * [241]11536 [strength-reduce] -O2 optimization produces wrong code
     * [242]11557 constant folding bug generates wrong code

    C front end

     * [243]5897 No warning for statement after return
     * [244]11279 DWARF-2 output mishandles large enums

    Preprocessor bugs

     * [245]11022 no warning for non-compatible macro redefinition

    C++ compiler and library

     * [246]2330 static_cast<>() to a private base is allowed
     * [247]5388 Incorrect message "operands to ?: have different types"
     * [248]5390 Libiberty fails to demangle multi-digit template
       parameters
     * [249]7877 Incorrect parameter passing to specializations of member
       function templates
     * [250]9393 Anonymous namespaces and compiling the same file twice
     * [251]10032 -pedantic converts some errors to warnings
     * [252]10468 const typeof(x) is non-const, but only in templates
     * [253]10527 confused error message with "new int()" parameter
       initializer
     * [254]10679 parameter MIN_INLINE_INSNS is not honored
     * [255]10682 gcc chokes on a typedef for an enum inside a class
       template
     * [256]10689 pow(std::complex(0),1/3) returns (nan, nan) instead of
       0.
     * [257]10845 template member function (with nested template as
       parameter) cannot be called anymore if another unrelated template
       member function is defined
     * [258]10849 Cannot define an out-of-class specialization of a
       private nested template class
     * [259]10888 Suppress -Winline warnings for system headers
     * [260]10929 -Winline warns about functions for which no definition
       is visible
     * [261]10931 valid conversion static_cast<const unsigned
       int&>(lvalue-of-type-int) is rejected
     * [262]10940 Bad code with explicit specialization
     * [263]10968 If member function implicitly instantiated, explicit
       instantiation of class fails to instantiate it
     * [264]10990 Cannot convert with dynamic_cast<> to a private base
       class from within a member function
     * [265]11039 Bad interaction between implicit typename deprecation
       and friendship
     * [266]11062 (libstdc++) avoid __attribute__ ((unused)); say
       "__unused__" instead
     * [267]11095 C++ iostream manipulator causes segfault when called
       with negative argument
     * [268]11098 g++ doesn't emit complete debugging information for
       local variables in destructors
     * [269]11137 GNU/Linux shared library constructors not called unless
       there's one global object
     * [270]11154 spurious ambiguity report for template class
       specialization
     * [271]11329 Compiler cannot find user defined implicit typecast
     * [272]11332 Spurious error with casts in ?: expression
     * [273]11431 static_cast behavior with subclasses when default
       constructor available
     * [274]11528 money_get facet does not accept "$.00" as valid
     * [275]11546 Type lookup problems in out-of-line definition of a
       class doubly nested from a template class
     * [276]11567 C++ code containing templated member function with same
       name as pure virtual member function results in linking failure
     * [277]11645 Failure to deal with using and private inheritance

    Java compiler and library

     * [278]5179 Qualified static field access doesn't initialize its
       class
     * [279]8204 gcj -O2 to native reorders certain instructions
       improperly
     * [280]10838 java.io.ObjectInputStream syntax error
     * [281]10886 The RMI registry that comes with GCJ does not work
       correctly
     * [282]11349 JNDI URL context factories not located correctly

    x86-specific (Intel/AMD)

     * [283]4823 ICE on inline assembly code
     * [284]8878 miscompilation with -O and SSE
     * [285]9815 (c++ library) atomicity.h - fails to compile with -O3
       -masm=intel
     * [286]10402 (inline assembly) [x86] ICE in merge_assigned_reloads,
       in reload1.c
     * [287]10504 ICE with SSE2 code and -O3 -mcpu=pentium4 -msse2
     * [288]10673 ICE for x86-64 on freebsd libc vfprintf.c source
     * [289]11044 [x86] out of range loop instructions for FP code on K6
     * [290]11089 ICE: instantiate_virtual_regs_lossage while using SSE
       built-ins
     * [291]11420 [x86_64] gcc generates invalid asm code when "-O -fPIC"
       is used

    SPARC- or Solaris- specific

     * [292]9362 solaris 'as' dies when fed .s and "-gstabs"
     * [293]10142 [SPARC64] gcc produces wrong code when passing
       structures by value
     * [294]10663 New configure check aborts with Sun tools.
     * [295]10835 combinatorial explosion in scheduler on HyperSPARC
     * [296]10876 ICE in calculate_giv_inc when building KDE
     * [297]10955 wrong code at -O3 for structure argument in context of
       structure return
     * [298]11018 -mcpu=ultrasparc busts tar-1.13.25
     * [299]11556 [sparc64] ICE in gen_reg_rtx() while compiling 2.6.x
       Linux kernel

    ia64 specific

     * [300]10907 gcc violates the ia64 ABI (GP must be preserved)
     * [301]11320 scheduler bug (in machine depended reorganization pass)
     * [302]11599 bug with conditional and __builtin_prefetch

    PowerPC specific

     * [303]9745 [powerpc] gcc mis-compiles libmcrypt (alias problem
       during loop)
     * [304]10871 error in rs6000_stack_info save_size computation
     * [305]11440 gcc mis-compiles c++ code (libkhtml) with -O2, -fno-gcse
       cures it

    m68k-specific

     * [306]7594 [m68k] ICE on legal code associated with simplify-rtx
     * [307]10557 [m68k] ICE in subreg_offset_representable_p
     * [308]11054 [m68k] ICE in reg_overlap_mentioned_p

    ARM-specific

     * [309]10834 [arm] GCC 3.3 still generates incorrect instructions for
       functions with __attribute__ ((interrupt ("IRQ")))
     * [310]10842 [arm] Clobbered link register is copied to pc under
       certain circumstances
     * [311]11052 [arm] noce_process_if_block() can lose REG_INC notes
     * [312]11183 [arm] ICE in change_address_1 (3.3) / subreg_hard_regno
       (3.4)

    MIPS-specific

     * [313]11084 ICE in propagate_one_insn, in flow.c

    SH-specific

     * [314]10331 can't compile c++ part of gcc cross compiler for sh-elf
     * [315]10413 [SH] ICE in reload_cse_simplify_operands, in reload1.c
     * [316]11096 i686-linux to sh-linux cross compiler fails to compile
       C++ files

    GNU/Linux (or Hurd?) specific

     * [317]2873 Bogus fixinclude of stdio.h from glibc 2.2.3

    UnixWare specific

     * [318]3163 configure bug: gcc/aclocal.m4 mmap test fails on UnixWare
       7.1.1

    Cygwin (or mingw) specific

     * [319]5287 ICE with dllimport attribute
     * [320]10148 [MingW/CygWin] Compiler dumps core

    DJGPP specific

     * [321]8787 GCC fails to emit .intel_syntax when invoked with
       -masm=intel on DJGPP

    Darwin (and MacOS X) specific

     * [322]10900 trampolines crash

    Documentation

     * [323]1607 (c++) Format attributes on methods undocumented
     * [324]4252 Invalid option `-fdump-translation-unit'
     * [325]4490 Clarify restrictions on -m96bit-long-double,
       -m128bit-long-double
     * [326]10355 document an issue with regparm attribute on some systems
       (e.g. Solaris)
     * [327]10726 (fortran) Documentation for function "IDate Intrinsic
       (Unix)" is wrong
     * [328]10805 document bug in old version of Sun assembler
     * [329]10815 warn against GNU binutils on AIX
     * [330]10877 document need for newer binutils on i?86-*-linux-gnu
     * [331]11280 Manual incorrect with respect to -freorder-blocks
     * [332]11466 Document -mlittle-endian and its restrictions for the
       sparc64 port

    Testsuite bugs (compiler itself is not affected)

     * [333]10737 newer bison causes g++.dg/parse/crash2.C to incorrectly
       report failure
     * [334]10810 gcc-3.3 fails make check: buffer overrun in
       test_demangle.c
     __________________________________________________________________

GCC 3.3.2

  Bug Fixes

   This section lists the problem reports (PRs) from [335]GCC's bug
   tracking system that are known to be fixed in the 3.3.2 release. This
   list might not be complete (that is, it is possible that some PRs that
   have been fixed are not listed here).

    Bootstrap failures and problems

     * [336]8336 [SCO5] bootstrap config still tries to use COFF options
     * [337]9330 [alpha-osf] Bootstrap failure on Compaq Tru64 with
       --enable-threads=posix
     * [338]9631 [hppa64-linux] gcc-3.3 fails to bootstrap
     * [339]9877 fixincludes makes a bad sys/byteorder.h on svr5 (UnixWare
       7.1.1)
     * [340]11687 xstormy16-elf build fails in libf2c
     * [341]12263 [SGI IRIX] bootstrap fails during compile of
       libf2c/libI77/backspace.c
     * [342]12490 buffer overflow in scan-decls.c (during Solaris 9
       fix-header processing)

    Internal compiler errors (multi-platform)

     * [343]7277 Casting integers to vector types causes ICE
     * [344]7939 (c++) ICE on invalid function template specialization
     * [345]11063 (c++) ICE on parsing initialization list of const array
       member
     * [346]11207 ICE with negative index in array element designator
     * [347]11522 (fortran) g77 dwarf-2 ICE in
       add_abstract_origin_attribute
     * [348]11595 (c++) ICE on duplicate label definition
     * [349]11646 (c++) ICE in commit_one_edge_insertion with
       -fnon-call-exceptions -fgcse -O
     * [350]11665 ICE in struct initializer when taking address
     * [351]11852 (c++) ICE with bad struct initializer.
     * [352]11878 (c++) ICE in cp_expr_size
     * [353]11883 ICE with any -O on mercury-generated C code
     * [354]11991 (c++) ICE in cxx_incomplete_type_diagnostic, in
       cp/typeck2.c when applying typeid operator to template template
       parameter
     * [355]12146 ICE in lookup_template_function, in cp/pt.c
     * [356]12215 ICE in make_label_edge with -fnon-call-exceptions
       -fno-gcse -O2
     * [357]12369 (c++) ICE with templates and friends
     * [358]12446 ICE in emit_move_insn on complicated array reference
     * [359]12510 ICE in final_scan_insn
     * [360]12544 ICE with large parameters used in nested functions

    C and optimization bugs

     * [361]9862 spurious warnings with -W -finline-functions
     * [362]10962 lookup_field is a linear search on a linked list (can be
       slow if large struct)
     * [363]11370 -Wunreachable-code gives false complaints
     * [364]11637 invalid assembly with -fnon-call-exceptions
     * [365]11885 Problem with bitfields in packed structs
     * [366]12082 Inappropriate unreachable code warnings
     * [367]12180 Inline optimization fails for variadic function
     * [368]12340 loop unroller + gcse produces wrong code

    C++ compiler and library

     * [369]3907 nested template parameter collides with member name
     * [370]5293 confusing message when binding a temporary to a reference
     * [371]5296 [DR115] Pointers to functions and to template functions
       behave differently in deduction
     * [372]7939 ICE on function template specialization
     * [373]8656 Unable to assign function with __attribute__ and pointer
       return type to an appropriate variable
     * [374]10147 Confusing error message for invalid template function
       argument
     * [375]11400 std::search_n() makes assumptions about Size parameter
     * [376]11409 issues with using declarations, overloading, and
       built-in functions
     * [377]11740 ctype<wchar_t>::do_is(mask, wchar_t) doesn't handle
       multiple bits in mask
     * [378]11786 operator() call on variable in other namespace not
       recognized
     * [379]11867 static_cast ignores ambiguity
     * [380]11928 bug with conversion operators that are typedefs
     * [381]12114 Uninitialized memory accessed in dtor
     * [382]12163 static_cast + explicit constructor regression
     * [383]12181 Wrong code with comma operator and c++
     * [384]12236 regparm and fastcall messes up parameters
     * [385]12266 incorrect instantiation of unneeded template during
       overload resolution
     * [386]12296 istream::peek() doesn't set eofbit
     * [387]12298 [sjlj exceptions] Stack unwind destroys
       not-yet-constructed object
     * [388]12369 ICE with templates and friends
     * [389]12337 apparently infinite loop in g++
     * [390]12344 stdcall attribute ignored if function returns a pointer
     * [391]12451 missing(late) class forward declaration in cxxabi.h
     * [392]12486 g++ accepts invalid use of a qualified name

    x86 specific (Intel/AMD)

     * [393]8869 [x86 MMX] ICE with const variable optimization and MMX
       builtins
     * [394]9786 ICE in fixup_abnormal_edges with -fnon-call-exceptions
       -O2
     * [395]11689 g++3.3 emits un-assembleable code for k6 architecture
     * [396]12116 [k6] Invalid assembly output values with X-MAME code
     * [397]12070 ICE converting between double and long double with
       -msoft-float

    ia64-specific

     * [398]11184 [ia64 hpux] ICE on __builtin_apply building libobjc
     * [399]11535 __builtin_return_address may not work on ia64
     * [400]11693 [ia64] ICE in gen_nop_type
     * [401]12224 [ia64] Thread-local storage doesn't work

    PowerPC-specific

     * [402]11087 [powerpc64-linux] GCC miscompiles raid1.c from linux
       kernel
     * [403]11319 loop miscompiled on ppc32
     * [404]11949 ICE Compiler segfault with ffmpeg -maltivec code

    SPARC-specific

     * [405]11662 wrong code for expr. with cast to long long and
       exclusive or
     * [406]11965 invalid assembler code for a shift < 32 operation
     * [407]12301 (c++) stack corruption when a returned expression throws
       an exception

    Alpha-specific

     * [408]11717 [alpha-linux] unrecognizable insn compiling for.c of
       kernel 2.4.22-pre8

    HPUX-specific

     * [409]11313 problem with #pragma weak and static inline functions
     * [410]11712 __STDC_EXT__ not defined for C++ by default anymore?

    Solaris specific

     * [411]12166 Profiled programs crash if PROFDIR is set

    Solaris-x86 specific

     * [412]12101 i386 Solaris no longer works with GNU as?

    Miscellaneous embedded target-specific bugs

     * [413]10988 [m32r-elf] wrong blockmove code with -O3
     * [414]11805 [h8300-unknown-coff] [H8300] ICE for simple code with
       -O2
     * [415]11902 [sh4] spec file improperly inserts rpath even when none
       needed
     * [416]11903 [sh4] -pthread fails to link due to error in spec file
       on sh4
     __________________________________________________________________

GCC 3.3.3

  Minor features

   In addition to the bug fixes documented below, this release contains
   few minor features such as:
     * Support for --with-sysroot
     * Support for automatic detection of executable stacks
     * Support for SSE3 instructions
     * Support for thread local storage debugging under GDB on S390

  Bug Fixes

   This section lists the problem reports (PRs) from [417]GCC's bug
   tracking system that are known to be fixed in the 3.3.3 release. This
   list might not be complete (that is, it is possible that some PRs that
   have been fixed are not listed here).

    Bootstrap failures and issues

     * [418]11890 Building cross gcc-3.3.1 for sparc-sun-solaris2.6 fails
     * [419]12399 boehm-gc fails (when building a cross compiler): libtool
       unable to infer tagged configuration
     * [420]13068 mklibgcc.in doesn't handle multi-level multilib
       subdirectories properly

    Internal compiler errors (multi-platform)

     * [421]10060 ICE (stack overflow) on huge file (300k lines) due to
       recursive behaviour of copy_rtx_if_shared, in emit_rtl.c
     * [422]10555 (c++) ICE on undefined template argument
     * [423]10706 (c++) ICE in mangle_class_name_for_template
     * [424]11496 (fortran) error in flow_loops_find when -funroll-loops
       active
     * [425]11741 ICE in pre_insert_copy_insn, in gcse.c
     * [426]12440 GCC crashes during compilation of quicktime4linux 2.0.0
     * [427]12632 (fortran) -fbounds-check ICE
     * [428]12712 (c++) ICE on short legit C++ code fragment with gcc
       3.3.2
     * [429]12726 (c++) ICE (segfault) on trivial code
     * [430]12890 (c++) ICE on compilation of class with throwing method
     * [431]12900 (c++) ICE in rtl_verify_flow_info_1
     * [432]13060 (fortran) ICE in fixup_var_refs_1, in function.c on
       correct code with -O2 -fno-force-mem
     * [433]13289 (c++) ICE in regenerate_decl_from_template on recursive
       template
     * [434]13318 ICE: floating point exception in the loop optimizer
     * [435]13392 (c++) ICE in convert_from_eh_region_ranges_1, in
       except.c
     * [436]13574 (c++) invalid array default initializer in class lets
       gcc consume all memory and die
     * [437]13475 ICE on SIMD variables with partial value initialization
     * [438]13797 (c++) ICE on invalid template parameter
     * [439]13824 (java) gcj SEGV with simple .java program

    C and optimization bugs

     * [440]8776 loop invariants are not removed (most likely)
     * [441]10339 [sparc,ppc,ppc64] Invalid optimization: replacing
       strncmp by memcmp
     * [442]11350 undefined labels with -Os -fPIC
     * [443]12826 Optimizer removes reference through volatile pointer
     * [444]12500 stabs debug info: void no longer a predefined / builtin
       type
     * [445]12941 builtin-bitops-1.c miscompilation (latent bug)
     * [446]12953 tree inliner bug (in inline_forbidden_p) and fix
     * [447]13041 linux-2.6/sound/core/oss/rate.c miscompiled
     * [448]13507 spurious printf format warning
     * [449]13382 Type information for const pointer disappears during
       optimization.
     * [450]13394 noreturn attribute ignored on recursive invokation
     * [451]13400 Compiled code crashes storing to read-only location
     * [452]13521 Endless loop in calculate_global_regs_live

    C++ compiler and library

   Some of the bug fixes in this list were made to implement decisions
   that the ISO C++ standards committee has made concerning several defect
   reports (DRs). Links in the list below point to detailed discussion of
   the relevant defect report.
     * [453]2094 unimplemented: use of `ptrmem_cst' in template type
       unification
     * [454]2294 using declaration confusion
     * [455]5050 template instantiation depth exceeds limit: recursion
       problem?
     * [456]9371 Bad exception handling in
       i/ostream::operator>>/<<(streambuf*)
     * [457]9546 bad exception handling in ostream members
     * [458]10081 basic_ios::_M_cache_locale leaves NULL members in the
       face of unknown locales
     * [459]10093 [460][DR 61] Setting failbit in exceptions doesn't work
     * [461]10095 istream::operator>>(int&) sets ios::badbit when
       ios::failbit is set.
     * [462]11554 Warning about reordering of initializers doesn't mention
       location of constructor
     * [463]12297 istream::sentry::sentry() handles eof() incorrectly.
     * [464]12352 Exception safety problems in src/localename.cc
     * [465]12438 Memory leak in locale::combine()
     * [466]12540 Memory leak in locale::locale(const char*)
     * [467]12594 DRs [468]60 [TC] and [469]63 [TC] not implemented
     * [470]12657 Resolution of [471]DR 292 (WP) still unimplemented
     * [472]12696 memory eating infinite loop in diagnostics (error
       recovery problem)
     * [473]12815 Code compiled with optimization behaves unexpectedly
     * [474]12862 Conflicts between typedefs/enums and namespace member
       declarations
     * [475]12926 Wrong value after assignment in initialize list using
       bit-fields
     * [476]12967 Resolution of [477]DR 300 [WP] still unimplemented
     * [478]12971 Resolution of [479]DR 328 [WP] still unimplemented
     * [480]13007 basic_streambuf::pubimbue, imbue wrong
     * [481]13009 Implicitly-defined assignment operator writes to wrong
       memory
     * [482]13057 regparm attribute not applied to destructor
     * [483]13070 -Wformat option ignored in g++
     * [484]13081 forward template declarations in <complex> let inlining
       fail
     * [485]13239 Assertion does not seem to work correctly anymore
     * [486]13262 "xxx is private within this context" when initializing a
       self-contained template class
     * [487]13290 simple typo in concept checking for std::generate_n
     * [488]13323 Template code does not compile in presence of typedef
     * [489]13369 __verify_grouping (and __add_grouping?) not correct
     * [490]13371 infinite loop with packed struct and inlining
     * [491]13445 Template argument replacement "dereferences" a typedef
     * [492]13461 Fails to access protected-ctor from public constant
     * [493]13462 Non-standard-conforming type set::pointer
     * [494]13478 gcc uses wrong constructor to initialize a const
       reference
     * [495]13544 "conflicting types" for enums in different scopes
     * [496]13650 string::compare should not (always) use
       traits_type::length()
     * [497]13683 bogus warning about passing non-PODs through ellipsis
     * [498]13688 Derived class is denied access to protected base class
       member class
     * [499]13774 Member variable cleared in virtual multiple inheritance
       class
     * [500]13884 Protect sstream.tcc from extern template use

    Java compiler and library

     * [501]10746 [win32] garbage collection crash in GCJ

    Objective-C compiler and library

     * [502]11433 Crash due to dereferencing null pointer when querying
       protocol

    Fortran compiler and library

     * [503]12633 logical expression gives incorrect result with
       -fugly-logint option
     * [504]13037 [gcse-lm] g77 generates incorrect code
     * [505]13213 Hex constant problem when compiling with -fugly-logint
       and -ftypeless-boz

    x86-specific (Intel/AMD)

     * [506]4490 ICE with -m128bit-long-double
     * [507]12292 [x86_64] ICE: RTL check: expected code `const_int', have
       `reg' in make_field_assignment, in combine.c
     * [508]12441 ICE: can't find a register to spill
     * [509]12943 array static-init failure under -fpic, -fPIC
     * [510]13608 Incorrect code with -O3 -ffast-math

    PowerPC-specific

     * [511]11598 testcase gcc.dg/20020118-1.c fails runtime check of
       __attribute__((aligned(16)))
     * [512]11793 ICE in extract_insn, in recog.c (const_vector's)
     * [513]12467 vmsumubm emitted when vmsummbm appropriate (typo in
       altivec.md)
     * [514]12537 g++ generates writeable text sections

    SPARC-specific

     * [515]12496 wrong result for __atomic_add(&value, -1) when using -O0
       -m64
     * [516]12865 mprotect call to make trampoline executable may fail
     * [517]13354 ICE in sparc_emit_set_const32

    ARM-specific

     * [518]10467 [arm] ICE in pre_insert_copy_insn,

    ia64-specific

     * [519]11226 ICE passing struct arg with two floats
     * [520]11227 ICE for _Complex float, _Complex long double args
     * [521]12644 GCC 3.3.2 fails to compile glibc on ia64
     * [522]13149 build gcc-3.3.2 1305 error:unrecognizable insn
     * Various fixes for libunwind

    Alpha-specific

     * [523]12654 Incorrect comparison code generated for Alpha
     * [524]12965 SEGV+ICE in cc1plus on alpha-linux with -O2
     * [525]13031 ICE (unrecognizable insn) when building gnome-libs-1.4.2

    HPPA-specific

     * [526]11634 [hppa] ICE in verify_local_live_at_start, in flow.c
     * [527]12158 [hppa] compilation does not terminate at -O1

    S390-specific

     * [528]11992 Wrong built-in code for memcmp with length 1<<24: only
       (1<<24)-1 possible for CLCL-Instruction

    SH-specific

     * [529]9365 segfault in gen_far_branch (config/sh/sh.c)
     * [530]10392 optimizer generates faulty array indexing
     * [531]11322 SH profiler outputs multiple definitions of symbol
     * [532]13069 gcc/config/sh/rtems.h broken
     * [533]13302 Putting a va_list in a struct causes seg fault
     * [534]13585 Incorrect optimization of call to sfunc
     * Fix inappropriately exported libgcc functions from the shared
       library

    Other embedded target specific

     * [535]8916 [mcore] unsigned char assign gets hosed.
     * [536]11576 [h8300] ICE in change_address_1, in emit-rtl.c
     * [537]13122 [h8300] local variable gets corrupted by function call
       when -fomit-frame-pointer is given
     * [538]13256 [cris] strict_low_part mistreated in delay slots
     * [539]13373 [mcore] optimization with -frerun-cse-after-loop
       -fexpensive-optimizations produces wrong code on mcore

    GNU HURD-specific

     * [540]12561 gcc/config/t-gnu needs updating to work with
       --with-sysroot

    Tru64 Unix specific

     * [541]6243 testsuite fails almost all tests due to no libintl in
       LD_LIBRARY_PATH during test.
     * [542]11397 weak aliases broken on Tru64 UNIX

    AIX-specific

     * [543]12505 build failure due to defines of uchar in cpphash.h and
       sys/types.h
     * [544]13150 WEAK symbols not exported by collect2

    IRIX-specific

     * [545]12666 fixincludes problem on IRIX 6.5.19m

    Solaris-specific

     * [546]12969 Including sys/byteorder.h breaks configure checks

    Testsuite problems (compiler is not affected)

     * [547]10819 testsuite creates CR+LF on compiler version lines in
       test summary files
     * [548]11612 abi_check not finding correct libgcc_s.so.1

    Miscellaneous

     * [549]13211 using -###, incorrect warnings about unused linker file
       are produced
     __________________________________________________________________

GCC 3.3.4

   This is the [550]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.3.4 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).
     __________________________________________________________________

GCC 3.3.5

   This is the [551]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.3.5 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).
     __________________________________________________________________

GCC 3.3.6

   This is the [552]list of problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.3.6 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here).


    For questions related to the use of GCC, please consult these web
    pages and the [553]GCC manuals. If that fails, the
    [554]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [555]gcc@gcc.gnu.org. All of [556]our lists have public
    archives.

   Copyright (C) [557]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [558]maintained by the GCC team. Last modified
   2013-10-31[559].

References

   1. http://gcc.gnu.org/gcc-3.3/changes.html#3.3.6
   2. http://gcc.gnu.org/gcc-3.1/changes.html#obsolete_systems
   3. http://gcc.gnu.org/gcc-3.3/changes.html#obsolete_systems
   4. http://gcc.gnu.org/gcc-3.3/changes.html#nonnull_attribute
   5. http://gcc.gnu.org/news/dfa.html
   6. http://gcc.gnu.org/c99status.html
   7. http://gcc.gnu.org/onlinedocs/gcc-3.3.6/g77/News.html
   8. http://gcc.gnu.org/PR10140
   9. http://gcc.gnu.org/PR10198
  10. http://gcc.gnu.org/PR10338
  11. http://gcc.gnu.org/PR3581
  12. http://gcc.gnu.org/PR4382
  13. http://gcc.gnu.org/PR5533
  14. http://gcc.gnu.org/PR6387
  15. http://gcc.gnu.org/PR6412
  16. http://gcc.gnu.org/PR6620
  17. http://gcc.gnu.org/PR6663
  18. http://gcc.gnu.org/PR7068
  19. http://gcc.gnu.org/PR7083
  20. http://gcc.gnu.org/PR7647
  21. http://gcc.gnu.org/PR7675
  22. http://gcc.gnu.org/PR7718
  23. http://gcc.gnu.org/PR8116
  24. http://gcc.gnu.org/PR8358
  25. http://gcc.gnu.org/PR8511
  26. http://gcc.gnu.org/PR8564
  27. http://gcc.gnu.org/PR8660
  28. http://gcc.gnu.org/PR8766
  29. http://gcc.gnu.org/PR8803
  30. http://gcc.gnu.org/PR8846
  31. http://gcc.gnu.org/PR8906
  32. http://gcc.gnu.org/PR9216
  33. http://gcc.gnu.org/PR9261
  34. http://gcc.gnu.org/PR9263
  35. http://gcc.gnu.org/PR9429
  36. http://gcc.gnu.org/PR9516
  37. http://gcc.gnu.org/PR9600
  38. http://gcc.gnu.org/PR9629
  39. http://gcc.gnu.org/PR9672
  40. http://gcc.gnu.org/PR9749
  41. http://gcc.gnu.org/PR9794
  42. http://gcc.gnu.org/PR9829
  43. http://gcc.gnu.org/PR9916
  44. http://gcc.gnu.org/PR9936
  45. http://gcc.gnu.org/PR10262
  46. http://gcc.gnu.org/PR10278
  47. http://gcc.gnu.org/PR10446
  48. http://gcc.gnu.org/PR10451
  49. http://gcc.gnu.org/PR10506
  50. http://gcc.gnu.org/PR10549
  51. http://gcc.gnu.org/PR2001
  52. http://gcc.gnu.org/PR2391
  53. http://gcc.gnu.org/PR2960
  54. http://gcc.gnu.org/PR4046
  55. http://gcc.gnu.org/PR6405
  56. http://gcc.gnu.org/PR6798
  57. http://gcc.gnu.org/PR6871
  58. http://gcc.gnu.org/PR6909
  59. http://gcc.gnu.org/PR7189
  60. http://gcc.gnu.org/PR7642
  61. http://gcc.gnu.org/PR8634
  62. http://gcc.gnu.org/PR8750
  63. http://gcc.gnu.org/PR2161
  64. http://gcc.gnu.org/PR4319
  65. http://gcc.gnu.org/PR8602
  66. http://gcc.gnu.org/PR9177
  67. http://gcc.gnu.org/PR9853
  68. http://gcc.gnu.org/PR45
  69. http://gcc.gnu.org/PR3784
  70. http://gcc.gnu.org/PR764
  71. http://gcc.gnu.org/PR5116
  72. http://gcc.gnu.org/PR2862
  73. http://gcc.gnu.org/PR3663
  74. http://gcc.gnu.org/PR3797
  75. http://gcc.gnu.org/PR3948
  76. http://gcc.gnu.org/PR4137
  77. http://gcc.gnu.org/PR4361
  78. http://gcc.gnu.org/PR4802
  79. http://gcc.gnu.org/PR5837
  80. http://gcc.gnu.org/PR4803
  81. http://gcc.gnu.org/PR5094
  82. http://gcc.gnu.org/PR5730
  83. http://gcc.gnu.org/PR6713
  84. http://gcc.gnu.org/PR7015
  85. http://gcc.gnu.org/PR7086
  86. http://gcc.gnu.org/PR7099
  87. http://gcc.gnu.org/PR7247
  88. http://gcc.gnu.org/PR7441
  89. http://gcc.gnu.org/PR7768
  90. http://gcc.gnu.org/PR7804
  91. http://gcc.gnu.org/PR8099
  92. http://gcc.gnu.org/PR8117
  93. http://gcc.gnu.org/PR8205
  94. http://gcc.gnu.org/PR8645
  95. http://gcc.gnu.org/PR8724
  96. http://gcc.gnu.org/PR8805
  97. http://gcc.gnu.org/PR8691
  98. http://gcc.gnu.org/PR8700
  99. http://gcc.gnu.org/PR8724
 100. http://gcc.gnu.org/PR8949
 101. http://gcc.gnu.org/PR9016
 102. http://gcc.gnu.org/PR9053
 103. http://gcc.gnu.org/PR9152
 104. http://gcc.gnu.org/PR9182
 105. http://gcc.gnu.org/PR9297
 106. http://gcc.gnu.org/PR9318
 107. http://gcc.gnu.org/PR9320
 108. http://gcc.gnu.org/PR9400
 109. http://gcc.gnu.org/PR9424
 110. http://gcc.gnu.org/PR9425
 111. http://gcc.gnu.org/PR9439
 112. http://gcc.gnu.org/PR9474
 113. http://gcc.gnu.org/PR9548
 114. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#231
 115. http://gcc.gnu.org/PR9555
 116. http://gcc.gnu.org/PR9561
 117. http://gcc.gnu.org/PR9563
 118. http://gcc.gnu.org/PR9582
 119. http://gcc.gnu.org/PR9622
 120. http://gcc.gnu.org/PR9683
 121. http://gcc.gnu.org/PR9791
 122. http://gcc.gnu.org/PR9817
 123. http://gcc.gnu.org/PR9825
 124. http://gcc.gnu.org/PR9826
 125. http://gcc.gnu.org/PR9924
 126. http://gcc.gnu.org/PR9946
 127. http://gcc.gnu.org/PR9964
 128. http://gcc.gnu.org/PR9988
 129. http://gcc.gnu.org/PR10033
 130. http://gcc.gnu.org/PR10097
 131. http://gcc.gnu.org/PR10132
 132. http://gcc.gnu.org/PR10180
 133. http://gcc.gnu.org/PR10199
 134. http://gcc.gnu.org/PR10300
 135. http://gcc.gnu.org/PR10427
 136. http://gcc.gnu.org/PR10503
 137. http://gcc.gnu.org/PR5956
 138. http://gcc.gnu.org/PR1832
 139. http://gcc.gnu.org/PR3924
 140. http://gcc.gnu.org/PR5634
 141. http://gcc.gnu.org/PR6367
 142. http://gcc.gnu.org/PR6491
 143. http://gcc.gnu.org/PR6742
 144. http://gcc.gnu.org/PR7113
 145. http://gcc.gnu.org/PR7236
 146. http://gcc.gnu.org/PR7278
 147. http://gcc.gnu.org/PR7384
 148. http://gcc.gnu.org/PR7388
 149. http://gcc.gnu.org/PR8587
 150. http://gcc.gnu.org/PR9038
 151. http://gcc.gnu.org/PR10197
 152. http://gcc.gnu.org/PR6005
 153. http://gcc.gnu.org/PR6389
 154. http://gcc.gnu.org/PR6576
 155. http://gcc.gnu.org/PR6652
 156. http://gcc.gnu.org/PR7060
 157. http://gcc.gnu.org/PR7073
 158. http://gcc.gnu.org/PR7180
 159. http://gcc.gnu.org/PR7416
 160. http://gcc.gnu.org/PR7570
 161. http://gcc.gnu.org/PR7578
 162. http://gcc.gnu.org/PR7611
 163. http://gcc.gnu.org/PR7709
 164. http://gcc.gnu.org/PR7766
 165. http://gcc.gnu.org/PR7785
 166. http://gcc.gnu.org/PR7786
 167. http://gcc.gnu.org/PR8142
 168. http://gcc.gnu.org/PR8234
 169. http://gcc.gnu.org/PR8415
 170. http://gcc.gnu.org/PR8481
 171. http://gcc.gnu.org/PR8593
 172. http://gcc.gnu.org/PR8759
 173. http://gcc.gnu.org/PR8997
 174. http://gcc.gnu.org/PR9253
 175. http://gcc.gnu.org/PR9254
 176. http://gcc.gnu.org/PR9271
 177. http://gcc.gnu.org/PR6767
 178. http://gcc.gnu.org/PR9911
 179. http://gcc.gnu.org/PR10020
 180. http://gcc.gnu.org/PR10546
 181. http://gcc.gnu.org/PR7029
 182. http://gcc.gnu.org/PR2903
 183. http://gcc.gnu.org/PR7873
 184. http://gcc.gnu.org/PR7680
 185. http://gcc.gnu.org/PR8705
 186. http://gcc.gnu.org/PR9986
 187. http://gcc.gnu.org/PR10056
 188. http://gcc.gnu.org/PR6744
 189. http://gcc.gnu.org/PR7361
 190. http://gcc.gnu.org/PR9496
 191. http://gcc.gnu.org/PR7067
 192. http://gcc.gnu.org/PR8480
 193. http://gcc.gnu.org/PR8784
 194. http://gcc.gnu.org/PR10315
 195. http://gcc.gnu.org/PR10267
 196. http://gcc.gnu.org/PR7916
 197. http://gcc.gnu.org/PR7926
 198. http://gcc.gnu.org/PR8555
 199. http://gcc.gnu.org/PR8994
 200. http://gcc.gnu.org/PR9426
 201. http://gcc.gnu.org/PR9806
 202. http://gcc.gnu.org/PR10077
 203. http://gcc.gnu.org/PR10233
 204. http://gcc.gnu.org/PR10286
 205. http://gcc.gnu.org/PR10308
 206. http://gcc.gnu.org/PR11272
 207. http://gcc.gnu.org/PR5754
 208. http://gcc.gnu.org/PR6597
 209. http://gcc.gnu.org/PR6949
 210. http://gcc.gnu.org/PR7053
 211. http://gcc.gnu.org/PR8164
 212. http://gcc.gnu.org/PR8384
 213. http://gcc.gnu.org/PR9559
 214. http://gcc.gnu.org/PR9649
 215. http://gcc.gnu.org/PR9864
 216. http://gcc.gnu.org/PR10432
 217. http://gcc.gnu.org/PR10475
 218. http://gcc.gnu.org/PR10635
 219. http://gcc.gnu.org/PR10661
 220. http://gcc.gnu.org/PR10700
 221. http://gcc.gnu.org/PR10712
 222. http://gcc.gnu.org/PR10796
 223. http://gcc.gnu.org/PR10890
 224. http://gcc.gnu.org/PR10939
 225. http://gcc.gnu.org/PR10956
 226. http://gcc.gnu.org/PR11041
 227. http://gcc.gnu.org/PR11059
 228. http://gcc.gnu.org/PR11083
 229. http://gcc.gnu.org/PR11105
 230. http://gcc.gnu.org/PR11149
 231. http://gcc.gnu.org/PR11228
 232. http://gcc.gnu.org/PR11282
 233. http://gcc.gnu.org/PR11301
 234. http://gcc.gnu.org/PR11308
 235. http://gcc.gnu.org/PR11473
 236. http://gcc.gnu.org/PR11503
 237. http://gcc.gnu.org/PR11513
 238. http://gcc.gnu.org/PR11198
 239. http://gcc.gnu.org/PR11304
 240. http://gcc.gnu.org/PR11381
 241. http://gcc.gnu.org/PR11536
 242. http://gcc.gnu.org/PR11557
 243. http://gcc.gnu.org/PR5897
 244. http://gcc.gnu.org/PR11279
 245. http://gcc.gnu.org/PR11022
 246. http://gcc.gnu.org/PR2330
 247. http://gcc.gnu.org/PR5388
 248. http://gcc.gnu.org/PR5390
 249. http://gcc.gnu.org/PR7877
 250. http://gcc.gnu.org/PR9393
 251. http://gcc.gnu.org/PR10032
 252. http://gcc.gnu.org/PR10468
 253. http://gcc.gnu.org/PR10527
 254. http://gcc.gnu.org/PR10679
 255. http://gcc.gnu.org/PR10682
 256. http://gcc.gnu.org/PR10689
 257. http://gcc.gnu.org/PR10845
 258. http://gcc.gnu.org/PR10849
 259. http://gcc.gnu.org/PR10888
 260. http://gcc.gnu.org/PR10929
 261. http://gcc.gnu.org/PR10931
 262. http://gcc.gnu.org/PR10940
 263. http://gcc.gnu.org/PR10968
 264. http://gcc.gnu.org/PR10990
 265. http://gcc.gnu.org/PR11039
 266. http://gcc.gnu.org/PR11062
 267. http://gcc.gnu.org/PR11095
 268. http://gcc.gnu.org/PR11098
 269. http://gcc.gnu.org/PR11137
 270. http://gcc.gnu.org/PR11154
 271. http://gcc.gnu.org/PR11329
 272. http://gcc.gnu.org/PR11332
 273. http://gcc.gnu.org/PR11431
 274. http://gcc.gnu.org/PR11528
 275. http://gcc.gnu.org/PR11546
 276. http://gcc.gnu.org/PR11567
 277. http://gcc.gnu.org/PR11645
 278. http://gcc.gnu.org/PR5179
 279. http://gcc.gnu.org/PR8204
 280. http://gcc.gnu.org/PR10838
 281. http://gcc.gnu.org/PR10886
 282. http://gcc.gnu.org/PR11349
 283. http://gcc.gnu.org/PR4823
 284. http://gcc.gnu.org/PR8878
 285. http://gcc.gnu.org/PR9815
 286. http://gcc.gnu.org/PR10402
 287. http://gcc.gnu.org/PR10504
 288. http://gcc.gnu.org/PR10673
 289. http://gcc.gnu.org/PR11044
 290. http://gcc.gnu.org/PR11089
 291. http://gcc.gnu.org/PR11420
 292. http://gcc.gnu.org/PR9362
 293. http://gcc.gnu.org/PR10142
 294. http://gcc.gnu.org/PR10663
 295. http://gcc.gnu.org/PR10835
 296. http://gcc.gnu.org/PR10876
 297. http://gcc.gnu.org/PR10955
 298. http://gcc.gnu.org/PR11018
 299. http://gcc.gnu.org/PR11556
 300. http://gcc.gnu.org/PR10907
 301. http://gcc.gnu.org/PR11320
 302. http://gcc.gnu.org/PR11599
 303. http://gcc.gnu.org/PR9745
 304. http://gcc.gnu.org/PR10871
 305. http://gcc.gnu.org/PR11440
 306. http://gcc.gnu.org/PR7594
 307. http://gcc.gnu.org/PR10557
 308. http://gcc.gnu.org/PR11054
 309. http://gcc.gnu.org/PR10834
 310. http://gcc.gnu.org/PR10842
 311. http://gcc.gnu.org/PR11052
 312. http://gcc.gnu.org/PR11183
 313. http://gcc.gnu.org/PR11084
 314. http://gcc.gnu.org/PR10331
 315. http://gcc.gnu.org/PR10413
 316. http://gcc.gnu.org/PR11096
 317. http://gcc.gnu.org/PR2873
 318. http://gcc.gnu.org/PR3163
 319. http://gcc.gnu.org/PR5287
 320. http://gcc.gnu.org/PR10148
 321. http://gcc.gnu.org/PR8787
 322. http://gcc.gnu.org/PR10900
 323. http://gcc.gnu.org/PR1607
 324. http://gcc.gnu.org/PR4252
 325. http://gcc.gnu.org/PR4490
 326. http://gcc.gnu.org/PR10355
 327. http://gcc.gnu.org/PR10726
 328. http://gcc.gnu.org/PR10805
 329. http://gcc.gnu.org/PR10815
 330. http://gcc.gnu.org/PR10877
 331. http://gcc.gnu.org/PR11280
 332. http://gcc.gnu.org/PR11466
 333. http://gcc.gnu.org/PR10737
 334. http://gcc.gnu.org/PR10810
 335. http://gcc.gnu.org/bugzilla/
 336. http://gcc.gnu.org/PR8336
 337. http://gcc.gnu.org/PR9330
 338. http://gcc.gnu.org/PR9631
 339. http://gcc.gnu.org/PR9877
 340. http://gcc.gnu.org/PR11687
 341. http://gcc.gnu.org/PR12263
 342. http://gcc.gnu.org/PR12490
 343. http://gcc.gnu.org/PR7277
 344. http://gcc.gnu.org/PR7939
 345. http://gcc.gnu.org/PR11063
 346. http://gcc.gnu.org/PR11207
 347. http://gcc.gnu.org/PR11522
 348. http://gcc.gnu.org/PR11595
 349. http://gcc.gnu.org/PR11646
 350. http://gcc.gnu.org/PR11665
 351. http://gcc.gnu.org/PR11852
 352. http://gcc.gnu.org/PR11878
 353. http://gcc.gnu.org/PR11883
 354. http://gcc.gnu.org/PR11991
 355. http://gcc.gnu.org/PR12146
 356. http://gcc.gnu.org/PR12215
 357. http://gcc.gnu.org/PR12369
 358. http://gcc.gnu.org/PR12446
 359. http://gcc.gnu.org/PR12510
 360. http://gcc.gnu.org/PR12544
 361. http://gcc.gnu.org/PR9862
 362. http://gcc.gnu.org/PR10962
 363. http://gcc.gnu.org/PR11370
 364. http://gcc.gnu.org/PR11637
 365. http://gcc.gnu.org/PR11885
 366. http://gcc.gnu.org/PR12082
 367. http://gcc.gnu.org/PR12180
 368. http://gcc.gnu.org/PR12340
 369. http://gcc.gnu.org/PR3907
 370. http://gcc.gnu.org/PR5293
 371. http://gcc.gnu.org/PR5296
 372. http://gcc.gnu.org/PR7939
 373. http://gcc.gnu.org/PR8656
 374. http://gcc.gnu.org/PR10147
 375. http://gcc.gnu.org/PR11400
 376. http://gcc.gnu.org/PR11409
 377. http://gcc.gnu.org/PR11740
 378. http://gcc.gnu.org/PR11786
 379. http://gcc.gnu.org/PR11867
 380. http://gcc.gnu.org/PR11928
 381. http://gcc.gnu.org/PR12114
 382. http://gcc.gnu.org/PR12163
 383. http://gcc.gnu.org/PR12181
 384. http://gcc.gnu.org/PR12236
 385. http://gcc.gnu.org/PR12266
 386. http://gcc.gnu.org/PR12296
 387. http://gcc.gnu.org/PR12298
 388. http://gcc.gnu.org/PR12369
 389. http://gcc.gnu.org/PR12337
 390. http://gcc.gnu.org/PR12344
 391. http://gcc.gnu.org/PR12451
 392. http://gcc.gnu.org/PR12486
 393. http://gcc.gnu.org/PR8869
 394. http://gcc.gnu.org/PR9786
 395. http://gcc.gnu.org/PR11689
 396. http://gcc.gnu.org/PR12116
 397. http://gcc.gnu.org/PR12070
 398. http://gcc.gnu.org/PR11184
 399. http://gcc.gnu.org/PR11535
 400. http://gcc.gnu.org/PR11693
 401. http://gcc.gnu.org/PR12224
 402. http://gcc.gnu.org/PR11087
 403. http://gcc.gnu.org/PR11319
 404. http://gcc.gnu.org/PR11949
 405. http://gcc.gnu.org/PR11662
 406. http://gcc.gnu.org/PR11965
 407. http://gcc.gnu.org/PR12301
 408. http://gcc.gnu.org/PR11717
 409. http://gcc.gnu.org/PR11313
 410. http://gcc.gnu.org/PR11712
 411. http://gcc.gnu.org/PR12166
 412. http://gcc.gnu.org/PR12101
 413. http://gcc.gnu.org/PR10988
 414. http://gcc.gnu.org/PR11805
 415. http://gcc.gnu.org/PR11902
 416. http://gcc.gnu.org/PR11903
 417. http://gcc.gnu.org/bugzilla/
 418. http://gcc.gnu.org/PR11890
 419. http://gcc.gnu.org/PR12399
 420. http://gcc.gnu.org/PR13068
 421. http://gcc.gnu.org/PR10060
 422. http://gcc.gnu.org/PR10555
 423. http://gcc.gnu.org/PR10706
 424. http://gcc.gnu.org/PR11496
 425. http://gcc.gnu.org/PR11741
 426. http://gcc.gnu.org/PR12440
 427. http://gcc.gnu.org/PR12632
 428. http://gcc.gnu.org/PR12712
 429. http://gcc.gnu.org/PR12726
 430. http://gcc.gnu.org/PR12890
 431. http://gcc.gnu.org/PR12900
 432. http://gcc.gnu.org/PR13060
 433. http://gcc.gnu.org/PR13289
 434. http://gcc.gnu.org/PR13318
 435. http://gcc.gnu.org/PR13392
 436. http://gcc.gnu.org/PR13574
 437. http://gcc.gnu.org/PR13475
 438. http://gcc.gnu.org/PR13797
 439. http://gcc.gnu.org/PR13824
 440. http://gcc.gnu.org/PR8776
 441. http://gcc.gnu.org/PR10339
 442. http://gcc.gnu.org/PR11350
 443. http://gcc.gnu.org/PR12826
 444. http://gcc.gnu.org/PR12500
 445. http://gcc.gnu.org/PR12941
 446. http://gcc.gnu.org/PR12953
 447. http://gcc.gnu.org/PR13041
 448. http://gcc.gnu.org/PR13507
 449. http://gcc.gnu.org/PR13382
 450. http://gcc.gnu.org/PR13394
 451. http://gcc.gnu.org/PR13400
 452. http://gcc.gnu.org/PR13521
 453. http://gcc.gnu.org/PR2094
 454. http://gcc.gnu.org/PR2294
 455. http://gcc.gnu.org/PR5050
 456. http://gcc.gnu.org/PR9371
 457. http://gcc.gnu.org/PR9546
 458. http://gcc.gnu.org/PR10081
 459. http://gcc.gnu.org/PR10093
 460. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#61
 461. http://gcc.gnu.org/PR10095
 462. http://gcc.gnu.org/PR11554
 463. http://gcc.gnu.org/PR12297
 464. http://gcc.gnu.org/PR12352
 465. http://gcc.gnu.org/PR12438
 466. http://gcc.gnu.org/PR12540
 467. http://gcc.gnu.org/PR12594
 468. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#60
 469. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#63
 470. http://gcc.gnu.org/PR12657
 471. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#292
 472. http://gcc.gnu.org/PR12696
 473. http://gcc.gnu.org/PR12815
 474. http://gcc.gnu.org/PR12862
 475. http://gcc.gnu.org/PR12926
 476. http://gcc.gnu.org/PR12967
 477. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html
 478. http://gcc.gnu.org/PR12971
 479. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#328
 480. http://gcc.gnu.org/PR13007
 481. http://gcc.gnu.org/PR13009
 482. http://gcc.gnu.org/PR13057
 483. http://gcc.gnu.org/PR13070
 484. http://gcc.gnu.org/PR13081
 485. http://gcc.gnu.org/PR13239
 486. http://gcc.gnu.org/PR13262
 487. http://gcc.gnu.org/PR13290
 488. http://gcc.gnu.org/PR13323
 489. http://gcc.gnu.org/PR13369
 490. http://gcc.gnu.org/PR13371
 491. http://gcc.gnu.org/PR13445
 492. http://gcc.gnu.org/PR13461
 493. http://gcc.gnu.org/PR13462
 494. http://gcc.gnu.org/PR13478
 495. http://gcc.gnu.org/PR13544
 496. http://gcc.gnu.org/PR13650
 497. http://gcc.gnu.org/PR13683
 498. http://gcc.gnu.org/PR13688
 499. http://gcc.gnu.org/PR13774
 500. http://gcc.gnu.org/PR13884
 501. http://gcc.gnu.org/PR10746
 502. http://gcc.gnu.org/PR11433
 503. http://gcc.gnu.org/PR12633
 504. http://gcc.gnu.org/PR13037
 505. http://gcc.gnu.org/PR13213
 506. http://gcc.gnu.org/PR4490
 507. http://gcc.gnu.org/PR12292
 508. http://gcc.gnu.org/PR12441
 509. http://gcc.gnu.org/PR12943
 510. http://gcc.gnu.org/PR13608
 511. http://gcc.gnu.org/PR11598
 512. http://gcc.gnu.org/PR11793
 513. http://gcc.gnu.org/PR12467
 514. http://gcc.gnu.org/PR12537
 515. http://gcc.gnu.org/PR12496
 516. http://gcc.gnu.org/PR12865
 517. http://gcc.gnu.org/PR13354
 518. http://gcc.gnu.org/PR10467
 519. http://gcc.gnu.org/PR11226
 520. http://gcc.gnu.org/PR11227
 521. http://gcc.gnu.org/PR12644
 522. http://gcc.gnu.org/PR13149
 523. http://gcc.gnu.org/PR12654
 524. http://gcc.gnu.org/PR12965
 525. http://gcc.gnu.org/PR13031
 526. http://gcc.gnu.org/PR11634
 527. http://gcc.gnu.org/PR12158
 528. http://gcc.gnu.org/PR11992
 529. http://gcc.gnu.org/PR9365
 530. http://gcc.gnu.org/PR10392
 531. http://gcc.gnu.org/PR11322
 532. http://gcc.gnu.org/PR13069
 533. http://gcc.gnu.org/PR13302
 534. http://gcc.gnu.org/PR13585
 535. http://gcc.gnu.org/PR8916
 536. http://gcc.gnu.org/PR11576
 537. http://gcc.gnu.org/PR13122
 538. http://gcc.gnu.org/PR13256
 539. http://gcc.gnu.org/PR13373
 540. http://gcc.gnu.org/PR12561
 541. http://gcc.gnu.org/PR6243
 542. http://gcc.gnu.org/PR11397
 543. http://gcc.gnu.org/PR12505
 544. http://gcc.gnu.org/PR13150
 545. http://gcc.gnu.org/PR12666
 546. http://gcc.gnu.org/PR12969
 547. http://gcc.gnu.org/PR10819
 548. http://gcc.gnu.org/PR11612
 549. http://gcc.gnu.org/PR13211
 550. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.4
 551. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.5
 552. http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=3.3.6
 553. http://gcc.gnu.org/onlinedocs/
 554. mailto:gcc-help@gcc.gnu.org
 555. mailto:gcc@gcc.gnu.org
 556. http://gcc.gnu.org/lists.html
 557. http://www.fsf.org/
 558. http://gcc.gnu.org/about.html
 559. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.2/index.html

                             GCC 3.2 Release Series

   April 25, 2003

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.2.3.

   The purpose of the GCC 3.2 release series is to provide a stable
   platform for OS distributors to use building their next releases. A
   primary objective was to stabilize the C++ ABI; we believe that the
   interface to the compiler and the C++ standard library are now
   relatively stable.

   Be aware that C++ code compiled by GCC 3.2.x will (in general) not
   interoperate with code compiled by GCC 3.1.1 or earlier.

   Please refer to our [2]detailed list of news, caveats, and bug-fixes
   for further information.

Release History

   GCC 3.2.3
          April 25, 2003 ([3]changes)

   GCC 3.2.2
          February 5, 2003 ([4]changes)

   GCC 3.2.1
          November 19, 2002 ([5]changes)

   GCC 3.2
          August 14, 2002 ([6]changes)

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [7]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, improvements, bug fixes, and other changes as
   well as test results to GCC. This [8]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [9]GCC project
   web site or contact the [10]GCC development mailing list.

   To obtain GCC please use [11]our mirror sites, or our CVS server.


    For questions related to the use of GCC, please consult these web
    pages and the [12]GCC manuals. If that fails, the
    [13]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [14]gcc@gcc.gnu.org. All of [15]our lists have public
    archives.

   Copyright (C) [16]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [17]maintained by the GCC team. Last modified
   2012-11-02[18].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-3.2/changes.html
   3. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.3
   4. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.2
   5. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.1
   6. http://gcc.gnu.org/gcc-3.2/changes.html#3.2
   7. http://gcc.gnu.org/gcc-3.2/buildstat.html
   8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   9. http://gcc.gnu.org/index.html
  10. mailto:gcc@gcc.gnu.org
  11. http://gcc.gnu.org/mirrors.html
  12. http://gcc.gnu.org/onlinedocs/
  13. mailto:gcc-help@gcc.gnu.org
  14. mailto:gcc@gcc.gnu.org
  15. http://gcc.gnu.org/lists.html
  16. http://www.fsf.org/
  17. http://gcc.gnu.org/about.html
  18. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.2/changes.html

                             GCC 3.2 Release Series
                        Changes, New Features, and Fixes

   The latest release in the 3.2 release series is [1]GCC 3.2.3.

Caveats and New Features

  Caveats

     * The C++ compiler does not correctly zero-initialize
       pointers-to-data members. You must explicitly initialize them. For
       example: int S::*m(0); will work, but depending on
       default-initialization to zero will not work. This bug cannot be
       fixed in GCC 3.2 without inducing unacceptable risks. It will be
       fixed in GCC 3.3.
     * This GCC release is based on the GCC 3.1 sourcebase, and thus has
       all the [2]changes in the GCC 3.1 series. In addition, GCC 3.2 has
       a number of C++ ABI fixes which make its C++ compiler generate
       binary code which is incompatible with the C++ compilers found in
       earlier GCC releases, including GCC 3.1 and GCC 3.1.1.

  Frontend Enhancements

    C/C++/Objective-C

     * The method of constructing the list of directories to be searched
       for header files has been revised. If a directory named by a -I
       option is a standard system include directory, the option is
       ignored to ensure that the default search order for system
       directories and the special treatment of system header files are
       not defeated.
     * The C and Objective-C compilers no longer accept the "Naming Types"
       extension (typedef foo = bar); it was already unavailable in C++.
       Code which uses it will need to be changed to use the "typeof"
       extension instead: typedef typeof(bar) foo. (We have removed this
       extension without a period of deprecation because it has caused the
       compiler to crash since version 3.0 and no one noticed until very
       recently. Thus we conclude it is not in widespread use.)

    C++

     * GCC 3.2 fixed serveral differences between the C++ ABI implemented
       in GCC and the multi-vendor standard, but more have been found
       since the release. 3.2.1 adds a new warning, -Wabi, to warn about
       code which is affected by these bugs. We will fix these bugs in
       some future release, once we are confident that all have been
       found; until then, it is our intention to make changes to the ABI
       only if they are necessary for correct compilation of C++, as
       opposed to conformance to the ABI documents.
     * For details on how to build an ABI compliant compiler for GNU/Linux
       systems, check the [3]common C++ ABI page.

  New Targets and Target Specific Improvements

    IA-32

     * Fixed a number of bugs in SSE and MMX intrinsics.
     * Fixed common compiler crashes with SSE instruction set enabled
       (implied by -march=pentium3, pentium4, athlon-xp)
     * __m128 and __m128i is not 128bit aligned when used in structures.

    x86-64

     * A bug whereby the compiler could generate bad code for bzero has
       been fixed.
     * ABI fixes (implying ABI incompatibilities with previous version in
       some corner cases)
     * Fixed prefetch code generation
     __________________________________________________________________

GCC 3.2.3

   3.2.3 is a bug fix release only; there are no new features that were
   not present in GCC 3.2.2.

  Bug Fixes

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.2.3 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here), and some of the titles have been changed to
   make them more clear.

    Internal Compiler Errors (multi-platform)

     * [4]3782: (c++) -quiet -fstats produces a segmentation fault in
       cc1plus
     * [5]6440: (c++) template specializations cause ICE
     * [6]7050: (c++) ICE on: (i ? get_string() : throw)
     * [7]7741: ICE on conflicting types (make_decl_rtl in varasm.c)
     * [8]7982: (c++) ICE due to infinite recursion (using STL set)
     * [9]8068: exceedingly high (infinite) memory usage
     * [10]8178: ICE with __builtin_ffs
     * [11]8396: ICE in copy_to_mode_reg, in explow.c
     * [12]8674: (c++) ICE in cp_expr_size, in cp/cp-lang.c
     * [13]9768: ICE when optimizing inline code at -O2
     * [14]9798: (c++) Infinite recursion (segfault) in
       cp/decl.c:push_using_directive with recursive using directives
     * [15]9799: mismatching structure initializer with nested flexible
       array member: ICE
     * [16]9928: ICE on duplicate enum declaration
     * [17]10114: ICE in mem_loc_descriptor, in dwarf2out.c (affects
       sparc, alpha)
     * [18]10352: ICE in find_reloads_toplev
     * [19]10336: ICE with -Wunreachable-code

    C/optimizer bugs:

     * [20]8224: Incorrect joining of signed and unsigned division
     * [21]8613: -O2 produces wrong code with builtin strlen and
       postincrements
     * [22]8828: gcc reports some code is unreachable when it is not
     * [23]9226: GCSE breaking argument passing
     * [24]9853: miscompilation of non-constant structure initializer
     * [25]9797: C99-style struct initializers are miscompiled
     * [26]9967: Some standard C function calls should not be replaced
       when optimizing for size
     * [27]10116: ce2: invalid merge of join_bb in the context of switch
       statements
     * [28]10171: wrong code for inlined function
     * [29]10175: -Wunreachable-code doesn't work for single lines

    C++ compiler and library:

     * [30]8316: Confusing diagnostic for code that misuses conversion
       operators
     * [31]9169: filebuf output fails if codecvt<>::out returns noconv
     * [32]9420: incomplete type incorrectly reported
     * [33]9459: typeof in return type specification of template not
       supported
     * [34]9507: filebuf::open handles ios_base::ate incorrectly
     * [35]9538: Out-of-bounds memory access in streambuf::sputbackc
     * [36]9602: Total confusion about template/friend/virtual/abstract
     * [37]9993: destructor not called for local object created within and
       returned from infinite loop
     * [38]10167: ieee_1003.1-2001 locale specialisations on a glibc-2.3.2
       system

    Java compiler and library:

     * [39]9652: libgcj build fails on irix6.5.1[78]
     * [40]10144: gas on solaris complains about bad .stabs lines for
       java, native as unaffected

    x86-specific (Intel/AMD):

     * [41]8746: gcc miscompiles Linux kernel ppa driver on x86
     * [42]9888: -mcpu=k6 -Os produces out of range loop instructions
     * [43]9638: Cross-build for target i386-elf and i586-pc-linux-gnu
       failed
     * [44]9954: Cross-build for target i586-pc-linux-gnu (--with-newlib)
       failed

    SPARC-specific:

     * [45]7784: [Sparc] ICE in extract_insn, in recog.c
     * [46]7796: sparc extra failure with -m64 on execute/930921-1.c in
       unroll.c
     * [47]8281: ICE when compiling with -O2 -fPIC for Ultrasparc
     * [48]8366: [Sparc] C testsuite failure with -m64 -fpic -O in
       execute/loop-2d.c
     * [49]8726: gcc -O2 miscompiles Samba 2.2.7 on 32-bit sparc
     * [50]9414: Scheduling bug on Ultrasparc
     * [51]10067: GCC-3.2.2 outputs invalid asm on sparc64

    m68k-specific:

     * [52]7248: broken "inclusive or" code
     * [53]8343: m68k-elf/rtems ICE at instantiate_virtual_regs_1

    PowerPC-specific:

     * [54]9732: Wrong code with -O2 -fPIC
     * [55]10073: ICE: powerpc cannot split insn

    Alpha-specific:

     * [56]7702: optimization problem on a DEC alpha under OSF1
     * [57]9671: gcc.3.2.2 does not build on a HP Tru64 Unix v5.1B system

    HP-specific:

     * [58]8694: <string> breaks <ctype.h> on HP-UX 10.20 (DUP: 9275)
     * [59]9953: (ada) gcc 3.2.x can't build 3.3-branch ada on HP-UX 10
       (missing symbol)
     * [60]10271: Floating point args don't get reloaded across function
       calls with -O2

    MIPS specific:

     * [61]6362: mips-irix6 gcc-3.1 C testsuite failure with -mips4 in
       compile/920501-4.c

    CRIS specific:

     * [62]10377: gcc-3.2.2 creates bad assembler code for cris

    Miscellaneous and minor bugs:

     * [63]6955: collect2 says "core dumped" when there is no core
     __________________________________________________________________

GCC 3.2.2

   Beginning with 3.2.2, GCC's Makefile suite supports redirection of make
   install by means of the DESTDIR variable. Parts of the GCC tree have
   featured that support long before, but now it is available even from
   the top level.

   Other than that, GCC 3.2.2 is a bug fix release only; there are no new
   features that were not present in GCC 3.2.1.

  Bug Fixes

   On the following i386-based systems GCC 3.2.1 broke the C ABI wrt.
   functions returning structures: Cygwin, FreeBSD (GCC 3.2.1 as shipped
   with FreeBSD 5.0 does not have this problem), Interix, a.out-based
   GNU/Linux and NetBSD, OpenBSD, and Darwin. GCC 3.2.2 reverts this ABI
   change, and thus restores ABI-compatibility with previous releases
   (except GCC 3.2.1) on these platforms.

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.2.2 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here) and some of the titles have been changed to
   make them more clear.

    Internal Compiler Errors (multi-platform)

     * [64]5919: (c++) ICE when passing variable array to template
       function
     * [65]7129: (c++) ICE with min/max assignment operators (<?= and >?=)
     * [66]7507: ICE with -O2 when address of called function is a
       complicated expression
     * [67]7622: ICE with nested inline functions if function's address is
       taken
     * [68]7681: (fortran) ICE in compensate_edge, in reg-stack.c (also PR
       [69]9258)
     * [70]8031: (c++) ICE in code comparing typeids and casting from
       virtual base
     * [71]8275: ICE in simplify_subreg
     * [72]8332: (c++) builtin strlen/template interaction causes ICE
     * [73]8372: (c++) ICE on explicit call of destructor
     * [74]8439: (c, not c++) empty struct causes ICE
     * [75]8442: (c++) ICE with nested template classes
     * [76]8518: ICE when compiling mplayer ("extern inline" issue)
     * [77]8615: (c++) ICE with out-of-range character constant template
       argument
     * [78]8663: (c++) ICE in cp_expr_size, at cp-lang.c:307
     * [79]8799: (c++) ICE: error reporting routines re-entered
     * [80]9328: (c++) ICE with typeof(X) for overloaded X
     * [81]9465: (preprocessor) cpp -traditional ICE on null bytes

    C++ (compiler and library) bugs

     * [82]47: scoping in nested classes is broken
     * [83]6745: problems with iostream rdbuf() member function
     * [84]8214: conversion from const char* const to char* sometimes
       accepted illegally
     * [85]8493: builtin strlen and overload resolution (same bug as
       [86]8332)
     * [87]8503: strange behaviour of function types
     * [88]8727: compiler confused by inheritance from an anonymous struct
     * [89]7445: poor performance of std::locale::classic() in
       multi-threaded applications
     * [90]8230: mishandling of overflow in vector<T>::resize
     * [91]8399: sync_with_stdio(false) breaks unformatted input
     * [92]8662: illegal access of private member of unnamed class is
       accepted
     * [93]8707: "make distclean" fails in libstdc++-v3 directory
     * [94]8708: __USE_MALLOC doesn't work
     * [95]8790: Use of non-thread-safe strtok in src/localename.cc
     * [96]8887: Bug in date formats with --enable-clocale=generic
     * [97]9076: Call Frame Instructions are not handled correctly during
       unwind operation
     * [98]9151: std::setprecision limited to 16 digits when outputting a
       double to a stream
     * [99]9168: codecvt<char, char, mbstate_t> overwrites output buffers
     * [100]9269: libstdc++ headers: explicit specialization of function
       must precede its first use
     * [101]9322: return value of basic_streambuf<>::getloc affected by
       locale::global
     * [102]9433: segfault in runtime support for dynamic_cast

    C and optimizer bugs

     * [103]8032: GCC incorrectly initializes static structs that have
       flexible arrays
     * [104]8639: simple arithmetic expression broken
     * [105]8794: optimization improperly eliminates certain expressions
     * [106]8832: traditional "asm volatile" code is illegally optimized
     * [107]8988: loop optimizer bug: with -O2, code is generated that
       segfaults (found on i386, bug present for all platforms)
     * [108]9492: structure copy clobbers subsequent stores to structure

    Objective-C bugs

     * [109]9267: Objective-C parser won't build with newer bison versions
       (e.g. 1.875)

    Ada bugs

     * [110]8344: Ada build problem due to conflict between gcc/final.o,
       gcc/ada/final.o

    Preprocessor bugs

     * [111]8524: _Pragma within macros is improperly expanded
     * [112]8880: __WCHAR_TYPE__ macro incorrectly set to "long int" with
       -fshort-wchar

    ARM-specific

     * [113]9090: arm ICE with >= -O2; regression from gcc-2.95

    x86-specific (Intel/AMD)

     * [114]8588: ICE in extract_insn, at recog.c:NNNN (shift instruction)
     * [115]8599: loop unroll bug with -march=k6-3
     * [116]9506: ABI breakage in structure return (affects BSD and
       Cygwin, but not GNU/Linux)

    FreeBSD 5.0 specific

     * [117]9484: GCC 3.2.1 Bootstrap failure on FreeBSD 5.0

    RTEMS-specific

     * [118]9292: hppa1.1-rtems configurery problems
     * [119]9293: [m68k-elf/rtems] config/m68k/t-crtstuff bug
     * [120]9295: [mips-rtems] config/mips/rtems.h init/fini issue
     * [121]9296: gthr-rtems regression
     * [122]9316: powerpc-rtems: extending multilibs

    HP-PA specific

     * [123]9493: ICE with -O2 when building a simple function

    Documentation

     * [124]7341: hyperlink to gcov in GCC documentation doesn't work
     * [125]8947: Please add a warning about "-malign-double" in docs
     * [126]7448, [127]8882: typo cleanups
     __________________________________________________________________

GCC 3.2.1

   3.2.1 adds a new warning, -Wabi. This option warns when GNU C++
   generates code that is known not to be binary-compatible with the
   vendor-neutral ia32/ia64 ABI. Please consult the GCC manual, included
   in the distribution, for details.

   This release also removes an old GCC extension, "naming types", and the
   documentation now directs users to use a different GCC extension,
   __typeof__, instead. The feature had evidently been broken for a while.

   Otherwise, 3.2.1 is a bug fix release only; other than bug fixes and
   the new warning there are no new features that were not present in GCC
   3.2.

   In addition, the previous fix for [128]PR 7445 (poor performance of
   std::locale::classic() in multi-threaded applications) was reverted
   ("unfixed"), because the "fix" was not thread-safe.

  Bug Fixes

   This section lists the problem reports (PRs) from GCC's bug tracking
   system that are known to be fixed in the 3.2.1 release. This list might
   not be complete (that is, it is possible that some PRs that have been
   fixed are not listed here). As you can see, the number of bug fixes is
   quite large, so it is strongly recommended that users of earlier GCC
   3.x releases upgrade to GCC 3.2.1.

    Internal Compiler Errors (multi-platform)

     * [129]2521: (c++) ICE in build_ptrmemfunc, in cp/typeck.c
     * [130]5661: (c++) ICE instantiating template on array of unknown
       size (bad code)
     * [131]6419: (c++) ICE in make_decl_rtl for "longest" attribute on
       64-bit platforms
     * [132]6994: (c++) ICE in find_function_data
     * [133]7150: preprocessor: GCC -dM -E gives an ICE
     * [134]7160: ICE when optimizing branches without a return value
     * [135]7228: (c++) ICE when using member template and template
       function
     * [136]7266: (c++) ICE with -pedantic on missing typename
     * [137]7353: ICE from use of "Naming Types" extension, see above
     * [138]7411: ICE in instantiate_virtual_regs_1, in function.c
     * [139]7478: (c++) ICE on static_cast inside template
     * [140]7526: preprocessor core dump when _Pragma implies #pragma
       dependency
     * [141]7721: (c++) ICE on simple (but incorrect) template ([142]7803
       is a duplicate)
     * [143]7754: (c++) ICE on union with template parameter
     * [144]7788: (c++) redeclaring a definition as an incomplete class
       causes ICE
     * [145]8031: (c++) ICE in comptypes, in cp/typeck.c
     * [146]8055: preprocessor dies with SIG11 when building FreeBSD
       kernel
     * [147]8067: (c++) ICE due to mishandling of __FUNCTION__ and related
       variables
     * [148]8134: (c++) ICE in force_store_init_value on legal code
     * [149]8149: (c++) ICE on incomplete type
     * [150]8160: (c++) ICE in build_modify_expr, in cp/typeck.c: array
       initialization

    C++ (compiler and library) bugs

     * [151]5607: No pointer adjustment in covariant return types
     * [152]6579: Infinite loop with statement expressions in member
       initialization
     * [153]6803: Default copy constructor bug in GCC 3.1
     * [154]7176: g++ confused by friend and static member with same name
     * [155]7188: Segfault with template class and recursive (incorrect)
       initializer list
     * [156]7306: Regression: GCC 3.x fails to compile code with virtual
       inheritance if a method has a variable number of arguments
     * [157]7461: ctype<char>::classic_table() returns offset array on
       Cygwin
     * [158]7524: f(const float arg[3]) fails
     * [159]7584: Erroneous ambiguous base error on using declaration
     * [160]7676: Member template overloading problem
     * [161]7679: infinite loop when a right parenthesis is missing
     * [162]7811: default locale not taken from environment
     * [163]7961: compare( char *) implemented incorrectly in
       basic_string<>
     * [164]8071: basic_ostream::operator<<(streambuf*) loops forever if
       streambuf::underflow() leaves gptr() NULL (dups: [165]8127,
       [166]6745)
     * [167]8096: deque::at() throws std::range_error instead of
       std::out_of_range
     * [168]8127: cout << cin.rdbuf() infinite loop
     * [169]8218: Excessively large memory consumed for classes with large
       array members
     * [170]8287: GCC 3.2: Destructor called for non-constructed local
       object
     * [171]8347: empty vector range used in string construction causes
       core dump
     * [172]8348: fail() flag is set in istringstream when eof() flag is
       set
     * [173]8391: regression: infinite loop in cp/decl2.c(finish_file)

    C and optimizer bugs

     * [174]6627: -fno-align-functions doesn't seem to disable function
       alignment
     * [175]6631: life_analysis misoptimizes code to initialize fields of
       a structure
     * [176]7102: unsigned char division results in floating exception
     * [177]7120: Run once loop should *always* be unrolled
       (pessimization)
     * [178]7209: Bug involving array referencing and ?: operator
     * [179]7515: invalid inlining of global function with -O3
     * [180]7814: incorrect scheduling for glibc-2.2.92 strcpy test
     * [181]8467: bug in sibling call optimization

    Preprocessor bugs

     * [182]4890: incorrect line markers from the traditional preprocessor
     * [183]7357: -M option omits system headers files (making it the same
       as -MM)
     * [184]7358: Changes to Sun's make Dependencies
     * [185]7602: C++ header files found in CPLUS_INCLUDE_PATH treated as
       C headers
     * [186]7862: Interrupting GCC -MD removes .d file but not .o
     * [187]8190: Failed compilation deletes -MD dependency file
     * [188]8524: _Pragma within macro is improperly expanded

    x86 specific (Intel/AMD)

     * [189]5351: (i686-only) function pass-by-value structure copy
       corrupts stack ([190]7591 is a duplicate)
     * [191]6845, [192]7034, [193]7124, [194]7174: ICE's with
       -march=pentium3/pentium2/athlon (these are all the same underlying
       bug, in MMX register use)
     * [195]7134, [196]7375, [197]7390: ICE with -march=athlon (maybe same
       as above?)
     * [198]6890: xmmintrin.h, _MM_TRANSPOSE4_PS is broken
     * [199]6981: wrong code in 64-bit manipulation on x86
     * [200]7242: GCC -mcpu=pentium[23] doesn't define __tune_pentiumpro__
       macro
     * [201]7396: ix86: cmpgt_ss, cmpge_ss, cmpngt_ss, and cmpnge_ss SSE
       intrinsics are broken
     * [202]7630: GCC 3.2 breaks on Mozilla 1.0's JS sources with
       -march=pentium4
     * [203]7693: Typo in i386 mmintrin.h header
     * [204]7723: ICE - Pentium3 sse - GCC 3.2
     * [205]7951: ICE on -march=pentium4 -O2 -mfpmath=sse
     * [206]8146: (i686 only) gcc 3.2 miscompiles gcc 2.95.3

    PowerPC specific

     * [207]5967: GCC bug when profiling nested functions on powerpc
     * [208]6984: wrong code generated with -O2, -O3, -Os for do-while
       loop on PowerPC
     * [209]7114: PowerPC: ICE building strcoll.op from glibc-2.2.5
     * [210]7130: miscompiled code for GCC-3.1 on
       powerpc-unknown-linux-gnu with -funroll-all-loops
     * [211]7133: PowerPC ICE: unrecognizable insn
     * [212]7380: ICE in extract_insn, at recog.c:2148
     * [213]8252: ICE on Altivec code with optimization turned on
     * [214]8451: Altivec ICE in GCC 3.2

    HP/PA specific

     * [215]7250: __ashrdi3 returns wrong value on 32 bit hppa

    SPARC specific

     * [216]6668: when using --disable-multilib, libgcc_s.so is installed
       in the wrong place on sparc-solaris
     * [217]7151: ICE when compiling for UltraSPARC
     * [218]7335: SPARC: ICE in verify_wide_reg (flow.c:557) with long
       double and -O1
     * [219]7842: [REGRESSION] SPARC code gen bug

    ARM specific

     * [220]7856: [arm] invalid offset in constant pool reference
     * [221]7967: optimization produces wrong code (ARM)

    Alpha specific

     * [222]7374: __builtin_fabsl broken on alpha

    IBM s390 specific

     * [223]7370: ICE in fixup_var_refs_1 on s390x
     * [224]7409: loop optimization bug on s390x-linux-gnu
     * [225]8232: s390x: ICE when using bcmp with int length argument

    SCO specific

     * [226]7623: SCO OpenServer build fails with machmode.def: undefined
       symbol: BITS_PER_UNIT

    m68k/Coldfire specific

     * [227]8314: crtbegin, crtend need to be multilib'ed for this
       platform

    Documentation

     * [228]761: Document some undocumented options
     * [229]5610: Fix documentation about invoking SSE instructions
       (-mfpmath=sse)
     * [230]7484: List -Wmissing-declarations as C-only option
     * [231]7531: -mcmodel not documented for x86-64
     * [232]8120: Update documentation of bad use of ##
     __________________________________________________________________

GCC 3.2

   3.2 is a small bug fix release, but there is a change to the
   application binary interface (ABI), hence the change to the second part
   of the version number.

   The main purpose of the 3.2 release is to correct a couple of problems
   in the C++ ABI, with the intention of providing a stable interface
   going forward.  Accordingly, 3.2 is only a small change to 3.1.1.

  Bug Fixes

    C++

     * [233]7320: g++ 3.2 relocation problem
     * [234]7470: vtable: virtual function pointers not in declaration
       order

    libstdc++

     * [235]6410: Trouble with non-ASCII monetary symbols and wchar_t
     * [236]6503, [237]6642, [238]7186: Problems with comparing or
       subtracting various types of const and non-const iterators
     * [239]7216: ambiguity with basic_iostream::traits_type
     * [240]7220: problem with basic_istream::ignore(0,delimiter)
     * [241]7222: locale::operator==() doesn't work on std::locale("")
     * [242]7286: placement operator delete issue
     * [243]7442: cxxabi.h does not match the C++ ABI
     * [244]7445: poor performance of std::locale::classic() in
       multi-threaded applications

    x86-64 specific

     * [245]7291: off-by-one in generated inline bzero code for x86-64


    For questions related to the use of GCC, please consult these web
    pages and the [246]GCC manuals. If that fails, the
    [247]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [248]gcc@gcc.gnu.org. All of [249]our lists have public
    archives.

   Copyright (C) [250]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [251]maintained by the GCC team. Last modified
   2012-11-02[252].

References

   1. http://gcc.gnu.org/gcc-3.2/changes.html#3.2.3
   2. http://gcc.gnu.org/gcc-3.1/changes.html
   3. http://gcc.gnu.org/gcc-3.2/c++-abi.html
   4. http://gcc.gnu.org/PR3782
   5. http://gcc.gnu.org/PR6440
   6. http://gcc.gnu.org/PR7050
   7. http://gcc.gnu.org/PR7741
   8. http://gcc.gnu.org/PR7982
   9. http://gcc.gnu.org/PR8068
  10. http://gcc.gnu.org/PR8178
  11. http://gcc.gnu.org/PR8396
  12. http://gcc.gnu.org/PR8674
  13. http://gcc.gnu.org/PR9768
  14. http://gcc.gnu.org/PR9798
  15. http://gcc.gnu.org/PR9799
  16. http://gcc.gnu.org/PR9928
  17. http://gcc.gnu.org/PR10114
  18. http://gcc.gnu.org/PR10352
  19. http://gcc.gnu.org/PR10336
  20. http://gcc.gnu.org/PR8224
  21. http://gcc.gnu.org/PR8613
  22. http://gcc.gnu.org/PR8828
  23. http://gcc.gnu.org/PR9226
  24. http://gcc.gnu.org/PR9853
  25. http://gcc.gnu.org/PR9797
  26. http://gcc.gnu.org/PR9967
  27. http://gcc.gnu.org/PR10116
  28. http://gcc.gnu.org/PR10171
  29. http://gcc.gnu.org/PR10175
  30. http://gcc.gnu.org/PR8316
  31. http://gcc.gnu.org/PR9169
  32. http://gcc.gnu.org/PR9420
  33. http://gcc.gnu.org/PR9459
  34. http://gcc.gnu.org/PR9507
  35. http://gcc.gnu.org/PR9538
  36. http://gcc.gnu.org/PR9602
  37. http://gcc.gnu.org/PR9993
  38. http://gcc.gnu.org/PR10167
  39. http://gcc.gnu.org/PR9652
  40. http://gcc.gnu.org/PR10144
  41. http://gcc.gnu.org/PR8746
  42. http://gcc.gnu.org/PR9888
  43. http://gcc.gnu.org/PR9638
  44. http://gcc.gnu.org/PR9954
  45. http://gcc.gnu.org/PR7784
  46. http://gcc.gnu.org/PR7796
  47. http://gcc.gnu.org/PR8281
  48. http://gcc.gnu.org/PR8366
  49. http://gcc.gnu.org/PR8726
  50. http://gcc.gnu.org/PR9414
  51. http://gcc.gnu.org/PR10067
  52. http://gcc.gnu.org/PR7248
  53. http://gcc.gnu.org/PR8343
  54. http://gcc.gnu.org/PR9732
  55. http://gcc.gnu.org/PR10073
  56. http://gcc.gnu.org/PR7702
  57. http://gcc.gnu.org/PR9671
  58. http://gcc.gnu.org/PR8694
  59. http://gcc.gnu.org/PR9953
  60. http://gcc.gnu.org/PR10271
  61. http://gcc.gnu.org/PR6362
  62. http://gcc.gnu.org/PR10377
  63. http://gcc.gnu.org/PR6955
  64. http://gcc.gnu.org/PR5919
  65. http://gcc.gnu.org/PR7129
  66. http://gcc.gnu.org/PR7507
  67. http://gcc.gnu.org/PR7622
  68. http://gcc.gnu.org/PR7681
  69. http://gcc.gnu.org/PR9528
  70. http://gcc.gnu.org/PR8031
  71. http://gcc.gnu.org/PR8275
  72. http://gcc.gnu.org/PR8332
  73. http://gcc.gnu.org/PR8372
  74. http://gcc.gnu.org/PR8439
  75. http://gcc.gnu.org/PR8442
  76. http://gcc.gnu.org/PR8518
  77. http://gcc.gnu.org/PR8615
  78. http://gcc.gnu.org/PR8663
  79. http://gcc.gnu.org/PR8799
  80. http://gcc.gnu.org/PR9328
  81. http://gcc.gnu.org/PR9465
  82. http://gcc.gnu.org/PR47
  83. http://gcc.gnu.org/PR6745
  84. http://gcc.gnu.org/PR8214
  85. http://gcc.gnu.org/PR8493
  86. http://gcc.gnu.org/PR8332
  87. http://gcc.gnu.org/PR8503
  88. http://gcc.gnu.org/PR8727
  89. http://gcc.gnu.org/PR7445
  90. http://gcc.gnu.org/PR8230
  91. http://gcc.gnu.org/PR8399
  92. http://gcc.gnu.org/PR8662
  93. http://gcc.gnu.org/PR8707
  94. http://gcc.gnu.org/PR8708
  95. http://gcc.gnu.org/PR8790
  96. http://gcc.gnu.org/PR8887
  97. http://gcc.gnu.org/PR9076
  98. http://gcc.gnu.org/PR9151
  99. http://gcc.gnu.org/PR9168
 100. http://gcc.gnu.org/PR9269
 101. http://gcc.gnu.org/PR9322
 102. http://gcc.gnu.org/PR9433
 103. http://gcc.gnu.org/PR8032
 104. http://gcc.gnu.org/PR8639
 105. http://gcc.gnu.org/PR8794
 106. http://gcc.gnu.org/PR8832
 107. http://gcc.gnu.org/PR8988
 108. http://gcc.gnu.org/PR9492
 109. http://gcc.gnu.org/PR9267
 110. http://gcc.gnu.org/PR8344
 111. http://gcc.gnu.org/PR8524
 112. http://gcc.gnu.org/PR8880
 113. http://gcc.gnu.org/PR9090
 114. http://gcc.gnu.org/PR8588
 115. http://gcc.gnu.org/PR8599
 116. http://gcc.gnu.org/PR9506
 117. http://gcc.gnu.org/PR9484
 118. http://gcc.gnu.org/PR9292
 119. http://gcc.gnu.org/PR9293
 120. http://gcc.gnu.org/PR9295
 121. http://gcc.gnu.org/PR9296
 122. http://gcc.gnu.org/PR9316
 123. http://gcc.gnu.org/PR9493
 124. http://gcc.gnu.org/PR7341
 125. http://gcc.gnu.org/PR8947
 126. http://gcc.gnu.org/PR7448
 127. http://gcc.gnu.org/PR8882
 128. http://gcc.gnu.org/PR7445
 129. http://gcc.gnu.org/PR2521
 130. http://gcc.gnu.org/PR5661
 131. http://gcc.gnu.org/PR6419
 132. http://gcc.gnu.org/PR6994
 133. http://gcc.gnu.org/PR7150
 134. http://gcc.gnu.org/PR7160
 135. http://gcc.gnu.org/PR7228
 136. http://gcc.gnu.org/PR7266
 137. http://gcc.gnu.org/PR7353
 138. http://gcc.gnu.org/PR7411
 139. http://gcc.gnu.org/PR7478
 140. http://gcc.gnu.org/PR7526
 141. http://gcc.gnu.org/PR7721
 142. http://gcc.gnu.org/PR7803
 143. http://gcc.gnu.org/PR7754
 144. http://gcc.gnu.org/PR7788
 145. http://gcc.gnu.org/PR8031
 146. http://gcc.gnu.org/PR8055
 147. http://gcc.gnu.org/PR8067
 148. http://gcc.gnu.org/PR8134
 149. http://gcc.gnu.org/PR8149
 150. http://gcc.gnu.org/PR8160
 151. http://gcc.gnu.org/PR5607
 152. http://gcc.gnu.org/PR6579
 153. http://gcc.gnu.org/PR6803
 154. http://gcc.gnu.org/PR7176
 155. http://gcc.gnu.org/PR7188
 156. http://gcc.gnu.org/PR7306
 157. http://gcc.gnu.org/PR7461
 158. http://gcc.gnu.org/PR7524
 159. http://gcc.gnu.org/PR7584
 160. http://gcc.gnu.org/PR7676
 161. http://gcc.gnu.org/PR7679
 162. http://gcc.gnu.org/PR7811
 163. http://gcc.gnu.org/PR7961
 164. http://gcc.gnu.org/PR8071
 165. http://gcc.gnu.org/PR8127
 166. http://gcc.gnu.org/PR6745
 167. http://gcc.gnu.org/PR8096
 168. http://gcc.gnu.org/PR8127
 169. http://gcc.gnu.org/PR8218
 170. http://gcc.gnu.org/PR8287
 171. http://gcc.gnu.org/PR8347
 172. http://gcc.gnu.org/PR8348
 173. http://gcc.gnu.org/PR8391
 174. http://gcc.gnu.org/PR6627
 175. http://gcc.gnu.org/PR6631
 176. http://gcc.gnu.org/PR7102
 177. http://gcc.gnu.org/PR7120
 178. http://gcc.gnu.org/PR7209
 179. http://gcc.gnu.org/PR7515
 180. http://gcc.gnu.org/PR7814
 181. http://gcc.gnu.org/PR8467
 182. http://gcc.gnu.org/PR4890
 183. http://gcc.gnu.org/PR7357
 184. http://gcc.gnu.org/PR7358
 185. http://gcc.gnu.org/PR7602
 186. http://gcc.gnu.org/PR7862
 187. http://gcc.gnu.org/PR8190
 188. http://gcc.gnu.org/PR8524
 189. http://gcc.gnu.org/PR5351
 190. http://gcc.gnu.org/PR7591
 191. http://gcc.gnu.org/PR6845
 192. http://gcc.gnu.org/PR7034
 193. http://gcc.gnu.org/PR7124
 194. http://gcc.gnu.org/PR7174
 195. http://gcc.gnu.org/PR7134
 196. http://gcc.gnu.org/PR7375
 197. http://gcc.gnu.org/PR7390
 198. http://gcc.gnu.org/PR6890
 199. http://gcc.gnu.org/PR6981
 200. http://gcc.gnu.org/PR7242
 201. http://gcc.gnu.org/PR7396
 202. http://gcc.gnu.org/PR7630
 203. http://gcc.gnu.org/PR7693
 204. http://gcc.gnu.org/PR7723
 205. http://gcc.gnu.org/PR7951
 206. http://gcc.gnu.org/PR8146
 207. http://gcc.gnu.org/PR5967
 208. http://gcc.gnu.org/PR6984
 209. http://gcc.gnu.org/PR7114
 210. http://gcc.gnu.org/PR7130
 211. http://gcc.gnu.org/PR7133
 212. http://gcc.gnu.org/PR7380
 213. http://gcc.gnu.org/PR8252
 214. http://gcc.gnu.org/PR8451
 215. http://gcc.gnu.org/PR7250
 216. http://gcc.gnu.org/PR6668
 217. http://gcc.gnu.org/PR7151
 218. http://gcc.gnu.org/PR7335
 219. http://gcc.gnu.org/PR7842
 220. http://gcc.gnu.org/PR7856
 221. http://gcc.gnu.org/PR7967
 222. http://gcc.gnu.org/PR7374
 223. http://gcc.gnu.org/PR7370
 224. http://gcc.gnu.org/PR7409
 225. http://gcc.gnu.org/PR8232
 226. http://gcc.gnu.org/PR7623
 227. http://gcc.gnu.org/PR8314
 228. http://gcc.gnu.org/PR761
 229. http://gcc.gnu.org/PR5610
 230. http://gcc.gnu.org/PR7484
 231. http://gcc.gnu.org/PR7531
 232. http://gcc.gnu.org/PR8120
 233. http://gcc.gnu.org/PR7320
 234. http://gcc.gnu.org/PR7470
 235. http://gcc.gnu.org/PR6410
 236. http://gcc.gnu.org/PR6503
 237. http://gcc.gnu.org/PR6642
 238. http://gcc.gnu.org/PR7186
 239. http://gcc.gnu.org/PR7216
 240. http://gcc.gnu.org/PR7220
 241. http://gcc.gnu.org/PR7222
 242. http://gcc.gnu.org/PR7286
 243. http://gcc.gnu.org/PR7442
 244. http://gcc.gnu.org/PR7445
 245. http://gcc.gnu.org/PR7291
 246. http://gcc.gnu.org/onlinedocs/
 247. mailto:gcc-help@gcc.gnu.org
 248. mailto:gcc@gcc.gnu.org
 249. http://gcc.gnu.org/lists.html
 250. http://www.fsf.org/
 251. http://gcc.gnu.org/about.html
 252. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.1/index.html

                                    GCC 3.1

   July 27, 2002

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.1.1.

   The links below still apply to GCC 3.1.1.

   May 15, 2002

   The [2]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.1.

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   A list of [3]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed [4]new features, improvements, bug fixes, and other changes
   as well as test results to GCC. This [5]amazing group of volunteers is
   what makes GCC successful.

   For additional information about GCC please refer to the [6]GCC project
   web site or contact the [7]GCC development mailing list.

   To obtain GCC please use [8]our mirror sites, or our CVS server.
     __________________________________________________________________


    For questions related to the use of GCC, please consult these web
    pages and the [9]GCC manuals. If that fails, the
    [10]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [11]gcc@gcc.gnu.org. All of [12]our lists have public
    archives.

   Copyright (C) [13]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [14]maintained by the GCC team. Last modified
   2012-11-02[15].

References

   1. http://www.gnu.org/
   2. http://www.gnu.org/
   3. http://gcc.gnu.org/gcc-3.1/buildstat.html
   4. http://gcc.gnu.org/gcc-3.1/changes.html
   5. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   6. http://gcc.gnu.org/index.html
   7. mailto:gcc@gcc.gnu.org
   8. http://gcc.gnu.org/mirrors.html
   9. http://gcc.gnu.org/onlinedocs/
  10. mailto:gcc-help@gcc.gnu.org
  11. mailto:gcc@gcc.gnu.org
  12. http://gcc.gnu.org/lists.html
  13. http://www.fsf.org/
  14. http://gcc.gnu.org/about.html
  15. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.1/changes.html

                             GCC 3.1 Release Series
                        Changes, New Features, and Fixes

Additional changes in GCC 3.1.1

     * A bug related to how structures and unions are returned has been
       fixed for powerpc-*-netbsd*.
     * An important bug in the implementation of -fprefetch-loop-arrays
       has been fixed. Previously the optimization prefetched random
       blocks of memory for most targets except for i386.
     * The Java compiler now compiles Java programs much faster and also
       works with parallel make.
     * Nested functions have been fixed for mips*-*-netbsd*.
     * Some missing floating point support routines have beed added for
       mips*-*-netbsd*.
     * This [1]message gives additional information about the bugs fixed
       in this release.

Caveats

     * The -traditional C compiler option has been deprecated and will be
       removed in GCC 3.3. (It remains possible to preprocess non-C code
       with the traditional preprocessor.)
     * The default debugging format for most ELF platforms (including
       GNU/Linux and FreeBSD; notable exception is Solaris) has changed
       from stabs to DWARF2. This requires GDB 5.1.1 or later.

General Optimizer Improvements

     * Jan Hubicka, SuSE Labs, together with Richard Henderson, Red Hat,
       and Andreas Jaeger, SuSE Labs, has contributed [2]infrastructure
       for profile driven optimizations.
       Options -fprofile-arcs and -fbranch-probabilities can now be used
       to improve speed of the generated code by profiling the actual
       program behaviour on typical runs. In the absence of profile info
       the compiler attempts to guess the profile statically.
     * [3]SPEC2000 and SPEC95 benchmark suites are now used daily to
       monitor performance of the generated code.
       According to the SPECInt2000 results on an AMD Athlon CPU, the code
       generated by GCC 3.1 is 6% faster on the average (8.2% faster with
       profile feedback) compared to GCC 3.0. The code produced by GCC 3.0
       is about 2.1% faster compared to 2.95.3. Tests were done using the
       -O2 -march=athlon command-line options.
     * Alexandre Oliva, of Red Hat, has generalized the tree inlining
       infrastructure developed by CodeSourcery, LLC for the C++ front
       end, so that it is now used in the C front end too. Inlining
       functions as trees exposes them earlier to the compiler, giving it
       more opportunities for optimization.
     * Support for data prefetching instructions has been added to the GCC
       back end and several targets. A new __builtin_prefetch intrinsic is
       available to explicitly insert prefetch instructions and
       experimental support for loop array prefetching has been added (see
       -fprefetch-loop-array documentation).
     * Support for emitting debugging information for macros has been
       added for DWARF2. It is activated using -g3.

New Languages and Language specific improvements

  C/C++

     * A few more [4]ISO C99 features.
     * The preprocessor is 10-50% faster than the preprocessor in GCC 3.0.
     * The preprocessor's symbol table has been merged with the symbol
       table of the C, C++ and Objective-C front ends.
     * The preprocessor consumes less memory than the preprocessor in GCC
       3.0, often significantly so. On normal input files, it typically
       consumes less memory than pre-3.0 cccp-based GCC, too.

  C++

     * -fhonor-std and -fno-honor-std have been removed. -fno-honor-std
       was a workaround to allow std compliant code to work with the
       non-std compliant libstdc++-v2. libstdc++-v3 is std compliant.
     * The C++ ABI has been fixed so that void (A::*)() const is mangled
       as "M1AKFvvE", rather than "MK1AFvvE" as before. This change only
       affects pointer to cv-qualified member function types.
     * The C++ ABI has been changed to correctly handle this code:
    struct A {
      void operator delete[] (void *, size_t);
    };

    struct B : public A {
    };

    new B[10];

       The amount of storage allocated for the array will be greater than
       it was in 3.0, in order to store the number of elements in the
       array, so that the correct size can be passed to operator delete[]
       when the array is deleted. Previously, the value passed to operator
       delete[] was unpredictable.
       This change will only affect code that declares a two-argument
       operator delete[] with a second parameter of type size_t in a base
       class, and does not override that definition in a derived class.
     * The C++ ABI has been changed so that:
    struct A {
      void operator delete[] (void *, size_t);
      void operator delete[] (void *);
    };

       does not cause unnecessary storage to be allocated when an array of
       A objects is allocated.
       This change will only affect code that declares both of these forms
       of operator delete[], and declared the two-argument form before the
       one-argument form.
     * The C++ ABI has been changed so that when a parameter is passed by
       value, any cleanup for that parameter is performed in the caller,
       as specified by the ia64 C++ ABI, rather than the called function
       as before. As a result, classes with a non-trivial destructor but a
       trivial copy constructor will be passed and returned by invisible
       reference, rather than by bitwise copy as before.
     * G++ now supports the "named return value optimization": for code
       like
    A f () {
      A a;
      ...
      return a;
    }

       G++ will allocate a in the return value slot, so that the return
       becomes a no-op. For this to work, all return statements in the
       function must return the same variable.
     * Improvements to the C++ library are listed in [5]the libstdc++-v3
       FAQ.

  Objective-C

     * Annoying linker warnings (due to incorrect code being generated)
       have been fixed.
     * If a class method cannot be found, the compiler no longer issues a
       warning if a corresponding instance method exists in the root
       class.
     * Forward @protocol declarations have been fixed.
     * Loading of categories has been fixed in certain situations (GNU run
       time only).
     * The class lookup in the run-time library has been rewritten so that
       class method dispatch is more than twice as fast as it used to be
       (GNU run time only).

  Java

     * libgcj now includes RMI, java.lang.ref.*, javax.naming, and
       javax.transaction.
     * Property files and other system resources can be compiled into
       executables which use libgcj using the new gcj --resource feature.
     * libgcj has been ported to more platforms. In particular there is
       now a mostly-functional mingw32 (Windows) target port.
     * JNI and CNI invocation interfaces were implemented, so gcj-compiled
       Java code can now be called from a C/C++ application.
     * gcj can now use builtin functions for certain known methods, for
       instance Math.cos.
     * gcj can now automatically remove redundant array-store checks in
       some common cases.
     * The --no-store-checks optimization option was added. This can be
       used to omit runtime store checks for code which is known not to
       throw ArrayStoreException
     * The following third party interface standards were added to libgcj:
       org.w3c.dom and org.xml.sax.
     * java.security has been merged with GNU Classpath. The new package
       is now JDK 1.2 compliant, and much more complete.
     * A bytecode verifier was added to the libgcj interpreter.
     * java.lang.Character was rewritten to comply with the Unicode 3.0
       standard, and improve performance.
     * Partial support for many more locales was added to libgcj.
     * Socket timeouts have been implemented.
     * libgcj has been merged into a single shared library. There are no
       longer separate shared libraries for the garbage collector and
       zlib.
     * Several performance improvements were made to gcj and libgcj:
          + Hash synchronization (thin locks)
          + A special allocation path for finalizer-free objects
          + Thread-local allocation
          + Parallel GC, and other GC tweaks

  Fortran

   Fortran improvements are listed in [6]the Fortran documentation.

  Ada

   [7]Ada Core Technologies, Inc, has contributed its GNAT Ada 95 front
   end and associated tools. The GNAT compiler fully implements the Ada
   language as defined by the ISO/IEC 8652 standard.

   Please note that the integration of the Ada front end is still work in
   progress.

New Targets and Target Specific Improvements

     * Hans-Peter Nilsson has contributed a port to [8]MMIX, the CPU
       architecture used in new editions of Donald E. Knuth's The Art of
       Computer Programming.
     * [9]Axis Communications has contributed its port to the CRIS CPU
       architecture, used in the ETRAX system-on-a-chip series. See
       [10]Axis' developer site for technical information.
     * Alexandre Oliva, of Red Hat, has contributed a port to the
       [11]SuperH SH5 64-bit RISC microprocessor architecture, extending
       the existing SH port.
     * UltraSPARC is fully supported in 64-bit mode. The option -m64
       enables it.
     * For compatibility with the Sun compiler #pragma redefine_extname
       has been implemented on Solaris.
     * The x86 back end has had some noticeable work done to it.
          + SuSE Labs developers Jan Hubicka, Bo Thorsen and Andreas
            Jaeger have contributed a port to the AMD x86-64 architecture.
            For more information on x86-64 see [12]http://www.x86-64.org.
          + The compiler now supports MMX, 3DNow!, SSE, and SSE2
            instructions. Options -mmmx, -m3dnow, -msse, and -msse2 will
            enable the respective instruction sets. Intel C++ compatible
            MMX/3DNow!/SSE intrinsics are implemented. SSE2 intrinsics
            will be added in next major release.
          + Following those improvements, targets for Pentium MMX, K6-2,
            K6-3, Pentium III, Pentium 4, and Athlon 4 Mobile/XP/MP were
            added. Refer to the documentation on -march= and -mcpu=
            options for details.
          + For those targets that support it, -mfpmath=sse will cause the
            compiler to generate SSE/SSE2 instructions for floating point
            math instead of x87 instructions. Usually, this will lead to
            quicker code -- especially on the Pentium 4. Note that only
            scalar floating point instructions are used and GCC does not
            exploit SIMD features yet.
          + Prefetch support has been added to the Pentium III, Pentium 4,
            K6-2, K6-3, and Athlon series.
          + Code generated for floating point to integer conversions has
            been improved leading to better performance of many 3D
            applications.
     * The PowerPC back end has added 64-bit PowerPC GNU/Linux support.
     * C++ support for AIX has been improved.
     * Aldy Hernandez, of Red Hat, Inc, has contributed extensions to the
       PowerPC port supporting the AltiVec programming model (SIMD). The
       support, though presently useful, is experimental and is expected
       to stabilize for 3.2. The support is written to conform to
       Motorola's AltiVec specs. See -maltivec.

Obsolete Systems

   Support for a number of older systems has been declared obsolete in GCC
   3.1. Unless there is activity to revive them, the next release of GCC
   will have their sources permanently removed.

   All configurations of the following processor architectures have been
   declared obsolete:
     * MIL-STD-1750A, 1750a-*-*
     * AMD A29k, a29k-*-*
     * Convex, c*-convex-*
     * Clipper, clipper-*-*
     * Elxsi, elxsi-*-*
     * Intel i860, i860-*-*
     * Sun picoJava, pj-*-* and pjl-*-*
     * Western Electric 32000, we32k-*-*

   Most configurations of the following processor architectures have been
   declared obsolete, but we are preserving a few systems which may have
   active developers. It is unlikely that the remaining systems will
   survive much longer unless we see definite signs of port activity.
     * Motorola 88000 except
          + Generic a.out, m88k-*-aout*
          + Generic SVR4, m88k-*-sysv4
          + OpenBSD, m88k-*-openbsd*
     * NS32k except
          + NetBSD, ns32k-*-netbsd*
          + OpenBSD, ns32k-*-openbsd*.
     * ROMP except
          + OpenBSD, romp-*-openbsd*.

   Finally, only some configurations of these processor architectures are
   being obsoleted.
     * Alpha:
          + OSF/1, alpha*-*-osf[123]*. (Digital Unix and Tru64 Unix, aka
            alpha*-*-osf[45], are still supported.)
     * ARM:
          + RISCiX, arm-*-riscix*.
     * i386:
          + 386BSD, i?86-*-bsd*
          + Chorus, i?86-*-chorusos*
          + DG/UX, i?86-*-dgux*
          + FreeBSD 1.x, i?86-*-freebsd1.*
          + IBM AIX, i?86-*-aix*
          + ISC UNIX, i?86-*-isc*
          + GNU/Linux with pre-BFD linker, i?86-*-linux*oldld*
          + NEXTstep, i?86-next-*
          + OSF UNIX, i?86-*-osf1* and i?86-*-osfrose*
          + RTEMS/coff, i?86-*-rtemscoff*
          + RTEMS/go32, i?86-go32-rtems*
          + Sequent/BSD, i?86-sequent-bsd*
          + Sequent/ptx before version 3, i?86-sequent-ptx[12]* and
            i?86-sequent-sysv3*
          + SunOS, i?86-*-sunos*
     * Motorola 68000:
          + Altos, m68[k0]*-altos-*
          + Apollo, m68[k0]*-apollo-*
          + Apple A/UX, m68[k0]*-apple-*
          + Bull, m68[k0]*-bull-*
          + Convergent, m68[k0]*-convergent-*
          + Generic SVR3, m68[k0]*-*-sysv3*
          + ISI, m68[k0]*-isi-*
          + LynxOS, m68[k0]*-*-lynxos*
          + NEXT, m68[k0]*-next-*
          + RTEMS/coff, m68[k0]*-*-rtemscoff*
          + Sony, m68[k0]*-sony-*
     * MIPS:
          + DEC Ultrix, mips-*-ultrix* and mips-dec-*
          + Generic BSD, mips-*-bsd*
          + Generic System V, mips-*-sysv*
          + IRIX before version 5, mips-sgi-irix[1234]*
          + RiscOS, mips-*-riscos*
          + Sony, mips-sony-*
          + Tandem, mips-tandem-*
     * SPARC:
          + RTEMS/a.out, sparc-*-rtemsaout*.

Documentation improvements

     * The old manual ("Using and Porting the GNU Compiler Collection")
       has been replaced by a users manual ("Using the GNU Compiler
       Collection") and a separate internals reference manual ("GNU
       Compiler Collection Internals").
     * More complete and much improved documentation about GCC's internal
       representation used by the C and C++ front ends.
     * Many cleanups and improvements in general.


    For questions related to the use of GCC, please consult these web
    pages and the [13]GCC manuals. If that fails, the
    [14]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [15]gcc@gcc.gnu.org. All of [16]our lists have public
    archives.

   Copyright (C) [17]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [18]maintained by the GCC team. Last modified
   2013-10-31[19].

References

   1. http://gcc.gnu.org/ml/gcc/2002-07/msg01208.html
   2. http://gcc.gnu.org/news/profiledriven.html
   3. http://gcc.gnu.org/benchmarks/
   4. http://gcc.gnu.org/c99status.html
   5. http://gcc.gnu.org/onlinedocs/libstdc++/faq.html
   6. http://gcc.gnu.org/onlinedocs/gcc-3.1.1/g77/News.html
   7. http://www.adacore.com/
   8. http://www-cs-faculty.stanford.edu/~knuth/mmix.html
   9. http://www.axis.com/
  10. http://developer.axis.com/
  11. http://www.superh.com/
  12. http://www.x86-64.org/
  13. http://gcc.gnu.org/onlinedocs/
  14. mailto:gcc-help@gcc.gnu.org
  15. mailto:gcc@gcc.gnu.org
  16. http://gcc.gnu.org/lists.html
  17. http://www.fsf.org/
  18. http://gcc.gnu.org/about.html
  19. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.0/gcc-3.0.html

                                   GCC 3.0.4

   February 20, 2002

   The [1]GNU project and the GCC developers are pleased to announce the
   release of GCC 3.0.4, which is a bug-fix release for the GCC 3.0
   series.

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   GCC 3.0.x has several new optimizations, new targets, new languages and
   many other new features, relative to GCC 2.95.x. See the [2]new
   features page for a more complete list.

   A list of [3]successful builds is updated as new information becomes
   available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, test results, bug fixes, etc to GCC. This
   [4]amazing group of volunteers is what makes GCC successful.

   And finally, we can't in good conscience fail to mention some
   [5]caveats to using GCC 3.0.x.

   For additional information about GCC please refer to the [6]GCC project
   web site or contact the [7]GCC development mailing list.

   To obtain GCC please use [8]our mirror sites, or our CVS server.
     __________________________________________________________________

Previous 3.0.x Releases

   December 20, 2001: GCC 3.0.3 has been released.
   October 25, 2001: GCC 3.0.2 has been released.
   August 20, 2001: GCC 3.0.1 has been released.
   June 18, 2001: GCC 3.0 has been released.


    For questions related to the use of GCC, please consult these web
    pages and the [9]GCC manuals. If that fails, the
    [10]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [11]gcc@gcc.gnu.org. All of [12]our lists have public
    archives.

   Copyright (C) [13]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [14]maintained by the GCC team. Last modified
   2012-11-02[15].

References

   1. http://www.gnu.org/
   2. http://gcc.gnu.org/gcc-3.0/features.html
   3. http://gcc.gnu.org/gcc-3.0/buildstat.html
   4. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   5. http://gcc.gnu.org/gcc-3.0/caveats.html
   6. http://gcc.gnu.org/index.html
   7. mailto:gcc@gcc.gnu.org
   8. http://gcc.gnu.org/mirrors.html
   9. http://gcc.gnu.org/onlinedocs/
  10. mailto:gcc-help@gcc.gnu.org
  11. mailto:gcc@gcc.gnu.org
  12. http://gcc.gnu.org/lists.html
  13. http://www.fsf.org/
  14. http://gcc.gnu.org/about.html
  15. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.0/features.html

                              GCC 3.0 New Features

Additional changes in GCC 3.0.4

     * GCC 3.0 now supports newer versions of the [1]NetBSD operating
       system, which use the ELF object file format, on x86 processors.
     * Correct debugging information is generated from functions that have
       lines from multiple files (e.g. yacc output).
     * A fix for whitespace handling in the -traditional preprocessor,
       which can affect Fortran.
     * Fixes to the exception handling runtime.
     * More fixes for bad code generation in C++.
     * A fix for shared library generation under AIX 4.3.
     * Documentation updates.
     * Port of GCC to Tensilica's Xtensa processor contributed.
     * A fix for compiling the PPC Linux kernel (FAT fs wouldn't link).

Additional changes in GCC 3.0.3

     * A fix to correct an accidental change to the PowerPC ABI.
     * Fixes for bad code generation on a variety of architectures.
     * Improvements to the debugging information generated for C++
       classes.
     * Fixes for bad code generation in C++.
     * A fix to avoid crashes in the C++ demangler.
     * A fix to the C++ standard library to avoid buffer overflows.
     * Miscellaneous improvements for a variety of architectures.

Additional changes in GCC 3.0.2

     * Fixes for bad code generation during loop unrolling.
     * Fixes for bad code generation by the sibling call optimization.
     * Minor improvements to x86 code generation.
     * Implementation of function descriptors in C++ vtables for IA64.
     * Numerous minor bug-fixes.

Additional changes in GCC 3.0.1

     * C++ fixes for incorrect code-generation.
     * Improved cross-compiling support for the C++ standard library.
     * Fixes for some embedded targets that worked in GCC 2.95.3, but not
       in GCC 3.0.
     * Fixes for various exception-handling bugs.
     * A port to the S/390 architecture.

General Optimizer Improvements

     * [2]Basic block reordering pass.
     * New if-conversion pass with support for conditional (predicated)
       execution.
     * New tail call and sibling call elimination optimizations.
     * New register renaming pass.
     * New (experimental) [3]static single assignment (SSA) representation
       support.
     * New dead-code elimination pass implemented using the SSA
       representation.
     * [4]Global null pointer test elimination.
     * [5]Global code hoisting/unification.
     * More builtins and optimizations for stdio.h, string.h and old BSD
       functions, as well as for ISO C99 functions.
     * New builtin __builtin_expect for giving hints to the branch
       predictor.

New Languages and Language specific improvements

     * The GNU Compiler for the Java(TM) language (GCJ) is now integrated
       and supported, including the run-time library containing most
       common non-GUI Java classes, a bytecode interpreter, and the Boehm
       conservative garbage collector. Many bugs have been fixed. GCJ can
       compile Java source or Java bytecodes to either native code or Java
       class files, and supports native methods written in either the
       standard JNI or the more efficient and convenient CNI.
     * Here is a [6]partial list of C++ improvements, both new features
       and those no longer supported.
     * New C++ ABI. On the IA-64 platform GCC is capable of
       inter-operating with other IA-64 compilers.
     * The new ABI also significantly reduces the size of symbol and debug
       information.
     * New [7]C++ support library and many C++ bug fixes, vastly improving
       our conformance to the ISO C++ standard.
     * New [8]inliner for C++.
     * Rewritten C preprocessor, integrated into the C, C++ and Objective
       C compilers, with very many improvements including ISO C99 support
       and [9]improvements to dependency generation.
     * Support for more [10]ISO C99 features.
     * Many improvements to support for checking calls to format functions
       such as printf and scanf, including support for ISO C99 format
       features, extensions from the Single Unix Specification and GNU
       libc 2.2, checking of strfmon formats and features to assist in
       auditing for format string security bugs.
     * New warnings for C code that may have undefined semantics because
       of violations of sequence point rules in the C standard (such as a
       = a++;, a[n] = b[n++]; and a[i++] = i;), included in -Wall.
     * Additional warning option -Wfloat-equal.
     * Improvements to -Wtraditional.
     * Fortran improvements are listed in [11]the Fortran documentation.

New Targets and Target Specific Improvements

     * New x86 back end, generating much improved code.
     * Support for a generic i386-elf target contributed.
     * New option to emit x86 assembly code using Intel style syntax
       (-mintel-syntax).
     * HPUX 11 support contributed.
     * Improved PowerPC code generation, including scheduled prologue and
       epilogue.
     * Port of GCC to Intel's IA-64 processor contributed.
     * Port of GCC to Motorola's MCore 210 and 340 contributed.
     * New unified back-end for Arm, Thumb and StrongArm contributed.
     * Port of GCC to Intel's XScale processor contributed.
     * Port of GCC to Atmel's AVR microcontrollers contributed.
     * Port of GCC to Mitsubishi's D30V processor contributed.
     * Port of GCC to Matsushita's AM33 processor (a member of the MN10300
       processor family) contributed.
     * Port of GCC to Fujitsu's FR30 processor contributed.
     * Port of GCC to Motorola's 68HC11 and 68HC12 processors contributed.
     * Port of GCC to Sun's picoJava processor core contributed.

Documentation improvements

     * Substantially rewritten and improved C preprocessor manual.
     * Many improvements to other documentation.
     * Manpages for gcc, cpp and gcov are now generated automatically from
       the master Texinfo manual, eliminating the problem of manpages
       being out of date. (The generated manpages are only extracts from
       the full manual, which is provided in Texinfo form, from which
       info, HTML, other formats and a printed manual can be generated.)
     * Generated info files are included in the release tarballs alongside
       their Texinfo sources, avoiding problems on some platforms with
       building makeinfo as part of the GCC distribution.

Other significant improvements

     * Garbage collection used internally by the compiler for most memory
       allocation instead of obstacks.
     * Lengauer and Tarjan algorithm used for computing dominators in the
       CFG. This algorithm can be significantly faster and more space
       efficient than our older algorithm.
     * gccbug script provided to assist in submitting bug reports to our
       bug tracking system. (Bug reports previously submitted directly to
       our mailing lists, for which you received no bug tracking number,
       should be submitted again using gccbug if you can reproduce the
       problem with GCC 3.0.)
     * The internal libgcc library is [12]built as a shared library on
       systems that support it.
     * Extensive testsuite included with GCC, with many new tests. In
       addition to tests for GCC bugs that have been fixed, many tests
       have been added for language features, compiler warnings and
       builtin functions.
     * Additional language-independent warning options -Wpacked, -Wpadded,
       -Wunreachable-code and -Wdisabled-optimization.
     * Target-independent options -falign-functions, -falign-loops and
       -falign-jumps.

   Plus a great many bug fixes and almost all the [13]features found in
   GCC 2.95.


    For questions related to the use of GCC, please consult these web
    pages and the [14]GCC manuals. If that fails, the
    [15]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [16]gcc@gcc.gnu.org. All of [17]our lists have public
    archives.

   Copyright (C) [18]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [19]maintained by the GCC team. Last modified
   2013-12-03[20].

References

   1. http://www.netbsd.org/
   2. http://gcc.gnu.org/news/reorder.html
   3. http://gcc.gnu.org/news/ssa.html
   4. http://gcc.gnu.org/news/null.html
   5. http://gcc.gnu.org/news/unify.html
   6. http://gcc.gnu.org/gcc-3.0/c++features.html
   7. http://gcc.gnu.org/libstdc++/
   8. http://gcc.gnu.org/news/inlining.html
   9. http://gcc.gnu.org/news/dependencies.html
  10. http://gcc.gnu.org/c99status.html
  11. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
  12. http://gcc.gnu.org/gcc-3.0/libgcc.html
  13. http://gcc.gnu.org/gcc-2.95/features.html
  14. http://gcc.gnu.org/onlinedocs/
  15. mailto:gcc-help@gcc.gnu.org
  16. mailto:gcc@gcc.gnu.org
  17. http://gcc.gnu.org/lists.html
  18. http://www.fsf.org/
  19. http://gcc.gnu.org/about.html
  20. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-3.0/caveats.html

                                GCC 3.0 Caveats

     * -fstrict-aliasing is now part of -O2 and higher optimization
       levels. This allows the compiler to assume the strictest aliasing
       rules applicable to the language being compiled. For C and C++,
       this activates optimizations based on the type of expressions. This
       optimization may thus break old, non-compliant code.
     * Enumerations are now properly promoted to int in function
       parameters and function returns. Normally this change is not
       visible, but when using -fshort-enums this is an ABI change.
     * The undocumented extension that allowed C programs to have a label
       at the end of a compound statement has been deprecated and may be
       removed in a future version. Programs that now generate a warning
       about this may be fixed by adding a null statement (a single
       semicolon) after the label.
     * The poorly documented extension that allowed string constants in C,
       C++ and Objective C to contain unescaped newlines has been
       deprecated and may be removed in a future version. Programs using
       this extension may be fixed in several ways: the bare newline may
       be replaced by \n, or preceded by \n\, or string concatenation may
       be used with the bare newline preceded by \n" and " placed at the
       start of the next line.
     * The Chill compiler is not included in GCC 3.0, because of the lack
       of a volunteer to convert it to use garbage collection.
     * Certain non-standard iostream methods from earlier versions of
       libstdc++ are not included in libstdc++ v3, i.e. filebuf::attach,
       ostream::form, and istream::gets.
     * The new C++ ABI is not yet fully supported by current (as of
       2001-07-01) releases and development versions of GDB, or any
       earlier versions. There is a problem setting breakpoints by line
       number, and other related issues that have been fixed in GCC 3.0
       but not yet handled in GDB:
       [1]http://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html


    For questions related to the use of GCC, please consult these web
    pages and the [2]GCC manuals. If that fails, the
    [3]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [4]gcc@gcc.gnu.org. All of [5]our lists have public archives.

   Copyright (C) [6]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [7]maintained by the GCC team. Last modified
   2012-11-02[8].

References

   1. http://gcc.gnu.org/ml/gcc-bugs/2001-06/msg00421.html
   2. http://gcc.gnu.org/onlinedocs/
   3. mailto:gcc-help@gcc.gnu.org
   4. mailto:gcc@gcc.gnu.org
   5. http://gcc.gnu.org/lists.html
   6. http://www.fsf.org/
   7. http://gcc.gnu.org/about.html
   8. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/index.html

                                    GCC 2.95

   March 16, 2001: The GNU project and the GCC developers are pleased to
   announce the release of GCC version 2.95.3.

Release History

   GCC 2.95.3
          March 16, 2001

   GCC 2.95.2
          October 27, 1999

   GCC 2.95.1
          August 19, 1999

   GCC 2.95
          July 31, 1999. This is the first release of GCC since the April
          1999 GCC/EGCS reunification and includes nearly a year's worth
          of new development and bugfixes.

References and Acknowledgements

   GCC used to stand for the GNU C Compiler, but since the compiler
   supports several other languages aside from C, it now stands for the
   GNU Compiler Collection.

   The whole suite has been extensively [1]regression tested and
   [2]package tested. It should be reliable and suitable for widespread
   use.

   The compiler has several new optimizations, new targets, new languages
   and other new features. See the [3]new features page for a more
   complete list of new features found in the GCC 2.95 releases.

   The sources include installation instructions in both HTML and
   plaintext forms in the install directory in the distribution. However,
   the most up to date [4]installation instructions and [5]build/test
   status are on the web pages. We will update those pages as new
   information becomes available.

   The GCC developers would like to thank the numerous people that have
   contributed new features, test results, bugfixes, etc to GCC. This
   [6]amazing group of volunteers is what makes GCC successful.

   And finally, we can't in good conscience fail to mention some
   [7]caveats to using GCC 2.95.

   Download GCC 2.95 from one of our many [8]mirror sites.

   For additional information about GCC please see the [9]GCC project web
   server or contact the [10]GCC development mailing list.


    For questions related to the use of GCC, please consult these web
    pages and the [11]GCC manuals. If that fails, the
    [12]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [13]gcc@gcc.gnu.org. All of [14]our lists have public
    archives.

   Copyright (C) [15]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [16]maintained by the GCC team. Last modified
   2012-11-02[17].

References

   1. http://gcc.gnu.org/gcc-2.95/regress.html
   2. http://gcc.gnu.org/gcc-2.95/othertest.html
   3. http://gcc.gnu.org/gcc-2.95/features.html
   4. http://gcc.gnu.org/install/
   5. http://gcc.gnu.org/gcc-2.95/buildstat.html
   6. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   7. http://gcc.gnu.org/gcc-2.95/caveats.html
   8. http://gcc.gnu.org/mirrors.html
   9. http://gcc.gnu.org/index.html
  10. mailto:gcc@gcc.gnu.org
  11. http://gcc.gnu.org/onlinedocs/
  12. mailto:gcc-help@gcc.gnu.org
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/lists.html
  15. http://www.fsf.org/
  16. http://gcc.gnu.org/about.html
  17. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/features.html

                             GCC 2.95 New Features

     * General Optimizer Improvements:
          + [1]Localized register spilling to improve speed and code
            density especially on small register class machines.
          + [2]Global CSE using lazy code motion algorithms.
          + [3]Improved global constant/copy propagation.
          + [4]Improved control flow graph analysis and manipulation.
          + [5]Local dead store elimination.
          + [6]Memory Load hoisting/store sinking in loops.
          + [7]Type based alias analysis is enabled by default. Note this
            feature will expose bugs in the Linux kernel. Please refer to
            the FAQ (as shipped with GCC 2.95) for additional information
            on this issue.
          + Major revamp of GIV detection, combination and simplification
            to improve loop performance.
          + Major improvements to register allocation and reloading.
     * New Languages and Language specific improvements
          + [8]Many C++ improvements.
          + [9]Many Fortran improvements.
          + [10]Java front-end has been integrated. [11]runtime library is
            available separately.
          + [12]ISO C99 support
          + [13]Chill front-end and runtime has been integrated.
          + Boehm garbage collector support in libobjc.
          + More support for various pragmas which appear in vendor
            include files
     * New Targets and Target Specific Improvements
          + [14]SPARC backend rewrite.
          + -mschedule=8000 will optimize code for PA8000 class
            processors; -mpa-risc-2-0 will generate code for PA2.0
            processors
          + Various micro-optimizations for the ia32 port. K6
            optimizations
          + Compiler will attempt to align doubles in the stack on the
            ia32 port
          + Alpha EV6 support
          + PowerPC 750
          + RS6000/PowerPC: -mcpu=401 was added as an alias for -mcpu=403.
            -mcpu=e603e was added to do -mcpu=603e and -msoft-float.
          + c3x, c4x
          + HyperSPARC
          + SparcLite86x
          + sh4
          + Support for new systems (OpenBSD, FreeBSD, UWIN, Interix,
            arm-linux)
          + vxWorks targets include support for vxWorks threads
          + StrongARM 110 and ARM9 support added. ARM Scheduling
            parameters rewritten.
          + Various changes to the MIPS port to avoid assembler macros,
            which in turn improves performance
          + Various performance improvements to the i960 port.
          + Major rewrite of ns32k port
     * Other significant improvements
          + [15]Ability to dump cfg information and display it using vcg.
          + The new faster scheme for fixing vendor header files is
            enabled by default.
          + Experimental internationalization support.
          + multibyte character support
          + Some compile-time speedups for pathological problems
          + Better support for complex types
     * Plus the usual mountain of bugfixes
     * Core compiler is based on the gcc2 development tree from Sept 30,
       1998, so we have all of the [16]features found in GCC 2.8.

Additional Changes in GCC 2.95.1

     * Generic bugfixes and improvements
          + Various documentation fixes related to the GCC/EGCS merger.
          + Fix memory management bug which could lead to spurious aborts,
            core dumps or random parsing errors in the compiler.
          + Fix a couple bugs in the dwarf1 and dwarf2 debug record
            support.
          + Fix infinite loop in the CSE optimizer.
          + Avoid undefined behavior in compiler FP emulation code
          + Fix install problem when prefix is overridden on the make
            install command.
          + Fix problem with unwanted installation of assert.h on some
            systems.
          + Fix problem with finding the wrong assembler in a single tree
            build.
          + Avoid increasing the known alignment of a register that is
            already known to be a pointer.
     * Platform specific bugfixes and improvements
          + Codegen bugfix for prologue/epilogue for cpu32 target.
          + Fix long long code generation bug for the Coldfire target.
          + Fix various aborts in the SH compiler.
          + Fix bugs in libgcc support library for the SH.
          + Fix alpha ev6 code generation bug.
          + Fix problems with EXIT_SUCCESS/EXIT_FAILURE redefinitions on
            AIX platforms.
          + Fix -fpic code generation bug for rs6000/ppc svr4 targets.
          + Fix varargs/stdarg code generation bug for rs6000/ppc svr4
            targets.
          + Fix weak symbol handling for rs6000/ppc svr4 targets.
          + Fix various problems with 64bit code generation for the
            rs6000/ppc port.
          + Fix codegen bug which caused tetex to be mis-compiled on the
            x86.
          + Fix compiler abort in new cfg code exposed by x86 port.
          + Fix out of range array reference in code convert flat
            registers to the x87 stacked FP register file.
          + Fix minor vxworks configuration bug.
          + Fix return type of bsearch for SunOS 4.x.
     * Language & Runtime specific fixes.
          + The G++ signature extension has been deprecated. It will be
            removed in the next major release of G++. Use of signatures
            will result in a warning from the compiler.
          + Several bugs relating to templates and namespaces were fixed.
          + A bug that caused crashes when combining templates with -g on
            DWARF1 platforms was fixed.
          + Pointers-to-members, virtual functions, and multiple
            inheritance should now work together correctly.
          + Some code-generation bugs relating to function try blocks were
            fixed.
          + G++ is a little bit more lenient with certain archaic
            constructs than in GCC 2.95.
          + Fix to prevent shared library version #s from bring truncated
            to 1 digit
          + Fix missing std:: in the libstdc++ library.
          + Fix stream locking problems in libio.
          + Fix problem in java compiler driver.

Additional Changes in GCC 2.95.2

   The -fstrict-aliasing is not enabled by default for GCC 2.95.2. While
   the optimizations performed by -fstrict-aliasing are valid according to
   the C and C++ standards, the optimization have caused some problems,
   particularly with old non-conforming code.

   The GCC developers are experimenting with ways to warn users about code
   which violates the C/C++ standards, but those warnings are not ready
   for widespread use at this time. Rather than wait for those warnings
   the GCC developers have chosen to disable -fstrict-aliasing by default
   for the GCC 2.95.2 release.

   We strongly encourage developers to find and fix code which violates
   the C/C++ standards as -fstrict-aliasing may be enabled by default in
   future releases. Use the option -fstrict-aliasing to re-enable these
   optimizations.
     * Generic bugfixes and improvements
          + Fix incorrectly optimized memory reference in global common
            subexpression elimination (GCSE) optimization pass.
          + Fix code generation bug in regmove.c in which it could
            incorrectly change a "const" value.
          + Fix bug in optimization of conditionals involving volatile
            memory references.
          + Avoid over-allocation of stack space for some procedures.
          + Fixed bug in the compiler which caused incorrect optimization
            of an obscure series of bit manipulations, shifts and
            arithmetic.
          + Fixed register allocator bug which caused teTeX to be
            mis-compiled on SPARC targets.
          + Avoid incorrect optimization of degenerate case statements for
            certain targets such as the ARM.
          + Fix out of range memory reference in the jump optimizer.
          + Avoid dereferencing null pointer in fix-header.
          + Fix test for GCC specific features so that it is possible to
            bootstrap with gcc-2.6.2 and older versions of GCC.
          + Fix typo in scheduler which could potentially cause out of
            range memory accesses.
          + Avoid incorrect loop reversal which caused incorrect code for
            certain loops on PowerPC targets.
          + Avoid incorrect optimization of switch statements on certain
            targets (for example the ARM).
     * Platform specific bugfixes and improvements
          + Work around bug in Sun V5.0 compilers which caused bootstrap
            comparison failures on SPARC targets.
          + Fix SPARC backend bug which caused aborts in final.c.
          + Fix sparc-hal-solaris2* configuration fragments.
          + Fix bug in sparc block profiling.
          + Fix obscure code generation bug for the PARISC targets.
          + Define __STDC_EXT__ for HPUX configurations.
          + Various POWERPC64 code generation bugfixes.
          + Fix abort for PPC targets using ELF (ex GNU/Linux).
          + Fix collect2 problems for AIX targets.
          + Correct handling of .file directive for PPC targets.
          + Fix bug in fix_trunc x86 patterns.
          + Fix x86 port to correctly pop the FP stack for functions that
            return structures in memory.
          + Fix minor bug in strlen x86 pattern.
          + Use stabs debugging instead of dwarf1 for x86-solaris targets.
          + Fix template repository code to handle leading underscore in
            mangled names.
          + Fix weak/weak alias support for OpenBSD.
          + GNU/Linux for the ARM has C++ compatible include files.
     * Language & Runtime specific fixes.
          + Fix handling of constructor attribute in the C front-end which
            caused problems building the Chill runtime library on some
            targets.
          + Fix minor problem merging type qualifiers in the C front-end.
          + Fix aliasing bug for pointers and references (C/C++).
          + Fix incorrect "non-constant initializer bug" when -traditional
            or -fwritable-strings is enabled.
          + Fix build error for Chill front-end on SunOS.
          + Do not complain about duplicate instantiations when using
            -frepo (C++).
          + Fix array bounds handling in C++ front-end which caused
            problems with dwarf debugging information in some
            circumstances.
          + Fix minor namespace problem.
          + Fix problem linking java programs.

Additional Changes in GCC 2.95.3

     * Generic bugfixes and improvements
          + Fix numerous problems that caused incorrect optimization in
            the register reloading code.
          + Fix numerous problems that caused incorrect optimization in
            the loop optimizer.
          + Fix aborts in the functions build_insn_chain and scan_loops
            under some circumstances.
          + Fix an alias analysis bug.
          + Fix an infinite compilation bug in the combiner.
          + A few problems with complex number support have been fixed.
          + It is no longer possible for gcc to act as a fork bomb when
            installed incorrectly.
          + The -fpack-struct option should be recognized now.
          + Fixed a bug that caused incorrect code to be generated due to
            a lost stack adjustment.
     * Platform specific bugfixes and improvements
          + Support building ARM toolchains hosted on Windows.
          + Fix attribute calculations in ARM toolchains.
          + arm-linux support has been improved.
          + Fix a PIC failure on sparc targets.
          + On ix86 targets, the regparm attribute should now work
            reliably.
          + Several updates for the h8300 port.
          + Fix problem building libio with glibc 2.2.


    For questions related to the use of GCC, please consult these web
    pages and the [17]GCC manuals. If that fails, the
    [18]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [19]gcc@gcc.gnu.org. All of [20]our lists have public
    archives.

   Copyright (C) [21]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [22]maintained by the GCC team. Last modified
   2012-11-02[23].

References

   1. http://gcc.gnu.org/news/spill.html
   2. http://gcc.gnu.org/news/lcm.html
   3. http://gcc.gnu.org/news/cprop.html
   4. http://gcc.gnu.org/news/cfg.html
   5. http://gcc.gnu.org/news/dse.html
   6. http://gcc.gnu.org/news/hoist.html
   7. http://gcc.gnu.org/news/alias.html
   8. http://gcc.gnu.org/gcc-2.95/c++features.html
   9. http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/News.html
  10. http://gcc.gnu.org/java/gcj-announce.txt
  11. http://gcc.gnu.org/news/javaannounce.html
  12. http://gcc.gnu.org/c99status.html
  13. http://gcc.gnu.org/news/chill.html
  14. http://gcc.gnu.org/news/sparc.html
  15. http://gcc.gnu.org/news/egcs-vcg.html
  16. http://gcc.gnu.org/egcs-1.0/features-2.8.html
  17. http://gcc.gnu.org/onlinedocs/
  18. mailto:gcc-help@gcc.gnu.org
  19. mailto:gcc@gcc.gnu.org
  20. http://gcc.gnu.org/lists.html
  21. http://www.fsf.org/
  22. http://gcc.gnu.org/about.html
  23. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/gcc-2.95/caveats.html

                                GCC 2.95 Caveats

     * GCC 2.95 will issue an error for invalid asm statements that had
       been silently accepted by earlier versions of the compiler. This is
       particularly noticeable when compiling older versions of the Linux
       kernel (2.0.xx). Please refer to the FAQ (as shipped with GCC 2.95)
       for more information on this issue.
     * GCC 2.95 implements type based alias analysis to disambiguate
       memory references. Some programs, particularly the Linux kernel
       violate ANSI/ISO aliasing rules and therefore may not operate
       correctly when compiled with GCC 2.95. Please refer to the FAQ (as
       shipped with GCC 2.95) for more information on this issue.
     * GCC 2.95 has a known bug in its handling of complex variables for
       64bit targets. Instead of silently generating incorrect code, GCC
       2.95 will issue a fatal error for situations it can not handle.
       This primarily affects the Fortran community as Fortran makes more
       use of complex variables than C or C++.
     * GCC 2.95 has an integrated libstdc++, but does not have an
       integrated libg++. Furthermore old libg++ releases will not work
       with GCC 2.95. You can retrieve a recent copy of libg++ from the
       [1]GCC ftp server.
       Note most C++ programs only need libstdc++.
     * Exception handling may not work with shared libraries, particularly
       on alphas, hppas, rs6000/powerpc and mips based platforms.
       Exception handling is known to work on x86 GNU/Linux platforms with
       shared libraries.
     * In general, GCC 2.95 is more rigorous about rejecting invalid C++
       code or deprecated C++ constructs than G++ 2.7, G++ 2.8, EGCS 1.0,
       or EGCS 1.1. As a result it may be necessary to fix C++ code before
       it will compile with GCC 2.95.
     * G++ is also converting toward the ISO C++ standard; as a result
       code which was previously valid (and thus accepted by other
       compilers and older versions of g++) may no longer be accepted. The
       flag -fpermissive may allow some non-conforming code to compile
       with GCC 2.95.
     * GCC 2.95 compiled C++ code is not binary compatible with EGCS
       1.1.x, EGCS 1.0.x or GCC 2.8.x.
     * GCC 2.95 does not have changes from the GCC 2.8 tree that were made
       between Sept 30, 1998 and April 30, 1999 (the official end of the
       GCC 2.8 project). Future GCC releases will include all the changes
       from the defunct GCC 2.8 sources.


    For questions related to the use of GCC, please consult these web
    pages and the [2]GCC manuals. If that fails, the
    [3]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [4]gcc@gcc.gnu.org. All of [5]our lists have public archives.

   Copyright (C) [6]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [7]maintained by the GCC team. Last modified
   2012-11-02[8].

References

   1. ftp://gcc.gnu.org/pub/gcc/infrastructure/libg++-2.8.1.3.tar.gz
   2. http://gcc.gnu.org/onlinedocs/
   3. mailto:gcc-help@gcc.gnu.org
   4. mailto:gcc@gcc.gnu.org
   5. http://gcc.gnu.org/lists.html
   6. http://www.fsf.org/
   7. http://gcc.gnu.org/about.html
   8. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/index.html

                                    EGCS 1.1

   September 3, 1998: We are pleased to announce the release of EGCS 1.1.
   December 1, 1998: We are pleased to announce the release of EGCS 1.1.1.
   March 15, 1999: We are pleased to announce the release of EGCS 1.1.2.

   EGCS is a free software project to further the development of the GNU
   compilers using an open development environment.

   EGCS 1.1 is a major new release of the EGCS compiler system. It has
   been [1]extensively tested and is believed to be stable and suitable
   for widespread use.

   EGCS 1.1 is based on an June 6, 1998 snapshot of the GCC 2.8
   development sources; it contains all of the new features found in GCC
   2.8.1 as well as all new development from GCC up to June 6, 1998.

   EGCS 1.1 also contains many improvements and features not found in GCC
   or in older versions of EGCS:
     * Global common subexpression elimination and global constant/copy
       propagation (aka [2]gcse)
     * Ongoing improvements to the [3]alias analysis support to allow for
       better optimizations throughout the compiler.
     * Vastly improved [4]C++ compiler and integrated C++ runtime
       libraries.
     * Fixes for the /tmp symlink race security problems.
     * New targets including mips16, arm-thumb and 64 bit PowerPC.
     * Improvements to GNU Fortran (g77) compiler and runtime library made
       since g77 version 0.5.23.

   See the [5]new features page for a more complete list of new features
   found in EGCS 1.1 releases.

   EGCS 1.1.1 is a minor update to fix several serious problems in EGCS
   1.1:
     * General improvements and fixes
          + Avoid some stack overflows when compiling large functions.
          + Avoid incorrect loop invariant code motions.
          + Fix some core dumps on Linux kernel code.
          + Bring back the imake -Di386 and friends fix from EGCS 1.0.2.
          + Fix code generation problem in gcse.
          + Various documentation related fixes.
     * g++/libstdc++ improvements and fixes
          + MT safe EH fix for setjmp/longjmp based exception handling.
          + Fix a few bad interactions between optimization and exception
            handling.
          + Fixes for demangling of template names starting with "__".
          + Fix a bug that would fail to run destructors in some cases
            with -O2.
          + Fix 'new' of classes with virtual bases.
          + Fix crash building Qt on the Alpha.
          + Fix failure compiling WIFEXITED macro on GNU/Linux.
          + Fix some -frepo failures.
     * g77 and libf2c improvements and fixes
          + Various documentation fixes.
          + Avoid compiler crash on RAND intrinsic.
          + Fix minor bugs in makefiles exposed by BSD make programs.
          + Define _XOPEN_SOURCE for libI77 build to avoid potential
            problems on some 64-bit systems.
          + Fix problem with implicit endfile on rewind.
          + Fix spurious recursive I/O errors.
     * platform specific improvements and fixes
          + Match all versions of UnixWare7.
          + Do not assume x86 SVR4 or UnixWare targets can handle stabs.
          + Fix PPC/RS6000 LEGITIMIZE_ADDRESS macro and bug in conversion
            from unsigned ints to double precision floats.
          + Fix ARM ABI issue with NetBSD.
          + Fix a few arm code generation bugs.
          + Fixincludes will fix additional broken SCO OpenServer header
            files.
          + Fix a m68k backend bug which caused invalid offsets in reg+d
            addresses.
          + Fix problems with 64bit AIX 4.3 support.
          + Fix handling of long longs for varargs/stdarg functions on the
            ppc.
          + Minor fixes to CPP predefines for Windows.
          + Fix code generation problems with gpr<->fpr copies for 64bit
            ppc.
          + Fix a few coldfire code generation bugs.
          + Fix some more header file problems on SunOS 4.x.
          + Fix assert.h handling for RTEMS.
          + Fix Windows handling of TREE_SYMBOL_REFERENCED.
          + Fix x86 compiler abort in reg-stack pass.
          + Fix cygwin/windows problem with section attributes.
          + Fix Alpha code generation problem exposed by SMP Linux
            kernels.
          + Fix typo in m68k 32->64bit integer conversion.
          + Make sure target libraries build with -fPIC for PPC & Alpha
            targets.

   EGCS 1.1.2 is a minor update to fix several serious problems in EGCS
   1.1.1:
     * General improvements and fixes
          + Fix bug in loop optimizer which caused the SPARC (and
            potentially other) ports to segfault.
          + Fix infinite recursion in alias analysis and combiner code.
          + Fix bug in regclass preferencing.
          + Fix incorrect loop reversal which caused incorrect code to be
            generated for several targets.
          + Fix return value for builtin memcpy.
          + Reduce compile time for certain loops which exposed quadratic
            behavior in the loop optimizer.
          + Fix bug which caused volatile memory to be written multiple
            times when only one write was needed/desired.
          + Fix compiler abort in caller-save.c
          + Fix combiner bug which caused incorrect code generation for
            certain division by constant operations.
          + Fix incorrect code generation due to a bug in range check
            optimizations.
          + Fix incorrect code generation due to mis-handling of clobbered
            values in CSE.
          + Fix compiler abort/segfault due to incorrect register
            splitting when unrolling loops.
          + Fix code generation involving autoincremented addresses with
            ternary operators.
          + Work around bug in the scheduler which caused qt to be
            mis-compiled on some platforms.
          + Fix code generation problems with -fshort-enums.
          + Tighten security for temporary files.
          + Improve compile time for codes which make heavy use of
            overloaded functions.
          + Fix multiply defined constructor/destructor symbol problems.
          + Avoid setting bogus RPATH environment variable during
            bootstrap.
          + Avoid GNU-make dependencies in the texinfo subdir.
          + Install CPP wrapper script in $(prefix)/bin if --enable-cpp.
            --enable-cpp=<dirname> can be used to specify an additional
            install directory for the cpp wrapper script.
          + Fix CSE bug which caused incorrect label-label refs to appear
            on some platforms.
          + Avoid linking in EH routines from libgcc if they are not
            needed.
          + Avoid obscure bug in aliasing code.
          + Fix bug in weak symbol handling.
     * Platform-specific improvements and fixes
          + Fix detection of PPro/PII on Unixware 7.
          + Fix compiler segfault when building spec99 and other programs
            for SPARC targets.
          + Fix code-generation bugs for integer and floating point
            conditional move instructions on the PPro/PII.
          + Use fixincludes to fix byteorder problems on i?86-*-sysv.
          + Fix build failure for the arc port.
          + Fix floating point format configuration for i?86-gnu port.
          + Fix problems with hppa1.0-hp-hpux10.20 configuration when
            threads are enabled.
          + Fix coldfire code generation bugs.
          + Fix "unrecognized insn" problems for Alpha and PPC ports.
          + Fix h8/300 code generation problem with floating point values
            in memory.
          + Fix unrecognized insn problems for the m68k port.
          + Fix namespace-pollution problem for the x86 port.
          + Fix problems with old assembler on x86 NeXT systems.
          + Fix PIC code-generation problems for the SPARC port.
          + Fix minor bug with LONG_CALLS in PowerPC SVR4 support.
          + Fix minor ISO namespace violation in Alpha varargs/stdarg
            support.
          + Fix incorrect "braf" instruction usage for the SH port.
          + Fix minor bug in va-sh which prevented its use with -ansi.
          + Fix problems recognizing and supporting FreeBSD.
          + Handle OpenBSD systems correctly.
          + Minor fixincludes fix for Digital UNIX 4.0B.
          + Fix problems with ctors/dtors in SCO shared libraries.
          + Abort instead of generating incorrect code for PPro/PII
            floating point conditional moves.
          + Avoid multiply defined symbols on GNU/Linux systems using
            libc-5.4.xx.
          + Fix abort in alpha compiler.
     * Fortran-specific fixes
          + Fix the IDate intrinsic (VXT) (in libg2c) so the returned year
            is in the documented, non-Y2K-compliant range of 0-99, instead
            of being returned as 100 in the year 2000.
          + Fix the `Date_and_Time' intrinsic (in libg2c) to return the
            milliseconds value properly in Values(8).
          + Fix the `LStat' intrinsic (in libg2c) to return device-ID
            information properly in SArray(7).

   Each release includes installation instructions in both HTML and
   plaintext forms (see the INSTALL directory in the toplevel directory of
   the distribution). However, we also keep the most up to date
   [6]installation instructions and [7]build/test status on our web page.
   We will update those pages as new information becomes available.

   The EGCS project would like to thank the numerous people that have
   contributed new features, test results, bugfixes, etc. This [8]amazing
   group of volunteers is what makes EGCS successful.

   And finally, we can't in good conscience fail to mention some
   [9]caveats to using EGCS 1.1.

   Download EGCS from egcs.cygnus.com (USA California).

   The EGCS 1.1 release is also available on many mirror sites.
   [10]Goto mirror list to find a closer site.


    For questions related to the use of GCC, please consult these web
    pages and the [11]GCC manuals. If that fails, the
    [12]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [13]gcc@gcc.gnu.org. All of [14]our lists have public
    archives.

   Copyright (C) [15]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [16]maintained by the GCC team. Last modified
   2012-11-02[17].

References

   1. http://gcc.gnu.org/egcs-1.1/egcs-1.1-test.html
   2. http://gcc.gnu.org/news/gcse.html
   3. http://gcc.gnu.org/news/alias.html
   4. http://gcc.gnu.org/egcs-1.1/c++features.html
   5. http://gcc.gnu.org/egcs-1.1/features.html
   6. http://gcc.gnu.org/install/
   7. http://gcc.gnu.org/egcs-1.1/buildstat.html
   8. http://gcc.gnu.org/onlinedocs/gcc/Contributors.html
   9. http://gcc.gnu.org/egcs-1.1/caveats.html
  10. http://gcc.gnu.org/mirrors.html
  11. http://gcc.gnu.org/onlinedocs/
  12. mailto:gcc-help@gcc.gnu.org
  13. mailto:gcc@gcc.gnu.org
  14. http://gcc.gnu.org/lists.html
  15. http://www.fsf.org/
  16. http://gcc.gnu.org/about.html
  17. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/features.html

                             EGCS 1.1 new features

     * Integrated GNU Fortran (g77) compiler and runtime library with
       improvements, based on g77 version 0.5.23.
     * Vast improvements in the C++ compiler; so many they have [1]page of
       their own!
     * Compiler implements [2]global common subexpression elimination and
       global copy/constant propagation.
     * More major improvements in the [3]alias analysis code.
     * More major improvements in the exception handling code to improve
       performance, lower static overhead and provide the infrastructure
       for future improvements.
     * The infamous /tmp symlink race security problems have been fixed.
     * The regmove optimization pass has been nearly completely rewritten
       to improve performance of generated code.
     * The compiler now recomputes register usage information before local
       register allocation. By providing more accurate information to the
       priority based allocator, we get better register allocation.
     * The register reloading phase of the compiler optimizes spill code
       much better than in previous releases.
     * Some bad interactions between the register allocator and
       instruction scheduler have been fixed, resulting in much better
       code for certain programs. Additionally, we have tuned the
       scheduler in various ways to improve performance of generated code
       for some architectures.
     * The compiler's branch shortening algorithms have been significantly
       improved to work better on targets which align jump targets.
     * The compiler now supports -Os to prefer optimizing for code space
       over optimizing for code speed.
     * The compiler will now totally eliminate library calls which compute
       constant values. This primarily helps targets with no integer
       div/mul support and targets without floating point support.
     * The compiler now supports an extensive "--help" option.
     * cpplib has been greatly improved and may be suitable for limited
       use.
     * Memory footprint for the compiler has been significantly reduced
       for some pathological cases.
     * The time to build EGCS has been improved for certain targets
       (particularly the alpha and mips platforms).
     * Many infrastructure improvements throughout the compiler, plus the
       usual mountain of bugfixes and minor improvements.
     * Target dependent improvements:
          + SPARC port now includes V8 plus and V9 support as well as
            performance tuning for Ultra class machines. The SPARC port
            now uses the Haifa scheduler.
          + Alpha port has been tuned for the EV6 processor and has an
            optimized expansion of memcpy/bzero. The Alpha port now uses
            the Haifa scheduler.
          + RS6000/PowerPC: support for the Power64 architecture and AIX
            4.3. The RS6000/PowerPC port now uses the Haifa scheduler.
          + x86: Alignment of static store data and jump targets is per
            Intel recommendations now. Various improvements throughout the
            x86 port to improve performance on Pentium processors
            (including improved epilogue sequences for Pentium chips and
            backend improvements which should help register allocation on
            all x86 variants. Conditional move support has been fixed and
            enabled for PPro processors. The x86 port also better supports
            64bit operations now. Unixware 7, a System V Release 5 target,
            is now supported and SCO OpenServer targets can support GAS.
          + MIPS has improved multiply/multiply-add support and now
            includes mips16 ISA support.
          + M68k has many micro-optimizations and Coldfire fixes.
     * Core compiler is based on the GCC development tree from June 9,
       1998, so we have all of the [4]features found in GCC 2.8.


    For questions related to the use of GCC, please consult these web
    pages and the [5]GCC manuals. If that fails, the
    [6]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [7]gcc@gcc.gnu.org. All of [8]our lists have public archives.

   Copyright (C) [9]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [10]maintained by the GCC team. Last modified
   2012-11-02[11].

References

   1. http://gcc.gnu.org/egcs-1.1/c++features.html
   2. http://gcc.gnu.org/news/gcse.html
   3. http://gcc.gnu.org/news/alias.html
   4. http://gcc.gnu.org/egcs-1.0/features-2.8.html
   5. http://gcc.gnu.org/onlinedocs/
   6. mailto:gcc-help@gcc.gnu.org
   7. mailto:gcc@gcc.gnu.org
   8. http://gcc.gnu.org/lists.html
   9. http://www.fsf.org/
  10. http://gcc.gnu.org/about.html
  11. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.1/caveats.html

                                EGCS 1.1 Caveats

     * EGCS has an integrated libstdc++, but does not have an integrated
       libg++. Furthermore old libg++ releases will not work with EGCS; HJ
       Lu has made a libg++-2.8.1.2 snapshot available which may work with
       EGCS.
       Note most C++ programs only need libstdc++.
     * Exception handling may not work with shared libraries, particularly
       on alphas, hppas, rs6000/powerpc and mips based platforms.
       Exception handling is known to work on x86-linux platforms with
       shared libraries.
     * Some versions of the Linux kernel have bugs which prevent them from
       being compiled or from running when compiled by EGCS. See the FAQ
       (as shipped with EGCS 1.1) for additional information.
     * In general, EGCS is more rigorous about rejecting invalid C++ code
       or deprecated C++ constructs than g++-2.7, g++-2.8 or EGCS 1.0. As
       a result it may be necessary to fix C++ code before it will compile
       with EGCS.
     * G++ is also converting toward the ISO C++ standard; as a result
       code which was previously valid (and thus accepted by other
       compilers and older versions of g++) may no longer be accepted.
     * EGCS 1.1 compiled C++ code is not binary compatible with EGCS 1.0.x
       or GCC 2.8.x due to changes necessary to support thread safe
       exception handling.


    For questions related to the use of GCC, please consult these web
    pages and the [1]GCC manuals. If that fails, the
    [2]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [3]gcc@gcc.gnu.org. All of [4]our lists have public archives.

   Copyright (C) [5]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [6]maintained by the GCC team. Last modified
   2012-11-02[7].

References

   1. http://gcc.gnu.org/onlinedocs/
   2. mailto:gcc-help@gcc.gnu.org
   3. mailto:gcc@gcc.gnu.org
   4. http://gcc.gnu.org/lists.html
   5. http://www.fsf.org/
   6. http://gcc.gnu.org/about.html
   7. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/index.html

                                    EGCS 1.0

   December 3, 1997: We are pleased to announce the release of EGCS 1.0.
   January 6, 1998: We are pleased to announce the release of EGCS 1.0.1.
   March 16, 1998: We are pleased to announce the release of EGCS 1.0.2.
   May 15, 1998 We are pleased to announce the release of EGCS 1.0.3.

   EGCS is a collaborative effort involving several groups of hackers
   using an open development model to accelerate development and testing
   of GNU compilers and runtime libraries.

   An important goal of EGCS is to allow wide scale testing of
   experimental features and optimizations; therefore, EGCS contains some
   features and optimizations which are still under development. However,
   EGCS has been carefully tested and should be comparable in quality to
   most GCC releases.

   EGCS 1.0 is based on an August 2, 1997 snapshot of the GCC 2.8
   development sources; it contains nearly all of the new features found
   in GCC 2.8.

   EGCS 1.0 also contains many improvements and features not found in GCC
   2.7 and even the GCC 2.8 series (which was released after the original
   EGCS 1.0 release).
     * Integrated C++ runtime libraries, including support for most major
       GNU/Linux systems!
     * The integrated libstdc++ library includes a verbatim copy of SGI's
       STL release.
     * Integrated GNU Fortran compiler.
     * New instruction scheduler.
     * New alias analysis code.

   See the [1]new features page for a more complete list of new features.

   EGCS 1.0.1 is a minor update to the EGCS 1.0 compiler to fix a few
   critical bugs and add support for Red Hat 5.0 Linux. Changes since the
   EGCS 1.0 release:
     * Add support for Red Hat 5.0 Linux and better support for Linux
       systems using glibc2.
       Many programs failed to link when compiled with EGCS 1.0 on Red Hat
       5.0 or on systems with newer versions of glibc2. EGCS 1.0.1 should
       fix these problems.
     * Compatibility with both EGCS 1.0 and GCC 2.8 libgcc exception
       handling interfaces.
       To avoid future compatibility problems, we strongly urge anyone who
       is planning on distributing shared libraries that contain C++ code
       to upgrade to EGCS 1.0.1 first.
       Soon after EGCS 1.0 was released, the GCC developers made some
       incompatible changes in libgcc's exception handling interfaces.
       These changes were needed to solve problems on some platforms. This
       means that GCC 2.8.0, when released, will not be seamlessly
       compatible with shared libraries built by EGCS 1.0. The reason is
       that the libgcc.a in GCC 2.8.0 will not contain a function needed
       by the old interface.
       The result of this is that there may be compatibility problems with
       shared libraries built by EGCS 1.0 when used with GCC 2.8.0.
       With EGCS 1.0.1, generated code uses the new (GCC 2.8.0) interface,
       and libgcc.a has the support routines for both the old and the new
       interfaces (so EGCS 1.0.1 and EGCS 1.0 code can be freely mixed,
       and EGCS 1.0.1 and GCC 2.8.0 code can be freely mixed).
       The maintainers of GCC 2.x have decided against including seamless
       support for the old interface in 2.8.0, since it was never
       "official", so to avoid future compatibility problems we recommend
       against distributing any shared libraries built by EGCS 1.0 that
       contain C++ code (upgrade to 1.0.1 and use that).
     * Various bugfixes in the x86, hppa, mips, and rs6000/ppc back ends.
       The x86 changes fix code generation errors exposed when building
       glibc2 and the usual GNU/Linux dynamic linker (ld.so).
       The hppa change fixes a compiler abort when configured for use with
       RTEMS.
       The MIPS changes fix problems with the definition of LONG_MAX on
       newer systems, allow for command line selection of the target ABI,
       and fix one code generation problem.
       The rs6000/ppc change fixes some problems with passing structures
       to varargs/stdarg functions.
     * A few machine independent bugfixes, mostly to fix code generation
       errors when building Linux kernels or glibc.
     * Fix a few critical exception handling and template bugs in the C++
       compiler.
     * Fix Fortran namelist bug on alphas.
     * Fix build problems on x86-solaris systems.

   EGCS 1.0.2 is a minor update to the EGCS 1.0.1 compiler to fix several
   serious problems in EGCS 1.0.1.
     * General improvements and fixes
          + Memory consumption significantly reduced, especially for
            templates and inline functions.
          + Fix various problems with glibc2.1.
          + Fix loop optimization bug exposed by rs6000/ppc port.
          + Fix to avoid potential code generation problems in jump.c.
          + Fix some undefined symbol problems in dwarf1 debug support.
     * g++/libstdc++ improvements and fixes
          + libstdc++ in the EGCS release has been updated and should be
            link compatible with libstdc++-2.8.
          + Various fixes in libio/libstdc++ to work better on GNU/Linux
            systems.
          + Fix problems with duplicate symbols on systems that do not
            support weak symbols.
          + Memory corruption bug and undefined symbols in bastring have
            been fixed.
          + Various exception handling fixes.
          + Fix compiler abort for very long thunk names.
     * g77 improvements and fixes
          + Fix compiler crash for omitted bound in Fortran CASE
            statement.
          + Add missing entries to g77 lang-options.
          + Fix problem with -fpedantic in the g77 compiler.
          + Fix "backspace" problem with g77 on alphas.
          + Fix x86 backend problem with Fortran literals and -fpic.
          + Fix some of the problems with negative subscripts for g77 on
            alphas.
          + Fixes for Fortran builds on cygwin32/mingw32.
     * platform specific improvements and fixes
          + Fix long double problems on x86 (exposed by glibc).
          + x86 ports define i386 again to keep imake happy.
          + Fix exception handling support on NetBSD ports.
          + Several changes to collect2 to fix many problems with AIX.
          + Define __ELF__ for GNU/Linux on rs6000.
          + Fix -mcall-linux problem on GNU/Linux on rs6000.
          + Fix stdarg/vararg problem for GNU/Linux on rs6000.
          + Allow autoconf to select a proper install problem on AIX 3.1.
          + m68k port support includes -mcpu32 option as well as cpu32
            multilibs.
          + Fix stdarg bug for irix6.
          + Allow EGCS to build on irix5 without the gnu assembler.
          + Fix problem with static linking on sco5.
          + Fix bootstrap on sco5 with native compiler.
          + Fix for abort building newlib on H8 target.
          + Fix fixincludes handling of math.h on SunOS.
          + Minor fix for Motorola 3300 m68k systems.

   EGCS 1.0.3 is a minor update to the EGCS 1.0.2 compiler to fix a few
   problems reported by Red Hat for builds of Red Hat 5.1.
     * Generic bugfixes:
          + Fix a typo in the libio library which resulted in incorrect
            behavior of istream::get.
          + Fix the Fortran negative array index problem.
          + Fix a major problem with the ObjC runtime thread support
            exposed by glibc2.
          + Reduce memory consumption of the Haifa scheduler.
     * Target specific bugfixes:
          + Fix one x86 floating point code generation bug exposed by
            glibc2 builds.
          + Fix one x86 internal compiler error exposed by glibc2 builds.
          + Fix profiling bugs on the Alpha.
          + Fix ImageMagick & emacs 20.2 build problems on the Alpha.
          + Fix rs6000/ppc bug when converting values from integer types
            to floating point types.

   The EGCS 1.0 releases include installation instructions in both HTML
   and plaintext forms (see the INSTALL directory in the toplevel
   directory of the distribution). However, we also keep the most up to
   date [2]installation instructions and [3]build/test status on our web
   page. We will update those pages as new information becomes available.

   And, we can't in good conscience fail to mention some [4]caveats to
   using EGCS.

   Update: Big thanks to Stanford for providing a high speed link for
   downloading EGCS (go.cygnus.com)!

   Download EGCS from ftp.cygnus.com (USA California) or go.cygnus.com
   (USA California -- High speed link provided by Stanford).

   The EGCS 1.0 release is also available many mirror sites.
   [5]Goto mirror list to find a closer site

   We'd like to thank the numerous people that have contributed new
   features, test results, bugfixes, etc. Unfortunately, they're far too
   numerous to mention by name.


    For questions related to the use of GCC, please consult these web
    pages and the [6]GCC manuals. If that fails, the
    [7]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [8]gcc@gcc.gnu.org. All of [9]our lists have public archives.

   Copyright (C) [10]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [11]maintained by the GCC team. Last modified
   2013-12-03[12].

References

   1. http://gcc.gnu.org/egcs-1.0/features.html
   2. http://gcc.gnu.org/install/
   3. http://gcc.gnu.org/egcs-1.0/buildstat.html
   4. http://gcc.gnu.org/egcs-1.0/caveats.html
   5. http://gcc.gnu.org/mirrors.html
   6. http://gcc.gnu.org/onlinedocs/
   7. mailto:gcc-help@gcc.gnu.org
   8. mailto:gcc@gcc.gnu.org
   9. http://gcc.gnu.org/lists.html
  10. http://www.fsf.org/
  11. http://gcc.gnu.org/about.html
  12. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/features.html

                               EGCS 1.0 features

     * Core compiler is based on the gcc2 development tree from Aug 2,
       1997, so we have most of the [1]features found in GCC 2.8.
     * Integrated GNU Fortran compiler based on g77-0.5.22-19970929.
     * Vast improvements in the C++ compiler; so many they have [2]page of
       their own!
     * Integrated C++ runtime libraries, including support for most major
       GNU/Linux systems!
     * New instruction scheduler from IBM Haifa which includes support for
       function wide instruction scheduling as well as superscalar
       scheduling.
     * Significantly improved alias analysis code.
     * Improved register allocation for two address machines.
     * Significant code generation improvements for Fortran code on
       Alphas.
     * Various optimizations from the g77 project as well as improved loop
       optimizations.
     * Dwarf2 debug format support for some targets.
     * egcs libstdc++ includes the SGI STL implementation without changes.
     * As a result of these and other changes, egcs libstc++ is not binary
       compatible with previous releases of libstdc++.
     * Various new ports -- UltraSPARC, Irix6.2 & Irix6.3 support, The SCO
       Openserver 5 family (5.0.{0,2,4} and Internet FastStart 1.0 and
       1.1), Support for RTEMS on several embedded targets, Support for
       arm-linux, Mitsubishi M32R, Hitachi H8/S, Matsushita MN102 and
       MN103, NEC V850, Sparclet, Solaris & GNU/Linux on PowerPCs, etc.
     * Integrated testsuites for gcc, g++, g77, libstdc++ and libio.
     * RS6000/PowerPC ports generate code which can run on all
       RS6000/PowerPC variants by default.
     * -mcpu= and -march= switches for the x86 port to allow better
       control over how the x86 port generates code.
     * Includes the template repository patch (aka repo patch); note the
       new template code makes repo obsolete for ELF systems using gnu-ld
       such as GNU/Linux.
     * Plus the usual assortment of bugfixes and improvements.


    For questions related to the use of GCC, please consult these web
    pages and the [3]GCC manuals. If that fails, the
    [4]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [5]gcc@gcc.gnu.org. All of [6]our lists have public archives.

   Copyright (C) [7]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [8]maintained by the GCC team. Last modified
   2012-11-02[9].

References

   1. http://gcc.gnu.org/egcs-1.0/features-2.8.html
   2. http://gcc.gnu.org/egcs-1.0/c++features.html
   3. http://gcc.gnu.org/onlinedocs/
   4. mailto:gcc-help@gcc.gnu.org
   5. mailto:gcc@gcc.gnu.org
   6. http://gcc.gnu.org/lists.html
   7. http://www.fsf.org/
   8. http://gcc.gnu.org/about.html
   9. http://validator.w3.org/check/referer
======================================================================
http://gcc.gnu.org/egcs-1.0/caveats.html

                                EGCS 1.0 Caveats

     * EGCS has an integrated libstdc++, but does not have an integrated
       libg++. Furthermore old libg++ releases will not work with egc; HJ
       Lu has made a libg++-2.8.1.2 available which may work with EGCS.
       Note most C++ programs only need libstdc++.
     * Note that using -pedantic or -Wreturn-type can cause an explosion
       in the amount of memory needed for template-heavy C++ code, such as
       code that uses STL. Also note that -Wall includes -Wreturn-type, so
       if you use -Wall you will need to specify -Wno-return-type to turn
       it off.
     * Exception handling may not work with shared libraries, particularly
       on alphas, hppas, and mips based platforms. Exception handling is
       known to work on x86-linux platforms with shared libraries.
     * Some versions of the Linux kernel have bugs which prevent them from
       being compiled or from running when compiled by EGCS. See the FAQ
       (as shipped with EGCS 1.0) for additional information.
     * In general, EGCS is more rigorous about rejecting invalid C++ code
       or deprecated C++ constructs than G++ 2.7. As a result it may be
       necessary to fix C++ code before it will compile with EGCS.
     * G++ is also aggressively tracking the C++ standard; as a result
       code which was previously valid (and thus accepted by other
       compilers and older versions of G++) may no longer be accepted.
     * EGCS 1.0 may not work with Red Hat Linux 5.0 on all targets. EGCS
       1.0.x and later releases should work with Red Hat Linux 5.0.


    For questions related to the use of GCC, please consult these web
    pages and the [1]GCC manuals. If that fails, the
    [2]gcc-help@gcc.gnu.org mailing list might help. Comments on these
    web pages and the development of GCC are welcome on our developer
    list at [3]gcc@gcc.gnu.org. All of [4]our lists have public archives.

   Copyright (C) [5]Free Software Foundation, Inc. Verbatim copying and
   distribution of this entire article is permitted in any medium,
   provided this notice is preserved.

   These pages are [6]maintained by the GCC team. Last modified
   2012-11-02[7].

References

   1. http://gcc.gnu.org/onlinedocs/
   2. mailto:gcc-help@gcc.gnu.org
   3. mailto:gcc@gcc.gnu.org
   4. http://gcc.gnu.org/lists.html
   5. http://www.fsf.org/
   6. http://gcc.gnu.org/about.html
   7. http://validator.w3.org/check/referer
======================================================================
