r199154 - [ms-abi] Reordering __declspec(align) pragma pack handling
Warren Hunt
whunt at google.com
Mon Jan 13 14:25:55 PST 2014
Author: whunt
Date: Mon Jan 13 16:25:55 2014
New Revision: 199154
URL: http://llvm.org/viewvc/llvm-project?rev=199154&view=rev
Log:
[ms-abi] Reordering __declspec(align) pragma pack handling
This patch moves the check for pragma pack until after the application
of __declspec align to before pragma pack. This causes observable
changes in the use of tail padding for bases. A test case is included.
Modified:
cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp
Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=199154&r1=199153&r2=199154&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Mon Jan 13 16:25:55 2014
@@ -2186,9 +2186,6 @@ MicrosoftRecordLayoutBuilder::getAdjuste
Context.getTypeInfoInChars(FD->getType());
if (FD->isBitField() && FD->getMaxAlignment() != 0)
Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);
- // Respect pragma pack.
- if (!MaxFieldAlignment.isZero())
- Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);
}
// Respect packed field attribute.
if (FD->hasAttr<PackedAttr>())
@@ -2200,6 +2197,9 @@ MicrosoftRecordLayoutBuilder::getAdjuste
// Capture required alignment as a side-effect.
RequiredAlignment = std::max(RequiredAlignment, FieldRequiredAlignment);
}
+ // Respect pragma pack.
+ if (!MaxFieldAlignment.isZero())
+ Info.Alignment = std::min(Info.Alignment, MaxFieldAlignment);
// TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
if (!(FD->isBitField() && IsUnion))
Alignment = std::max(Alignment, Info.Alignment);
Modified: cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp?rev=199154&r1=199153&r2=199154&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp Mon Jan 13 16:25:55 2014
@@ -43,7 +43,7 @@ struct X {
// CHECK: 8 | char b
// CHECK-NEXT: 10 | int c
// CHECK-NEXT: | [sizeof=16, align=4
-// CHECK-NEXT: | nvsize=16, nvalign=4]
+// CHECK-NEXT: | nvsize=14, nvalign=4]
// CHECK-X64: *** Dumping AST Record Layout
// CHECK-X64: *** Dumping AST Record Layout
// CHECK-X64-NEXT: 0 | struct X
@@ -52,7 +52,7 @@ struct X {
// CHECK-X64: 8 | char b
// CHECK-X64-NEXT: 10 | int c
// CHECK-X64-NEXT: | [sizeof=16, align=4
-// CHECK-X64-NEXT: | nvsize=16, nvalign=4]
+// CHECK-X64-NEXT: | nvsize=14, nvalign=4]
struct Y : A, B {
char a;
@@ -321,6 +321,34 @@ struct D2 : D1 { char a; };
// CHECK-X64-NEXT: | [sizeof=16, align=16
// CHECK-X64-NEXT: | nvsize=16, nvalign=16]
+#pragma pack()
+struct JA { char a; };
+#pragma pack(1)
+struct JB { __declspec(align(4)) char a; };
+#pragma pack()
+struct JC : JB, JA { };
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct JC
+// CHECK-NEXT: 0 | struct JB (base)
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 1 | struct JA (base)
+// CHECK-NEXT: 1 | char a
+// CHECK-NEXT: | [sizeof=4, align=4
+// CHECK-NEXT: | nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct JC
+// CHECK-X64-NEXT: 0 | struct JB (base)
+// CHECK-X64-NEXT: 0 | char a
+// CHECK-X64-NEXT: 1 | struct JA (base)
+// CHECK-X64-NEXT: 1 | char a
+// CHECK-X64-NEXT: | [sizeof=4, align=4
+// CHECK-X64-NEXT: | nvsize=4, nvalign=4]
+
int a[
sizeof(X)+
sizeof(Y)+
@@ -335,4 +363,5 @@ sizeof(YE)+
sizeof(YF)+
sizeof(YF)+
sizeof(D2)+
+sizeof(JC)+
0];
More information about the cfe-commits
mailing list