### 15.15 Anchored Addresses

GCC usually addresses every static object as a separate entity. For example, if we have:

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

the code for `foo` will usually calculate three separate symbolic addresses: those of `a`, `b` and `c`. On some targets, it would be better to calculate just one symbolic address and access the three variables relative to it. The equivalent pseudocode would be something like:

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

(which isn't valid C). We refer to shared addresses like `x` as “section anchors”. Their use is controlled by `-fsection-anchors`.

The hooks below describe the target properties that GCC needs to know in order to make effective use of section anchors. It won't use section anchors at all unless either `TARGET_MIN_ANCHOR_OFFSET` or `TARGET_MAX_ANCHOR_OFFSET` is set to a nonzero value.

— Variable: Target Hook HOST_WIDE_INT TARGET_MIN_ANCHOR_OFFSET

> The minimum offset that should be applied to a section anchor. On most targets, it should be the smallest offset that can be applied to a base register while still giving a legitimate address for every mode. The default value is 0.

— Variable: Target Hook HOST_WIDE_INT TARGET_MAX_ANCHOR_OFFSET

> Like `TARGET_MIN_ANCHOR_OFFSET`, but the maximum (inclusive) offset that should be applied to section anchors. The default value is 0.

— Target Hook: void TARGET_ASM_OUTPUT_ANCHOR (rtx x)

> Write the assembly code to define section anchor x, which is a `SYMBOL_REF` for which ‘`SYMBOL_REF_ANCHOR_P (x)`’ is true. The hook is called with the assembly output position set to the beginning of `SYMBOL_REF_BLOCK (`x`)`.

> If `ASM_OUTPUT_DEF` is available, the hook's default definition uses it to define the symbol as ‘`. + SYMBOL_REF_BLOCK_OFFSET (x)`’. If `ASM_OUTPUT_DEF` is not available, the hook's default definition is `NULL`, which disables the use of section anchors altogether.

— Target Hook: bool TARGET_USE_ANCHORS_FOR_SYMBOL_P (rtx x)

> Return true if GCC should attempt to use anchors to access `SYMBOL_REF` x. You can assume ‘`SYMBOL_REF_HAS_BLOCK_INFO_P (x)`’ and ‘`!SYMBOL_REF_ANCHOR_P (x)`’.

> The default version is correct for most targets, but you might need to intercept this hook to handle things like target-specific attributes or target-specific sections.