Next: , Previous: Addressing Modes, Up: Target Macros


17.15 锚定的地址

GCC通常将每一个静态对象作为一个单独的实体来寻址。例如,如果我们有:

     static int a, b, c;
     int foo (void) { return a + b + c; }

foo的代码通常会计算三个独立的符号地址:abc的。 在一些target上,只计算一个符号地址并且通过相对地址来访问这三个变量会更好些。 等价的伪代码可能为:

     int foo (void)
     {
       register int *xr = &x;
       return xr[&a - &x] + xr[&b - &x] + xr[&c - &x];
     }

(这不是有效的C)。我们称像x这样的共享地址为“section anchors”。 它们的用法由-fsection-anchors控制。

下面的钩子描述了GCC需要知道的target属性,以便有效利用section anchors。 除非TARGET_MIN_ANCHOR_OFFSETTARGET_MAX_ANCHOR_OFFSET 被设为一个非0的值,否则section anchors根本不会被使用。

— Variable: Target Hook HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET

应该应用到section anchor的最小偏移量。在大多数target上, 其应该为可以应用到基址寄存器并且对每种机器模式都可以给出合法地址的最小偏移量。 缺省值为0。

— Variable: Target Hook HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET

类似TARGET_MIN_ANCHOR_OFFSET, 但是为可以应用到section anchors的最大(包括)偏移量。缺省为0。

— Target Hook: void TARGET_ASM_OUTPUT_ANCHOR (rtx x)

写汇编代码来定义section anchor x,其为一个SYMBOL_REF, 并且‘SYMBOL_REF_ANCHOR_P (x)’为真。该钩子被调用时, 汇编输出位置被设为SYMBOL_REF_BLOCK (x)的起始处。

如果ASM_OUTPUT_DEF可用, 则钩子的缺省定义使用它来定义符号为‘. + SYMBOL_REF_BLOCK_OFFSET (x)’。 如果ASM_OUTPUT_DEF不可用,则钩子的缺省定义为NULL, 其禁止了section anchors的使用。

— Target Hook: bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (rtx x)

返回真,如果GCC应该尝试使用anchors来访问SYMBOL_REF x。 你可以假设‘SYMBOL_REF_HAS_BLOCK_INFO_P (x)’和 ‘!SYMBOL_REF_ANCHOR_P (x)’。

缺省版本对于大多数target都正确, 但是你可能需要截取该钩子来处理target特定的属性或者target特定的section。