-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[CLANG][MS-STRUCT] bitfield padding warning presents padding to exact bit count #136062
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[CLANG][MS-STRUCT] bitfield padding warning presents padding to exact bit count #136062
Conversation
@llvm/pr-subscribers-clang Author: Theo de Magalhaes (theomagellan) ChangesAims to fix #131647. Full diff: https://github.com/llvm/llvm-project/pull/136062.diff 2 Files Affected:
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index ea353f88a8aec..ca08e186f4ff2 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -1538,6 +1538,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
uint64_t StorageUnitSize = FieldInfo.Width;
unsigned FieldAlign = FieldInfo.Align;
bool AlignIsRequired = FieldInfo.isAlignRequired();
+ unsigned char PaddingInLastUnit = 0;
// UnfilledBitsInLastUnit is the difference between the end of the
// last allocated bitfield (i.e. the first bit offset available for
@@ -1610,6 +1611,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
if (!LastBitfieldStorageUnitSize && !FieldSize)
FieldAlign = 1;
+ PaddingInLastUnit = UnfilledBitsInLastUnit;
UnfilledBitsInLastUnit = 0;
LastBitfieldStorageUnitSize = 0;
}
@@ -1706,7 +1708,7 @@ void ItaniumRecordLayoutBuilder::LayoutBitField(const FieldDecl *D) {
// For purposes of diagnostics, we're going to simultaneously
// compute the field offsets that we would have used if we weren't
// adding any alignment padding or if the field weren't packed.
- uint64_t UnpaddedFieldOffset = FieldOffset;
+ uint64_t UnpaddedFieldOffset = FieldOffset - PaddingInLastUnit;
uint64_t UnpackedFieldOffset = FieldOffset;
// Check if we need to add padding to fit the bitfield within an
diff --git a/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp b/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp
index ee5a57124eca5..0b88b4c170617 100644
--- a/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp
+++ b/clang/test/SemaCXX/windows-Wpadded-bitfield.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fsyntax-only -verify -Wpadded %s
+// RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -verify -Wpadded %s
struct __attribute__((ms_struct)) BitfieldStruct { // expected-warning {{padding size of 'BitfieldStruct' with 3 bytes to alignment boundary}}
char c : 1;
@@ -24,9 +25,23 @@ struct __attribute__((ms_struct)) DifferentUnitSizeBitfield { // expected-warnin
char i; // expected-warning {{padding struct 'DifferentUnitSizeBitfield' with 31 bits to align 'i'}}
};
+struct __attribute__((ms_struct)) Foo { // expected-warning {{padding size of 'Foo' with 63 bits to alignment boundary}}
+ long long x;
+ char a : 1;
+ long long b : 1; // expected-warning {{padding struct 'Foo' with 63 bits to align 'b'}}
+};
+
+struct __attribute__((ms_struct)) SameUnitSizeMultiple { // expected-warning {{padding size of 'SameUnitSizeMultiple' with 2 bits to alignment boundary}}
+ char c : 1;
+ char cc : 2;
+ char ccc : 3;
+};
+
int main() {
BitfieldStruct b;
SevenBitfieldStruct s;
SameUnitSizeBitfield su;
DifferentUnitSizeBitfield du;
+ Foo f;
+ SameUnitSizeMultiple susm;
}
|
Hello @efriedma-quic, hope you don’t mind the ping. This patch addresses the padded bitfield warning, which was reporting the wrong number of padded bits when using I originally planned to merge Thank you! |
If I'm following correctly, this also affects non-ms_struct definitions? Can you also add test coverage for that? I'm not sure people will be happy to see "padding struct 'Foo' with 1 bit to align 'xx'", but I guess we can see how it goes. Looks like gcc's -Wpadded does warn. |
It doesn't affect non-ms_struct definitions! The new I could still add tests for that but I am not sure what they would look like as so far the tests only make sure both ABIs (MSVC and Itanium under ms_struct) produce the correct padding warnings. I gave the |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I see, I missed the nesting.
LGTM
… bit count (llvm#136062) Aims to fix llvm#131647.
… bit count (llvm#136062) Aims to fix llvm#131647.
… bit count (llvm#136062) Aims to fix llvm#131647.
Aims to fix #131647.