[Bug c/53037] warn_if_not_aligned(X)
nsz at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Aug 21 18:35:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53037
nsz at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |nsz at gcc dot gnu.org
--- Comment #38 from nsz at gcc dot gnu.org ---
(In reply to Eric Botcazou from comment #32)
> > Sparc defines STRICT_ALIGNMENT which leads to
> >
> > unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
> >
> > /* Don't override a larger alignment requirement coming from a user
> > alignment of one of the fields. */
> > if (mode_align >= TYPE_ALIGN (type))
> > {
> > SET_TYPE_ALIGN (type, mode_align);
> > TYPE_USER_ALIGN (type) = 0;
> > }
> >
> > so __attribute__ ((packed)) is basically ignored on Sparc.
>
> I don't think that's correct. Simply, on strict-alignment targets, you
> cannot have an aggregate type less aligned than its scalar mode, if any; for
> other targets, that's only true for scalar types. But you can have an
> aggregate type with alignment 1 if it has BLKmode.
>
i don't quite understand this reasoning, i would
not expect the internal STRICT_ALIGNMENT setting
to change how types behave (e.g. it might mean
some code errors out, but the semantics of packed
and aligned attributes are not changed).
> > diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
> > index 3028d55773a..6dd605810ac 100644
> > --- a/gcc/stor-layout.c
> > +++ b/gcc/stor-layout.c
> > @@ -1784,7 +1784,7 @@ finalize_type_size (tree type)
> >
> > /* Don't override a larger alignment requirement coming from a user
> > alignment of one of the fields. */
> > - if (mode_align >= TYPE_ALIGN (type))
> > + if (mode_align > TYPE_ALIGN (type))
> > {
> > SET_TYPE_ALIGN (type, mode_align);
> > TYPE_USER_ALIGN (type) = 0;
> >
> > works with cross compiler.
>
> The existing code works as intended: if the alignment given by the mode is
> larger than or equal to the type's alignment, then this alignment given by
> the mode becomes the natural alignment and TYPE_USER_ALIGN becomes
> obsolete/wrong.
>
i don't see this on arm/sparc, instead i see wrong
alignment given:
struct __attribute__ ((aligned (8))) S8 { char a[8]; };
struct __attribute__ ((packed)) S1 { struct S8 s8; };
char a[_Alignof(struct S8)] = {0};
char b[_Alignof(struct S1)] = {0};
compiles into a size 8 array for a and size 1 array for b,
so _Alignof is inconsistent, which i'd expect to be an
error (or warning at least).
> So I think that the absence of warning is correct on strict-alignment
> platforms and that, if you want to make the tests portable, then you must
> use structures whose rounded size is not a power of 2 or is larger than 128
> bits, so that they don't get a scalar mode.
More information about the Gcc-bugs
mailing list