1018 lines
45 KiB
Plaintext
1018 lines
45 KiB
Plaintext
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: Misc, Prev: Cross-compilation, Up: Target Macros
|
||
|
||
Miscellaneous Parameters
|
||
========================
|
||
|
||
Here are several miscellaneous parameters.
|
||
|
||
`PREDICATE_CODES'
|
||
Define this if you have defined special-purpose predicates in the
|
||
file `MACHINE.c'. This macro is called within an initializer of an
|
||
array of structures. The first field in the structure is the name
|
||
of a predicate and the second field is an array of rtl codes. For
|
||
each predicate, list all rtl codes that can be in expressions
|
||
matched by the predicate. The list should have a trailing comma.
|
||
Here is an example of two entries in the list for a typical RISC
|
||
machine:
|
||
|
||
#define PREDICATE_CODES \
|
||
{"gen_reg_rtx_operand", {SUBREG, REG}}, \
|
||
{"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},
|
||
|
||
Defining this macro does not affect the generated code (however,
|
||
incorrect definitions that omit an rtl code that may be matched by
|
||
the predicate can cause the compiler to malfunction). Instead, it
|
||
allows the table built by `genrecog' to be more compact and
|
||
efficient, thus speeding up the compiler. The most important
|
||
predicates to include in the list specified by this macro are
|
||
those used in the most insn patterns.
|
||
|
||
`CASE_VECTOR_MODE'
|
||
An alias for a machine mode name. This is the machine mode that
|
||
elements of a jump-table should have.
|
||
|
||
`CASE_VECTOR_SHORTEN_MODE (MIN_OFFSET, MAX_OFFSET, BODY)'
|
||
Optional: return the preferred mode for an `addr_diff_vec' when
|
||
the minimum and maximum offset are known. If you define this, it
|
||
enables extra code in branch shortening to deal with
|
||
`addr_diff_vec'. To make this work, you also have to define
|
||
INSN_ALIGN and make the alignment for `addr_diff_vec' explicit.
|
||
The BODY argument is provided so that the offset_unsigned and scale
|
||
flags can be updated.
|
||
|
||
`CASE_VECTOR_PC_RELATIVE'
|
||
Define this macro to be a C expression to indicate when jump-tables
|
||
should contain relative addresses. If jump-tables never contain
|
||
relative addresses, then you need not define this macro.
|
||
|
||
`CASE_DROPS_THROUGH'
|
||
Define this if control falls through a `case' insn when the index
|
||
value is out of range. This means the specified default-label is
|
||
actually ignored by the `case' insn proper.
|
||
|
||
`CASE_VALUES_THRESHOLD'
|
||
Define this to be the smallest number of different values for
|
||
which it is best to use a jump-table instead of a tree of
|
||
conditional branches. The default is four for machines with a
|
||
`casesi' instruction and five otherwise. This is best for most
|
||
machines.
|
||
|
||
`WORD_REGISTER_OPERATIONS'
|
||
Define this macro if operations between registers with integral
|
||
mode smaller than a word are always performed on the entire
|
||
register. Most RISC machines have this property and most CISC
|
||
machines do not.
|
||
|
||
`LOAD_EXTEND_OP (MODE)'
|
||
Define this macro to be a C expression indicating when insns that
|
||
read memory in MODE, an integral mode narrower than a word, set the
|
||
bits outside of MODE to be either the sign-extension or the
|
||
zero-extension of the data read. Return `SIGN_EXTEND' for values
|
||
of MODE for which the insn sign-extends, `ZERO_EXTEND' for which
|
||
it zero-extends, and `NIL' for other modes.
|
||
|
||
This macro is not called with MODE non-integral or with a width
|
||
greater than or equal to `BITS_PER_WORD', so you may return any
|
||
value in this case. Do not define this macro if it would always
|
||
return `NIL'. On machines where this macro is defined, you will
|
||
normally define it as the constant `SIGN_EXTEND' or `ZERO_EXTEND'.
|
||
|
||
`SHORT_IMMEDIATES_SIGN_EXTEND'
|
||
Define this macro if loading short immediate values into registers
|
||
sign extends.
|
||
|
||
`IMPLICIT_FIX_EXPR'
|
||
An alias for a tree code that should be used by default for
|
||
conversion of floating point values to fixed point. Normally,
|
||
`FIX_ROUND_EXPR' is used.
|
||
|
||
`FIXUNS_TRUNC_LIKE_FIX_TRUNC'
|
||
Define this macro if the same instructions that convert a floating
|
||
point number to a signed fixed point number also convert validly
|
||
to an unsigned one.
|
||
|
||
`EASY_DIV_EXPR'
|
||
An alias for a tree code that is the easiest kind of division to
|
||
compile code for in the general case. It may be `TRUNC_DIV_EXPR',
|
||
`FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'. These four
|
||
division operators differ in how they round the result to an
|
||
integer. `EASY_DIV_EXPR' is used when it is permissible to use
|
||
any of those kinds of division and the choice should be made on
|
||
the basis of efficiency.
|
||
|
||
`MOVE_MAX'
|
||
The maximum number of bytes that a single instruction can move
|
||
quickly between memory and registers or between two memory
|
||
locations.
|
||
|
||
`MAX_MOVE_MAX'
|
||
The maximum number of bytes that a single instruction can move
|
||
quickly between memory and registers or between two memory
|
||
locations. If this is undefined, the default is `MOVE_MAX'.
|
||
Otherwise, it is the constant value that is the largest value that
|
||
`MOVE_MAX' can have at run-time.
|
||
|
||
`SHIFT_COUNT_TRUNCATED'
|
||
A C expression that is nonzero if on this machine the number of
|
||
bits actually used for the count of a shift operation is equal to
|
||
the number of bits needed to represent the size of the object
|
||
being shifted. When this macro is non-zero, the compiler will
|
||
assume that it is safe to omit a sign-extend, zero-extend, and
|
||
certain bitwise `and' instructions that truncates the count of a
|
||
shift operation. On machines that have instructions that act on
|
||
bitfields at variable positions, which may include `bit test'
|
||
instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
|
||
deletion of truncations of the values that serve as arguments to
|
||
bitfield instructions.
|
||
|
||
If both types of instructions truncate the count (for shifts) and
|
||
position (for bitfield operations), or if no variable-position
|
||
bitfield instructions exist, you should define this macro.
|
||
|
||
However, on some machines, such as the 80386 and the 680x0,
|
||
truncation only applies to shift operations and not the (real or
|
||
pretended) bitfield operations. Define `SHIFT_COUNT_TRUNCATED' to
|
||
be zero on such machines. Instead, add patterns to the `md' file
|
||
that include the implied truncation of the shift instructions.
|
||
|
||
You need not define this macro if it would always have the value
|
||
of zero.
|
||
|
||
`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)'
|
||
A C expression which is nonzero if on this machine it is safe to
|
||
"convert" an integer of INPREC bits to one of OUTPREC bits (where
|
||
OUTPREC is smaller than INPREC) by merely operating on it as if it
|
||
had only OUTPREC bits.
|
||
|
||
On many machines, this expression can be 1.
|
||
|
||
When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
|
||
modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result.
|
||
If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
|
||
such cases may improve things.
|
||
|
||
`STORE_FLAG_VALUE'
|
||
A C expression describing the value returned by a comparison
|
||
operator with an integral mode and stored by a store-flag
|
||
instruction (`sCOND') when the condition is true. This
|
||
description must apply to *all* the `sCOND' patterns and all the
|
||
comparison operators whose results have a `MODE_INT' mode.
|
||
|
||
A value of 1 or -1 means that the instruction implementing the
|
||
comparison operator returns exactly 1 or -1 when the comparison is
|
||
true and 0 when the comparison is false. Otherwise, the value
|
||
indicates which bits of the result are guaranteed to be 1 when the
|
||
comparison is true. This value is interpreted in the mode of the
|
||
comparison operation, which is given by the mode of the first
|
||
operand in the `sCOND' pattern. Either the low bit or the sign
|
||
bit of `STORE_FLAG_VALUE' be on. Presently, only those bits are
|
||
used by the compiler.
|
||
|
||
If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will
|
||
generate code that depends only on the specified bits. It can also
|
||
replace comparison operators with equivalent operations if they
|
||
cause the required bits to be set, even if the remaining bits are
|
||
undefined. For example, on a machine whose comparison operators
|
||
return an `SImode' value and where `STORE_FLAG_VALUE' is defined as
|
||
`0x80000000', saying that just the sign bit is relevant, the
|
||
expression
|
||
|
||
(ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0))
|
||
|
||
can be converted to
|
||
|
||
(ashift:SI X (const_int N))
|
||
|
||
where N is the appropriate shift count to move the bit being
|
||
tested into the sign bit.
|
||
|
||
There is no way to describe a machine that always sets the
|
||
low-order bit for a true value, but does not guarantee the value
|
||
of any other bits, but we do not know of any machine that has such
|
||
an instruction. If you are trying to port GNU CC to such a
|
||
machine, include an instruction to perform a logical-and of the
|
||
result with 1 in the pattern for the comparison operators and let
|
||
us know (*note How to Report Bugs: Bug Reporting.).
|
||
|
||
Often, a machine will have multiple instructions that obtain a
|
||
value from a comparison (or the condition codes). Here are rules
|
||
to guide the choice of value for `STORE_FLAG_VALUE', and hence the
|
||
instructions to be used:
|
||
|
||
* Use the shortest sequence that yields a valid definition for
|
||
`STORE_FLAG_VALUE'. It is more efficient for the compiler to
|
||
"normalize" the value (convert it to, e.g., 1 or 0) than for
|
||
the comparison operators to do so because there may be
|
||
opportunities to combine the normalization with other
|
||
operations.
|
||
|
||
* For equal-length sequences, use a value of 1 or -1, with -1
|
||
being slightly preferred on machines with expensive jumps and
|
||
1 preferred on other machines.
|
||
|
||
* As a second choice, choose a value of `0x80000001' if
|
||
instructions exist that set both the sign and low-order bits
|
||
but do not define the others.
|
||
|
||
* Otherwise, use a value of `0x80000000'.
|
||
|
||
Many machines can produce both the value chosen for
|
||
`STORE_FLAG_VALUE' and its negation in the same number of
|
||
instructions. On those machines, you should also define a pattern
|
||
for those cases, e.g., one matching
|
||
|
||
(set A (neg:M (ne:M B C)))
|
||
|
||
Some machines can also perform `and' or `plus' operations on
|
||
condition code values with less instructions than the corresponding
|
||
`sCOND' insn followed by `and' or `plus'. On those machines,
|
||
define the appropriate patterns. Use the names `incscc' and
|
||
`decscc', respectively, for the patterns which perform `plus' or
|
||
`minus' operations on condition code values. See `rs6000.md' for
|
||
some examples. The GNU Superoptizer can be used to find such
|
||
instruction sequences on other machines.
|
||
|
||
You need not define `STORE_FLAG_VALUE' if the machine has no
|
||
store-flag instructions.
|
||
|
||
`FLOAT_STORE_FLAG_VALUE'
|
||
A C expression that gives a non-zero floating point value that is
|
||
returned when comparison operators with floating-point results are
|
||
true. Define this macro on machine that have comparison
|
||
operations that return floating-point values. If there are no
|
||
such operations, do not define this macro.
|
||
|
||
`Pmode'
|
||
An alias for the machine mode for pointers. On most machines,
|
||
define this to be the integer mode corresponding to the width of a
|
||
hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit
|
||
machines. On some machines you must define this to be one of the
|
||
partial integer modes, such as `PSImode'.
|
||
|
||
The width of `Pmode' must be at least as large as the value of
|
||
`POINTER_SIZE'. If it is not equal, you must define the macro
|
||
`POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to
|
||
`Pmode'.
|
||
|
||
`FUNCTION_MODE'
|
||
An alias for the machine mode used for memory references to
|
||
functions being called, in `call' RTL expressions. On most
|
||
machines this should be `QImode'.
|
||
|
||
`INTEGRATE_THRESHOLD (DECL)'
|
||
A C expression for the maximum number of instructions above which
|
||
the function DECL should not be inlined. DECL is a
|
||
`FUNCTION_DECL' node.
|
||
|
||
The default definition of this macro is 64 plus 8 times the number
|
||
of arguments that the function accepts. Some people think a larger
|
||
threshold should be used on RISC machines.
|
||
|
||
`SCCS_DIRECTIVE'
|
||
Define this if the preprocessor should ignore `#sccs' directives
|
||
and print no error message.
|
||
|
||
`NO_IMPLICIT_EXTERN_C'
|
||
Define this macro if the system header files support C++ as well
|
||
as C. This macro inhibits the usual method of using system header
|
||
files in C++, which is to pretend that the file's contents are
|
||
enclosed in `extern "C" {...}'.
|
||
|
||
`HANDLE_PRAGMA (GETC, UNGETC, NAME)'
|
||
Define this macro if you want to implement any pragmas. If
|
||
defined, it is a C expression whose value is 1 if the pragma was
|
||
handled by the macro, zero otherwise. The argument GETC is a
|
||
function of type `int (*)(void)' which will return the next
|
||
character in the input stream, or EOF if no characters are left.
|
||
The argument UNGETC is a function of type `void (*)(int)' which
|
||
will push a character back into the input stream. The argument
|
||
NAME is the word following #pragma in the input stream. The input
|
||
stream pointer will be pointing just beyond the end of this word.
|
||
The input stream should be left undistrubed if the expression
|
||
returns zero, otherwise it should be pointing at the next
|
||
character after the end of the pragma. Any characters remaining
|
||
on the line will be ignored.
|
||
|
||
It is generally a bad idea to implement new uses of `#pragma'. The
|
||
only reason to define this macro is for compatibility with other
|
||
compilers that do support `#pragma' for the sake of any user
|
||
programs which already use it.
|
||
|
||
If the pragma can be implemented by atttributes then the macro
|
||
`INSERT_ATTRIBUTES' might be a useful one to define as well.
|
||
|
||
Note: older versions of this macro only had two arguments: STREAM
|
||
and TOKEN. The macro was changed in order to allow it to work
|
||
when gcc is built both with and without a cpp library.
|
||
|
||
`HANDLE_SYSV_PRAGMA'
|
||
Define this macro (to a value of 1) if you want the System V style
|
||
pragmas `#pragma pack(<n>)' and `#pragma weak <name> [=<value>]'
|
||
to be supported by gcc.
|
||
|
||
The pack pragma specifies the maximum alignment (in bytes) of
|
||
fields within a structure, in much the same way as the
|
||
`__aligned__' and `__packed__' `__attribute__'s do. A pack value
|
||
of zero resets the behaviour to the default.
|
||
|
||
The weak pragma only works if `SUPPORTS_WEAK' and
|
||
`ASM_WEAKEN_LABEL' are defined. If enabled it allows the creation
|
||
of specifically named weak labels, optionally with a value.
|
||
|
||
`HANDLE_PRAGMA_PACK_PUSH_POP'
|
||
Define this macro (to a value of 1) if you want to support the
|
||
Win32 style pragmas `#pragma pack(push,<n>)' and `#pragma
|
||
pack(pop)'. The pack(push,<n>) pragma specifies the maximum
|
||
alignment (in bytes) of fields within a structure, in much the
|
||
same way as the `__aligned__' and `__packed__' `__attribute__'s
|
||
do. A pack value of zero resets the behaviour to the default.
|
||
Successive invocations of this pragma cause the previous values to
|
||
be stacked, so that invocations of `#pragma pack(pop)' will return
|
||
to the previous value.
|
||
|
||
`VALID_MACHINE_DECL_ATTRIBUTE (DECL, ATTRIBUTES, IDENTIFIER, ARGS)'
|
||
If defined, a C expression whose value is nonzero if IDENTIFIER
|
||
with arguments ARGS is a valid machine specific attribute for DECL.
|
||
The attributes in ATTRIBUTES have previously been assigned to DECL.
|
||
|
||
`VALID_MACHINE_TYPE_ATTRIBUTE (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)'
|
||
If defined, a C expression whose value is nonzero if IDENTIFIER
|
||
with arguments ARGS is a valid machine specific attribute for TYPE.
|
||
The attributes in ATTRIBUTES have previously been assigned to TYPE.
|
||
|
||
`COMP_TYPE_ATTRIBUTES (TYPE1, TYPE2)'
|
||
If defined, a C expression whose value is zero if the attributes on
|
||
TYPE1 and TYPE2 are incompatible, one if they are compatible, and
|
||
two if they are nearly compatible (which causes a warning to be
|
||
generated).
|
||
|
||
`SET_DEFAULT_TYPE_ATTRIBUTES (TYPE)'
|
||
If defined, a C statement that assigns default attributes to newly
|
||
defined TYPE.
|
||
|
||
`MERGE_MACHINE_TYPE_ATTRIBUTES (TYPE1, TYPE2)'
|
||
Define this macro if the merging of type attributes needs special
|
||
handling. If defined, the result is a list of the combined
|
||
TYPE_ATTRIBUTES of TYPE1 and TYPE2. It is assumed that comptypes
|
||
has already been called and returned 1.
|
||
|
||
`MERGE_MACHINE_DECL_ATTRIBUTES (OLDDECL, NEWDECL)'
|
||
Define this macro if the merging of decl attributes needs special
|
||
handling. If defined, the result is a list of the combined
|
||
DECL_MACHINE_ATTRIBUTES of OLDDECL and NEWDECL. NEWDECL is a
|
||
duplicate declaration of OLDDECL. Examples of when this is needed
|
||
are when one attribute overrides another, or when an attribute is
|
||
nullified by a subsequent definition.
|
||
|
||
`INSERT_ATTRIBUTES (NODE, ATTR_PTR, PREFIX_PTR)'
|
||
Define this macro if you want to be able to add attributes to a
|
||
decl when it is being created. This is normally useful for
|
||
backends which wish to implement a pragma by using the attributes
|
||
which correspond to the pragma's effect. The NODE argument is the
|
||
decl which is being created. The ATTR_PTR argument is a pointer
|
||
to the attribute list for this decl. The PREFIX_PTR is a pointer
|
||
to the list of attributes that have appeared after the specifiers
|
||
and modifiers of the declaration, but before the declaration
|
||
proper.
|
||
|
||
`SET_DEFAULT_DECL_ATTRIBUTES (DECL, ATTRIBUTES)'
|
||
If defined, a C statement that assigns default attributes to newly
|
||
defined DECL.
|
||
|
||
`DOLLARS_IN_IDENTIFIERS'
|
||
Define this macro to control use of the character `$' in identifier
|
||
names. 0 means `$' is not allowed by default; 1 means it is
|
||
allowed. 1 is the default; there is no need to define this macro
|
||
in that case. This macro controls the compiler proper; it does
|
||
not affect the preprocessor.
|
||
|
||
`NO_DOLLAR_IN_LABEL'
|
||
Define this macro if the assembler does not accept the character
|
||
`$' in label names. By default constructors and destructors in
|
||
G++ have `$' in the identifiers. If this macro is defined, `.' is
|
||
used instead.
|
||
|
||
`NO_DOT_IN_LABEL'
|
||
Define this macro if the assembler does not accept the character
|
||
`.' in label names. By default constructors and destructors in G++
|
||
have names that use `.'. If this macro is defined, these names
|
||
are rewritten to avoid `.'.
|
||
|
||
`DEFAULT_MAIN_RETURN'
|
||
Define this macro if the target system expects every program's
|
||
`main' function to return a standard "success" value by default
|
||
(if no other value is explicitly returned).
|
||
|
||
The definition should be a C statement (sans semicolon) to
|
||
generate the appropriate rtl instructions. It is used only when
|
||
compiling the end of `main'.
|
||
|
||
`HAVE_ATEXIT'
|
||
Define this if the target system supports the function `atexit'
|
||
from the ANSI C standard. If this is not defined, and
|
||
`INIT_SECTION_ASM_OP' is not defined, a default `exit' function
|
||
will be provided to support C++.
|
||
|
||
`EXIT_BODY'
|
||
Define this if your `exit' function needs to do something besides
|
||
calling an external function `_cleanup' before terminating with
|
||
`_exit'. The `EXIT_BODY' macro is only needed if neither
|
||
`HAVE_ATEXIT' nor `INIT_SECTION_ASM_OP' are defined.
|
||
|
||
`INSN_SETS_ARE_DELAYED (INSN)'
|
||
Define this macro as a C expression that is nonzero if it is safe
|
||
for the delay slot scheduler to place instructions in the delay
|
||
slot of INSN, even if they appear to use a resource set or
|
||
clobbered in INSN. INSN is always a `jump_insn' or an `insn'; GNU
|
||
CC knows that every `call_insn' has this behavior. On machines
|
||
where some `insn' or `jump_insn' is really a function call and
|
||
hence has this behavior, you should define this macro.
|
||
|
||
You need not define this macro if it would always return zero.
|
||
|
||
`INSN_REFERENCES_ARE_DELAYED (INSN)'
|
||
Define this macro as a C expression that is nonzero if it is safe
|
||
for the delay slot scheduler to place instructions in the delay
|
||
slot of INSN, even if they appear to set or clobber a resource
|
||
referenced in INSN. INSN is always a `jump_insn' or an `insn'.
|
||
On machines where some `insn' or `jump_insn' is really a function
|
||
call and its operands are registers whose use is actually in the
|
||
subroutine it calls, you should define this macro. Doing so
|
||
allows the delay slot scheduler to move instructions which copy
|
||
arguments into the argument registers into the delay slot of INSN.
|
||
|
||
You need not define this macro if it would always return zero.
|
||
|
||
`MACHINE_DEPENDENT_REORG (INSN)'
|
||
In rare cases, correct code generation requires extra machine
|
||
dependent processing between the second jump optimization pass and
|
||
delayed branch scheduling. On those machines, define this macro
|
||
as a C statement to act on the code starting at INSN.
|
||
|
||
`MULTIPLE_SYMBOL_SPACES'
|
||
Define this macro if in some cases global symbols from one
|
||
translation unit may not be bound to undefined symbols in another
|
||
translation unit without user intervention. For instance, under
|
||
Microsoft Windows symbols must be explicitly imported from shared
|
||
libraries (DLLs).
|
||
|
||
`ISSUE_RATE'
|
||
A C expression that returns how many instructions can be issued at
|
||
the same time if the machine is a superscalar machine. This is
|
||
only used by the `Haifa' scheduler, and not the traditional
|
||
scheduler.
|
||
|
||
`MD_SCHED_INIT (FILE, VERBOSE)'
|
||
A C statement which is executed by the `Haifa' scheduler at the
|
||
beginning of each block of instructions that are to be scheduled.
|
||
FILE is either a null pointer, or a stdio stream to write any
|
||
debug output to. VERBOSE is the verbose level provided by
|
||
`-fsched-verbose-'N.
|
||
|
||
`MD_SCHED_REORDER (FILE, VERBOSE, READY, N_READY)'
|
||
A C statement which is executed by the `Haifa' scheduler after it
|
||
has scheduled the ready list to allow the machine description to
|
||
reorder it (for example to combine two small instructions together
|
||
on `VLIW' machines). FILE is either a null pointer, or a stdio
|
||
stream to write any debug output to. VERBOSE is the verbose level
|
||
provided by `-fsched-verbose-'N. READY is a pointer to the ready
|
||
list of instructions that are ready to be scheduled. N_READY is
|
||
the number of elements in the ready list. The scheduler reads the
|
||
ready list in reverse order, starting with READY[N_READY-1] and
|
||
going to READY[0].
|
||
|
||
`MD_SCHED_VARIABLE_ISSUE (FILE, VERBOSE, INSN, MORE)'
|
||
A C statement which is executed by the `Haifa' scheduler after it
|
||
has scheduled an insn from the ready list. FILE is either a null
|
||
pointer, or a stdio stream to write any debug output to. VERBOSE
|
||
is the verbose level provided by `-fsched-verbose-'N. INSN is the
|
||
instruction that was scheduled. MORE is the number of
|
||
instructions that can be issued in the current cycle. The
|
||
`MD_SCHED_VARIABLE_ISSUE' macro is responsible for updating the
|
||
value of MORE (typically by MORE-).
|
||
|
||
`MAX_INTEGER_COMPUTATION_MODE'
|
||
Define this to the largest integer machine mode which can be used
|
||
for operations other than load, store and copy operations.
|
||
|
||
You need only define this macro if the target holds values larger
|
||
than `word_mode' in general purpose registers. Most targets
|
||
should not define this macro.
|
||
|
||
`MATH_LIBRARY'
|
||
Define this macro as a C string constant for the linker argument
|
||
to link in the system math library, or `""' if the target does not
|
||
have a separate math library.
|
||
|
||
You need only define this macro if the default of `"-lm"' is wrong.
|
||
|
||
|
||
File: gcc.info, Node: Config, Next: Fragments, Prev: Target Macros, Up: Top
|
||
|
||
The Configuration File
|
||
**********************
|
||
|
||
The configuration file `xm-MACHINE.h' contains macro definitions
|
||
that describe the machine and system on which the compiler is running,
|
||
unlike the definitions in `MACHINE.h', which describe the machine for
|
||
which the compiler is producing output. Most of the values in
|
||
`xm-MACHINE.h' are actually the same on all machines that GCC runs on,
|
||
so large parts of all configuration files are identical. But there are
|
||
some macros that vary:
|
||
|
||
`USG'
|
||
Define this macro if the host system is System V.
|
||
|
||
`VMS'
|
||
Define this macro if the host system is VMS.
|
||
|
||
`FATAL_EXIT_CODE'
|
||
A C expression for the status code to be returned when the compiler
|
||
exits after serious errors.
|
||
|
||
`SUCCESS_EXIT_CODE'
|
||
A C expression for the status code to be returned when the compiler
|
||
exits without serious errors.
|
||
|
||
`HOST_WORDS_BIG_ENDIAN'
|
||
Defined if the host machine stores words of multi-word values in
|
||
big-endian order. (GCC does not depend on the host byte ordering
|
||
within a word.)
|
||
|
||
`HOST_FLOAT_WORDS_BIG_ENDIAN'
|
||
Define this macro to be 1 if the host machine stores `DFmode',
|
||
`XFmode' or `TFmode' floating point numbers in memory with the
|
||
word containing the sign bit at the lowest address; otherwise,
|
||
define it to be zero.
|
||
|
||
This macro need not be defined if the ordering is the same as for
|
||
multi-word integers.
|
||
|
||
`HOST_FLOAT_FORMAT'
|
||
A numeric code distinguishing the floating point format for the
|
||
host machine. See `TARGET_FLOAT_FORMAT' in *Note Storage Layout::
|
||
for the alternatives and default.
|
||
|
||
`HOST_BITS_PER_CHAR'
|
||
A C expression for the number of bits in `char' on the host
|
||
machine.
|
||
|
||
`HOST_BITS_PER_SHORT'
|
||
A C expression for the number of bits in `short' on the host
|
||
machine.
|
||
|
||
`HOST_BITS_PER_INT'
|
||
A C expression for the number of bits in `int' on the host machine.
|
||
|
||
`HOST_BITS_PER_LONG'
|
||
A C expression for the number of bits in `long' on the host
|
||
machine.
|
||
|
||
`ONLY_INT_FIELDS'
|
||
Define this macro to indicate that the host compiler only supports
|
||
`int' bit fields, rather than other integral types, including
|
||
`enum', as do most C compilers.
|
||
|
||
`OBSTACK_CHUNK_SIZE'
|
||
A C expression for the size of ordinary obstack chunks. If you
|
||
don't define this, a usually-reasonable default is used.
|
||
|
||
`OBSTACK_CHUNK_ALLOC'
|
||
The function used to allocate obstack chunks. If you don't define
|
||
this, `xmalloc' is used.
|
||
|
||
`OBSTACK_CHUNK_FREE'
|
||
The function used to free obstack chunks. If you don't define
|
||
this, `free' is used.
|
||
|
||
`USE_C_ALLOCA'
|
||
Define this macro to indicate that the compiler is running with the
|
||
`alloca' implemented in C. This version of `alloca' can be found
|
||
in the file `alloca.c'; to use it, you must also alter the
|
||
`Makefile' variable `ALLOCA'. (This is done automatically for the
|
||
systems on which we know it is needed.)
|
||
|
||
If you do define this macro, you should probably do it as follows:
|
||
|
||
#ifndef __GNUC__
|
||
#define USE_C_ALLOCA
|
||
#else
|
||
#define alloca __builtin_alloca
|
||
#endif
|
||
|
||
so that when the compiler is compiled with GCC it uses the more
|
||
efficient built-in `alloca' function.
|
||
|
||
`FUNCTION_CONVERSION_BUG'
|
||
Define this macro to indicate that the host compiler does not
|
||
properly handle converting a function value to a
|
||
pointer-to-function when it is used in an expression.
|
||
|
||
`MULTIBYTE_CHARS'
|
||
Define this macro to enable support for multibyte characters in the
|
||
input to GCC. This requires that the host system support the ANSI
|
||
C library functions for converting multibyte characters to wide
|
||
characters.
|
||
|
||
`POSIX'
|
||
Define this if your system is POSIX.1 compliant.
|
||
|
||
`NO_SYS_SIGLIST'
|
||
Define this if your system *does not* provide the variable
|
||
`sys_siglist'.
|
||
|
||
Some systems do provide this variable, but with a different name
|
||
such as `_sys_siglist'. On these systems, you can define
|
||
`sys_siglist' as a macro which expands into the name actually
|
||
provided.
|
||
|
||
Autoconf normally defines `SYS_SIGLIST_DECLARED' when it finds a
|
||
declaration of `sys_siglist' in the system header files. However,
|
||
when you define `sys_siglist' to a different name autoconf will
|
||
not automatically define `SYS_SIGLIST_DECLARED'. Therefore, if
|
||
you define `sys_siglist', you should also define
|
||
`SYS_SIGLIST_DECLARED'.
|
||
|
||
`USE_PROTOTYPES'
|
||
Define this to be 1 if you know that the host compiler supports
|
||
prototypes, even if it doesn't define __STDC__, or define it to be
|
||
0 if you do not want any prototypes used in compiling GCC. If
|
||
`USE_PROTOTYPES' is not defined, it will be determined
|
||
automatically whether your compiler supports prototypes by
|
||
checking if `__STDC__' is defined.
|
||
|
||
`NO_MD_PROTOTYPES'
|
||
Define this if you wish suppression of prototypes generated from
|
||
the machine description file, but to use other prototypes within
|
||
GCC. If `USE_PROTOTYPES' is defined to be 0, or the host compiler
|
||
does not support prototypes, this macro has no effect.
|
||
|
||
`MD_CALL_PROTOTYPES'
|
||
Define this if you wish to generate prototypes for the `gen_call'
|
||
or `gen_call_value' functions generated from the machine
|
||
description file. If `USE_PROTOTYPES' is defined to be 0, or the
|
||
host compiler does not support prototypes, or `NO_MD_PROTOTYPES'
|
||
is defined, this macro has no effect. As soon as all of the
|
||
machine descriptions are modified to have the appropriate number
|
||
of arguments, this macro will be removed.
|
||
|
||
`PATH_SEPARATOR'
|
||
Define this macro to be a C character constant representing the
|
||
character used to separate components in paths. The default value
|
||
is the colon character
|
||
|
||
`DIR_SEPARATOR'
|
||
If your system uses some character other than slash to separate
|
||
directory names within a file specification, define this macro to
|
||
be a C character constant specifying that character. When GCC
|
||
displays file names, the character you specify will be used. GCC
|
||
will test for both slash and the character you specify when
|
||
parsing filenames.
|
||
|
||
`OBJECT_SUFFIX'
|
||
Define this macro to be a C string representing the suffix for
|
||
object files on your machine. If you do not define this macro,
|
||
GCC will use `.o' as the suffix for object files.
|
||
|
||
`EXECUTABLE_SUFFIX'
|
||
Define this macro to be a C string representing the suffix for
|
||
executable files on your machine. If you do not define this
|
||
macro, GCC will use the null string as the suffix for object files.
|
||
|
||
`COLLECT_EXPORT_LIST'
|
||
If defined, `collect2' will scan the individual object files
|
||
specified on its command line and create an export list for the
|
||
linker. Define this macro for systems like AIX, where the linker
|
||
discards object files that are not referenced from `main' and uses
|
||
export lists.
|
||
|
||
In addition, configuration files for system V define `bcopy',
|
||
`bzero' and `bcmp' as aliases. Some files define `alloca' as a macro
|
||
when compiled with GCC, in order to take advantage of the benefit of
|
||
GCC's built-in `alloca'.
|
||
|
||
|
||
File: gcc.info, Node: Fragments, Next: Funding, Prev: Config, Up: Top
|
||
|
||
Makefile Fragments
|
||
******************
|
||
|
||
When you configure GCC using the `configure' script (*note
|
||
Installation::.), it will construct the file `Makefile' from the
|
||
template file `Makefile.in'. When it does this, it will incorporate
|
||
makefile fragment files from the `config' directory, named `t-TARGET'
|
||
and `x-HOST'. If these files do not exist, it means nothing needs to
|
||
be added for a given target or host.
|
||
|
||
* Menu:
|
||
|
||
* Target Fragment:: Writing the `t-TARGET' file.
|
||
* Host Fragment:: Writing the `x-HOST' file.
|
||
|
||
|
||
File: gcc.info, Node: Target Fragment, Next: Host Fragment, Up: Fragments
|
||
|
||
The Target Makefile Fragment
|
||
============================
|
||
|
||
The target makefile fragment, `t-TARGET', defines special target
|
||
dependent variables and targets used in the `Makefile':
|
||
|
||
`LIBGCC1'
|
||
The rule to use to build `libgcc1.a'. If your target does not
|
||
need to use the functions in `libgcc1.a', set this to empty.
|
||
*Note Interface::.
|
||
|
||
`CROSS_LIBGCC1'
|
||
The rule to use to build `libgcc1.a' when building a cross
|
||
compiler. If your target does not need to use the functions in
|
||
`libgcc1.a', set this to empty. *Note Cross Runtime::.
|
||
|
||
`LIBGCC2_CFLAGS'
|
||
Compiler flags to use when compiling `libgcc2.c'.
|
||
|
||
`LIB2FUNCS_EXTRA'
|
||
A list of source file names to be compiled or assembled and
|
||
inserted into `libgcc.a'.
|
||
|
||
`CRTSTUFF_T_CFLAGS'
|
||
Special flags used when compiling `crtstuff.c'. *Note
|
||
Initialization::.
|
||
|
||
`CRTSTUFF_T_CFLAGS_S'
|
||
Special flags used when compiling `crtstuff.c' for shared linking.
|
||
Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'.
|
||
*Note Initialization::.
|
||
|
||
`MULTILIB_OPTIONS'
|
||
For some targets, invoking GCC in different ways produces objects
|
||
that can not be linked together. For example, for some targets GCC
|
||
produces both big and little endian code. For these targets, you
|
||
must arrange for multiple versions of `libgcc.a' to be compiled,
|
||
one for each set of incompatible options. When GCC invokes the
|
||
linker, it arranges to link in the right version of `libgcc.a',
|
||
based on the command line options used.
|
||
|
||
The `MULTILIB_OPTIONS' macro lists the set of options for which
|
||
special versions of `libgcc.a' must be built. Write options that
|
||
are mutually incompatible side by side, separated by a slash.
|
||
Write options that may be used together separated by a space. The
|
||
build procedure will build all combinations of compatible options.
|
||
|
||
For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020
|
||
msoft-float', `Makefile' will build special versions of `libgcc.a'
|
||
using the following sets of options: `-m68000', `-m68020',
|
||
`-msoft-float', `-m68000 -msoft-float', and `-m68020 -msoft-float'.
|
||
|
||
`MULTILIB_DIRNAMES'
|
||
If `MULTILIB_OPTIONS' is used, this variable specifies the
|
||
directory names that should be used to hold the various libraries.
|
||
Write one element in `MULTILIB_DIRNAMES' for each element in
|
||
`MULTILIB_OPTIONS'. If `MULTILIB_DIRNAMES' is not used, the
|
||
default value will be `MULTILIB_OPTIONS', with all slashes treated
|
||
as spaces.
|
||
|
||
For example, if `MULTILIB_OPTIONS' is set to `m68000/m68020
|
||
msoft-float', then the default value of `MULTILIB_DIRNAMES' is
|
||
`m68000 m68020 msoft-float'. You may specify a different value if
|
||
you desire a different set of directory names.
|
||
|
||
`MULTILIB_MATCHES'
|
||
Sometimes the same option may be written in two different ways.
|
||
If an option is listed in `MULTILIB_OPTIONS', GCC needs to know
|
||
about any synonyms. In that case, set `MULTILIB_MATCHES' to a
|
||
list of items of the form `option=option' to describe all relevant
|
||
synonyms. For example, `m68000=mc68000 m68020=mc68020'.
|
||
|
||
`MULTILIB_EXCEPTIONS'
|
||
Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being
|
||
specified, there are combinations that should not be built. In
|
||
that case, set `MULTILIB_EXCEPTIONS' to be all of the switch
|
||
exceptions in shell case syntax that should not be built.
|
||
|
||
For example, in the PowerPC embedded ABI support, it was not
|
||
desirable to build libraries that compiled with the
|
||
`-mcall-aixdesc' option and either of the `-mcall-aixdesc' or
|
||
`-mlittle' options at the same time, and therefore
|
||
`MULTILIB_EXCEPTIONS' is set to `*mrelocatable/*mcall-aixdesc*
|
||
*mlittle/*mcall-aixdesc*'.
|
||
|
||
`MULTILIB_EXTRA_OPTS'
|
||
Sometimes it is desirable that when building multiple versions of
|
||
`libgcc.a' certain options should always be passed on to the
|
||
compiler. In that case, set `MULTILIB_EXTRA_OPTS' to be the list
|
||
of options to be used for all builds.
|
||
|
||
|
||
File: gcc.info, Node: Host Fragment, Prev: Target Fragment, Up: Fragments
|
||
|
||
The Host Makefile Fragment
|
||
==========================
|
||
|
||
The host makefile fragment, `x-HOST', defines special host dependent
|
||
variables and targets used in the `Makefile':
|
||
|
||
`CC'
|
||
The compiler to use when building the first stage.
|
||
|
||
`CLIB'
|
||
Additional host libraries to link with.
|
||
|
||
`OLDCC'
|
||
The compiler to use when building `libgcc1.a' for a native
|
||
compilation.
|
||
|
||
`OLDAR'
|
||
The version of `ar' to use when building `libgcc1.a' for a native
|
||
compilation.
|
||
|
||
`INSTALL'
|
||
The install program to use.
|
||
|
||
|
||
File: gcc.info, Node: Funding, Next: GNU/Linux, Prev: Fragments, Up: Top
|
||
|
||
Funding Free Software
|
||
*********************
|
||
|
||
If you want to have more free software a few years from now, it makes
|
||
sense for you to help encourage people to contribute funds for its
|
||
development. The most effective approach known is to encourage
|
||
commercial redistributors to donate.
|
||
|
||
Users of free software systems can boost the pace of development by
|
||
encouraging for-a-fee distributors to donate part of their selling price
|
||
to free software developers--the Free Software Foundation, and others.
|
||
|
||
The way to convince distributors to do this is to demand it and
|
||
expect it from them. So when you compare distributors, judge them
|
||
partly by how much they give to free software development. Show
|
||
distributors they must compete to be the one who gives the most.
|
||
|
||
To make this approach work, you must insist on numbers that you can
|
||
compare, such as, "We will donate ten dollars to the Frobnitz project
|
||
for each disk sold." Don't be satisfied with a vague promise, such as
|
||
"A portion of the profits are donated," since it doesn't give a basis
|
||
for comparison.
|
||
|
||
Even a precise fraction "of the profits from this disk" is not very
|
||
meaningful, since creative accounting and unrelated business decisions
|
||
can greatly alter what fraction of the sales price counts as profit.
|
||
If the price you pay is $50, ten percent of the profit is probably less
|
||
than a dollar; it might be a few cents, or nothing at all.
|
||
|
||
Some redistributors do development work themselves. This is useful
|
||
too; but to keep everyone honest, you need to inquire how much they do,
|
||
and what kind. Some kinds of development make much more long-term
|
||
difference than others. For example, maintaining a separate version of
|
||
a program contributes very little; maintaining the standard version of a
|
||
program for the whole community contributes much. Easy new ports
|
||
contribute little, since someone else would surely do them; difficult
|
||
ports such as adding a new CPU to the GNU Compiler Collection
|
||
contribute more; major new features or packages contribute the most.
|
||
|
||
By establishing the idea that supporting further development is "the
|
||
proper thing to do" when distributing free software for a fee, we can
|
||
assure a steady flow of resources into making more free software.
|
||
|
||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||
Verbatim copying and redistribution of this section is permitted
|
||
without royalty; alteration is not permitted.
|
||
|
||
|
||
File: gcc.info, Node: GNU/Linux, Next: Copying, Prev: Funding, Up: Top
|
||
|
||
Linux and the GNU Project
|
||
*************************
|
||
|
||
Many computer users run a modified version of the GNU system every
|
||
day, without realizing it. Through a peculiar turn of events, the
|
||
version of GNU which is widely used today is more often known as
|
||
"Linux", and many users are not aware of the extent of its connection
|
||
with the GNU Project.
|
||
|
||
There really is a Linux; it is a kernel, and these people are using
|
||
it. But you can't use a kernel by itself; a kernel is useful only as
|
||
part of a whole system. The system in which Linux is typically used is
|
||
a modified variant of the GNU system--in other words, a Linux-based GNU
|
||
system.
|
||
|
||
Many users are not fully aware of the distinction between the kernel,
|
||
which is Linux, and the whole system, which they also call "Linux".
|
||
The ambiguous use of the name doesn't promote understanding.
|
||
|
||
Programmers generally know that Linux is a kernel. But since they
|
||
have generally heard the whole system called "Linux" as well, they
|
||
often envisage a history which fits that name. For example, many
|
||
believe that once Linus Torvalds finished writing the kernel, his
|
||
friends looked around for other free software, and for no particular
|
||
reason most everything necessary to make a Unix-like system was already
|
||
available.
|
||
|
||
What they found was no accident--it was the GNU system. The
|
||
available free software added up to a complete system because the GNU
|
||
Project had been working since 1984 to make one. The GNU Manifesto had
|
||
set forth the goal of developing a free Unix-like system, called GNU.
|
||
By the time Linux was written, the system was almost finished.
|
||
|
||
Most free software projects have the goal of developing a particular
|
||
program for a particular job. For example, Linus Torvalds set out to
|
||
write a Unix-like kernel (Linux); Donald Knuth set out to write a text
|
||
formatter (TeX); Bob Scheifler set out to develop a window system (X
|
||
Windows). It's natural to measure the contribution of this kind of
|
||
project by specific programs that came from the project.
|
||
|
||
If we tried to measure the GNU Project's contribution in this way,
|
||
what would we conclude? One CD-ROM vendor found that in their "Linux
|
||
distribution", GNU software was the largest single contingent, around
|
||
28% of the total source code, and this included some of the essential
|
||
major components without which there could be no system. Linux itself
|
||
was about 3%. So if you were going to pick a name for the system based
|
||
on who wrote the programs in the system, the most appropriate single
|
||
choice would be "GNU".
|
||
|
||
But we don't think that is the right way to consider the question.
|
||
The GNU Project was not, is not, a project to develop specific software
|
||
packages. It was not a project to develop a C compiler, although we
|
||
did. It was not a project to develop a text editor, although we
|
||
developed one. The GNU Project's aim was to develop *a complete free
|
||
Unix-like system*.
|
||
|
||
Many people have made major contributions to the free software in the
|
||
system, and they all deserve credit. But the reason it is *a
|
||
system*--and not just a collection of useful programs--is because the
|
||
GNU Project set out to make it one. We wrote the programs that were
|
||
needed to make a *complete* free system. We wrote essential but
|
||
unexciting major components, such as the assembler and linker, because
|
||
you can't have a system without them. A complete system needs more
|
||
than just programming tools, so we wrote other components as well, such
|
||
as the Bourne Again SHell, the PostScript interpreter Ghostscript, and
|
||
the GNU C library.
|
||
|
||
By the early 90s we had put together the whole system aside from the
|
||
kernel (and we were also working on a kernel, the GNU Hurd, which runs
|
||
on top of Mach). Developing this kernel has been a lot harder than we
|
||
expected, and we are still working on finishing it.
|
||
|
||
Fortunately, you don't have to wait for it, because Linux is working
|
||
now. When Linus Torvalds wrote Linux, he filled the last major gap.
|
||
People could then put Linux together with the GNU system to make a
|
||
complete free system: a Linux-based GNU system (or GNU/Linux system,
|
||
for short).
|
||
|
||
Putting them together sounds simple, but it was not a trivial job.
|
||
The GNU C library (called glibc for short) needed substantial changes.
|
||
Integrating a complete system as a distribution that would work "out of
|
||
the box" was a big job, too. It required addressing the issue of how
|
||
to install and boot the system--a problem we had not tackled, because
|
||
we hadn't yet reached that point. The people who developed the various
|
||
system distributions made a substantial contribution.
|
||
|
||
The GNU Project supports GNU/Linux systems as well as *the* GNU
|
||
system--even with funds. We funded the rewriting of the Linux-related
|
||
extensions to the GNU C library, so that now they are well integrated,
|
||
and the newest GNU/Linux systems use the current library release with
|
||
no changes. We also funded an early stage of the development of Debian
|
||
GNU/Linux.
|
||
|
||
We use Linux-based GNU systems today for most of our work, and we
|
||
hope you use them too. But please don't confuse the public by using the
|
||
name "Linux" ambiguously. Linux is the kernel, one of the essential
|
||
major components of the system. The system as a whole is more or less
|
||
the GNU system.
|
||
|