[PATCH] D11034: Respect alignment of nested bitfields

Ulrich Weigand ulrich.weigand at de.ibm.com
Thu Jul 9 10:04:19 PDT 2015


uweigand added a comment.

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?

> Also, please use CreateAlignedStore and CreateAlignedLoad.


OK, done.


http://reviews.llvm.org/D11034







More information about the cfe-commits mailing list