aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2014-07-24 17:12:45 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2014-07-24 17:12:45 +0000
commite1089c7a5caebffb0986d87435d2bfaf6bb55d89 (patch)
treee86a439386e107b23e13426ef34eeb7a7aa96180 /gcc
parentff46d64d829740dee098b0181d60db1231d90c09 (diff)
downloadgcc-e1089c7a5caebffb0986d87435d2bfaf6bb55d89.zip
gcc-e1089c7a5caebffb0986d87435d2bfaf6bb55d89.tar.gz
gcc-e1089c7a5caebffb0986d87435d2bfaf6bb55d89.tar.bz2
rs6000.c (rs6000_function_arg_boundary): In the AIX and ELFv2 ABI...
gcc/ * config/rs6000/rs6000.c (rs6000_function_arg_boundary): In the AIX and ELFv2 ABI, do not use the "mode == BLKmode" check to test for aggregate types. Instead, *all* aggregate types, except for single- element or homogeneous float/vector aggregates, are quadword-aligned if required by their type alignment. Issue -Wpsabi note when a type is now treated differently than before. gcc/testsuite/ * gcc.target/powerpc/ppc64-abi-warn-2.c: New test. From-SVN: r213016
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/rs6000/rs6000.c48
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c11
4 files changed, 65 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 244cf23..5436866 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+ * config/rs6000/rs6000.c (rs6000_function_arg_boundary): In the AIX
+ and ELFv2 ABI, do not use the "mode == BLKmode" check to test for
+ aggregate types. Instead, *all* aggregate types, except for single-
+ element or homogeneous float/vector aggregates, are quadword-aligned
+ if required by their type alignment. Issue -Wpsabi note when a type
+ is now treated differently than before.
+
+2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
* config/rs6000/rs6000.c (rs6000_function_arg): If a float argument
does not fit fully into floating-point registers, and there is still
space in the register parameter area, use GPRs to pass those parts
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 0f02862..49d50a6 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -9184,14 +9184,48 @@ rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
|| (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) >= 16))
return 128;
- else if (((TARGET_MACHO && rs6000_darwin64_abi)
- || DEFAULT_ABI == ABI_ELFv2
- || (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
- && mode == BLKmode
- && type && TYPE_ALIGN (type) > 64)
+
+ /* Aggregate types that need > 8 byte alignment are quadword-aligned
+ in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
+ -mcompat-align-parm is used. */
+ if (((DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)
+ || DEFAULT_ABI == ABI_ELFv2)
+ && type && TYPE_ALIGN (type) > 64)
+ {
+ /* "Aggregate" means any AGGREGATE_TYPE except for single-element
+ or homogeneous float/vector aggregates here. We already handled
+ vector aggregates above, but still need to check for float here. */
+ bool aggregate_p = (AGGREGATE_TYPE_P (type)
+ && !SCALAR_FLOAT_MODE_P (elt_mode));
+
+ /* We used to check for BLKmode instead of the above aggregate type
+ check. Warn when this results in any difference to the ABI. */
+ if (aggregate_p != (mode == BLKmode))
+ {
+ static bool warned;
+ if (!warned && warn_psabi)
+ {
+ warned = true;
+ inform (input_location,
+ "the ABI of passing aggregates with %d-byte alignment"
+ " has changed in GCC 4.10",
+ (int) TYPE_ALIGN (type) / BITS_PER_UNIT);
+ }
+ }
+
+ if (aggregate_p)
+ return 128;
+ }
+
+ /* Similar for the Darwin64 ABI. Note that for historical reasons we
+ implement the "aggregate type" check as a BLKmode check here; this
+ means certain aggregate types are in fact not aligned. */
+ if (TARGET_MACHO && rs6000_darwin64_abi
+ && mode == BLKmode
+ && type && TYPE_ALIGN (type) > 64)
return 128;
- else
- return PARM_BOUNDARY;
+
+ return PARM_BOUNDARY;
}
/* The offset in words to the start of the parameter save area. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f64ab59..bf929fa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+ * gcc.target/powerpc/ppc64-abi-warn-2.c: New test.
+
+2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
* gcc.target/powerpc/ppc64-abi-warn-1.c: New test.
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
diff --git a/gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c b/gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c
new file mode 100644
index 0000000..fdbeddf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/ppc64-abi-warn-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */
+
+struct test
+ {
+ long a __attribute__((aligned (16)));
+ };
+
+void test (struct test a) /* { dg-message "note: the ABI of passing aggregates with 16-byte alignment has changed" } */
+{
+}
+