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.
-
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.
-
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.
-
void TARGET_ASM_OUTPUT_ANCHOR(rtx x)#
Write the assembly code to define section anchor
x
, which is aSYMBOL_REF
for whichSYMBOL_REF_ANCHOR_P (x)
is true. The hook is called with the assembly output position set to the beginning ofSYMBOL_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)
. IfASM_OUTPUT_DEF
is not available, the hook’s default definition isNULL
, which disables the use of section anchors altogether.
-
bool TARGET_USE_ANCHORS_FOR_SYMBOL_P(const_rtx x)#
Return true if GCC should attempt to use anchors to access
SYMBOL_REF
x
. You can assumeSYMBOL_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.