init: init nachos hw01, should pass jenkins os_group_20_hw job but fail on os_group_20_ta job
This commit is contained in:
989
usr/local/nachos/info/gcc.info-23
Normal file
989
usr/local/nachos/info/gcc.info-23
Normal file
@@ -0,0 +1,989 @@
|
||||
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: Register Classes, Next: Stack and Calling, Prev: Registers, Up: Target Macros
|
||||
|
||||
Register Classes
|
||||
================
|
||||
|
||||
On many machines, the numbered registers are not all equivalent.
|
||||
For example, certain registers may not be allowed for indexed
|
||||
addressing; certain registers may not be allowed in some instructions.
|
||||
These machine restrictions are described to the compiler using
|
||||
"register classes".
|
||||
|
||||
You define a number of register classes, giving each one a name and
|
||||
saying which of the registers belong to it. Then you can specify
|
||||
register classes that are allowed as operands to particular instruction
|
||||
patterns.
|
||||
|
||||
In general, each register will belong to several classes. In fact,
|
||||
one class must be named `ALL_REGS' and contain all the registers.
|
||||
Another class must be named `NO_REGS' and contain no registers. Often
|
||||
the union of two classes will be another class; however, this is not
|
||||
required.
|
||||
|
||||
One of the classes must be named `GENERAL_REGS'. There is nothing
|
||||
terribly special about the name, but the operand constraint letters `r'
|
||||
and `g' specify this class. If `GENERAL_REGS' is the same as
|
||||
`ALL_REGS', just define it as a macro which expands to `ALL_REGS'.
|
||||
|
||||
Order the classes so that if class X is contained in class Y then X
|
||||
has a lower class number than Y.
|
||||
|
||||
The way classes other than `GENERAL_REGS' are specified in operand
|
||||
constraints is through machine-dependent operand constraint letters.
|
||||
You can define such letters to correspond to various classes, then use
|
||||
them in operand constraints.
|
||||
|
||||
You should define a class for the union of two classes whenever some
|
||||
instruction allows both classes. For example, if an instruction allows
|
||||
either a floating point (coprocessor) register or a general register
|
||||
for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS'
|
||||
which includes both of them. Otherwise you will get suboptimal code.
|
||||
|
||||
You must also specify certain redundant information about the
|
||||
register classes: for each class, which classes contain it and which
|
||||
ones are contained in it; for each pair of classes, the largest class
|
||||
contained in their union.
|
||||
|
||||
When a value occupying several consecutive registers is expected in a
|
||||
certain class, all the registers used must belong to that class.
|
||||
Therefore, register classes cannot be used to enforce a requirement for
|
||||
a register pair to start with an even-numbered register. The way to
|
||||
specify this requirement is with `HARD_REGNO_MODE_OK'.
|
||||
|
||||
Register classes used for input-operands of bitwise-and or shift
|
||||
instructions have a special requirement: each such class must have, for
|
||||
each fixed-point machine mode, a subclass whose registers can transfer
|
||||
that mode to or from memory. For example, on some machines, the
|
||||
operations for single-byte values (`QImode') are limited to certain
|
||||
registers. When this is so, each register class that is used in a
|
||||
bitwise-and or shift instruction must have a subclass consisting of
|
||||
registers from which single-byte values can be loaded or stored. This
|
||||
is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to
|
||||
return.
|
||||
|
||||
`enum reg_class'
|
||||
An enumeral type that must be defined with all the register class
|
||||
names as enumeral values. `NO_REGS' must be first. `ALL_REGS'
|
||||
must be the last register class, followed by one more enumeral
|
||||
value, `LIM_REG_CLASSES', which is not a register class but rather
|
||||
tells how many classes there are.
|
||||
|
||||
Each register class has a number, which is the value of casting
|
||||
the class name to type `int'. The number serves as an index in
|
||||
many of the tables described below.
|
||||
|
||||
`N_REG_CLASSES'
|
||||
The number of distinct register classes, defined as follows:
|
||||
|
||||
#define N_REG_CLASSES (int) LIM_REG_CLASSES
|
||||
|
||||
`REG_CLASS_NAMES'
|
||||
An initializer containing the names of the register classes as C
|
||||
string constants. These names are used in writing some of the
|
||||
debugging dumps.
|
||||
|
||||
`REG_CLASS_CONTENTS'
|
||||
An initializer containing the contents of the register classes, as
|
||||
integers which are bit masks. The Nth integer specifies the
|
||||
contents of class N. The way the integer MASK is interpreted is
|
||||
that register R is in the class if `MASK & (1 << R)' is 1.
|
||||
|
||||
When the machine has more than 32 registers, an integer does not
|
||||
suffice. Then the integers are replaced by sub-initializers,
|
||||
braced groupings containing several integers. Each
|
||||
sub-initializer must be suitable as an initializer for the type
|
||||
`HARD_REG_SET' which is defined in `hard-reg-set.h'.
|
||||
|
||||
`REGNO_REG_CLASS (REGNO)'
|
||||
A C expression whose value is a register class containing hard
|
||||
register REGNO. In general there is more than one such class;
|
||||
choose a class which is "minimal", meaning that no smaller class
|
||||
also contains the register.
|
||||
|
||||
`BASE_REG_CLASS'
|
||||
A macro whose definition is the name of the class to which a valid
|
||||
base register must belong. A base register is one used in an
|
||||
address which is the register value plus a displacement.
|
||||
|
||||
`INDEX_REG_CLASS'
|
||||
A macro whose definition is the name of the class to which a valid
|
||||
index register must belong. An index register is one used in an
|
||||
address where its value is either multiplied by a scale factor or
|
||||
added to another register (as well as added to a displacement).
|
||||
|
||||
`REG_CLASS_FROM_LETTER (CHAR)'
|
||||
A C expression which defines the machine-dependent operand
|
||||
constraint letters for register classes. If CHAR is such a
|
||||
letter, the value should be the register class corresponding to
|
||||
it. Otherwise, the value should be `NO_REGS'. The register
|
||||
letter `r', corresponding to class `GENERAL_REGS', will not be
|
||||
passed to this macro; you do not need to handle it.
|
||||
|
||||
`REGNO_OK_FOR_BASE_P (NUM)'
|
||||
A C expression which is nonzero if register number NUM is suitable
|
||||
for use as a base register in operand addresses. It may be either
|
||||
a suitable hard register or a pseudo register that has been
|
||||
allocated such a hard register.
|
||||
|
||||
`REGNO_MODE_OK_FOR_BASE_P (NUM, MODE)'
|
||||
A C expression that is just like `REGNO_OK_FOR_BASE_P', except that
|
||||
that expression may examine the mode of the memory reference in
|
||||
MODE. You should define this macro if the mode of the memory
|
||||
reference affects whether a register may be used as a base
|
||||
register. If you define this macro, the compiler will use it
|
||||
instead of `REGNO_OK_FOR_BASE_P'.
|
||||
|
||||
`REGNO_OK_FOR_INDEX_P (NUM)'
|
||||
A C expression which is nonzero if register number NUM is suitable
|
||||
for use as an index register in operand addresses. It may be
|
||||
either a suitable hard register or a pseudo register that has been
|
||||
allocated such a hard register.
|
||||
|
||||
The difference between an index register and a base register is
|
||||
that the index register may be scaled. If an address involves the
|
||||
sum of two registers, neither one of them scaled, then either one
|
||||
may be labeled the "base" and the other the "index"; but whichever
|
||||
labeling is used must fit the machine's constraints of which
|
||||
registers may serve in each capacity. The compiler will try both
|
||||
labelings, looking for one that is valid, and will reload one or
|
||||
both registers only if neither labeling works.
|
||||
|
||||
`PREFERRED_RELOAD_CLASS (X, CLASS)'
|
||||
A C expression that places additional restrictions on the register
|
||||
class to use when it is necessary to copy value X into a register
|
||||
in class CLASS. The value is a register class; perhaps CLASS, or
|
||||
perhaps another, smaller class. On many machines, the following
|
||||
definition is safe:
|
||||
|
||||
#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
|
||||
|
||||
Sometimes returning a more restrictive class makes better code.
|
||||
For example, on the 68000, when X is an integer constant that is
|
||||
in range for a `moveq' instruction, the value of this macro is
|
||||
always `DATA_REGS' as long as CLASS includes the data registers.
|
||||
Requiring a data register guarantees that a `moveq' will be used.
|
||||
|
||||
If X is a `const_double', by returning `NO_REGS' you can force X
|
||||
into a memory constant. This is useful on certain machines where
|
||||
immediate floating values cannot be loaded into certain kinds of
|
||||
registers.
|
||||
|
||||
`PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS)'
|
||||
Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of
|
||||
input reloads. If you don't define this macro, the default is to
|
||||
use CLASS, unchanged.
|
||||
|
||||
`LIMIT_RELOAD_CLASS (MODE, CLASS)'
|
||||
A C expression that places additional restrictions on the register
|
||||
class to use when it is necessary to be able to hold a value of
|
||||
mode MODE in a reload register for which class CLASS would
|
||||
ordinarily be used.
|
||||
|
||||
Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when
|
||||
there are certain modes that simply can't go in certain reload
|
||||
classes.
|
||||
|
||||
The value is a register class; perhaps CLASS, or perhaps another,
|
||||
smaller class.
|
||||
|
||||
Don't define this macro unless the target machine has limitations
|
||||
which require the macro to do something nontrivial.
|
||||
|
||||
`SECONDARY_RELOAD_CLASS (CLASS, MODE, X)'
|
||||
`SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)'
|
||||
`SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)'
|
||||
Many machines have some registers that cannot be copied directly
|
||||
to or from memory or even from other types of registers. An
|
||||
example is the `MQ' register, which on most machines, can only be
|
||||
copied to or from general registers, but not memory. Some
|
||||
machines allow copying all registers to and from memory, but
|
||||
require a scratch register for stores to some memory locations
|
||||
(e.g., those with symbolic address on the RT, and those with
|
||||
certain symbolic address on the Sparc when compiling PIC). In
|
||||
some cases, both an intermediate and a scratch register are
|
||||
required.
|
||||
|
||||
You should define these macros to indicate to the reload phase
|
||||
that it may need to allocate at least one register for a reload in
|
||||
addition to the register to contain the data. Specifically, if
|
||||
copying X to a register CLASS in MODE requires an intermediate
|
||||
register, you should define `SECONDARY_INPUT_RELOAD_CLASS' to
|
||||
return the largest register class all of whose registers can be
|
||||
used as intermediate registers or scratch registers.
|
||||
|
||||
If copying a register CLASS in MODE to X requires an intermediate
|
||||
or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be
|
||||
defined to return the largest register class required. If the
|
||||
requirements for input and output reloads are the same, the macro
|
||||
`SECONDARY_RELOAD_CLASS' should be used instead of defining both
|
||||
macros identically.
|
||||
|
||||
The values returned by these macros are often `GENERAL_REGS'.
|
||||
Return `NO_REGS' if no spare register is needed; i.e., if X can be
|
||||
directly copied to or from a register of CLASS in MODE without
|
||||
requiring a scratch register. Do not define this macro if it
|
||||
would always return `NO_REGS'.
|
||||
|
||||
If a scratch register is required (either with or without an
|
||||
intermediate register), you should define patterns for
|
||||
`reload_inM' or `reload_outM', as required (*note Standard
|
||||
Names::.. These patterns, which will normally be implemented with
|
||||
a `define_expand', should be similar to the `movM' patterns,
|
||||
except that operand 2 is the scratch register.
|
||||
|
||||
Define constraints for the reload register and scratch register
|
||||
that contain a single register class. If the original reload
|
||||
register (whose class is CLASS) can meet the constraint given in
|
||||
the pattern, the value returned by these macros is used for the
|
||||
class of the scratch register. Otherwise, two additional reload
|
||||
registers are required. Their classes are obtained from the
|
||||
constraints in the insn pattern.
|
||||
|
||||
X might be a pseudo-register or a `subreg' of a pseudo-register,
|
||||
which could either be in a hard register or in memory. Use
|
||||
`true_regnum' to find out; it will return -1 if the pseudo is in
|
||||
memory and the hard register number if it is in a register.
|
||||
|
||||
These macros should not be used in the case where a particular
|
||||
class of registers can only be copied to memory and not to another
|
||||
class of registers. In that case, secondary reload registers are
|
||||
not needed and would not be helpful. Instead, a stack location
|
||||
must be used to perform the copy and the `movM' pattern should use
|
||||
memory as a intermediate storage. This case often occurs between
|
||||
floating-point and general registers.
|
||||
|
||||
`SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)'
|
||||
Certain machines have the property that some registers cannot be
|
||||
copied to some other registers without using memory. Define this
|
||||
macro on those machines to be a C expression that is non-zero if
|
||||
objects of mode M in registers of CLASS1 can only be copied to
|
||||
registers of class CLASS2 by storing a register of CLASS1 into
|
||||
memory and loading that memory location into a register of CLASS2.
|
||||
|
||||
Do not define this macro if its value would always be zero.
|
||||
|
||||
`SECONDARY_MEMORY_NEEDED_RTX (MODE)'
|
||||
Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler
|
||||
allocates a stack slot for a memory location needed for register
|
||||
copies. If this macro is defined, the compiler instead uses the
|
||||
memory location defined by this macro.
|
||||
|
||||
Do not define this macro if you do not define
|
||||
`SECONDARY_MEMORY_NEEDED'.
|
||||
|
||||
`SECONDARY_MEMORY_NEEDED_MODE (MODE)'
|
||||
When the compiler needs a secondary memory location to copy
|
||||
between two registers of mode MODE, it normally allocates
|
||||
sufficient memory to hold a quantity of `BITS_PER_WORD' bits and
|
||||
performs the store and load operations in a mode that many bits
|
||||
wide and whose class is the same as that of MODE.
|
||||
|
||||
This is right thing to do on most machines because it ensures that
|
||||
all bits of the register are copied and prevents accesses to the
|
||||
registers in a narrower mode, which some machines prohibit for
|
||||
floating-point registers.
|
||||
|
||||
However, this default behavior is not correct on some machines,
|
||||
such as the DEC Alpha, that store short integers in floating-point
|
||||
registers differently than in integer registers. On those
|
||||
machines, the default widening will not work correctly and you
|
||||
must define this macro to suppress that widening in some cases.
|
||||
See the file `alpha.h' for details.
|
||||
|
||||
Do not define this macro if you do not define
|
||||
`SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is
|
||||
`BITS_PER_WORD' bits wide is correct for your machine.
|
||||
|
||||
`SMALL_REGISTER_CLASSES'
|
||||
On some machines, it is risky to let hard registers live across
|
||||
arbitrary insns. Typically, these machines have instructions that
|
||||
require values to be in specific registers (like an accumulator),
|
||||
and reload will fail if the required hard register is used for
|
||||
another purpose across such an insn.
|
||||
|
||||
Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero
|
||||
value on these machines. When this macro has a non-zero value, the
|
||||
compiler will try to minimize the lifetime of hard registers.
|
||||
|
||||
It is always safe to define this macro with a non-zero value, but
|
||||
if you unnecessarily define it, you will reduce the amount of
|
||||
optimizations that can be performed in some cases. If you do not
|
||||
define this macro with a non-zero value when it is required, the
|
||||
compiler will run out of spill registers and print a fatal error
|
||||
message. For most machines, you should not define this macro at
|
||||
all.
|
||||
|
||||
`CLASS_LIKELY_SPILLED_P (CLASS)'
|
||||
A C expression whose value is nonzero if pseudos that have been
|
||||
assigned to registers of class CLASS would likely be spilled
|
||||
because registers of CLASS are needed for spill registers.
|
||||
|
||||
The default value of this macro returns 1 if CLASS has exactly one
|
||||
register and zero otherwise. On most machines, this default
|
||||
should be used. Only define this macro to some other expression
|
||||
if pseudos allocated by `local-alloc.c' end up in memory because
|
||||
their hard registers were needed for spill registers. If this
|
||||
macro returns nonzero for those classes, those pseudos will only
|
||||
be allocated by `global.c', which knows how to reallocate the
|
||||
pseudo to another register. If there would not be another
|
||||
register available for reallocation, you should not change the
|
||||
definition of this macro since the only effect of such a
|
||||
definition would be to slow down register allocation.
|
||||
|
||||
`CLASS_MAX_NREGS (CLASS, MODE)'
|
||||
A C expression for the maximum number of consecutive registers of
|
||||
class CLASS needed to hold a value of mode MODE.
|
||||
|
||||
This is closely related to the macro `HARD_REGNO_NREGS'. In fact,
|
||||
the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be
|
||||
the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all
|
||||
REGNO values in the class CLASS.
|
||||
|
||||
This macro helps control the handling of multiple-word values in
|
||||
the reload pass.
|
||||
|
||||
`CLASS_CANNOT_CHANGE_SIZE'
|
||||
If defined, a C expression for a class that contains registers
|
||||
which the compiler must always access in a mode that is the same
|
||||
size as the mode in which it loaded the register.
|
||||
|
||||
For the example, loading 32-bit integer or floating-point objects
|
||||
into floating-point registers on the Alpha extends them to 64-bits.
|
||||
Therefore loading a 64-bit object and then storing it as a 32-bit
|
||||
object does not store the low-order 32-bits, as would be the case
|
||||
for a normal register. Therefore, `alpha.h' defines this macro as
|
||||
`FLOAT_REGS'.
|
||||
|
||||
Three other special macros describe which operands fit which
|
||||
constraint letters.
|
||||
|
||||
`CONST_OK_FOR_LETTER_P (VALUE, C)'
|
||||
A C expression that defines the machine-dependent operand
|
||||
constraint letters (`I', `J', `K', ... `P') that specify
|
||||
particular ranges of integer values. If C is one of those
|
||||
letters, the expression should check that VALUE, an integer, is in
|
||||
the appropriate range and return 1 if so, 0 otherwise. If C is
|
||||
not one of those letters, the value should be 0 regardless of
|
||||
VALUE.
|
||||
|
||||
`CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)'
|
||||
A C expression that defines the machine-dependent operand
|
||||
constraint letters that specify particular ranges of
|
||||
`const_double' values (`G' or `H').
|
||||
|
||||
If C is one of those letters, the expression should check that
|
||||
VALUE, an RTX of code `const_double', is in the appropriate range
|
||||
and return 1 if so, 0 otherwise. If C is not one of those
|
||||
letters, the value should be 0 regardless of VALUE.
|
||||
|
||||
`const_double' is used for all floating-point constants and for
|
||||
`DImode' fixed-point constants. A given letter can accept either
|
||||
or both kinds of values. It can use `GET_MODE' to distinguish
|
||||
between these kinds.
|
||||
|
||||
`EXTRA_CONSTRAINT (VALUE, C)'
|
||||
A C expression that defines the optional machine-dependent
|
||||
constraint letters (`Q', `R', `S', `T', `U') that can be used to
|
||||
segregate specific types of operands, usually memory references,
|
||||
for the target machine. Normally this macro will not be defined.
|
||||
If it is required for a particular target machine, it should
|
||||
return 1 if VALUE corresponds to the operand type represented by
|
||||
the constraint letter C. If C is not defined as an extra
|
||||
constraint, the value returned should be 0 regardless of VALUE.
|
||||
|
||||
For example, on the ROMP, load instructions cannot have their
|
||||
output in r0 if the memory reference contains a symbolic address.
|
||||
Constraint letter `Q' is defined as representing a memory address
|
||||
that does *not* contain a symbolic address. An alternative is
|
||||
specified with a `Q' constraint on the input and `r' on the
|
||||
output. The next alternative specifies `m' on the input and a
|
||||
register class that does not include r0 on the output.
|
||||
|
||||
|
||||
File: gcc.info, Node: Stack and Calling, Next: Varargs, Prev: Register Classes, Up: Target Macros
|
||||
|
||||
Stack Layout and Calling Conventions
|
||||
====================================
|
||||
|
||||
This describes the stack layout and calling conventions.
|
||||
|
||||
* Menu:
|
||||
|
||||
* Frame Layout::
|
||||
* Stack Checking::
|
||||
* Frame Registers::
|
||||
* Elimination::
|
||||
* Stack Arguments::
|
||||
* Register Arguments::
|
||||
* Scalar Return::
|
||||
* Aggregate Return::
|
||||
* Caller Saves::
|
||||
* Function Entry::
|
||||
* Profiling::
|
||||
|
||||
|
||||
File: gcc.info, Node: Frame Layout, Next: Stack Checking, Up: Stack and Calling
|
||||
|
||||
Basic Stack Layout
|
||||
------------------
|
||||
|
||||
Here is the basic stack layout.
|
||||
|
||||
`STACK_GROWS_DOWNWARD'
|
||||
Define this macro if pushing a word onto the stack moves the stack
|
||||
pointer to a smaller address.
|
||||
|
||||
When we say, "define this macro if ...," it means that the
|
||||
compiler checks this macro only with `#ifdef' so the precise
|
||||
definition used does not matter.
|
||||
|
||||
`FRAME_GROWS_DOWNWARD'
|
||||
Define this macro if the addresses of local variable slots are at
|
||||
negative offsets from the frame pointer.
|
||||
|
||||
`ARGS_GROW_DOWNWARD'
|
||||
Define this macro if successive arguments to a function occupy
|
||||
decreasing addresses on the stack.
|
||||
|
||||
`STARTING_FRAME_OFFSET'
|
||||
Offset from the frame pointer to the first local variable slot to
|
||||
be allocated.
|
||||
|
||||
If `FRAME_GROWS_DOWNWARD', find the next slot's offset by
|
||||
subtracting the first slot's length from `STARTING_FRAME_OFFSET'.
|
||||
Otherwise, it is found by adding the length of the first slot to
|
||||
the value `STARTING_FRAME_OFFSET'.
|
||||
|
||||
`STACK_POINTER_OFFSET'
|
||||
Offset from the stack pointer register to the first location at
|
||||
which outgoing arguments are placed. If not specified, the
|
||||
default value of zero is used. This is the proper value for most
|
||||
machines.
|
||||
|
||||
If `ARGS_GROW_DOWNWARD', this is the offset to the location above
|
||||
the first location at which outgoing arguments are placed.
|
||||
|
||||
`FIRST_PARM_OFFSET (FUNDECL)'
|
||||
Offset from the argument pointer register to the first argument's
|
||||
address. On some machines it may depend on the data type of the
|
||||
function.
|
||||
|
||||
If `ARGS_GROW_DOWNWARD', this is the offset to the location above
|
||||
the first argument's address.
|
||||
|
||||
`STACK_DYNAMIC_OFFSET (FUNDECL)'
|
||||
Offset from the stack pointer register to an item dynamically
|
||||
allocated on the stack, e.g., by `alloca'.
|
||||
|
||||
The default value for this macro is `STACK_POINTER_OFFSET' plus the
|
||||
length of the outgoing arguments. The default is correct for most
|
||||
machines. See `function.c' for details.
|
||||
|
||||
`DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)'
|
||||
A C expression whose value is RTL representing the address in a
|
||||
stack frame where the pointer to the caller's frame is stored.
|
||||
Assume that FRAMEADDR is an RTL expression for the address of the
|
||||
stack frame itself.
|
||||
|
||||
If you don't define this macro, the default is to return the value
|
||||
of FRAMEADDR--that is, the stack frame address is also the address
|
||||
of the stack word that points to the previous frame.
|
||||
|
||||
`SETUP_FRAME_ADDRESSES'
|
||||
If defined, a C expression that produces the machine-specific code
|
||||
to setup the stack so that arbitrary frames can be accessed. For
|
||||
example, on the Sparc, we must flush all of the register windows
|
||||
to the stack before we can access arbitrary stack frames. You
|
||||
will seldom need to define this macro.
|
||||
|
||||
`BUILTIN_SETJMP_FRAME_VALUE'
|
||||
If defined, a C expression that contains an rtx that is used to
|
||||
store the address of the current frame into the built in `setjmp'
|
||||
buffer. The default value, `virtual_stack_vars_rtx', is correct
|
||||
for most machines. One reason you may need to define this macro
|
||||
is if `hard_frame_pointer_rtx' is the appropriate value on your
|
||||
machine.
|
||||
|
||||
`RETURN_ADDR_RTX (COUNT, FRAMEADDR)'
|
||||
A C expression whose value is RTL representing the value of the
|
||||
return address for the frame COUNT steps up from the current
|
||||
frame, after the prologue. FRAMEADDR is the frame pointer of the
|
||||
COUNT frame, or the frame pointer of the COUNT - 1 frame if
|
||||
`RETURN_ADDR_IN_PREVIOUS_FRAME' is defined.
|
||||
|
||||
The value of the expression must always be the correct address when
|
||||
COUNT is zero, but may be `NULL_RTX' if there is not way to
|
||||
determine the return address of other frames.
|
||||
|
||||
`RETURN_ADDR_IN_PREVIOUS_FRAME'
|
||||
Define this if the return address of a particular stack frame is
|
||||
accessed from the frame pointer of the previous stack frame.
|
||||
|
||||
`INCOMING_RETURN_ADDR_RTX'
|
||||
A C expression whose value is RTL representing the location of the
|
||||
incoming return address at the beginning of any function, before
|
||||
the prologue. This RTL is either a `REG', indicating that the
|
||||
return value is saved in `REG', or a `MEM' representing a location
|
||||
in the stack.
|
||||
|
||||
You only need to define this macro if you want to support call
|
||||
frame debugging information like that provided by DWARF 2.
|
||||
|
||||
`INCOMING_FRAME_SP_OFFSET'
|
||||
A C expression whose value is an integer giving the offset, in
|
||||
bytes, from the value of the stack pointer register to the top of
|
||||
the stack frame at the beginning of any function, before the
|
||||
prologue. The top of the frame is defined to be the value of the
|
||||
stack pointer in the previous frame, just before the call
|
||||
instruction.
|
||||
|
||||
You only need to define this macro if you want to support call
|
||||
frame debugging information like that provided by DWARF 2.
|
||||
|
||||
`ARG_POINTER_CFA_OFFSET'
|
||||
A C expression whose value is an integer giving the offset, in
|
||||
bytes, from the argument pointer to the canonical frame address
|
||||
(cfa). The final value should coincide with that calculated by
|
||||
`INCOMING_FRAME_SP_OFFSET'. Which is unfortunately not usable
|
||||
during virtual register instantiation.
|
||||
|
||||
You only need to define this macro if you want to support call
|
||||
frame debugging information like that provided by DWARF 2.
|
||||
|
||||
|
||||
File: gcc.info, Node: Stack Checking, Next: Frame Registers, Prev: Frame Layout, Up: Stack and Calling
|
||||
|
||||
Specifying How Stack Checking is Done
|
||||
-------------------------------------
|
||||
|
||||
GNU CC will check that stack references are within the boundaries of
|
||||
the stack, if the `-fstack-check' is specified, in one of three ways:
|
||||
|
||||
1. If the value of the `STACK_CHECK_BUILTIN' macro is nonzero, GNU CC
|
||||
will assume that you have arranged for stack checking to be done at
|
||||
appropriate places in the configuration files, e.g., in
|
||||
`FUNCTION_PROLOGUE'. GNU CC will do not other special processing.
|
||||
|
||||
2. If `STACK_CHECK_BUILTIN' is zero and you defined a named pattern
|
||||
called `check_stack' in your `md' file, GNU CC will call that
|
||||
pattern with one argument which is the address to compare the stack
|
||||
value against. You must arrange for this pattern to report an
|
||||
error if the stack pointer is out of range.
|
||||
|
||||
3. If neither of the above are true, GNU CC will generate code to
|
||||
periodically "probe" the stack pointer using the values of the
|
||||
macros defined below.
|
||||
|
||||
Normally, you will use the default values of these macros, so GNU CC
|
||||
will use the third approach.
|
||||
|
||||
`STACK_CHECK_BUILTIN'
|
||||
A nonzero value if stack checking is done by the configuration
|
||||
files in a machine-dependent manner. You should define this macro
|
||||
if stack checking is require by the ABI of your machine or if you
|
||||
would like to have to stack checking in some more efficient way
|
||||
than GNU CC's portable approach. The default value of this macro
|
||||
is zero.
|
||||
|
||||
`STACK_CHECK_PROBE_INTERVAL'
|
||||
An integer representing the interval at which GNU CC must generate
|
||||
stack probe instructions. You will normally define this macro to
|
||||
be no larger than the size of the "guard pages" at the end of a
|
||||
stack area. The default value of 4096 is suitable for most
|
||||
systems.
|
||||
|
||||
`STACK_CHECK_PROBE_LOAD'
|
||||
A integer which is nonzero if GNU CC should perform the stack probe
|
||||
as a load instruction and zero if GNU CC should use a store
|
||||
instruction. The default is zero, which is the most efficient
|
||||
choice on most systems.
|
||||
|
||||
`STACK_CHECK_PROTECT'
|
||||
The number of bytes of stack needed to recover from a stack
|
||||
overflow, for languages where such a recovery is supported. The
|
||||
default value of 75 words should be adequate for most machines.
|
||||
|
||||
`STACK_CHECK_MAX_FRAME_SIZE'
|
||||
The maximum size of a stack frame, in bytes. GNU CC will generate
|
||||
probe instructions in non-leaf functions to ensure at least this
|
||||
many bytes of stack are available. If a stack frame is larger
|
||||
than this size, stack checking will not be reliable and GNU CC
|
||||
will issue a warning. The default is chosen so that GNU CC only
|
||||
generates one instruction on most systems. You should normally
|
||||
not change the default value of this macro.
|
||||
|
||||
`STACK_CHECK_FIXED_FRAME_SIZE'
|
||||
GNU CC uses this value to generate the above warning message. It
|
||||
represents the amount of fixed frame used by a function, not
|
||||
including space for any callee-saved registers, temporaries and
|
||||
user variables. You need only specify an upper bound for this
|
||||
amount and will normally use the default of four words.
|
||||
|
||||
`STACK_CHECK_MAX_VAR_SIZE'
|
||||
The maximum size, in bytes, of an object that GNU CC will place in
|
||||
the fixed area of the stack frame when the user specifies
|
||||
`-fstack-check'. GNU CC computed the default from the values of
|
||||
the above macros and you will normally not need to override that
|
||||
default.
|
||||
|
||||
|
||||
File: gcc.info, Node: Frame Registers, Next: Elimination, Prev: Stack Checking, Up: Stack and Calling
|
||||
|
||||
Registers That Address the Stack Frame
|
||||
--------------------------------------
|
||||
|
||||
This discusses registers that address the stack frame.
|
||||
|
||||
`STACK_POINTER_REGNUM'
|
||||
The register number of the stack pointer register, which must also
|
||||
be a fixed register according to `FIXED_REGISTERS'. On most
|
||||
machines, the hardware determines which register this is.
|
||||
|
||||
`FRAME_POINTER_REGNUM'
|
||||
The register number of the frame pointer register, which is used to
|
||||
access automatic variables in the stack frame. On some machines,
|
||||
the hardware determines which register this is. On other
|
||||
machines, you can choose any register you wish for this purpose.
|
||||
|
||||
`HARD_FRAME_POINTER_REGNUM'
|
||||
On some machines the offset between the frame pointer and starting
|
||||
offset of the automatic variables is not known until after register
|
||||
allocation has been done (for example, because the saved registers
|
||||
are between these two locations). On those machines, define
|
||||
`FRAME_POINTER_REGNUM' the number of a special, fixed register to
|
||||
be used internally until the offset is known, and define
|
||||
`HARD_FRAME_POINTER_REGNUM' to be the actual hard register number
|
||||
used for the frame pointer.
|
||||
|
||||
You should define this macro only in the very rare circumstances
|
||||
when it is not possible to calculate the offset between the frame
|
||||
pointer and the automatic variables until after register
|
||||
allocation has been completed. When this macro is defined, you
|
||||
must also indicate in your definition of `ELIMINABLE_REGS' how to
|
||||
eliminate `FRAME_POINTER_REGNUM' into either
|
||||
`HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'.
|
||||
|
||||
Do not define this macro if it would be the same as
|
||||
`FRAME_POINTER_REGNUM'.
|
||||
|
||||
`ARG_POINTER_REGNUM'
|
||||
The register number of the arg pointer register, which is used to
|
||||
access the function's argument list. On some machines, this is
|
||||
the same as the frame pointer register. On some machines, the
|
||||
hardware determines which register this is. On other machines,
|
||||
you can choose any register you wish for this purpose. If this is
|
||||
not the same register as the frame pointer register, then you must
|
||||
mark it as a fixed register according to `FIXED_REGISTERS', or
|
||||
arrange to be able to eliminate it (*note Elimination::.).
|
||||
|
||||
`RETURN_ADDRESS_POINTER_REGNUM'
|
||||
The register number of the return address pointer register, which
|
||||
is used to access the current function's return address from the
|
||||
stack. On some machines, the return address is not at a fixed
|
||||
offset from the frame pointer or stack pointer or argument
|
||||
pointer. This register can be defined to point to the return
|
||||
address on the stack, and then be converted by `ELIMINABLE_REGS'
|
||||
into either the frame pointer or stack pointer.
|
||||
|
||||
Do not define this macro unless there is no other way to get the
|
||||
return address from the stack.
|
||||
|
||||
`STATIC_CHAIN_REGNUM'
|
||||
`STATIC_CHAIN_INCOMING_REGNUM'
|
||||
Register numbers used for passing a function's static chain
|
||||
pointer. If register windows are used, the register number as
|
||||
seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM',
|
||||
while the register number as seen by the calling function is
|
||||
`STATIC_CHAIN_REGNUM'. If these registers are the same,
|
||||
`STATIC_CHAIN_INCOMING_REGNUM' need not be defined.
|
||||
|
||||
The static chain register need not be a fixed register.
|
||||
|
||||
If the static chain is passed in memory, these macros should not be
|
||||
defined; instead, the next two macros should be defined.
|
||||
|
||||
`STATIC_CHAIN'
|
||||
`STATIC_CHAIN_INCOMING'
|
||||
If the static chain is passed in memory, these macros provide rtx
|
||||
giving `mem' expressions that denote where they are stored.
|
||||
`STATIC_CHAIN' and `STATIC_CHAIN_INCOMING' give the locations as
|
||||
seen by the calling and called functions, respectively. Often the
|
||||
former will be at an offset from the stack pointer and the latter
|
||||
at an offset from the frame pointer.
|
||||
|
||||
The variables `stack_pointer_rtx', `frame_pointer_rtx', and
|
||||
`arg_pointer_rtx' will have been initialized prior to the use of
|
||||
these macros and should be used to refer to those items.
|
||||
|
||||
If the static chain is passed in a register, the two previous
|
||||
macros should be defined instead.
|
||||
|
||||
|
||||
File: gcc.info, Node: Elimination, Next: Stack Arguments, Prev: Frame Registers, Up: Stack and Calling
|
||||
|
||||
Eliminating Frame Pointer and Arg Pointer
|
||||
-----------------------------------------
|
||||
|
||||
This is about eliminating the frame pointer and arg pointer.
|
||||
|
||||
`FRAME_POINTER_REQUIRED'
|
||||
A C expression which is nonzero if a function must have and use a
|
||||
frame pointer. This expression is evaluated in the reload pass.
|
||||
If its value is nonzero the function will have a frame pointer.
|
||||
|
||||
The expression can in principle examine the current function and
|
||||
decide according to the facts, but on most machines the constant 0
|
||||
or the constant 1 suffices. Use 0 when the machine allows code to
|
||||
be generated with no frame pointer, and doing so saves some time
|
||||
or space. Use 1 when there is no possible advantage to avoiding a
|
||||
frame pointer.
|
||||
|
||||
In certain cases, the compiler does not know how to produce valid
|
||||
code without a frame pointer. The compiler recognizes those cases
|
||||
and automatically gives the function a frame pointer regardless of
|
||||
what `FRAME_POINTER_REQUIRED' says. You don't need to worry about
|
||||
them.
|
||||
|
||||
In a function that does not require a frame pointer, the frame
|
||||
pointer register can be allocated for ordinary usage, unless you
|
||||
mark it as a fixed register. See `FIXED_REGISTERS' for more
|
||||
information.
|
||||
|
||||
`INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR)'
|
||||
A C statement to store in the variable DEPTH-VAR the difference
|
||||
between the frame pointer and the stack pointer values immediately
|
||||
after the function prologue. The value would be computed from
|
||||
information such as the result of `get_frame_size ()' and the
|
||||
tables of registers `regs_ever_live' and `call_used_regs'.
|
||||
|
||||
If `ELIMINABLE_REGS' is defined, this macro will be not be used and
|
||||
need not be defined. Otherwise, it must be defined even if
|
||||
`FRAME_POINTER_REQUIRED' is defined to always be true; in that
|
||||
case, you may set DEPTH-VAR to anything.
|
||||
|
||||
`ELIMINABLE_REGS'
|
||||
If defined, this macro specifies a table of register pairs used to
|
||||
eliminate unneeded registers that point into the stack frame. If
|
||||
it is not defined, the only elimination attempted by the compiler
|
||||
is to replace references to the frame pointer with references to
|
||||
the stack pointer.
|
||||
|
||||
The definition of this macro is a list of structure
|
||||
initializations, each of which specifies an original and
|
||||
replacement register.
|
||||
|
||||
On some machines, the position of the argument pointer is not
|
||||
known until the compilation is completed. In such a case, a
|
||||
separate hard register must be used for the argument pointer.
|
||||
This register can be eliminated by replacing it with either the
|
||||
frame pointer or the argument pointer, depending on whether or not
|
||||
the frame pointer has been eliminated.
|
||||
|
||||
In this case, you might specify:
|
||||
#define ELIMINABLE_REGS \
|
||||
{{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
|
||||
{ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
|
||||
{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
|
||||
|
||||
Note that the elimination of the argument pointer with the stack
|
||||
pointer is specified first since that is the preferred elimination.
|
||||
|
||||
`CAN_ELIMINATE (FROM-REG, TO-REG)'
|
||||
A C expression that returns non-zero if the compiler is allowed to
|
||||
try to replace register number FROM-REG with register number
|
||||
TO-REG. This macro need only be defined if `ELIMINABLE_REGS' is
|
||||
defined, and will usually be the constant 1, since most of the
|
||||
cases preventing register elimination are things that the compiler
|
||||
already knows about.
|
||||
|
||||
`INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR)'
|
||||
This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'. It
|
||||
specifies the initial difference between the specified pair of
|
||||
registers. This macro must be defined if `ELIMINABLE_REGS' is
|
||||
defined.
|
||||
|
||||
`LONGJMP_RESTORE_FROM_STACK'
|
||||
Define this macro if the `longjmp' function restores registers from
|
||||
the stack frames, rather than from those saved specifically by
|
||||
`setjmp'. Certain quantities must not be kept in registers across
|
||||
a call to `setjmp' on such machines.
|
||||
|
||||
|
||||
File: gcc.info, Node: Stack Arguments, Next: Register Arguments, Prev: Elimination, Up: Stack and Calling
|
||||
|
||||
Passing Function Arguments on the Stack
|
||||
---------------------------------------
|
||||
|
||||
The macros in this section control how arguments are passed on the
|
||||
stack. See the following section for other macros that control passing
|
||||
certain arguments in registers.
|
||||
|
||||
`PROMOTE_PROTOTYPES'
|
||||
Define this macro if an argument declared in a prototype as an
|
||||
integral type smaller than `int' should actually be passed as an
|
||||
`int'. In addition to avoiding errors in certain cases of
|
||||
mismatch, it also makes for better code on certain machines.
|
||||
|
||||
`PUSH_ROUNDING (NPUSHED)'
|
||||
A C expression that is the number of bytes actually pushed onto the
|
||||
stack when an instruction attempts to push NPUSHED bytes.
|
||||
|
||||
If the target machine does not have a push instruction, do not
|
||||
define this macro. That directs GNU CC to use an alternate
|
||||
strategy: to allocate the entire argument block and then store the
|
||||
arguments into it.
|
||||
|
||||
On some machines, the definition
|
||||
|
||||
#define PUSH_ROUNDING(BYTES) (BYTES)
|
||||
|
||||
will suffice. But on other machines, instructions that appear to
|
||||
push one byte actually push two bytes in an attempt to maintain
|
||||
alignment. Then the definition should be
|
||||
|
||||
#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
|
||||
|
||||
`ACCUMULATE_OUTGOING_ARGS'
|
||||
If defined, the maximum amount of space required for outgoing
|
||||
arguments will be computed and placed into the variable
|
||||
`current_function_outgoing_args_size'. No space will be pushed
|
||||
onto the stack for each call; instead, the function prologue should
|
||||
increase the stack frame size by this amount.
|
||||
|
||||
Defining both `PUSH_ROUNDING' and `ACCUMULATE_OUTGOING_ARGS' is
|
||||
not proper.
|
||||
|
||||
`REG_PARM_STACK_SPACE (FNDECL)'
|
||||
Define this macro if functions should assume that stack space has
|
||||
been allocated for arguments even when their values are passed in
|
||||
registers.
|
||||
|
||||
The value of this macro is the size, in bytes, of the area
|
||||
reserved for arguments passed in registers for the function
|
||||
represented by FNDECL, which can be zero if GNU CC is calling a
|
||||
library function.
|
||||
|
||||
This space can be allocated by the caller, or be a part of the
|
||||
machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
|
||||
which.
|
||||
|
||||
`MAYBE_REG_PARM_STACK_SPACE'
|
||||
`FINAL_REG_PARM_STACK_SPACE (CONST_SIZE, VAR_SIZE)'
|
||||
Define these macros in addition to the one above if functions might
|
||||
allocate stack space for arguments even when their values are
|
||||
passed in registers. These should be used when the stack space
|
||||
allocated for arguments in registers is not a simple constant
|
||||
independent of the function declaration.
|
||||
|
||||
The value of the first macro is the size, in bytes, of the area
|
||||
that we should initially assume would be reserved for arguments
|
||||
passed in registers.
|
||||
|
||||
The value of the second macro is the actual size, in bytes, of the
|
||||
area that will be reserved for arguments passed in registers.
|
||||
This takes two arguments: an integer representing the number of
|
||||
bytes of fixed sized arguments on the stack, and a tree
|
||||
representing the number of bytes of variable sized arguments on
|
||||
the stack.
|
||||
|
||||
When these macros are defined, `REG_PARM_STACK_SPACE' will only be
|
||||
called for libcall functions, the current function, or for a
|
||||
function being called when it is known that such stack space must
|
||||
be allocated. In each case this value can be easily computed.
|
||||
|
||||
When deciding whether a called function needs such stack space,
|
||||
and how much space to reserve, GNU CC uses these two macros
|
||||
instead of `REG_PARM_STACK_SPACE'.
|
||||
|
||||
`OUTGOING_REG_PARM_STACK_SPACE'
|
||||
Define this if it is the responsibility of the caller to allocate
|
||||
the area reserved for arguments passed in registers.
|
||||
|
||||
If `ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls
|
||||
whether the space for these arguments counts in the value of
|
||||
`current_function_outgoing_args_size'.
|
||||
|
||||
`STACK_PARMS_IN_REG_PARM_AREA'
|
||||
Define this macro if `REG_PARM_STACK_SPACE' is defined, but the
|
||||
stack parameters don't skip the area specified by it.
|
||||
|
||||
Normally, when a parameter is not passed in registers, it is
|
||||
placed on the stack beyond the `REG_PARM_STACK_SPACE' area.
|
||||
Defining this macro suppresses this behavior and causes the
|
||||
parameter to be passed on the stack in its natural location.
|
||||
|
||||
`RETURN_POPS_ARGS (FUNDECL, FUNTYPE, STACK-SIZE)'
|
||||
A C expression that should indicate the number of bytes of its own
|
||||
arguments that a function pops on returning, or 0 if the function
|
||||
pops no arguments and the caller must therefore pop them all after
|
||||
the function returns.
|
||||
|
||||
FUNDECL is a C variable whose value is a tree node that describes
|
||||
the function in question. Normally it is a node of type
|
||||
`FUNCTION_DECL' that describes the declaration of the function.
|
||||
From this you can obtain the DECL_MACHINE_ATTRIBUTES of the
|
||||
function.
|
||||
|
||||
FUNTYPE is a C variable whose value is a tree node that describes
|
||||
the function in question. Normally it is a node of type
|
||||
`FUNCTION_TYPE' that describes the data type of the function.
|
||||
From this it is possible to obtain the data types of the value and
|
||||
arguments (if known).
|
||||
|
||||
When a call to a library function is being considered, FUNDECL
|
||||
will contain an identifier node for the library function. Thus, if
|
||||
you need to distinguish among various library functions, you can
|
||||
do so by their names. Note that "library function" in this
|
||||
context means a function used to perform arithmetic, whose name is
|
||||
known specially in the compiler and was not mentioned in the C
|
||||
code being compiled.
|
||||
|
||||
STACK-SIZE is the number of bytes of arguments passed on the
|
||||
stack. If a variable number of bytes is passed, it is zero, and
|
||||
argument popping will always be the responsibility of the calling
|
||||
function.
|
||||
|
||||
On the Vax, all functions always pop their arguments, so the
|
||||
definition of this macro is STACK-SIZE. On the 68000, using the
|
||||
standard calling convention, no functions pop their arguments, so
|
||||
the value of the macro is always 0 in this case. But an
|
||||
alternative calling convention is available in which functions
|
||||
that take a fixed number of arguments pop them but other functions
|
||||
(such as `printf') pop nothing (the caller pops all). When this
|
||||
convention is in use, FUNTYPE is examined to determine whether a
|
||||
function takes a fixed number of arguments.
|
||||
|
||||
Reference in New Issue
Block a user