r206004 - [MS-ABI] Update virtual base padding rules to match MSVC 10+

Nico Weber thakis at chromium.org
Thu Apr 10 17:36:07 PDT 2014


Should clang warn if this codepath is taken and -fmsc-version is VS2010?


On Thu, Apr 10, 2014 at 5:14 PM, Warren Hunt <whunt at google.com> wrote:

> Author: whunt
> Date: Thu Apr 10 19:14:09 2014
> New Revision: 206004
>
> URL: http://llvm.org/viewvc/llvm-project?rev=206004&view=rev
> Log:
> [MS-ABI] Update virtual base padding rules to match MSVC 10+
> In version 9 (VS2010) (and prior)? versions of msvc, if the last field
> in a record was a bitfield padding equal to the size of the storage
> class of that bitfield was added before each vbase and vtordisp.  This
> patch removes that feature from clang and updates the lit tests to
> reflect it.
>
>
> Modified:
>     cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
>     cfe/trunk/test/Layout/ms-x86-bitfields-vbases.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=206004&r1=206003&r2=206004&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Thu Apr 10 19:14:09 2014
> @@ -2091,9 +2091,6 @@ static bool isMsLayout(const RecordDecl*
>  //   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::layou
>      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
>
> Modified: cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp?rev=206004&r1=206003&r2=206004&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp (original)
> +++ cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp Thu Apr 10 19:14:09
> 2014
> @@ -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
>  // 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[
>
> 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=206004&r1=206003&r2=206004&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp (original)
> +++ cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp Thu Apr 10 19:14:09
> 2014
> @@ -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
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140410/1c67870b/attachment.html>


More information about the cfe-commits mailing list