Commit e1089c7a by Ulrich Weigand Committed by Ulrich Weigand

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
parent ff46d64d
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 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 * config/rs6000/rs6000.c (rs6000_function_arg): If a float argument
does not fit fully into floating-point registers, and there is still does not fit fully into floating-point registers, and there is still
space in the register parameter area, use GPRs to pass those parts space in the register parameter area, use GPRs to pass those parts
......
...@@ -9184,14 +9184,48 @@ rs6000_function_arg_boundary (enum machine_mode mode, const_tree type) ...@@ -9184,14 +9184,48 @@ rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
|| (type && TREE_CODE (type) == VECTOR_TYPE || (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) >= 16)) && int_size_in_bytes (type) >= 16))
return 128; return 128;
else if (((TARGET_MACHO && rs6000_darwin64_abi)
|| DEFAULT_ABI == ABI_ELFv2 /* Aggregate types that need > 8 byte alignment are quadword-aligned
|| (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm)) in the parameter area in the ELFv2 ABI, and in the AIX ABI unless
&& mode == BLKmode -mcompat-align-parm is used. */
&& type && TYPE_ALIGN (type) > 64) 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; return 128;
else
return PARM_BOUNDARY; return PARM_BOUNDARY;
} }
/* The offset in words to the start of the parameter save area. */ /* The offset in words to the start of the parameter save area. */
......
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 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. * gcc.target/powerpc/ppc64-abi-warn-1.c: New test.
2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> 2014-07-24 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
......
/* { 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" } */
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment