1013 lines
46 KiB
Plaintext
Executable File
1013 lines
46 KiB
Plaintext
Executable File
This is Info file gcc.info, produced by Makeinfo version 1.68 from the
|
|
input file ../../gcc-2.95.2/gcc/gcc.texi.
|
|
|
|
INFO-DIR-SECTION Programming
|
|
START-INFO-DIR-ENTRY
|
|
* gcc: (gcc). The GNU Compiler Collection.
|
|
END-INFO-DIR-ENTRY
|
|
This file documents the use and the internals of the GNU compiler.
|
|
|
|
Published by the Free Software Foundation 59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307 USA
|
|
|
|
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
|
1999 Free Software Foundation, Inc.
|
|
|
|
Permission is granted to make and distribute verbatim copies of this
|
|
manual provided the copyright notice and this permission notice are
|
|
preserved on all copies.
|
|
|
|
Permission is granted to copy and distribute modified versions of
|
|
this manual under the conditions for verbatim copying, provided also
|
|
that the sections entitled "GNU General Public License" and "Funding
|
|
for Free Software" are included exactly as in the original, and
|
|
provided that the entire resulting derived work is distributed under
|
|
the terms of a permission notice identical to this one.
|
|
|
|
Permission is granted to copy and distribute translations of this
|
|
manual into another language, under the above conditions for modified
|
|
versions, except that the sections entitled "GNU General Public
|
|
License" and "Funding for Free Software", and this permission notice,
|
|
may be included in translations approved by the Free Software Foundation
|
|
instead of in the original English.
|
|
|
|
|
|
File: gcc.info, Node: Global Declarations, Next: VMS Misc, Prev: Include Files and VMS, Up: VMS
|
|
|
|
Global Declarations and VMS
|
|
===========================
|
|
|
|
GCC does not provide the `globalref', `globaldef' and `globalvalue'
|
|
keywords of VAX-C. You can get the same effect with an obscure feature
|
|
of GAS, the GNU assembler. (This requires GAS version 1.39 or later.)
|
|
The following macros allow you to use this feature in a fairly natural
|
|
way:
|
|
|
|
#ifdef __GNUC__
|
|
#define GLOBALREF(TYPE,NAME) \
|
|
TYPE NAME \
|
|
asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME)
|
|
#define GLOBALDEF(TYPE,NAME,VALUE) \
|
|
TYPE NAME \
|
|
asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \
|
|
= VALUE
|
|
#define GLOBALVALUEREF(TYPE,NAME) \
|
|
const TYPE NAME[1] \
|
|
asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)
|
|
#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
|
|
const TYPE NAME[1] \
|
|
asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME) \
|
|
= {VALUE}
|
|
#else
|
|
#define GLOBALREF(TYPE,NAME) \
|
|
globalref TYPE NAME
|
|
#define GLOBALDEF(TYPE,NAME,VALUE) \
|
|
globaldef TYPE NAME = VALUE
|
|
#define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
|
|
globalvalue TYPE NAME = VALUE
|
|
#define GLOBALVALUEREF(TYPE,NAME) \
|
|
globalvalue TYPE NAME
|
|
#endif
|
|
|
|
(The `_$$PsectAttributes_GLOBALSYMBOL' prefix at the start of the name
|
|
is removed by the assembler, after it has modified the attributes of
|
|
the symbol). These macros are provided in the VMS binaries
|
|
distribution in a header file `GNU_HACKS.H'. An example of the usage
|
|
is:
|
|
|
|
GLOBALREF (int, ijk);
|
|
GLOBALDEF (int, jkl, 0);
|
|
|
|
The macros `GLOBALREF' and `GLOBALDEF' cannot be used
|
|
straightforwardly for arrays, since there is no way to insert the array
|
|
dimension into the declaration at the right place. However, you can
|
|
declare an array with these macros if you first define a typedef for the
|
|
array type, like this:
|
|
|
|
typedef int intvector[10];
|
|
GLOBALREF (intvector, foo);
|
|
|
|
Array and structure initializers will also break the macros; you can
|
|
define the initializer to be a macro of its own, or you can expand the
|
|
`GLOBALDEF' macro by hand. You may find a case where you wish to use
|
|
the `GLOBALDEF' macro with a large array, but you are not interested in
|
|
explicitly initializing each element of the array. In such cases you
|
|
can use an initializer like: `{0,}', which will initialize the entire
|
|
array to `0'.
|
|
|
|
A shortcoming of this implementation is that a variable declared with
|
|
`GLOBALVALUEREF' or `GLOBALVALUEDEF' is always an array. For example,
|
|
the declaration:
|
|
|
|
GLOBALVALUEREF(int, ijk);
|
|
|
|
declares the variable `ijk' as an array of type `int [1]'. This is
|
|
done because a globalvalue is actually a constant; its "value" is what
|
|
the linker would normally consider an address. That is not how an
|
|
integer value works in C, but it is how an array works. So treating
|
|
the symbol as an array name gives consistent results--with the
|
|
exception that the value seems to have the wrong type. *Don't try to
|
|
access an element of the array.* It doesn't have any elements. The
|
|
array "address" may not be the address of actual storage.
|
|
|
|
The fact that the symbol is an array may lead to warnings where the
|
|
variable is used. Insert type casts to avoid the warnings. Here is an
|
|
example; it takes advantage of the ANSI C feature allowing macros that
|
|
expand to use the same name as the macro itself.
|
|
|
|
GLOBALVALUEREF (int, ss$_normal);
|
|
GLOBALVALUEDEF (int, xyzzy,123);
|
|
#ifdef __GNUC__
|
|
#define ss$_normal ((int) ss$_normal)
|
|
#define xyzzy ((int) xyzzy)
|
|
#endif
|
|
|
|
Don't use `globaldef' or `globalref' with a variable whose type is
|
|
an enumeration type; this is not implemented. Instead, make the
|
|
variable an integer, and use a `globalvaluedef' for each of the
|
|
enumeration values. An example of this would be:
|
|
|
|
#ifdef __GNUC__
|
|
GLOBALDEF (int, color, 0);
|
|
GLOBALVALUEDEF (int, RED, 0);
|
|
GLOBALVALUEDEF (int, BLUE, 1);
|
|
GLOBALVALUEDEF (int, GREEN, 3);
|
|
#else
|
|
enum globaldef color {RED, BLUE, GREEN = 3};
|
|
#endif
|
|
|
|
|
|
File: gcc.info, Node: VMS Misc, Prev: Global Declarations, Up: VMS
|
|
|
|
Other VMS Issues
|
|
================
|
|
|
|
GCC automatically arranges for `main' to return 1 by default if you
|
|
fail to specify an explicit return value. This will be interpreted by
|
|
VMS as a status code indicating a normal successful completion.
|
|
Version 1 of GCC did not provide this default.
|
|
|
|
GCC on VMS works only with the GNU assembler, GAS. You need version
|
|
1.37 or later of GAS in order to produce value debugging information for
|
|
the VMS debugger. Use the ordinary VMS linker with the object files
|
|
produced by GAS.
|
|
|
|
Under previous versions of GCC, the generated code would occasionally
|
|
give strange results when linked to the sharable `VAXCRTL' library.
|
|
Now this should work.
|
|
|
|
A caveat for use of `const' global variables: the `const' modifier
|
|
must be specified in every external declaration of the variable in all
|
|
of the source files that use that variable. Otherwise the linker will
|
|
issue warnings about conflicting attributes for the variable. Your
|
|
program will still work despite the warnings, but the variable will be
|
|
placed in writable storage.
|
|
|
|
Although the VMS linker does distinguish between upper and lower case
|
|
letters in global symbols, most VMS compilers convert all such symbols
|
|
into upper case and most run-time library routines also have upper case
|
|
names. To be able to reliably call such routines, GCC (by means of the
|
|
assembler GAS) converts global symbols into upper case like other VMS
|
|
compilers. However, since the usual practice in C is to distinguish
|
|
case, GCC (via GAS) tries to preserve usual C behavior by augmenting
|
|
each name that is not all lower case. This means truncating the name
|
|
to at most 23 characters and then adding more characters at the end
|
|
which encode the case pattern of those 23. Names which contain at
|
|
least one dollar sign are an exception; they are converted directly into
|
|
upper case without augmentation.
|
|
|
|
Name augmentation yields bad results for programs that use
|
|
precompiled libraries (such as Xlib) which were generated by another
|
|
compiler. You can use the compiler option `/NOCASE_HACK' to inhibit
|
|
augmentation; it makes external C functions and variables
|
|
case-independent as is usual on VMS. Alternatively, you could write
|
|
all references to the functions and variables in such libraries using
|
|
lower case; this will work on VMS, but is not portable to other
|
|
systems. The compiler option `/NAMES' also provides control over
|
|
global name handling.
|
|
|
|
Function and variable names are handled somewhat differently with GNU
|
|
C++. The GNU C++ compiler performs "name mangling" on function names,
|
|
which means that it adds information to the function name to describe
|
|
the data types of the arguments that the function takes. One result of
|
|
this is that the name of a function can become very long. Since the
|
|
VMS linker only recognizes the first 31 characters in a name, special
|
|
action is taken to ensure that each function and variable has a unique
|
|
name that can be represented in 31 characters.
|
|
|
|
If the name (plus a name augmentation, if required) is less than 32
|
|
characters in length, then no special action is performed. If the name
|
|
is longer than 31 characters, the assembler (GAS) will generate a hash
|
|
string based upon the function name, truncate the function name to 23
|
|
characters, and append the hash string to the truncated name. If the
|
|
`/VERBOSE' compiler option is used, the assembler will print both the
|
|
full and truncated names of each symbol that is truncated.
|
|
|
|
The `/NOCASE_HACK' compiler option should not be used when you are
|
|
compiling programs that use libg++. libg++ has several instances of
|
|
objects (i.e. `Filebuf' and `filebuf') which become indistinguishable
|
|
in a case-insensitive environment. This leads to cases where you need
|
|
to inhibit augmentation selectively (if you were using libg++ and Xlib
|
|
in the same program, for example). There is no special feature for
|
|
doing this, but you can get the result by defining a macro for each
|
|
mixed case symbol for which you wish to inhibit augmentation. The
|
|
macro should expand into the lower case equivalent of itself. For
|
|
example:
|
|
|
|
#define StuDlyCapS studlycaps
|
|
|
|
These macro definitions can be placed in a header file to minimize
|
|
the number of changes to your source code.
|
|
|
|
|
|
File: gcc.info, Node: Portability, Next: Interface, Prev: VMS, Up: Top
|
|
|
|
GCC and Portability
|
|
*******************
|
|
|
|
The main goal of GCC was to make a good, fast compiler for machines
|
|
in the class that the GNU system aims to run on: 32-bit machines that
|
|
address 8-bit bytes and have several general registers. Elegance,
|
|
theoretical power and simplicity are only secondary.
|
|
|
|
GCC gets most of the information about the target machine from a
|
|
machine description which gives an algebraic formula for each of the
|
|
machine's instructions. This is a very clean way to describe the
|
|
target. But when the compiler needs information that is difficult to
|
|
express in this fashion, I have not hesitated to define an ad-hoc
|
|
parameter to the machine description. The purpose of portability is to
|
|
reduce the total work needed on the compiler; it was not of interest
|
|
for its own sake.
|
|
|
|
GCC does not contain machine dependent code, but it does contain code
|
|
that depends on machine parameters such as endianness (whether the most
|
|
significant byte has the highest or lowest address of the bytes in a
|
|
word) and the availability of autoincrement addressing. In the
|
|
RTL-generation pass, it is often necessary to have multiple strategies
|
|
for generating code for a particular kind of syntax tree, strategies
|
|
that are usable for different combinations of parameters. Often I have
|
|
not tried to address all possible cases, but only the common ones or
|
|
only the ones that I have encountered. As a result, a new target may
|
|
require additional strategies. You will know if this happens because
|
|
the compiler will call `abort'. Fortunately, the new strategies can be
|
|
added in a machine-independent fashion, and will affect only the target
|
|
machines that need them.
|
|
|
|
|
|
File: gcc.info, Node: Interface, Next: Passes, Prev: Portability, Up: Top
|
|
|
|
Interfacing to GCC Output
|
|
*************************
|
|
|
|
GCC is normally configured to use the same function calling
|
|
convention normally in use on the target system. This is done with the
|
|
machine-description macros described (*note Target Macros::.).
|
|
|
|
However, returning of structure and union values is done differently
|
|
on some target machines. As a result, functions compiled with PCC
|
|
returning such types cannot be called from code compiled with GCC, and
|
|
vice versa. This does not cause trouble often because few Unix library
|
|
routines return structures or unions.
|
|
|
|
GCC code returns structures and unions that are 1, 2, 4 or 8 bytes
|
|
long in the same registers used for `int' or `double' return values.
|
|
(GCC typically allocates variables of such types in registers also.)
|
|
Structures and unions of other sizes are returned by storing them into
|
|
an address passed by the caller (usually in a register). The
|
|
machine-description macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE'
|
|
tell GCC where to pass this address.
|
|
|
|
By contrast, PCC on most target machines returns structures and
|
|
unions of any size by copying the data into an area of static storage,
|
|
and then returning the address of that storage as if it were a pointer
|
|
value. The caller must copy the data from that memory area to the
|
|
place where the value is wanted. This is slower than the method used
|
|
by GCC, and fails to be reentrant.
|
|
|
|
On some target machines, such as RISC machines and the 80386, the
|
|
standard system convention is to pass to the subroutine the address of
|
|
where to return the value. On these machines, GCC has been configured
|
|
to be compatible with the standard compiler, when this method is used.
|
|
It may not be compatible for structures of 1, 2, 4 or 8 bytes.
|
|
|
|
GCC uses the system's standard convention for passing arguments. On
|
|
some machines, the first few arguments are passed in registers; in
|
|
others, all are passed on the stack. It would be possible to use
|
|
registers for argument passing on any machine, and this would probably
|
|
result in a significant speedup. But the result would be complete
|
|
incompatibility with code that follows the standard convention. So this
|
|
change is practical only if you are switching to GCC as the sole C
|
|
compiler for the system. We may implement register argument passing on
|
|
certain machines once we have a complete GNU system so that we can
|
|
compile the libraries with GCC.
|
|
|
|
On some machines (particularly the Sparc), certain types of arguments
|
|
are passed "by invisible reference". This means that the value is
|
|
stored in memory, and the address of the memory location is passed to
|
|
the subroutine.
|
|
|
|
If you use `longjmp', beware of automatic variables. ANSI C says
|
|
that automatic variables that are not declared `volatile' have undefined
|
|
values after a `longjmp'. And this is all GCC promises to do, because
|
|
it is very difficult to restore register variables correctly, and one
|
|
of GCC's features is that it can put variables in registers without
|
|
your asking it to.
|
|
|
|
If you want a variable to be unaltered by `longjmp', and you don't
|
|
want to write `volatile' because old C compilers don't accept it, just
|
|
take the address of the variable. If a variable's address is ever
|
|
taken, even if just to compute it and ignore it, then the variable
|
|
cannot go in a register:
|
|
|
|
{
|
|
int careful;
|
|
&careful;
|
|
...
|
|
}
|
|
|
|
Code compiled with GCC may call certain library routines. Most of
|
|
them handle arithmetic for which there are no instructions. This
|
|
includes multiply and divide on some machines, and floating point
|
|
operations on any machine for which floating point support is disabled
|
|
with `-msoft-float'. Some standard parts of the C library, such as
|
|
`bcopy' or `memcpy', are also called automatically. The usual function
|
|
call interface is used for calling the library routines.
|
|
|
|
These library routines should be defined in the library `libgcc.a',
|
|
which GCC automatically searches whenever it links a program. On
|
|
machines that have multiply and divide instructions, if hardware
|
|
floating point is in use, normally `libgcc.a' is not needed, but it is
|
|
searched just in case.
|
|
|
|
Each arithmetic function is defined in `libgcc1.c' to use the
|
|
corresponding C arithmetic operator. As long as the file is compiled
|
|
with another C compiler, which supports all the C arithmetic operators,
|
|
this file will work portably. However, `libgcc1.c' does not work if
|
|
compiled with GCC, because each arithmetic function would compile into
|
|
a call to itself!
|
|
|
|
|
|
File: gcc.info, Node: Passes, Next: RTL, Prev: Interface, Up: Top
|
|
|
|
Passes and Files of the Compiler
|
|
********************************
|
|
|
|
The overall control structure of the compiler is in `toplev.c'. This
|
|
file is responsible for initialization, decoding arguments, opening and
|
|
closing files, and sequencing the passes.
|
|
|
|
The parsing pass is invoked only once, to parse the entire input.
|
|
The RTL intermediate code for a function is generated as the function
|
|
is parsed, a statement at a time. Each statement is read in as a
|
|
syntax tree and then converted to RTL; then the storage for the tree
|
|
for the statement is reclaimed. Storage for types (and the expressions
|
|
for their sizes), declarations, and a representation of the binding
|
|
contours and how they nest, remain until the function is finished being
|
|
compiled; these are all needed to output the debugging information.
|
|
|
|
Each time the parsing pass reads a complete function definition or
|
|
top-level declaration, it calls either the function
|
|
`rest_of_compilation', or the function `rest_of_decl_compilation' in
|
|
`toplev.c', which are responsible for all further processing necessary,
|
|
ending with output of the assembler language. All other compiler
|
|
passes run, in sequence, within `rest_of_compilation'. When that
|
|
function returns from compiling a function definition, the storage used
|
|
for that function definition's compilation is entirely freed, unless it
|
|
is an inline function (*note An Inline Function is As Fast As a Macro:
|
|
Inline.).
|
|
|
|
Here is a list of all the passes of the compiler and their source
|
|
files. Also included is a description of where debugging dumps can be
|
|
requested with `-d' options.
|
|
|
|
* Parsing. This pass reads the entire text of a function definition,
|
|
constructing partial syntax trees. This and RTL generation are no
|
|
longer truly separate passes (formerly they were), but it is
|
|
easier to think of them as separate.
|
|
|
|
The tree representation does not entirely follow C syntax, because
|
|
it is intended to support other languages as well.
|
|
|
|
Language-specific data type analysis is also done in this pass,
|
|
and every tree node that represents an expression has a data type
|
|
attached. Variables are represented as declaration nodes.
|
|
|
|
Constant folding and some arithmetic simplifications are also done
|
|
during this pass.
|
|
|
|
The language-independent source files for parsing are
|
|
`stor-layout.c', `fold-const.c', and `tree.c'. There are also
|
|
header files `tree.h' and `tree.def' which define the format of
|
|
the tree representation.
|
|
|
|
The source files to parse C are `c-parse.in', `c-decl.c',
|
|
`c-typeck.c', `c-aux-info.c', `c-convert.c', and `c-lang.c' along
|
|
with header files `c-lex.h', and `c-tree.h'.
|
|
|
|
The source files for parsing C++ are `cp-parse.y', `cp-class.c',
|
|
`cp-cvt.c', `cp-decl.c', `cp-decl2.c', `cp-dem.c', `cp-except.c',
|
|
`cp-expr.c', `cp-init.c', `cp-lex.c', `cp-method.c', `cp-ptree.c',
|
|
`cp-search.c', `cp-tree.c', `cp-type2.c', and `cp-typeck.c', along
|
|
with header files `cp-tree.def', `cp-tree.h', and `cp-decl.h'.
|
|
|
|
The special source files for parsing Objective C are
|
|
`objc-parse.y', `objc-actions.c', `objc-tree.def', and
|
|
`objc-actions.h'. Certain C-specific files are used for this as
|
|
well.
|
|
|
|
The file `c-common.c' is also used for all of the above languages.
|
|
|
|
* RTL generation. This is the conversion of syntax tree into RTL
|
|
code. It is actually done statement-by-statement during parsing,
|
|
but for most purposes it can be thought of as a separate pass.
|
|
|
|
This is where the bulk of target-parameter-dependent code is found,
|
|
since often it is necessary for strategies to apply only when
|
|
certain standard kinds of instructions are available. The purpose
|
|
of named instruction patterns is to provide this information to
|
|
the RTL generation pass.
|
|
|
|
Optimization is done in this pass for `if'-conditions that are
|
|
comparisons, boolean operations or conditional expressions. Tail
|
|
recursion is detected at this time also. Decisions are made about
|
|
how best to arrange loops and how to output `switch' statements.
|
|
|
|
The source files for RTL generation include `stmt.c', `calls.c',
|
|
`expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and
|
|
`emit-rtl.c'. Also, the file `insn-emit.c', generated from the
|
|
machine description by the program `genemit', is used in this
|
|
pass. The header file `expr.h' is used for communication within
|
|
this pass.
|
|
|
|
The header files `insn-flags.h' and `insn-codes.h', generated from
|
|
the machine description by the programs `genflags' and `gencodes',
|
|
tell this pass which standard names are available for use and
|
|
which patterns correspond to them.
|
|
|
|
Aside from debugging information output, none of the following
|
|
passes refers to the tree structure representation of the function
|
|
(only part of which is saved).
|
|
|
|
The decision of whether the function can and should be expanded
|
|
inline in its subsequent callers is made at the end of rtl
|
|
generation. The function must meet certain criteria, currently
|
|
related to the size of the function and the types and number of
|
|
parameters it has. Note that this function may contain loops,
|
|
recursive calls to itself (tail-recursive functions can be
|
|
inlined!), gotos, in short, all constructs supported by GCC. The
|
|
file `integrate.c' contains the code to save a function's rtl for
|
|
later inlining and to inline that rtl when the function is called.
|
|
The header file `integrate.h' is also used for this purpose.
|
|
|
|
The option `-dr' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.rtl' to
|
|
the input file name.
|
|
|
|
* Jump optimization. This pass simplifies jumps to the following
|
|
instruction, jumps across jumps, and jumps to jumps. It deletes
|
|
unreferenced labels and unreachable code, except that unreachable
|
|
code that contains a loop is not recognized as unreachable in this
|
|
pass. (Such loops are deleted later in the basic block analysis.)
|
|
It also converts some code originally written with jumps into
|
|
sequences of instructions that directly set values from the
|
|
results of comparisons, if the machine has such instructions.
|
|
|
|
Jump optimization is performed two or three times. The first time
|
|
is immediately following RTL generation. The second time is after
|
|
CSE, but only if CSE says repeated jump optimization is needed.
|
|
The last time is right before the final pass. That time,
|
|
cross-jumping and deletion of no-op move instructions are done
|
|
together with the optimizations described above.
|
|
|
|
The source file of this pass is `jump.c'.
|
|
|
|
The option `-dj' causes a debugging dump of the RTL code after
|
|
this pass is run for the first time. This dump file's name is
|
|
made by appending `.jump' to the input file name.
|
|
|
|
* Register scan. This pass finds the first and last use of each
|
|
register, as a guide for common subexpression elimination. Its
|
|
source is in `regclass.c'.
|
|
|
|
* Jump threading. This pass detects a condition jump that branches
|
|
to an identical or inverse test. Such jumps can be `threaded'
|
|
through the second conditional test. The source code for this
|
|
pass is in `jump.c'. This optimization is only performed if
|
|
`-fthread-jumps' is enabled.
|
|
|
|
* Common subexpression elimination. This pass also does constant
|
|
propagation. Its source file is `cse.c'. If constant propagation
|
|
causes conditional jumps to become unconditional or to become
|
|
no-ops, jump optimization is run again when CSE is finished.
|
|
|
|
The option `-ds' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.cse' to
|
|
the input file name.
|
|
|
|
* Global common subexpression elimination. This pass performs GCSE
|
|
using Morel-Renvoise Partial Redundancy Elimination, with the
|
|
exception that it does not try to move invariants out of loops -
|
|
that is left to the loop optimization pass. This pass also
|
|
performs global constant and copy propagation.
|
|
|
|
The source file for this pass is gcse.c.
|
|
|
|
The option `-dG' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.gcse' to
|
|
the input file name.
|
|
|
|
* Loop optimization. This pass moves constant expressions out of
|
|
loops, and optionally does strength-reduction and loop unrolling
|
|
as well. Its source files are `loop.c' and `unroll.c', plus the
|
|
header `loop.h' used for communication between them. Loop
|
|
unrolling uses some functions in `integrate.c' and the header
|
|
`integrate.h'.
|
|
|
|
The option `-dL' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.loop' to
|
|
the input file name.
|
|
|
|
* If `-frerun-cse-after-loop' was enabled, a second common
|
|
subexpression elimination pass is performed after the loop
|
|
optimization pass. Jump threading is also done again at this time
|
|
if it was specified.
|
|
|
|
The option `-dt' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.cse2' to
|
|
the input file name.
|
|
|
|
* Stupid register allocation is performed at this point in a
|
|
nonoptimizing compilation. It does a little data flow analysis as
|
|
well. When stupid register allocation is in use, the next pass
|
|
executed is the reloading pass; the others in between are skipped.
|
|
The source file is `stupid.c'.
|
|
|
|
* Data flow analysis (`flow.c'). This pass divides the program into
|
|
basic blocks (and in the process deletes unreachable loops); then
|
|
it computes which pseudo-registers are live at each point in the
|
|
program, and makes the first instruction that uses a value point at
|
|
the instruction that computed the value.
|
|
|
|
This pass also deletes computations whose results are never used,
|
|
and combines memory references with add or subtract instructions
|
|
to make autoincrement or autodecrement addressing.
|
|
|
|
The option `-df' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.flow' to
|
|
the input file name. If stupid register allocation is in use, this
|
|
dump file reflects the full results of such allocation.
|
|
|
|
* Instruction combination (`combine.c'). This pass attempts to
|
|
combine groups of two or three instructions that are related by
|
|
data flow into single instructions. It combines the RTL
|
|
expressions for the instructions by substitution, simplifies the
|
|
result using algebra, and then attempts to match the result
|
|
against the machine description.
|
|
|
|
The option `-dc' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.combine'
|
|
to the input file name.
|
|
|
|
* Register movement (`regmove.c'). This pass looks for cases where
|
|
matching constraints would force an instruction to need a reload,
|
|
and this reload would be a register to register move. It them
|
|
attempts to change the registers used by the instruction to avoid
|
|
the move instruction.
|
|
|
|
The option `-dN' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.regmove'
|
|
to the input file name.
|
|
|
|
* Instruction scheduling (`sched.c'). This pass looks for
|
|
instructions whose output will not be available by the time that
|
|
it is used in subsequent instructions. (Memory loads and floating
|
|
point instructions often have this behavior on RISC machines). It
|
|
re-orders instructions within a basic block to try to separate the
|
|
definition and use of items that otherwise would cause pipeline
|
|
stalls.
|
|
|
|
Instruction scheduling is performed twice. The first time is
|
|
immediately after instruction combination and the second is
|
|
immediately after reload.
|
|
|
|
The option `-dS' causes a debugging dump of the RTL code after this
|
|
pass is run for the first time. The dump file's name is made by
|
|
appending `.sched' to the input file name.
|
|
|
|
* Register class preferencing. The RTL code is scanned to find out
|
|
which register class is best for each pseudo register. The source
|
|
file is `regclass.c'.
|
|
|
|
* Local register allocation (`local-alloc.c'). This pass allocates
|
|
hard registers to pseudo registers that are used only within one
|
|
basic block. Because the basic block is linear, it can use fast
|
|
and powerful techniques to do a very good job.
|
|
|
|
The option `-dl' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.lreg' to
|
|
the input file name.
|
|
|
|
* Global register allocation (`global.c'). This pass allocates hard
|
|
registers for the remaining pseudo registers (those whose life
|
|
spans are not contained in one basic block).
|
|
|
|
* Reloading. This pass renumbers pseudo registers with the hardware
|
|
registers numbers they were allocated. Pseudo registers that did
|
|
not get hard registers are replaced with stack slots. Then it
|
|
finds instructions that are invalid because a value has failed to
|
|
end up in a register, or has ended up in a register of the wrong
|
|
kind. It fixes up these instructions by reloading the
|
|
problematical values temporarily into registers. Additional
|
|
instructions are generated to do the copying.
|
|
|
|
The reload pass also optionally eliminates the frame pointer and
|
|
inserts instructions to save and restore call-clobbered registers
|
|
around calls.
|
|
|
|
Source files are `reload.c' and `reload1.c', plus the header
|
|
`reload.h' used for communication between them.
|
|
|
|
The option `-dg' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.greg' to
|
|
the input file name.
|
|
|
|
* Instruction scheduling is repeated here to try to avoid pipeline
|
|
stalls due to memory loads generated for spilled pseudo registers.
|
|
|
|
The option `-dR' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.sched2'
|
|
to the input file name.
|
|
|
|
* Jump optimization is repeated, this time including cross-jumping
|
|
and deletion of no-op move instructions.
|
|
|
|
The option `-dJ' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.jump2' to
|
|
the input file name.
|
|
|
|
* Delayed branch scheduling. This optional pass attempts to find
|
|
instructions that can go into the delay slots of other
|
|
instructions, usually jumps and calls. The source file name is
|
|
`reorg.c'.
|
|
|
|
The option `-dd' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.dbr' to
|
|
the input file name.
|
|
|
|
* Conversion from usage of some hard registers to usage of a register
|
|
stack may be done at this point. Currently, this is supported only
|
|
for the floating-point registers of the Intel 80387 coprocessor.
|
|
The source file name is `reg-stack.c'.
|
|
|
|
The options `-dk' causes a debugging dump of the RTL code after
|
|
this pass. This dump file's name is made by appending `.stack' to
|
|
the input file name.
|
|
|
|
* Final. This pass outputs the assembler code for the function. It
|
|
is also responsible for identifying spurious test and compare
|
|
instructions. Machine-specific peephole optimizations are
|
|
performed at the same time. The function entry and exit sequences
|
|
are generated directly as assembler code in this pass; they never
|
|
exist as RTL.
|
|
|
|
The source files are `final.c' plus `insn-output.c'; the latter is
|
|
generated automatically from the machine description by the tool
|
|
`genoutput'. The header file `conditions.h' is used for
|
|
communication between these files.
|
|
|
|
* Debugging information output. This is run after final because it
|
|
must output the stack slot offsets for pseudo registers that did
|
|
not get hard registers. Source files are `dbxout.c' for DBX
|
|
symbol table format, `sdbout.c' for SDB symbol table format, and
|
|
`dwarfout.c' for DWARF symbol table format.
|
|
|
|
Some additional files are used by all or many passes:
|
|
|
|
* Every pass uses `machmode.def' and `machmode.h' which define the
|
|
machine modes.
|
|
|
|
* Several passes use `real.h', which defines the default
|
|
representation of floating point constants and how to operate on
|
|
them.
|
|
|
|
* All the passes that work with RTL use the header files `rtl.h' and
|
|
`rtl.def', and subroutines in file `rtl.c'. The tools `gen*' also
|
|
use these files to read and work with the machine description RTL.
|
|
|
|
* Several passes refer to the header file `insn-config.h' which
|
|
contains a few parameters (C macro definitions) generated
|
|
automatically from the machine description RTL by the tool
|
|
`genconfig'.
|
|
|
|
* Several passes use the instruction recognizer, which consists of
|
|
`recog.c' and `recog.h', plus the files `insn-recog.c' and
|
|
`insn-extract.c' that are generated automatically from the machine
|
|
description by the tools `genrecog' and `genextract'.
|
|
|
|
* Several passes use the header files `regs.h' which defines the
|
|
information recorded about pseudo register usage, and
|
|
`basic-block.h' which defines the information recorded about basic
|
|
blocks.
|
|
|
|
* `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector
|
|
with a bit for each hard register, and some macros to manipulate
|
|
it. This type is just `int' if the machine has few enough hard
|
|
registers; otherwise it is an array of `int' and some of the
|
|
macros expand into loops.
|
|
|
|
* Several passes use instruction attributes. A definition of the
|
|
attributes defined for a particular machine is in file
|
|
`insn-attr.h', which is generated from the machine description by
|
|
the program `genattr'. The file `insn-attrtab.c' contains
|
|
subroutines to obtain the attribute values for insns. It is
|
|
generated from the machine description by the program `genattrtab'.
|
|
|
|
|
|
File: gcc.info, Node: RTL, Next: Machine Desc, Prev: Passes, Up: Top
|
|
|
|
RTL Representation
|
|
******************
|
|
|
|
Most of the work of the compiler is done on an intermediate
|
|
representation called register transfer language. In this language,
|
|
the instructions to be output are described, pretty much one by one, in
|
|
an algebraic form that describes what the instruction does.
|
|
|
|
RTL is inspired by Lisp lists. It has both an internal form, made
|
|
up of structures that point at other structures, and a textual form
|
|
that is used in the machine description and in printed debugging dumps.
|
|
The textual form uses nested parentheses to indicate the pointers in
|
|
the internal form.
|
|
|
|
* Menu:
|
|
|
|
* RTL Objects:: Expressions vs vectors vs strings vs integers.
|
|
* RTL Classes:: Categories of RTL expresion objects, and their structure.
|
|
* Accessors:: Macros to access expression operands or vector elts.
|
|
* Flags:: Other flags in an RTL expression.
|
|
* Machine Modes:: Describing the size and format of a datum.
|
|
* Constants:: Expressions with constant values.
|
|
* Regs and Memory:: Expressions representing register contents or memory.
|
|
* Arithmetic:: Expressions representing arithmetic on other expressions.
|
|
* Comparisons:: Expressions representing comparison of expressions.
|
|
* Bit Fields:: Expressions representing bitfields in memory or reg.
|
|
* Conversions:: Extending, truncating, floating or fixing.
|
|
* RTL Declarations:: Declaring volatility, constancy, etc.
|
|
* Side Effects:: Expressions for storing in registers, etc.
|
|
* Incdec:: Embedded side-effects for autoincrement addressing.
|
|
* Assembler:: Representing `asm' with operands.
|
|
* Insns:: Expression types for entire insns.
|
|
* Calls:: RTL representation of function call insns.
|
|
* Sharing:: Some expressions are unique; others *must* be copied.
|
|
* Reading RTL:: Reading textual RTL from a file.
|
|
|
|
|
|
File: gcc.info, Node: RTL Objects, Next: RTL Classes, Prev: RTL, Up: RTL
|
|
|
|
RTL Object Types
|
|
================
|
|
|
|
RTL uses five kinds of objects: expressions, integers, wide integers,
|
|
strings and vectors. Expressions are the most important ones. An RTL
|
|
expression ("RTX", for short) is a C structure, but it is usually
|
|
referred to with a pointer; a type that is given the typedef name `rtx'.
|
|
|
|
An integer is simply an `int'; their written form uses decimal
|
|
digits. A wide integer is an integral object whose type is
|
|
`HOST_WIDE_INT' (*note Config::.); their written form uses decimal
|
|
digits.
|
|
|
|
A string is a sequence of characters. In core it is represented as a
|
|
`char *' in usual C fashion, and it is written in C syntax as well.
|
|
However, strings in RTL may never be null. If you write an empty
|
|
string in a machine description, it is represented in core as a null
|
|
pointer rather than as a pointer to a null character. In certain
|
|
contexts, these null pointers instead of strings are valid. Within RTL
|
|
code, strings are most commonly found inside `symbol_ref' expressions,
|
|
but they appear in other contexts in the RTL expressions that make up
|
|
machine descriptions.
|
|
|
|
A vector contains an arbitrary number of pointers to expressions.
|
|
The number of elements in the vector is explicitly present in the
|
|
vector. The written form of a vector consists of square brackets
|
|
(`[...]') surrounding the elements, in sequence and with whitespace
|
|
separating them. Vectors of length zero are not created; null pointers
|
|
are used instead.
|
|
|
|
Expressions are classified by "expression codes" (also called RTX
|
|
codes). The expression code is a name defined in `rtl.def', which is
|
|
also (in upper case) a C enumeration constant. The possible expression
|
|
codes and their meanings are machine-independent. The code of an RTX
|
|
can be extracted with the macro `GET_CODE (X)' and altered with
|
|
`PUT_CODE (X, NEWCODE)'.
|
|
|
|
The expression code determines how many operands the expression
|
|
contains, and what kinds of objects they are. In RTL, unlike Lisp, you
|
|
cannot tell by looking at an operand what kind of object it is.
|
|
Instead, you must know from its context--from the expression code of
|
|
the containing expression. For example, in an expression of code
|
|
`subreg', the first operand is to be regarded as an expression and the
|
|
second operand as an integer. In an expression of code `plus', there
|
|
are two operands, both of which are to be regarded as expressions. In
|
|
a `symbol_ref' expression, there is one operand, which is to be
|
|
regarded as a string.
|
|
|
|
Expressions are written as parentheses containing the name of the
|
|
expression type, its flags and machine mode if any, and then the
|
|
operands of the expression (separated by spaces).
|
|
|
|
Expression code names in the `md' file are written in lower case,
|
|
but when they appear in C code they are written in upper case. In this
|
|
manual, they are shown as follows: `const_int'.
|
|
|
|
In a few contexts a null pointer is valid where an expression is
|
|
normally wanted. The written form of this is `(nil)'.
|
|
|
|
|
|
File: gcc.info, Node: RTL Classes, Next: Accessors, Prev: RTL Objects, Up: RTL
|
|
|
|
RTL Classes and Formats
|
|
=======================
|
|
|
|
The various expression codes are divided into several "classes",
|
|
which are represented by single characters. You can determine the class
|
|
of an RTX code with the macro `GET_RTX_CLASS (CODE)'. Currently,
|
|
`rtx.def' defines these classes:
|
|
|
|
`o'
|
|
An RTX code that represents an actual object, such as a register
|
|
(`REG') or a memory location (`MEM', `SYMBOL_REF'). Constants and
|
|
basic transforms on objects (`ADDRESSOF', `HIGH', `LO_SUM') are
|
|
also included. Note that `SUBREG' and `STRICT_LOW_PART' are not
|
|
in this class, but in class `x'.
|
|
|
|
`<'
|
|
An RTX code for a comparison, such as `NE' or `LT'.
|
|
|
|
`1'
|
|
An RTX code for a unary arithmetic operation, such as `NEG',
|
|
`NOT', or `ABS'. This category also includes value extension
|
|
(sign or zero) and conversions between integer and floating point.
|
|
|
|
`c'
|
|
An RTX code for a commutative binary operation, such as `PLUS' or
|
|
`AND'. `NE' and `EQ' are comparisons, so they have class `<'.
|
|
|
|
`2'
|
|
An RTX code for a non-commutative binary operation, such as
|
|
`MINUS', `DIV', or `ASHIFTRT'.
|
|
|
|
`b'
|
|
An RTX code for a bitfield operation. Currently only
|
|
`ZERO_EXTRACT' and `SIGN_EXTRACT'. These have three inputs and
|
|
are lvalues (so they can be used for insertion as well). *Note
|
|
Bit Fields::.
|
|
|
|
`3'
|
|
An RTX code for other three input operations. Currently only
|
|
`IF_THEN_ELSE'.
|
|
|
|
`i'
|
|
An RTX code for an entire instruction: `INSN', `JUMP_INSN', and
|
|
`CALL_INSN'. *Note Insns::.
|
|
|
|
`m'
|
|
An RTX code for something that matches in insns, such as
|
|
`MATCH_DUP'. These only occur in machine descriptions.
|
|
|
|
`x'
|
|
All other RTX codes. This category includes the remaining codes
|
|
used only in machine descriptions (`DEFINE_*', etc.). It also
|
|
includes all the codes describing side effects (`SET', `USE',
|
|
`CLOBBER', etc.) and the non-insns that may appear on an insn
|
|
chain, such as `NOTE', `BARRIER', and `CODE_LABEL'.
|
|
|
|
For each expression type `rtl.def' specifies the number of contained
|
|
objects and their kinds, with four possibilities: `e' for expression
|
|
(actually a pointer to an expression), `i' for integer, `w' for wide
|
|
integer, `s' for string, and `E' for vector of expressions. The
|
|
sequence of letters for an expression code is called its "format". For
|
|
example, the format of `subreg' is `ei'.
|
|
|
|
A few other format characters are used occasionally:
|
|
|
|
`u'
|
|
`u' is equivalent to `e' except that it is printed differently in
|
|
debugging dumps. It is used for pointers to insns.
|
|
|
|
`n'
|
|
`n' is equivalent to `i' except that it is printed differently in
|
|
debugging dumps. It is used for the line number or code number of
|
|
a `note' insn.
|
|
|
|
`S'
|
|
`S' indicates a string which is optional. In the RTL objects in
|
|
core, `S' is equivalent to `s', but when the object is read, from
|
|
an `md' file, the string value of this operand may be omitted. An
|
|
omitted string is taken to be the null string.
|
|
|
|
`V'
|
|
`V' indicates a vector which is optional. In the RTL objects in
|
|
core, `V' is equivalent to `E', but when the object is read from
|
|
an `md' file, the vector value of this operand may be omitted. An
|
|
omitted vector is effectively the same as a vector of no elements.
|
|
|
|
`0'
|
|
`0' means a slot whose contents do not fit any normal category.
|
|
`0' slots are not printed at all in dumps, and are often used in
|
|
special ways by small parts of the compiler.
|
|
|
|
There are macros to get the number of operands and the format of an
|
|
expression code:
|
|
|
|
`GET_RTX_LENGTH (CODE)'
|
|
Number of operands of an RTX of code CODE.
|
|
|
|
`GET_RTX_FORMAT (CODE)'
|
|
The format of an RTX of code CODE, as a C string.
|
|
|
|
Some classes of RTX codes always have the same format. For example,
|
|
it is safe to assume that all comparison operations have format `ee'.
|
|
|
|
`1'
|
|
All codes of this class have format `e'.
|
|
|
|
`<'
|
|
`c'
|
|
`2'
|
|
All codes of these classes have format `ee'.
|
|
|
|
`b'
|
|
`3'
|
|
All codes of these classes have format `eee'.
|
|
|
|
`i'
|
|
All codes of this class have formats that begin with `iuueiee'.
|
|
*Note Insns::. Note that not all RTL objects linked onto an insn
|
|
chain are of class `i'.
|
|
|
|
`o'
|
|
`m'
|
|
`x'
|
|
You can make no assumptions about the format of these codes.
|
|
|
|
|
|
File: gcc.info, Node: Accessors, Next: Flags, Prev: RTL Classes, Up: RTL
|
|
|
|
Access to Operands
|
|
==================
|
|
|
|
Operands of expressions are accessed using the macros `XEXP',
|
|
`XINT', `XWINT' and `XSTR'. Each of these macros takes two arguments:
|
|
an expression-pointer (RTX) and an operand number (counting from zero).
|
|
Thus,
|
|
|
|
XEXP (X, 2)
|
|
|
|
accesses operand 2 of expression X, as an expression.
|
|
|
|
XINT (X, 2)
|
|
|
|
accesses the same operand as an integer. `XSTR', used in the same
|
|
fashion, would access it as a string.
|
|
|
|
Any operand can be accessed as an integer, as an expression or as a
|
|
string. You must choose the correct method of access for the kind of
|
|
value actually stored in the operand. You would do this based on the
|
|
expression code of the containing expression. That is also how you
|
|
would know how many operands there are.
|
|
|
|
For example, if X is a `subreg' expression, you know that it has two
|
|
operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
|
|
1)'. If you did `XINT (X, 0)', you would get the address of the
|
|
expression operand but cast as an integer; that might occasionally be
|
|
useful, but it would be cleaner to write `(int) XEXP (X, 0)'. `XEXP
|
|
(X, 1)' would also compile without error, and would return the second,
|
|
integer operand cast as an expression pointer, which would probably
|
|
result in a crash when accessed. Nothing stops you from writing `XEXP
|
|
(X, 28)' either, but this will access memory past the end of the
|
|
expression with unpredictable results.
|
|
|
|
Access to operands which are vectors is more complicated. You can
|
|
use the macro `XVEC' to get the vector-pointer itself, or the macros
|
|
`XVECEXP' and `XVECLEN' to access the elements and length of a vector.
|
|
|
|
`XVEC (EXP, IDX)'
|
|
Access the vector-pointer which is operand number IDX in EXP.
|
|
|
|
`XVECLEN (EXP, IDX)'
|
|
Access the length (number of elements) in the vector which is in
|
|
operand number IDX in EXP. This value is an `int'.
|
|
|
|
`XVECEXP (EXP, IDX, ELTNUM)'
|
|
Access element number ELTNUM in the vector which is in operand
|
|
number IDX in EXP. This value is an RTX.
|
|
|
|
It is up to you to make sure that ELTNUM is not negative and is
|
|
less than `XVECLEN (EXP, IDX)'.
|
|
|
|
All the macros defined in this section expand into lvalues and
|
|
therefore can be used to assign the operands, lengths and vector
|
|
elements as well as to access them.
|
|
|