This document is obsolete and kept for historical reference only.
This page provides the release criteria for GCC 3.0. GCC 3.0 will not be released until these criteria have been met. This page enumerates the release criteria and provides a rationale for some of the choices made in determining these criteria.
In all cases, these criteria represent the minimum functionality required in order to make the release. If this level of minimum functionality is not provided by a release candidate, then that candidate will not become the eventual release. However, a release candidate that does meet these criteria may not necessarily become the official release; there may be other unforseen issues that prevent release. For example, if support for the Intel Pentium II is required by the release criteria, it is nevertheless unlikely that GCC 3.0 would be released even though it did not support the Intel Pentium.
Because the development of GCC is largely dependent on volunteers, the Steering Committee may eventually have to decide whether to make a release, even if the criteria here are not met. For example, if no volunteer can be found to verify correct operation of a particular application program on a particular system, then that criterion may be abandoned. However, that eventuality should be avoided if at all possible.
GCC 3.0 will contain considerable improvements in functionality relative to previous releases of GCC. Each of these improvements must be completed before GCC 3.0 is released:
C preprocessor
GCC 3.0 will use a new implementation of the C preprocessor.
The old preprocessor has been allowed to rot, so
the implementation of the new preprocessor must be completed.
(Note that GCC 3.0 will still use a stand-alone, rather than an
integrated, preprocessor. However, the preprocessor will be
based on cpplib
rather than cccp.c
.)
Done and surpassed. The integrated
preprocessor was ready in time to be made the default.
C++ ABI
In order to avoid changing the C++ ABI from release to release, as GCC has done to date, there must be a stable ABI.
C++ Standard Library
The standard library is a part of the ABI. Changing the standard library interfaces is effectively a change in the ABI. It is important that we provide a standards-conforming C++ standard library.
Java Standard Library
The Java standard library should be present in the tree is required in order to avoid users having to download it separately. Done.
GCC Support Library
The libgcc
library will be built in both static
and shared library whenever --enable-shared
is
used to configure GCC. As GCC 3.0 will contain other ABI
changes, now is as good a time as any to make this change.
Partly done.
Java Front-End Garbage Collection
The Java front-end will be converted to use garbage collection, like the other GCC front-ends. This conversion will enable the simplification, optimization, and removal of code in the machine-independent portions of the compiler, as well as in the various back ends. Done.
Chill Front-End Garbage Collection
Like the Java front-end, the Chill front-end will be converted to use garbage collection. Dropped. No volunteer has been found to do this, so GCC 3.0 will not support Chill unless one comes forward.
Open Bugs
High-priority open bugs in GNATs will be fixed before the GCC 3.0 release.
Installation Documentation
Merge on-line installation documentation,
gcc/install.texi
, past changes
to gcc/INSTALL
made in the CVS tree without
realising that it was a generated file that were subsequently
overridden when it was regenerated, the old system-specific
gcc/README.*
files, and
gcc/f/g77install.texi
.
Partly done
GCC is available on a vast number of platforms. However, it is not possible to effectively test GCC in all possible configurations. Therefore, a smaller number of platforms have been selected as targets. The targets chosen represent both the most popular operating systems and the most popular microprocessors. Of course, where possible, the release will support other targets as well.
Chip | OS | Triplet |
---|---|---|
Alpha | Red Hat Linux 6.2 | |
HPPA | HPUX 11.0 | hppa2.0w-hp-hpux11.00 |
Intel x86 | Debian GNU/Linux 2.2 | i386-pc-linux-gnu |
Intel x86 | Red Hat Linux 6.2 | i686-pc-linux-gnu |
MIPS | IRIX 6.5 | mips-sgi-irix6.5 |
PowerPC | AIX 4.3.3 | powerpc-ibm-aix4.3.3.0 |
SPARC | Solaris 2.7 | sparc-sun-solaris2.7 |
GCC's performance on the following platforms will not be required to meet all the criteria mentioned in this document before GCC 3.0 ships, but the performance on these systems will be of considerable interest, and it is likely that serious problems on these platforms will delay the release.
Among the secondary evaluation platforms, we are are especially concerned about free systems (i.e., GNU/Linux and the BSDs) where GCC also serves as the system compiler.
Volunteers will be required, both to test and to fix bugs, for all secondary platforms. (These volunteers may be the same person, but volunteers should be careful not to sign up for more work than they can actually do.) If volunteers cannot be found for these platforms, then the secondary platforms will be dropped from this list.
The bug-fixing volunteer will commit to ensuring that GCC 3.0 will at least bootstrap itself on each of these secondary platforms. That commitment doesn't necessarily mean fixing bugs personally; for example, if you are a manager for a company with GCC expertise you could be the volunteer if you'll commit to donating your employee's efforts as necessary. The release manager, and the GCC development team, will make reasonable efforts to assist these volunteers by answering questions and reviewing patches as time permits.
Chip | OS | Triplet | Tester |
---|---|---|---|
Intel x86 | FreeBSD 4.2 | i386-unknown-freebsd4.2 | David O'Brien |
PowerPC | GNU/Linux | ||
SPARC | SunOS 4.1.4 | sparc-sun-sunos4.1.4 | |
SPARC | Debian GNU/Linux 2.2 | sparc-linux | Ben Collins |
ARM | GNU/Linux | armv4l-unknown-linux-gnu | |
Intel x86 | Cygwin | i686-pc-cygwin |
There are GCC front-ends for many different languages. However, in this release, only the behavior of front-ends for the following languages will be considered part of the release criteria:
The following languages will be supported by the release, but their behavior will not be a primary consideration in determining whether or not to ship a particular release candidate:
In particular, no application testing, code quality, or compile-time performance testing will be required for these languages. However, the regression testing criteria documented below will apply to these languages, except Chill, for which no regression tests are available.
The GCC testsuite contains extensive C and C++ regression tests, as
well as some Fortran, and Objective-C tests. GCC 3.0 will not fail
any of these tests which the previous release GCC passed on any of the
supported platforms. In particular, the current regression testsuite
will be run using GCC 2.95.2 on each of the supported platforms; those
results can then be compared with the output from a release candidate.
Because there have often been issues with generating PIC code, we will
test with -fPIC
as well.
In addition, on all supported platforms, there will be no
--enable-checking
failures when running any of the
regression test-suites.
In addition to the regression-testing mentioned above, it is important that operation of the compiler be verified on some real-world applications. The following applications represent a mix of low-level and high-level code, of numerical and logical programs, and of different programming languages.
Name | Language | Version | Source URL |
---|---|---|---|
Linux kernel | C | 2.4.0 | linux-2.4.0.tar.gz |
GNU Emacs | C | 20.6 | |
POOMA | C++ | 2.2.0 | pooma-2.3.0.tgz |
LAPACK | Fortran | 3.0 | LAPACK (testing programs) |
These selections were made for a variety of reasons. The Linux kernel is one of the most important pieces of free software, and kernel developers pay careful attention to GCC performance. It would be an embarrassment to GCC 3.0 if it did not compile the kernel correctly, out of the box. The kernel taxes many of the low-level aspects of GCC, as well as many GCC extensions, including the extended assembly syntax, addresses of labels, and so forth. (Historically, there have been kernel bugs, found only by more aggressive optimization in new releases of GCC. If such bugs are encountered, then appropriate patches should be applied to the kernel before testing.)
GNU Emacs is portable to almost every system available, and is a complex application-level C program, known to have very few bugs.
POOMA is a complex expression-template library that will tax the ability of G++ to deal with templates, an area that has historically been buggy. In addition, templates have historically taken inordinately much time and memory at compile-time. With the widespread prevalence of templates in C++ programs, including the standard library, testing this area heavily is vitally important. For instructions on how to set up and build POOMA and check the outcome of its testing programs see this guide.
LAPACK is a well known linear algebra package that contains code typical for large scale Fortran programs. For instructions on how to set up and build LAPACK and check the outcome of its testing programs see this guide.
As progress is made towards the release, specific information about how these programs should be compiled, and how their correct operation should be verified will be made available here. In general, however, the purpose will not be to exhaustively test these applications; instead, testers should simply verify that they compile, and perform basic functionality correctly.
Historically, there has been no formal release criterion that took into account performance of code generated by the compiler. It is important that the generated code performs approximately as well as previous releases. Therefore, we will use the following benchmarks for measuring code quality:
Name | Language | Source URL |
---|---|---|
gzip 1.2.4a | C | |
Stepanov | C++ | stepanov_v1p2.C |
LAPACK | Fortran | LAPACK 3.0 (timing programs) |
A Java benchmark is not required for this release since there is little precedent for the behavior of the Java compiler. For Java, functional completeness and correctness are still more important than optimization.
In addition to the above benchmarks, the behavior of real programs should be considered as well. For that reason, the behavior of the elliptic curve integer factorization program ecm4c.c, which uses GNU mp, will be considered part of the release criteria.
A release candidate will be deemed unacceptable if the performance of the generated code is not at least as good as that of GCC 2.95.2 on the benchmarks, and within at least 5% on the application tests.
There is a perception that development snapshots take longer to compile programs than their 2.95.2 counterparts, and that they often use more memory as well. Compile-time performance is an important part of compiler quality. It is not enough simply to provide additional optimizations; the compiler must also continue to compile programs relatively quickly. However, it is to be expected that additional optimizations and additional features will have a non-zero cost.
In order to measure compile-time performance, we will use the following unit tests:
Name | Language | Source | Flags | Comments |
---|---|---|---|---|
insn-attrtab.c | C | -O2 | This file contains a large machine-generated switch statement; it is a reasonable benchmark for testing flow optimizations and for handling large functions. | |
C++ | ||||
Fortran |
In addition to these unit tests, we will measure the time and peak memory usage used when building the entire GNU Emacs distribution with both GCC 2.95.2 and GCC 3.0.
If the release candidate's compile-time exceeds GCC 2.95.2 by more than 15%, or if the peak memory usage exceeds that of GCC 2.95.2 by more than 25%, that candidate will be deemed unacceptable.
The following issues are as of yet unresolved:
-fstrict-aliasing
be enabled?-O2 -g
when
bootstrapping? (Probably we should have a matrix of various flags, as
in previous releases.)