Next: , Previous: Sections, Up: Target Macros


17.20 位置独立代码

这一节描述了帮助实现位置独立代码生成的宏。 简单的定义这些宏并不足以生成有效的PIC; 你必须还要增加对宏GO_IF_LEGITIMATE_ADDRESSPRINT_OPERAND_ADDRESS的支持,还有LEGITIMIZE_ADDRESS。 你必须修改‘movsi’的定义, 当源操作数包含一个符号地址时来做一些适当的处理。 还可能需要修改switch语句的处理,使得它们使用相对地址。

— Macro: PIC_OFFSET_TABLE_REGNUM

用于寻址内存中静态数据地址表的寄存器的编号。一些情况下, 该寄存器由处理器的“应用二进制接口”(ABI)定义。当该宏被定义时, 会为该寄存器生成一次 RTL,使用栈指针和帧指针寄存器。如果该宏没有被定义, 则需要机器相关文件来分配这样的寄存器(如果需要的话)。 注意该寄存器在使用时(即当flag_pic为真时)必须为固定的。

— Macro: PIC_OFFSET_TABLE_REG_CALL_CLOBBERED

定义该宏,如果由PIC_OFFSET_TABLE_REGNUM定义的寄存器被调用破坏。 如果PIC_OFFSET_TABLE_REGNUM没有被定义,则不要定义该宏。

— Macro: LEGITIMATE_PIC_OPERAND_P (x)

一个C表达式,如果当生成位置独立代码时, x为target机器上的合法的立即数操作数,则为非零。 你可以假设x满足CONSTANT_P,所以不需要进行检查。 你还可以假设flag_pic为真,所以也不需要进行检查。 如果当生成位置独立代码时, 所有的常量(包括SYMBOL_REF)都可以为立即操作数,则不需要定义该宏。