[PATCH] D14980: PR18513: make gcc compatible layout for bit-fields with explicit aligned attribute

John McCall via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 1 11:29:21 PST 2015


rjmccall added a comment.

I don't mean the actual layout used by Windows targets; I mean the layout used by the ms_struct pragma / attribute.


================
Comment at: lib/AST/RecordLayoutBuilder.cpp:1606
@@ -1605,1 +1605,3 @@
+    } else if (ExplicitFieldAlign)
+      FieldOffset = llvm::RoundUpToAlignment(FieldOffset, ExplicitFieldAlign);
 
----------------
It does still seem to be limited by platforms that ignore natural alignment, though, and by #pragma pack (2) and so on, so at least some of the modifications made to FieldAlign need to be reflected in ExplicitFieldAlign.

I had to spend some time trying to work out counter-examples, but I did convince myself that the effect of the fallback here is correct.  My concern was that there was a way we might round up to FieldAlign when we only needed to round up to ExplicitFieldAlign, which could matter if there were another properly-aligned position within the current storage unit.  However, the second clause of the first condition will only trigger at the very end of a storage unit, which means that there cannot be any other properly-aligned positions within it.

It might be wrong for zero-width bit-fields, though, since we'll always round up to FieldAlign instead of ExplicitFieldAlign.

================
Comment at: lib/AST/RecordLayoutBuilder.cpp:1614
@@ -1610,3 +1613,3 @@
       UnpackedFieldOffset = llvm::RoundUpToAlignment(UnpackedFieldOffset,
                                                      UnpackedFieldAlign);
   }
----------------
This should follow the same logic that you use for FieldOffset, unless I'm missing something.


http://reviews.llvm.org/D14980





More information about the cfe-commits mailing list