GNU Compiler Collection
|
The GNU Compiler Collection (usually shortened to GCC) is a set of programming language compilers produced by the GNU Project. It is free software distributed by the Free Software Foundation (FSF) under the GNU GPL, and is a key component of the GNU toolchain. It is the standard compiler for the open source Unix-like operating systems, and certain proprietary operating systems derived therefrom such as Mac OS X.
Originally named the GNU C Compiler, because it only handled the C programming language, GCC was later extended to compile C++, Fortran, Ada, and others.
Contents |
Languages
As of version 4.0.0 (released on 2005-04-20), the standard compiler release includes front ends for:
- Ada (GCC for Ada aka GNAT)
- C
- C++ (GCC for C++ aka G++)
- Fortran (GCC for Fortran aka GFortran)
- Java (GCC for Java aka GCJ)
- Objective-C
A front end for CHILL was previously included, but has been dropped owing to a lack of maintenance. The G77 front end was dropped in favour of the new GFortran frontend that supports Fortran 95. Pascal, Modula-2, Modula-3, Mercury, VHDL, PL/I and Objective-C++ frontends also exist.
Architectures
GCC target processors (as of version 3.2) include:
- Alpha
- ARM
- H8/300
- System/370, System 390
- x86 and x86-64
- IA-64 "Itanium"
- Motorola 68000
- Motorola 88000
- MIPS
- PA-RISC
- PDP-11
- PowerPC
- SuperH
- SPARC
- VAX
Lesser-known target processors supported in the standard release have included A29K, ARC, Atmel AVR, C4x, CRIS, D30V, DSP16xx, FR-30, FR-V, Intel i960, IP2000, M32R, 68HC11, MCORE, MMIX, MN10200, MN10300, NS32K, ROMP, Stormy16, V850, and Xtensa. Additional processors, such as the D10V, PDP-10, and Z8000, have been supported by GCC versions maintained separately from the FSF version.
Structure
GCC's external interface is generally standard for a Unix compiler. Users invoke a driver program named gcc
, which interprets command arguments, decides which language compilers to use for each input file, runs the assembler on their output, and then possibly runs the linker to produce a complete program.
Each of the language compilers is a separate program that takes in source code and produces assembly language. All have a common internal structure; a per-language front end that parses the languages and produces an abstract syntax tree ("tree" for short), and a back end that converts the trees to GCC's Register Transfer Language (RTL), runs various compiler optimizations, then produces assembly language using architecture-specific pattern matching originally based on an algorithm of Jack Davidson and Chris Fraser's.
Nearly all of GCC is written in C, although much of the Ada frontend is written in Ada.
Front ends
Frontends vary internally, having to produce trees that can be handled by the backend. Some parsers use a YACC-type grammar specification, and the others are hand-coded recursive descent parsers.
Until recently, the tree representation of the program was not fully independent of the processor being targeted. Confusingly, the meaning of a tree was somewhat different for different language front-ends, and front-ends could provide their own tree codes.
Recently, two new forms of language-independent trees have been introduced. These new tree formats are called GENERIC and GIMPLE. Parsing is now done by creating temporary language-dependent trees, and converting them to GENERIC. The so-called gimplifier then lowers this more complex form into the simpler SSA-based GIMPLE form which is the common language for a large number of new powerful language- and architecture-independent global (function scope) optimizations.
Optimization on trees does not generally fit into what most compiler developers would consider a front end task, as it is not language dependent and does not involve parsing. GCC developers have given this part of the compiler the somewhat contradictory name the "middle end." These optimizations include dead code elimination, partial redundancy elimination, global value numbering, sparse conditional constant propagation, and scalar replacement of aggregates. Array dependence based optimizations such as automatic vectorization are currently being developed.
Back end
The behavior of the GCC back end is partly specified by preprocessor macros and functions specific to a target architecture, for instance to define the endianness, word size, and calling conventions. The front part of the back end uses these to help decide RTL generation, so although GCC's RTL is nominally processor-independent, the initial sequence of abstract instructions is already adapted to the target.
The exact set of GCC optimizations varies from release to release as it develops, but includes the standard algorithms, such as jump optimization, jump threading, common subexpression elimination, instruction scheduling, and so forth. The RTL optimizations are of less importance with the recent addition of global SSA-based optimizations on GIMPLE trees, as RTL optimizations have a much more limited scope, and have less high-level information.
A "reloading" phase changes abstract (pseudo-) registers into real machine registers, using data collected from the patterns describing the target's instruction set. This is a somewhat complicated phase, because it must account for the vagaries of all of GCC's targets.
The final phase is somewhat anticlimactic, since the patterns to match were generally chosen during reloading, and so the assembly code is simply built by running substitutions of registers and addresses into the strings specifying the instructions.
References
- Richard M. Stallman: Using and Porting the GNU Compiler Collection (http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html), Free Software Foundation, ISBN 059510035X
- Richard M. Stallman: Using Gcc: The Gnu Compiler Collection Reference (http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/), Free Software Foundation, ISBN 1882114396
- Brian J. Gough: An Introduction to GCC (http://www.network-theory.co.uk/gcc/intro/), Network Theory Ltd., ISBN 0-9541617-9-3
See also
External links
- GCC homepage (http://gcc.gnu.org/)
- v4.0 Manual (http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/)
- v3.4.3 Manual (http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/)
- GCC periodic news summary (http://gccnews.chatta.us/)
- Building and Testing gcc/glibc cross toolchains (http://www.kegel.com/crosstool/)
- GCC Wiki (http://gcc.gnu.org/wiki)
Further reading
- Arthur Griffith, GCC: The Complete Reference. McGrawHill/Osborne. ISBN 0-07-222405-3.
hu:gcc de:GNU Compiler Collection es:GCC eo:GCC et:GNU Compiler Collection fr:GNU compiler collection ja:GNUコンパイラコレクション it:GNU Compiler Collection lt:GCC nl:GNU Compiler Collection pl:Gcc pt:GNU Compiler Collection sv:GCC zh:GCC uk:GCC