[PATCH] D11034: Respect alignment of nested bitfields

John McCall rjmccall at gmail.com
Thu Jul 9 11:23:12 PDT 2015


rjmccall added a comment.

In http://reviews.llvm.org/D11034#201981, @uweigand wrote:

> In http://reviews.llvm.org/D11034#201452, @rjmccall wrote:
>
> > Good catch!
> >
> > The better fix would be to ignore the bitfield's abstract storage alignment and instead use the base l-value's alignment, adjusted with alignmentAtOffset to the offset of the bitfield's storage.  This ensures we get the right alignment when the base l-value is *over*-aligned: in a packed struct, bitfield storage at offset 0 will have alignment 1, but if the packed struct itself is known to have alignment 4 (e.g., if it is embedded in an unpacked struct), then we still know that the storage has alignment 4.alignmentAtOffset(0) == 4.
>
>
> Good point.  Unfortunately, at the point the access is generated, there doesn't appear to be an easy way to retrieve the offset of the bitfield's storage relative to the surrounding struct.  This value is present as "StartOffset" in CGRecordLowering::setBitFieldInfo, but is not actually stored in the CGBitFieldInfo struct.  Maybe instead of the  StorageAlignment field, the CGBitFieldInfo struct should instead have a StorageOffset field?


Storing the offset makes sense.  If this means that we don't otherwise need StorageAlignment — probably true — then we can drop that at the same time.


http://reviews.llvm.org/D11034







More information about the cfe-commits mailing list