Implement target-specific __attribute__((aligned)) value


Implement target-specific attribute((aligned)) value

The GCC construct attribute((aligned)) is defined to set alignment
to "the default alignment for the target architecture" according to
the GCC documentation:

The default alignment is sufficient for all scalar types, but may not be
enough for all vector types on a target that supports vector operations.
The default alignment is fixed for a particular target ABI.

clang currently hard-coded an alignment of 16 bytes for that construct,
which is correct on some platforms (including X86), but wrong on others
(including SystemZ). Since this value is ABI-relevant, it is important
to get correct for compatibility purposes.

This patch adds a new TargetInfo member "DefaultAlignForAttributeAligned"
that targets can set to the appropriate default attribute((aligned))

Note that I'm deliberately *not* using the existing "SuitableAlign"
value, which is used to set the pre-defined macro BIGGEST_ALIGNMENT,
since those two values may not be the same on all platforms. In fact,
on X86, attribute((aligned)) always uses 16-byte alignment, while
BIGGEST_ALIGNMENT may be larger if AVX-2 or AVX-512 are supported.
(This is actually not yet correctly implemented in clang either.)

The patch provides a value for DefaultAlignForAttributeAligned only for
SystemZ, and leaves the default for all other targets at 16, which means
no visible change in behavior on all other targets. (The value is still
wrong for some other targets, but I'd prefer to leave it to the target
maintainers for those platforms to fix.)


uweigandApr 21 2015, 10:29 AM
rL235396: Provide alignment info on LLVM external symbols