diff options
author | Robin Dapp <rdapp@linux.ibm.com> | 2021-06-15 09:06:02 +0200 |
---|---|---|
committer | Robin Dapp <rdapp@linux.ibm.com> | 2021-06-15 09:12:55 +0200 |
commit | ba2eef033e59d80fde35d0cc3acf4d82f7706e60 (patch) | |
tree | decf378f6ad15e1100d7317f31cc0bc033037980 /gcc/c-family | |
parent | 327a6b55e171669f2e72588570c931cd000822d0 (diff) | |
download | gcc-ba2eef033e59d80fde35d0cc3acf4d82f7706e60.tar.gz |
c-family: Copy DECL_USER_ALIGN even if DECL_ALIGN is similar.
When re-declaring a function with differing attributes DECL_USER_ALIGN
is usually not merged/copied when DECL_ALIGN is similar. On s390 this
will cause a warning message not to be shown. Similarly, we warned
about the wrong alignment when short-circuiting an alignment initialization in
common_handle_aligned_attribute ().
Fix this by copying DECL_USER_ALIGN even if DECL_ALIGN is similar as
well as getting rid of the short-circuited initialization.
gcc/c-family/ChangeLog:
* c-attribs.c (common_handle_aligned_attribute): Remove short
circuit and dead code.
gcc/c/ChangeLog:
* c-decl.c (merge_decls): Copy DECL_USER_ALIGN if DECL_ALIGN is
similar.
gcc/cp/ChangeLog:
* decl.c (duplicate_decls): Likewise.
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/c-attribs.c | 30 |
1 files changed, 7 insertions, 23 deletions
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index 6bf492afcc0..e60fb31d8c8 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -2338,14 +2338,17 @@ common_handle_aligned_attribute (tree *node, tree name, tree args, int flags, *no_add_attrs = true; } else if (TREE_CODE (decl) == FUNCTION_DECL - && ((curalign = DECL_ALIGN (decl)) > bitalign - || ((lastalign = DECL_ALIGN (last_decl)) > bitalign))) + && (((curalign = DECL_ALIGN (decl)) > bitalign) + | ((lastalign = DECL_ALIGN (last_decl)) > bitalign))) { /* Either a prior attribute on the same declaration or one on a prior declaration of the same function specifies stricter alignment than this attribute. */ - bool note = lastalign != 0; - if (lastalign) + bool note = (lastalign > curalign + || (lastalign == curalign + && (DECL_USER_ALIGN (last_decl) + > DECL_USER_ALIGN (decl)))); + if (note) curalign = lastalign; curalign /= BITS_PER_UNIT; @@ -2390,25 +2393,6 @@ common_handle_aligned_attribute (tree *node, tree name, tree args, int flags, This formally comes from the c++11 specification but we are doing it for the GNU attribute syntax as well. */ *no_add_attrs = true; - else if (!warn_if_not_aligned_p - && TREE_CODE (decl) == FUNCTION_DECL - && DECL_ALIGN (decl) > bitalign) - { - /* Don't warn for function alignment here if warn_if_not_aligned_p - is true. It will be warned about later. */ - if (DECL_USER_ALIGN (decl)) - { - /* Only reject attempts to relax/override an alignment - explicitly specified previously and accept declarations - that appear to relax the implicit function alignment for - the target. Both increasing and increasing the alignment - set by -falign-functions setting is permitted. */ - error ("alignment for %q+D was previously specified as %d " - "and may not be decreased", decl, - DECL_ALIGN (decl) / BITS_PER_UNIT); - *no_add_attrs = true; - } - } else if (warn_if_not_aligned_p && TREE_CODE (decl) == FIELD_DECL && !DECL_C_BIT_FIELD (decl)) |