diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 1ea2be41b3bd3a548c1fcb5846d416cf5dd02ebf..02fbcf0a4ad1ad6071c274cf9c050e5092d39291 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -2091,9 +2091,6 @@ static bool isMsLayout(const RecordDecl* D) { // one. // * The last zero size virtual base may be placed at the end of the struct. // and can potentially alias a zero sized type in the next struct. -// * If the last field is a non-zero length bitfield, all virtual bases will -// have extra padding added before them for no obvious reason. The padding -// has the same number of bits as the type of the bitfield. // * When laying out empty non-virtual bases, an extra byte of padding is added // if the non-virtual base before the empty non-virtual base has a vbptr. // * The ABI attempts to avoid aliasing of zero sized bases by adding padding @@ -2595,10 +2592,6 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) { const CXXRecordDecl *BaseDecl = I.getType()->getAsCXXRecordDecl(); const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(BaseDecl); bool HasVtordisp = HasVtordispSet.count(BaseDecl); - // If the last field we laid out was a non-zero length bitfield then add - // some extra padding for no obvious reason. - if (LastFieldIsNonZeroWidthBitfield) - Size += CurrentBitfieldSize; // Insert padding between two bases if the left first one is zero sized or // contains a zero sized subobject and the right is zero sized or one leads // with a zero sized base. The padding between virtual bases is 4 diff --git a/test/Layout/ms-x86-bitfields-vbases.cpp b/test/Layout/ms-x86-bitfields-vbases.cpp index 7cffa8c8e4ac9fba5eace8f6b1231dd47c8e7a3c..5b54596bbb83c89a4b99a85fb1f971da535b75ca 100644 --- a/test/Layout/ms-x86-bitfields-vbases.cpp +++ b/test/Layout/ms-x86-bitfields-vbases.cpp @@ -13,17 +13,17 @@ struct A : virtual B0 { char a : 1; }; // CHECK-NEXT: 0 | struct A // CHECK-NEXT: 0 | (A vbtable pointer) // CHECK-NEXT: 4 | char a -// CHECK-NEXT: 12 | struct B0 (virtual base) -// CHECK-NEXT: 12 | int a -// CHECK-NEXT: | [sizeof=16, align=4 +// CHECK-NEXT: 8 | struct B0 (virtual base) +// CHECK-NEXT: 8 | int a +// CHECK-NEXT: | [sizeof=12, align=4 // CHECK-NEXT: | nvsize=8, nvalign=4] // CHECK-X64: *** Dumping AST Record Layout // CHECK-X64: *** Dumping AST Record Layout // CHECK-X64-NEXT: 0 | struct A // CHECK-X64-NEXT: 0 | (A vbtable pointer) // CHECK-X64-NEXT: 8 | char a -// CHECK-X64-NEXT: 20 | struct B0 (virtual base) -// CHECK-X64-NEXT: 20 | int a +// CHECK-X64-NEXT: 16 | struct B0 (virtual base) +// CHECK-X64-NEXT: 16 | int a // CHECK-X64-NEXT: | [sizeof=24, align=8 // CHECK-X64-NEXT: | nvsize=16, nvalign=8] @@ -33,16 +33,16 @@ struct B : virtual B0 { short a : 1; }; // CHECK-NEXT: 0 | struct B // CHECK-NEXT: 0 | (B vbtable pointer) // CHECK-NEXT: 4 | short a -// CHECK-NEXT: 12 | struct B0 (virtual base) -// CHECK-NEXT: 12 | int a -// CHECK-NEXT: | [sizeof=16, align=4 +// CHECK-NEXT: 8 | struct B0 (virtual base) +// CHECK-NEXT: 8 | int a +// CHECK-NEXT: | [sizeof=12, align=4 // CHECK-NEXT: | nvsize=8, nvalign=4] // CHECK-X64: *** Dumping AST Record Layout // CHECK-X64-NEXT: 0 | struct B // CHECK-X64-NEXT: 0 | (B vbtable pointer) // CHECK-X64-NEXT: 8 | short a -// CHECK-X64-NEXT: 20 | struct B0 (virtual base) -// CHECK-X64-NEXT: 20 | int a +// CHECK-X64-NEXT: 16 | struct B0 (virtual base) +// CHECK-X64-NEXT: 16 | int a // CHECK-X64-NEXT: | [sizeof=24, align=8 // CHECK-X64-NEXT: | nvsize=16, nvalign=8] @@ -94,22 +94,22 @@ struct E : virtual B0, virtual B1 { long long : 1; }; // CHECK-NEXT: 0 | struct E // CHECK-NEXT: 0 | (E vbtable pointer) // CHECK-NEXT: 8 | long long -// CHECK-NEXT: 24 | struct B0 (virtual base) -// CHECK-NEXT: 24 | int a -// CHECK-NEXT: 36 | struct B1 (virtual base) -// CHECK-NEXT: 36 | int a -// CHECK-NEXT: | [sizeof=40, align=8 +// CHECK-NEXT: 16 | struct B0 (virtual base) +// CHECK-NEXT: 16 | int a +// CHECK-NEXT: 20 | struct B1 (virtual base) +// CHECK-NEXT: 20 | int a +// CHECK-NEXT: | [sizeof=24, align=8 // CHECK-NEXT: | nvsize=16, nvalign=8] // CHECK-X64: *** Dumping AST Record Layout // CHECK-X64: *** Dumping AST Record Layout // CHECK-X64-NEXT: 0 | struct E // CHECK-X64-NEXT: 0 | (E vbtable pointer) // CHECK-X64-NEXT: 8 | long long -// CHECK-X64-NEXT: 24 | struct B0 (virtual base) -// CHECK-X64-NEXT: 24 | int a -// CHECK-X64-NEXT: 36 | struct B1 (virtual base) -// CHECK-X64-NEXT: 36 | int a -// CHECK-X64-NEXT: | [sizeof=40, align=8 +// CHECK-X64-NEXT: 16 | struct B0 (virtual base) +// CHECK-X64-NEXT: 16 | int a +// CHECK-X64-NEXT: 20 | struct B1 (virtual base) +// CHECK-X64-NEXT: 20 | int a +// CHECK-X64-NEXT: | [sizeof=24, align=8 // CHECK-X64-NEXT: | nvsize=16, nvalign=8] int a[ diff --git a/test/Layout/ms-x86-pack-and-align.cpp b/test/Layout/ms-x86-pack-and-align.cpp index 0843b3e0bfe409002b68e32ebdb408841311d07f..be0499c2cbbeb210db446c3d68c2f3c950d8b327 100644 --- a/test/Layout/ms-x86-pack-and-align.cpp +++ b/test/Layout/ms-x86-pack-and-align.cpp @@ -473,7 +473,7 @@ struct RE { // CHECK-NEXT: 0 | struct RB2 // CHECK-NEXT: 0 | (RB2 vbtable pointer) // CHECK-NEXT: 1024 | int b -// CHECK-NEXT: 1032 | struct RA (virtual base) (empty) +// CHECK-NEXT: 1028 | struct RA (virtual base) (empty) // CHECK-NEXT: | [sizeof=1032, align=1024 // CHECK-NEXT: | nvsize=1028, nvalign=1024] // CHECK: *** Dumping AST Record Layout @@ -481,7 +481,7 @@ struct RE { // CHECK-NEXT: 0 | (RB3 vftable pointer) // CHECK-NEXT: 1024 | (RB3 vbtable pointer) // CHECK-NEXT: 2048 | int b -// CHECK-NEXT: 2056 | struct RA (virtual base) (empty) +// CHECK-NEXT: 2052 | struct RA (virtual base) (empty) // CHECK-NEXT: | [sizeof=2056, align=1024 // CHECK-NEXT: | nvsize=2052, nvalign=1024] // CHECK: *** Dumping AST Record Layout @@ -516,7 +516,7 @@ struct RE { // CHECK-X64-NEXT: 0 | struct RB2 // CHECK-X64-NEXT: 0 | (RB2 vbtable pointer) // CHECK-X64-NEXT: 1024 | int b -// CHECK-X64-NEXT: 1032 | struct RA (virtual base) (empty) +// CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty) // CHECK-X64-NEXT: | [sizeof=1032, align=1024 // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] // CHECK-X64: *** Dumping AST Record Layout @@ -524,7 +524,7 @@ struct RE { // CHECK-X64-NEXT: 0 | (RB3 vftable pointer) // CHECK-X64-NEXT: 1024 | (RB3 vbtable pointer) // CHECK-X64-NEXT: 2048 | int b -// CHECK-X64-NEXT: 2056 | struct RA (virtual base) (empty) +// CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty) // CHECK-X64-NEXT: | [sizeof=2056, align=1024 // CHECK-X64-NEXT: | nvsize=2052, nvalign=1024] // CHECK-X64: *** Dumping AST Record Layout