diff options
| -rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 7 | ||||
| -rw-r--r-- | clang/test/Layout/ms-x86-bitfields-vbases.cpp | 40 | ||||
| -rw-r--r-- | clang/test/Layout/ms-x86-pack-and-align.cpp | 8 | 
3 files changed, 24 insertions, 31 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 1ea2be41b3b..02fbcf0a4ad 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/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/clang/test/Layout/ms-x86-bitfields-vbases.cpp b/clang/test/Layout/ms-x86-bitfields-vbases.cpp index 7cffa8c8e4a..5b54596bbb8 100644 --- a/clang/test/Layout/ms-x86-bitfields-vbases.cpp +++ b/clang/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/clang/test/Layout/ms-x86-pack-and-align.cpp b/clang/test/Layout/ms-x86-pack-and-align.cpp index 0843b3e0bfe..be0499c2cbb 100644 --- a/clang/test/Layout/ms-x86-pack-and-align.cpp +++ b/clang/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  | 

