Next: Elimination, Previous: Stack Checking, Up: Stack and Calling
这里讨论了用于栈帧寻址的寄存器。
帧指针寄存器的寄存器编号,其用于访问在栈帧中的自动变量。 在一些机器上,硬件决定了这是哪个寄存器。 在其它机器上,你可以选择任意寄存器来达到该目的。
在一些机器上,帧指针和自动变量的起始处之间的偏移量直到寄存器分配进行完之后才知道 (例如,因为保存寄存器位于这两个位置之间)。这些机器上, 定义
FRAME_POINTER_REGNUM
为一个特定的固定寄存器的编号,在内部使用, 直到位移已知,并且定义HARD_FRAME_POINTER_REGNUM
为实际的硬件寄存器, 用于帧指针。你只需要在非常少见的情况下定义该宏,当不可能计算帧指针和自动变量的偏移时, 并且直到寄存器分配完成。当该宏被定义, 你必须还要在你的
ELIMINABLE_REGS
的定义中指示如果消除FRAME_POINTER_REGNUM
为HARD_FRAME_POINTER_REGNUM
或者STACK_POINTER_REGNUM
。如果其与
FRAME_POINTER_REGNUM
相同,则不要定义该宏。
arg指针寄存器的寄存器编号,其用于访问函数的参数列表。在大多数机器上, 这与帧指针寄存器相同。在一些机器上,硬件决定了其为那个寄存器。在其它机器上, 你可以选择任意的寄存器。如果这与帧指针寄存器不同, 则你必须标记其为一个固定寄存器, 根据
FIXED_REGISTERS
或者设法能够消除它(参见Elimination)。
返回地址指针寄存器的寄存器编号,其用于访问栈中当前函数的返回地址。 在一些机器上,返回地址不在帧指针或栈指针或参数指针的固定偏移处。 该寄存器被定义指向栈中的返回地址, 并且然后通过
ELIMINABLE_REGS
转换为帧指针或者栈指针。不要定义该宏,除非没有其他的方式从栈中获得返回地址。
用于传递函数static链指针的寄存器编号。如果寄存器窗口被使用, 则寄存器编号由被调用函数所看到是
STATIC_CHAIN_INCOMING_REGNUM
, 而由调用者函数看到的是STATIC_CHAIN_REGNUM
。如果这些寄存器是相同的, 则不需要定义STATIC_CHAIN_INCOMING_REGNUM
。静态链寄存器不需要为一个固定寄存器。
如果静态链在内存中传递,则这些宏不需要定义;替代的,应该定义下面的两个宏。
This hook replaces the use of
STATIC_CHAIN_REGNUM
et al for targets that may use different static chain locations for different nested functions. This may be required if the target has function attributes that affect the calling conventions of the function and those calling conventions use different static chain locations.The default version of this hook uses
STATIC_CHAIN_REGNUM
et al.If the static chain is passed in memory, this hook should be used to provide rtx giving
mem
expressions that denote where they are stored. Often themem
expression as seen by the caller will be at an offset from the stack pointer and themem
expression as seen by the callee will be at an offset from the frame pointer. 变量stack_pointer_rtx
,frame_pointer_rtx
和arg_pointer_rtx
将在使用这些宏之前被初始化,并可以引用。
该宏指定了可以在一个调用帧中被保存的硬件寄存器的最大数。 这用于DWARF2异常处理中的size数据结构体。
在GCC3.0之前,该宏需要用来建立一个稳定的异常处理ABI。
如果该宏没有被定义,其缺省为
FIRST_PSEUDO_REGISTER
。
该宏类似于
DWARF_FRAME_REGISTERS
,是为了向后兼容在GCC3.0之前编译的代码而提供。如果没有定义该宏,其缺省为
DWARF_FRAME_REGISTERS
。
定义该宏,如果target对于dwarf寄存器的表示与对于unwind column的内部表示不相同。 给定一个dwarf寄存器,该宏应该返回替代使用的内部unwind column编号。
例子参见PowerPC's SPE target。