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