if (TARGET_EXTRA_BUILTINS)
{
vector_pair_type_node = make_unsigned_type (256);
+ SET_TYPE_ALIGN (vector_pair_type_node, 256);
SET_TYPE_MODE (vector_pair_type_node, POImode);
layout_type (vector_pair_type_node);
lang_hooks.types.register_builtin_type (vector_pair_type_node,
"__vector_pair");
vector_quad_type_node = make_unsigned_type (512);
+ SET_TYPE_ALIGN (vector_quad_type_node, 512);
SET_TYPE_MODE (vector_quad_type_node, PXImode);
layout_type (vector_quad_type_node);
lang_hooks.types.register_builtin_type (vector_quad_type_node,
/* Allocation boundary (in *bits*) for the code of a function. */
#define FUNCTION_BOUNDARY 32
-/* No data type wants to be aligned rounder than this. */
-#define BIGGEST_ALIGNMENT (TARGET_MMA ? 512 : 128)
+/* No data type is required to be aligned rounder than this. Warning, if
+ BIGGEST_ALIGNMENT is changed, then this may be an ABI break. An example
+ of where this can break an ABI is in GLIBC's struct _Unwind_Exception. */
+#define BIGGEST_ALIGNMENT 128
/* Alignment of field after `int : 0' in a structure. */
#define EMPTY_FIELD_BOUNDARY 32
--- /dev/null
+/* { dg-do run } */
+/* { dg-require-effective-target hard_float } */
+/* { dg-options "-O2 -mhard-float" } */
+
+#include <stdlib.h>
+
+/* The MMA types below are enabled for pre-power10 compiles, because the
+ built-ins that use them must always be initialized in case the user has
+ a target attribute or pragma on a function that uses the MMA built-ins.
+ Since the test below doesn't need any other MMA support, we can enable
+ this test case on basically any cpu that has hard floating point
+ registers. */
+
+struct
+{
+ int __attribute__ ((__aligned__)) ivar;
+ __vector_pair pair;
+ __vector_quad quad;
+} s;
+
+int
+main (void)
+{
+ /* Verify default alignment is 16-byte aligned (BIGGEST_ALIGNMENT).
+ This may change in the future, but that is an ABI break, so this
+ hardcoded test case is here to be a noisy FAIL as a warning, in
+ case the ABI change was unintended and unwanted. An example of where
+ this can break an ABI is in glibc's struct _Unwind_Exception. */
+ if (__alignof__ (s.ivar) != 16)
+ abort ();
+
+ /* Verify __vector_pair types are 32-byte aligned. */
+ if (__alignof__ (s.pair) != 32)
+ abort ();
+
+ /* Verify __vector_quad types are 64-byte aligned. */
+ if (__alignof__ (s.quad) != 64)
+ abort ();
+
+ return 0;
+}