]> granicus.if.org Git - clang/commitdiff
MS ABI: Bitfields FielDecls only align if they allocate
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 13 Apr 2014 08:15:50 +0000 (08:15 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 13 Apr 2014 08:15:50 +0000 (08:15 +0000)
Don't consider a __declspec(align) on a bitfield's declaration if it didn't
allocate any underlying storage.

This fixes PR19414.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206132 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
test/Sema/ms_bitfield_layout.c

index 04a0fab737a5d7ff8843841a3b4f0dfcec329a30..5eb87e7fc755bd75b8caff7c6b2ffe4cd44c46aa 100644 (file)
@@ -2291,9 +2291,6 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(
   if (FD->hasAttr<PackedAttr>())
     Info.Alignment = CharUnits::One();
   Info.Alignment = std::max(Info.Alignment, FieldRequiredAlignment);
-  // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
-  if (!(FD->isBitField() && IsUnion))
-    Alignment = std::max(Alignment, Info.Alignment);
   return Info;
 }
 
@@ -2472,6 +2469,7 @@ void MicrosoftRecordLayoutBuilder::layoutField(const FieldDecl *FD) {
   }
   LastFieldIsNonZeroWidthBitfield = false;
   ElementInfo Info = getAdjustedElementInfo(FD);
+  Alignment = std::max(Alignment, Info.Alignment);
   if (IsUnion) {
     placeFieldAtOffset(CharUnits::Zero());
     Size = std::max(Size, Info.Size);
@@ -2507,11 +2505,13 @@ void MicrosoftRecordLayoutBuilder::layoutBitField(const FieldDecl *FD) {
   if (IsUnion) {
     placeFieldAtOffset(CharUnits::Zero());
     Size = std::max(Size, Info.Size);
+    // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
   } else {
     // Allocate a new block of memory and place the bitfield in it.
     CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
     placeFieldAtOffset(FieldOffset);
     Size = FieldOffset + Info.Size;
+    Alignment = std::max(Alignment, Info.Alignment);
     RemainingBitsInField = Context.toBits(Info.Size) - Width;
   }
 }
@@ -2531,11 +2531,13 @@ MicrosoftRecordLayoutBuilder::layoutZeroWidthBitField(const FieldDecl *FD) {
   if (IsUnion) {
     placeFieldAtOffset(CharUnits::Zero());
     Size = std::max(Size, Info.Size);
+    // TODO: Add a Sema warning that MS ignores bitfield alignment in unions.
   } else {
     // Round up the current record size to the field's alignment boundary.
     CharUnits FieldOffset = Size.RoundUpToAlignment(Info.Alignment);
     placeFieldAtOffset(FieldOffset);
     Size = FieldOffset;
+    Alignment = std::max(Alignment, Info.Alignment);
   }
 }
 
index f2010c162257faf32b380be048a41a072ce7e75c..8444f469d59dff350d14abad2ddc37ba203c9916 100644 (file)
@@ -1,6 +1,6 @@
-// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts %s 2>/dev/null \\r
+// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \\r
 // RUN:            | FileCheck %s\r
-// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts %s 2>/dev/null \\r
+// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts %s 2>/dev/null \\r
 // RUN:            | FileCheck %s\r
 \r
 typedef struct A {\r
@@ -111,6 +111,16 @@ typedef struct H {
 // CHECK:   Alignment:16\r
 // CHECK:   FieldOffsets: [0, 16, 16, 16]>\r
 \r
+typedef struct I {\r
+       short : 8;\r
+       __declspec(align(16)) short : 8;\r
+} I;\r
+\r
+// CHECK: Type: struct I\r
+// CHECK:   Size:16\r
+// CHECK:   Alignment:16\r
+// CHECK:   FieldOffsets: [0, 8]\r
+\r
 #pragma pack(push, 1)\r
 \r
 typedef struct A1 {\r
@@ -221,6 +231,16 @@ typedef struct H1 {
 // CHECK:   Alignment:8\r
 // CHECK:   FieldOffsets: [0, 32, 32, 32]>\r
 \r
+typedef struct I1 {\r
+       short : 8;\r
+       __declspec(align(16)) short : 8;\r
+} I1;\r
+\r
+// CHECK: Type: struct I1\r
+// CHECK:   Size:16\r
+// CHECK:   Alignment:8\r
+// CHECK:   FieldOffsets: [0, 8]\r
+\r
 #pragma pack(pop)\r
 \r
 int x[\r
@@ -232,6 +252,7 @@ sizeof(E ) +
 sizeof(F ) +\r
 sizeof(G ) +\r
 sizeof(H ) +\r
+sizeof(I ) +\r
 sizeof(A1) +\r
 sizeof(B1) +\r
 sizeof(C1) +\r
@@ -240,4 +261,5 @@ sizeof(E1) +
 sizeof(F1) +\r
 sizeof(G1) +\r
 sizeof(H1) +\r
+sizeof(I1) +\r
 0];\r