This is the mail archive of the
mailing list for the GCC project.
Re: [arm][RFC] PR target/88469 fix incorrect argument passing with 64-bit bitfields
- From: Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- To: Richard Earnshaw <richard dot earnshaw at arm dot com>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Jakub Jelinek <jakub at redhat dot com>, Richard Biener <rguenther at suse dot de>, Joseph Myers <joseph at codesourcery dot com>
- Date: Mon, 17 Dec 2018 18:12:45 +0000
- Subject: Re: [arm][RFC] PR target/88469 fix incorrect argument passing with 64-bit bitfields
> Unfortunately another PCS bug has come to light with the layout of
> structs whose alignment is dominated by a 64-bit bitfield element. Such
> fields in the type list appear to have alignment 1, but in reality, for
> the purposes of alignment of the underlying structure, the alignment is
> derived from the underlying bitfield's type. We've been getting this
> wrong since support for over-aligned record types was added several
> releases back. Worse still, the existing code may generate unaligned
> memory accesses that may fault on some versions of the architecture.
> I'd appreciate a comment from someone with a bit more knowledge of
> record layout - the code in stor-layout.c looks hideously complex when
> it comes to bit-field layout; but it's quite possible that all of that
> is irrelevant on Arm.
I am not really an expert here, Joseph might know the right answers.
I think there are two different alignment values, one is the minimum
alignment for a type within another structure, that can be computed
and there is a possibly greater value that tells how a type is aligned
when used alone:
I thought both are always identical on arm, but maybe they are not.
They are for instance different for double on x86_64 in structures that
type is 4-byte aligned, and used alone, it is 8-byte aligned.
I wonder why you have to iterate over all the type members.
for instance this also gets the right alignment of the bit field type:
--- arm/arm.c (Revision 267164)
+++ arm/arm.c (Arbeitskopie)
@@ -6622,6 +6622,8 @@
ret = -1;
+ if (min_align_of_type (const_cast<tree>(type)) > PARM_BOUNDARY / BITS_PER_UNIT)
+ return 1;
But I might have missed the point why this needs to be dome this way.