aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@arm.com>2022-06-14 21:08:33 +0000
committerChristophe Lyon <christophe.lyon@arm.com>2023-01-12 14:42:00 +0100
commit3df1a115be22caeab3ffe7afb12e71adb54ff132 (patch)
tree0e8f83dd063f2b8e077ae6a4fc21a0006a6b5d35 /gcc/config
parentb073f2b098ba7819450d6c14a0fb96cb1c09f242 (diff)
downloadgcc-3df1a115be22caeab3ffe7afb12e71adb54ff132.zip
gcc-3df1a115be22caeab3ffe7afb12e71adb54ff132.tar.gz
gcc-3df1a115be22caeab3ffe7afb12e71adb54ff132.tar.bz2
aarch64: fix warning emission for ABI break since GCC 9.1
While looking at PR 105549, which is about fixing the ABI break introduced in GCC 9.1 in parameter alignment with bit-fields, we noticed that the GCC 9.1 warning is not emitted in all the cases where it should be. This patch fixes that and the next patch in the series fixes the GCC 9.1 break. We split this into two patches since patch #2 introduces a new ABI break starting with GCC 13.1. This way, patch #1 can be back-ported to release branches if needed to fix the GCC 9.1 warning issue. The main idea is to add a new global boolean that indicates whether we're expanding the start of a function, so that aarch64_layout_arg can emit warnings for callees as well as callers. This removes the need for aarch64_function_arg_boundary to warn (with its incomplete information). However, in the first patch there are still cases where we emit warnings were we should not; this is fixed in patch #2 where we can distinguish between GCC 9.1 and GCC.13.1 ABI breaks properly. The fix in aarch64_function_arg_boundary (replacing & with &&) looks like an oversight of a previous commit in this area which changed 'abi_break' from a boolean to an integer. We also take the opportunity to fix the comment above aarch64_function_arg_alignment since the value of the abi_break parameter was changed in a previous commit, no longer matching the description. 2022-11-28 Christophe Lyon <christophe.lyon@arm.com> Richard Sandiford <richard.sandiford@arm.com> gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_function_arg_alignment): Fix comment. (aarch64_layout_arg): Factorize warning conditions. (aarch64_function_arg_boundary): Fix typo. * function.cc (currently_expanding_function_start): New variable. (expand_function_start): Handle currently_expanding_function_start. * function.h (currently_expanding_function_start): Declare. gcc/testsuite/ChangeLog: * gcc.target/aarch64/bitfield-abi-warning-align16-O2.c: New test. * gcc.target/aarch64/bitfield-abi-warning-align16-O2-extra.c: New test. * gcc.target/aarch64/bitfield-abi-warning-align32-O2.c: New test. * gcc.target/aarch64/bitfield-abi-warning-align32-O2-extra.c: New test. * gcc.target/aarch64/bitfield-abi-warning-align8-O2.c: New test. * gcc.target/aarch64/bitfield-abi-warning.h: New test. * g++.target/aarch64/bitfield-abi-warning-align16-O2.C: New test. * g++.target/aarch64/bitfield-abi-warning-align16-O2-extra.C: New test. * g++.target/aarch64/bitfield-abi-warning-align32-O2.C: New test. * g++.target/aarch64/bitfield-abi-warning-align32-O2-extra.C: New test. * g++.target/aarch64/bitfield-abi-warning-align8-O2.C: New test. * g++.target/aarch64/bitfield-abi-warning.h: New test.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/aarch64/aarch64.cc28
1 files changed, 21 insertions, 7 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 7591a66..9eb6652 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -7536,9 +7536,9 @@ aarch64_vfp_is_call_candidate (cumulative_args_t pcum_v, machine_mode mode,
/* Given MODE and TYPE of a function argument, return the alignment in
bits. The idea is to suppress any stronger alignment requested by
the user and opt for the natural alignment (specified in AAPCS64 \S
- 4.1). ABI_BREAK is set to true if the alignment was incorrectly
- calculated in versions of GCC prior to GCC-9. This is a helper
- function for local use only. */
+ 4.1). ABI_BREAK is set to the old alignment if the alignment was
+ incorrectly calculated in versions of GCC prior to GCC-9. This is
+ a helper function for local use only. */
static unsigned int
aarch64_function_arg_alignment (machine_mode mode, const_tree type,
@@ -7614,11 +7614,24 @@ aarch64_layout_arg (cumulative_args_t pcum_v, const function_arg_info &arg)
if (pcum->aapcs_arg_processed)
return;
+ bool warn_pcs_change
+ = (warn_psabi
+ && !pcum->silent_p
+ && (currently_expanding_function_start
+ || currently_expanding_gimple_stmt));
+
+ unsigned int alignment
+ = aarch64_function_arg_alignment (mode, type, &abi_break);
+ gcc_assert (!alignment || abi_break < alignment);
+
pcum->aapcs_arg_processed = true;
pure_scalable_type_info pst_info;
if (type && pst_info.analyze_registers (type))
{
+ /* aarch64_function_arg_alignment has never had an effect on
+ this case. */
+
/* The PCS says that it is invalid to pass an SVE value to an
unprototyped function. There is no ABI-defined location we
can return in this case, so we have no real choice but to raise
@@ -7689,6 +7702,8 @@ aarch64_layout_arg (cumulative_args_t pcum_v, const function_arg_info &arg)
and homogenous short-vector aggregates (HVA). */
if (allocate_nvrn)
{
+ /* aarch64_function_arg_alignment has never had an effect on
+ this case. */
if (!pcum->silent_p && !TARGET_FLOAT)
aarch64_err_no_fpadvsimd (mode);
@@ -7753,7 +7768,7 @@ aarch64_layout_arg (cumulative_args_t pcum_v, const function_arg_info &arg)
&& (aarch64_function_arg_alignment (mode, type, &abi_break)
== 16 * BITS_PER_UNIT))
{
- if (abi_break && warn_psabi && currently_expanding_gimple_stmt)
+ if (warn_pcs_change && abi_break)
inform (input_location, "parameter passing for argument of type "
"%qT changed in GCC 9.1", type);
++ncrn;
@@ -7816,7 +7831,7 @@ on_stack:
int new_size = ROUND_UP (pcum->aapcs_stack_size, 16 / UNITS_PER_WORD);
if (pcum->aapcs_stack_size != new_size)
{
- if (abi_break && warn_psabi && currently_expanding_gimple_stmt)
+ if (warn_pcs_change && abi_break)
inform (input_location, "parameter passing for argument of type "
"%qT changed in GCC 9.1", type);
pcum->aapcs_stack_size = new_size;
@@ -7936,14 +7951,13 @@ aarch64_function_arg_boundary (machine_mode mode, const_tree type)
unsigned int alignment = aarch64_function_arg_alignment (mode, type,
&abi_break);
alignment = MIN (MAX (alignment, PARM_BOUNDARY), STACK_BOUNDARY);
- if (abi_break & warn_psabi)
+ if (abi_break && warn_psabi)
{
abi_break = MIN (MAX (abi_break, PARM_BOUNDARY), STACK_BOUNDARY);
if (alignment != abi_break)
inform (input_location, "parameter passing for argument of type "
"%qT changed in GCC 9.1", type);
}
-
return alignment;
}