Next: , Previous: Stack Checking, Up: Stack and Calling


17.10.4 用于栈帧寻址的寄存器

这里讨论了用于栈帧寻址的寄存器。

— Macro: STACK_POINTER_REGNUM

栈指针寄存器的寄存器编号,其还必须为一个FIXED_REGISTERS中的固定寄存器。 在大多数机器上,硬件决定了这是哪个寄存器。

— Macro: FRAME_POINTER_REGNUM

帧指针寄存器的寄存器编号,其用于访问在栈帧中的自动变量。 在一些机器上,硬件决定了这是哪个寄存器。 在其它机器上,你可以选择任意寄存器来达到该目的。

— Macro: HARD_FRAME_POINTER_REGNUM

在一些机器上,帧指针和自动变量的起始处之间的偏移量直到寄存器分配进行完之后才知道 (例如,因为保存寄存器位于这两个位置之间)。这些机器上, 定义FRAME_POINTER_REGNUM为一个特定的固定寄存器的编号,在内部使用, 直到位移已知,并且定义HARD_FRAME_POINTER_REGNUM为实际的硬件寄存器, 用于帧指针。

你只需要在非常少见的情况下定义该宏,当不可能计算帧指针和自动变量的偏移时, 并且直到寄存器分配完成。当该宏被定义, 你必须还要在你的ELIMINABLE_REGS的定义中指示如果消除 FRAME_POINTER_REGNUMHARD_FRAME_POINTER_REGNUM或者 STACK_POINTER_REGNUM

如果其与FRAME_POINTER_REGNUM相同,则不要定义该宏。

— Macro: ARG_POINTER_REGNUM

arg指针寄存器的寄存器编号,其用于访问函数的参数列表。在大多数机器上, 这与帧指针寄存器相同。在一些机器上,硬件决定了其为那个寄存器。在其它机器上, 你可以选择任意的寄存器。如果这与帧指针寄存器不同, 则你必须标记其为一个固定寄存器, 根据FIXED_REGISTERS或者设法能够消除它(参见Elimination)。

— Macro: RETURN_ADDRESS_POINTER_REGNUM

返回地址指针寄存器的寄存器编号,其用于访问栈中当前函数的返回地址。 在一些机器上,返回地址不在帧指针或栈指针或参数指针的固定偏移处。 该寄存器被定义指向栈中的返回地址, 并且然后通过ELIMINABLE_REGS转换为帧指针或者栈指针。

不要定义该宏,除非没有其他的方式从栈中获得返回地址。

— Macro: STATIC_CHAIN_REGNUM
— Macro: STATIC_CHAIN_INCOMING_REGNUM

用于传递函数static链指针的寄存器编号。如果寄存器窗口被使用, 则寄存器编号由被调用函数所看到是STATIC_CHAIN_INCOMING_REGNUM, 而由调用者函数看到的是STATIC_CHAIN_REGNUM。如果这些寄存器是相同的, 则不需要定义STATIC_CHAIN_INCOMING_REGNUM

静态链寄存器不需要为一个固定寄存器。

如果静态链在内存中传递,则这些宏不需要定义;替代的,应该定义下面的两个宏。

— Target Hook: rtx TARGET_STATIC_CHAIN (const_tree fndecl, bool incoming_p)

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 the mem expression as seen by the caller will be at an offset from the stack pointer and the mem expression as seen by the callee will be at an offset from the frame pointer. 变量stack_pointer_rtx, frame_pointer_rtxarg_pointer_rtx将在使用这些宏之前被初始化,并可以引用。

— Macro: DWARF_FRAME_REGISTERS

该宏指定了可以在一个调用帧中被保存的硬件寄存器的最大数。 这用于DWARF2异常处理中的size数据结构体。

在GCC3.0之前,该宏需要用来建立一个稳定的异常处理ABI。

如果该宏没有被定义,其缺省为FIRST_PSEUDO_REGISTER

— Macro: PRE_GCC3_DWARF_FRAME_REGISTERS

该宏类似于DWARF_FRAME_REGISTERS,是为了向后兼容在GCC3.0之前编译的代码而提供。

如果没有定义该宏,其缺省为DWARF_FRAME_REGISTERS

— Macro: DWARF_REG_TO_UNWIND_COLUMN (regno)

定义该宏,如果target对于dwarf寄存器的表示与对于unwind column的内部表示不相同。 给定一个dwarf寄存器,该宏应该返回替代使用的内部unwind column编号。

例子参见PowerPC's SPE target。

— Macro: DWARF_FRAME_REGNUM (regno)

定义该宏,如果target对于用在.eh_frame或者.debug_frame的dwarf寄存器的表示与用在 其它调试信息section中的不同。给定一个GCC硬件寄存器编号,该宏应该返回.eh_frame 寄存器编号。缺省为DBX_REGISTER_NUMBER (regno)

— Macro: DWARF2_FRAME_REG_OUT (regno, for_eh)

定义该宏来影射在调用帧信息中存放的寄存器编号, 其为GCC使用DWARF_FRAME_REGNUM来搜集的应该放在.debug_frame (for_eh为0)和.eh_frame(for_eh为非0)中的寄存器。 缺省为返回regno