Zero-width bitfields on AIX pad out to the natral alignment boundary but do not change the containing records alignment when they are packed.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
LGTM with some nits.
clang/lib/AST/RecordLayoutBuilder.cpp | ||
---|---|---|
1781 | Just noting that the comment says MaxFieldAlignment - The maximum allowed field alignment. This is set by #pragma pack, but __attribute__(packed) also seems to set it to some large value that is at least as large as the FieldAlign. Maybe edit the comment accordingly for now, and a future follow-on patch if necessary. | |
clang/test/Layout/aix-packed-bitfields.c | ||
99 | nit: might be helpful to use a different type for the zero-width bitfield here. (e.g., long long : 0 |
clang/lib/AST/RecordLayoutBuilder.cpp | ||
---|---|---|
1781 | Sorry Steven, not sure what you are asking for. attribute packed will set 'FieldPacked` to true, in which case we ignore the max field alignment (and why the new comment says, or 1 if packed). IIUC the MaXFieldAlign is set by only by pragma pack and pragma align in the Itanium recored layout builder, and the place where it is set based on attribute packed is int he Microsoft record layout builder and doesn't affect us here. |
clang/lib/AST/RecordLayoutBuilder.cpp | ||
---|---|---|
1781 | Sorry Sean, my previous comment was indeed confusing. The old buggy behaviour confused me, and for some reason I thought the code must had went down this if statement when attribute packed is set, hence the previous comment. Now that I take a second look, I realize the problem was actually that we never went into the if to fix the FieldAlign. Sorry for the churn. |
clang/lib/AST/RecordLayoutBuilder.cpp | ||
---|---|---|
1783 | UnpackedFieldAlign is used to check if the packed attribute is unnecessary (-Wpacked). here the attribute is making a difference, we probably shouldn't set FieldAlign = UnpackedFieldAlign? |
clang/lib/AST/RecordLayoutBuilder.cpp | ||
---|---|---|
1783 | Good catch, updated. |