Next: Exception Handling, Up: Stack and Calling
定义该宏,如果将一个字压入栈中使得栈指针移向更小的地址。
当我们说“定义该宏,如果...”,这意味着编译器只是使用
#ifdef
来检查该宏, 所以具体定义的值并没有关系。
该宏定义了当压栈所使用的操作。对于RTL形式, 压栈操作将为
(set (mem (STACK_PUSH_CODE (reg sp))) ...)
。可选择的方式为
PRE_DEC
,POST_DEC
,PRE_INC
和POST_INC
。 使用哪一个是正确的,取决于栈的方向和栈指针是否指向栈中的最后一项, 还是指向之后的空间。缺省为
PRE_DEC
,当STACK_GROWS_DOWNWARD
被定义时, 这大多情况下都是正确,否则为PRE_INC
,这经常是错误的。
帧指针到第一个被分配的局部变量槽的偏移量。
如果
FRAME_GROWS_DOWNWARD
,则通过从STARTING_FRAME_OFFSET
减去第一个 栈槽的长度来查找下一个栈槽的偏移量。否则,通过从STARTING_FRAME_OFFSET
加上第一个栈槽的长度来查找。
定义为0,来禁止在重载过程中对栈进行最后的对齐操作。缺省的非0值适合于大多port。
在一些port上,
STARTING_FRAME_OFFSET
为非0, 或者在局部块之后有一块寄存器保存区域,其不需要对齐到STACK_BOUNDARY
, 这样禁止栈对齐并且在后端实现可能会更好。
从栈指针寄存器到第一个输出的参数所放在的位置的偏移量。 如果没有指定,则缺省值0被使用。这对于大多数机器都合适。
如果
ARGS_GROW_DOWNWARD
, 则这是输出参数位于的第一个位置的上面的位置的偏移量。
参数指针寄存器到第一个参数的地址的偏移量。在一些机器上, 其可能依赖于函数的数据类型。
如果
ARGS_GROW_DOWNWARD
,则这是第一个参数的地址的上面的位置的偏移量。
栈指针寄存器到在栈上动态分配的对象的偏移量,例如,通过
alloca
。该宏的缺省值为
STACK_POINTER_OFFSET
加上输出参数的长度。 缺省值对于大多数机器是正确的。详情参见function.c。
一个C表达式,其值为RTL,表示初始栈帧的地址。 该地址被传给
RETURN_ADDR_RTX
和DYNAMIC_CHAIN_ADDRESS
。 如果你没有定义该宏,则一个合理的缺省值将被使用。定义该宏, 可以使帧指针消除在__builtin_frame_address (count)
和__builtin_return_address (count)
不等于0的情况下工作。
一个C表达式,其值为RTL,表示栈帧中的地址,指向被存储的调用者的帧。 假设frameaddr为一个栈帧本身的地址的RTL表达式。
如果你没有定义该宏,则缺省为返回frameaddr的值——也就是说, 栈帧地址也是指向之前帧的地址。
如果定义,为一个C表达式,其产生机器特定的代码来建立栈,使得可以访问任意的帧。 例如,在SPARC上,我们必须刷新栈的所有寄存器窗口,在我们可以访问任意栈帧之前。 你很少会需要定义该宏。
该target钩子应该返回一个rtx,用于将当前帧的地址存储到内建的
setjmp
缓存中。 缺省值,virtual_stack_vars_rtx
,对于大多数机器是正确的。 一种你可能需要定义该target钩子的原因是, 如果hard_frame_pointer_rtx
在你的机器上是合适的值。
一个C表达式,其值为RTL,表示当前帧的帧地址。frameaddr为当前帧的帧指针。 这用于__builtin_frame_address。你只有当帧地址与帧指针不同的时候才需要定义该宏。 大多数机器不需要定义该宏。
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 no way to determine the return address of other frames.
一个C表达式,其值为RTL,表示在任何函数的起始处,在序言之前, 流入的返回地址的位置。该RTL或者为一个
REG
, 指示返回地址保存在‘REG’中,或者一个MEM
表示位于栈中。你只在你想支持调用帧调试信息,像DWARF2提供的那样,的时候才需要定义该宏。
如果该RTL为一个
REG
, 你还要定义DWARF_FRAME_RETURN_COLUMN
为DWARF_FRAME_REGNUM (REGNO)
。
一个C表达式,其值为一个整数,给出了DWARF2的列号,可以用作替代的返回列。 column必须不对应于任何gcc硬件寄存器(也就是说, 其必须不在
DWARF_FRAME_REGNUM
的范围中)。该宏当被设为一个通用寄存器,但是候选的column需要用于signal帧的时候会很有用。 一些target还使用了不同的帧返回列。
一个C表达式,其值为一个整数,给出了DWARF2寄存器编号,其被认为总是具有值0。 这应该只当target的体系结构中具有一个0寄存器并且认为使用寄存器编号来确定栈的 回溯是一个好主意的时候才被定义。新的part应该避免该宏。
该target钩子允许后端生成帧相关的insn,其包含了UNSPECs或UNSPEC_VOLATILEs。 DWARF2调用帧调试信息引擎将会按照如下的形式来调用它
(set (reg) (unspec [...] UNSPEC_INDEX))和
(set (reg) (unspec_volatile [...] UNSPECV_INDEX)).来使后端生成调用帧指令。label为insn附带的CFI标号, pattern为insn的指令模式, index为
UNSPEC_INDEX
或UNSPECV_INDEX
。
一个C表达式,其值为一个整数,给出了偏移字节数, 从栈指针寄存器到任何函数的起始处,序言之前的栈帧的顶部。 帧的顶部被定义为之前帧的栈指针的值,就在call指令之前。
你只有当你想支持像DWARF2提供的那样的帧调试信息时才需要定义该宏。
一个C表达式,其值为一个整数,给出了偏移字节数,从参数指针到规范化帧地址(cfa)。 最终的值应该与通过
INCOMING_FRAME_SP_OFFSET
所计算的一致。 不幸的是这在虚寄存器实例化的时候不可用。该宏的缺省值为
FIRST_PARM_OFFSET (fundecl)
,其对于大多数机器是正确的; 总的来说,参数在栈帧之前被找到。注意有些情况不是这样的,一些target将寄存器保存在调用者的帧中,像SPARC和rs6000,这样的target就不需要定义该宏。你只有当缺省是不正确的时候, 以及你想支持像DWARF2提供的那样的帧调试信息时才需要定义该宏。