Next: Allocation Order, Up: Registers
寄存器具有不同的特征。
编译器知道的硬件寄存器个数。它们包括编号0到
FIRST_PSEUDO_REGISTER-1
; 因此,第一个伪寄存器的编号实际被赋值为FIRST_PSEUDO_REGISTER
。
一个初始化,说明哪些寄存器在整个编译代码中都用于固定用途, 因此不能用于通用分配。这些将包括栈指针,帧指针(在当不需要帧指针时, 可以用于通用寄存器的机器上除外), 在一些机器上被认为是可寻址的寄存器的程序计数器, 以及其它具有标准用法的编号寄存器。
这些信息作为一个序列编号来表示,由逗号分隔并由大括号包括。 第n个编号为1,如果寄存器n为固定的,否则为0。
从该宏初始化的表,以及由下面的初始化的表,都可以在运行时被覆盖, 或者通过执行宏
CONDITIONAL_REGISTER_USAGE
自动完成, 或者通过用户使用命令选项-ffixed-reg, -fcall-used-reg和-fcall-saved-reg。
类似
FIXED_REGISTERS
,但是对于被函数调用破坏的每个寄存器, 以及固定寄存器,值为1。因此, 该宏标识了哪些寄存器不适合用于必须活跃于整个函数调用的值的通用分配。如果寄存器在
CALL_USED_REGISTERS
中具有值0, 如果寄存器在函数中被使用,则编译器会自动的在函数入口保存它, 并在函数出口恢复它。
类似
CALL_USED_REGISTERS
,除了该宏不需要包含整个FIXED_REGISTERS
集。 (CALL_USED_REGISTERS
必须为FIXED_REGISTERS
的超集)。 该宏为可选的。如果没有被指定,其缺省为CALL_USED_REGISTERS
的值。
一个C表达式,值为非0, 如果不允许将机器模式为mode的值存储在编号为regno的硬件寄存器中, 并且整个调用中没有破坏其某个部分。对于大多数机器,该宏不需要被定义。 其只用于一些在调用中不保护寄存器的整个内容的机器上。
0条或者多条C语句,其可以条件修改5个变量
fixed_regs
,call_used_rehs
,global_regs
,reg_names
和reg_class_contents
,来考虑这些寄存器集对target标号的任何依赖。 前3个为char []
类型(作为布尔向量来解析)。global_regs
为一个const char *[]
,reg_class_contents
为一个HARD_REG_SET
。 在宏被调用之前,fixed_regs
,call_used_regs
,reg_class_contents
和reg_names
已经分别通过FIXED_REGISTERS
,CALL_USED_REGISTERS
,REG_CLASS_CONTENTS
和REGISTER_NAMES
被初始化。global_regs
已经被清除,并且任何-ffixed-reg, -fcall-used-reg和-fcall-saved-reg选项已经被应用。如果不需要做什么工作,则不必定义该宏。
如果整个寄存器的类别的使用,取决于target标记, 则你可以通过使用该宏来指示GCC修改
fixed_regs
和call_used_regs
为1, 对于类别中的每个不应由GCC使用的寄存器。还有就是, 定义宏REG_CLASS_FROM_LETTER
/REG_CLASS_FROM_CONSTRAINT
来返回NO_REGS
, 如果其被调用,并带有一个不应该被使用的类别字母。(然而,如果该类没有包含在
GENERAL_REGS
中, 并且所有的insn指令模式的约束允许该类通过target开关来控制, 则GCC将自动避免使用这些寄存器,当target开关与它们相反时。)
定义该宏,如果target机器具有寄存器窗口。 该C表达式根据调用函数能看到的寄存器编号out, 返回被调用函数所能看到的寄存器编号。 返回out,如果寄存器编号out不是发送寄存器(outbound register)。
定义该宏,如果target机器具有寄存器窗口。 该C表达式根据被调用函数能看到的寄存器编号in, 返回调用函数所能看到的寄存器编号。 返回in,如果寄存器编号in不是运入寄存器(inbound register)。