r194115 - Microsoft adds weird padding before virtual bases if the last field was a bitfield

Alp Toker alp at nuanti.com
Tue Nov 5 17:41:40 PST 2013


Hello Warren,

Could you check your CRLF settings? Your commit added mixed line endings
to test/Layout/ms-x86-bitfields-vbases.cpp.

Also maybe it's worth adding a TODO to investigate this further, weird
padding might indicate something is misaligned or missing in the base
layout.

Alp.

On 06/11/2013 00:55, Warren Hunt wrote:
> Author: whunt
> Date: Tue Nov  5 18:54:59 2013
> New Revision: 194115
>
> URL: http://llvm.org/viewvc/llvm-project?rev=194115&view=rev
> Log:
> Microsoft adds weird padding before virtual bases if the last field was a bitfield
>
> This patch adds the same behavior to clang.
>
> Differential Revision: http://llvm-reviews.chandlerc.com/D2103
>
>
> Added:
>     cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp
> Modified:
>     cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
>
> Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=194115&r1=194114&r2=194115&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Tue Nov  5 18:54:59 2013
> @@ -2014,6 +2014,10 @@ 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 and we have any virtual
> +//   bases then some extra padding is added before the virtual bases for no
> +//   obvious reason.
> +
>  
>  namespace {
>  struct MicrosoftRecordLayoutBuilder {
> @@ -2499,6 +2503,11 @@ void MicrosoftRecordLayoutBuilder::layou
>    llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordisp =
>        computeVtorDispSet(RD);
>  
> +  // 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;
> +
>    // Iterate through the virtual bases and lay them out.
>    for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
>                                                  e = RD->vbases_end();
>
> Added: 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=194115&view=auto
> ==============================================================================
> --- cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp (added)
> +++ cfe/trunk/test/Layout/ms-x86-bitfields-vbases.cpp Tue Nov  5 18:54:59 2013
> @@ -0,0 +1,84 @@
> +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \
> +// RUN:            | FileCheck %s
> +// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
> +// RUN:            | FileCheck %s -check-prefix CHECK-X64
> +
> +struct B0 { };
> +
> +struct A : virtual B0 { char a : 1; };
> +
> +// CHECK: *** Dumping AST Record Layout
> +// CHECK:    0 | struct A
> +// CHECK:    0 |   (A vbtable pointer)
> +// CHECK:    4 |   char a
> +// CHECK:    9 |   struct B0 (virtual base) (empty)
> +// CHECK:      | [sizeof=9, align=4
> +// CHECK:      |  nvsize=8, nvalign=4]
> +// CHECK-X64: *** Dumping AST Record Layout
> +// CHECK-X64:    0 | struct A
> +// CHECK-X64:    0 |   (A vbtable pointer)
> +// CHECK-X64:    8 |   char a
> +// CHECK-X64:   17 |   struct B0 (virtual base) (empty)
> +// CHECK-X64:      | [sizeof=24, align=8
> +// CHECK-X64:      |  nvsize=16, nvalign=8]
> +
> +struct B : virtual B0 { short a : 1; };
> +
> +// CHECK: *** Dumping AST Record Layout
> +// CHECK:    0 | struct B
> +// CHECK:    0 |   (B vbtable pointer)
> +// CHECK:    4 |   short a
> +// CHECK:   10 |   struct B0 (virtual base) (empty)
> +// CHECK:      | [sizeof=10, align=4
> +// CHECK:      |  nvsize=8, nvalign=4]
> +// CHECK-X64: *** Dumping AST Record Layout
> +// CHECK-X64:    0 | struct B
> +// CHECK-X64:    0 |   (B vbtable pointer)
> +// CHECK-X64:    8 |   short a
> +// CHECK-X64:   18 |   struct B0 (virtual base) (empty)
> +// CHECK-X64:      | [sizeof=24, align=8
> +// CHECK-X64:      |  nvsize=16, nvalign=8]
> +
> +struct C : virtual B0 { char a : 1; char : 0; };
> +
> +// CHECK: *** Dumping AST Record Layout
> +// CHECK:    0 | struct C
> +// CHECK:    0 |   (C vbtable pointer)
> +// CHECK:    4 |   char a
> +// CHECK:    5 |   char
> +// CHECK:    8 |   struct B0 (virtual base) (empty)
> +// CHECK:      | [sizeof=8, align=4
> +// CHECK:      |  nvsize=8, nvalign=4]
> +// CHECK-X64: *** Dumping AST Record Layout
> +// CHECK-X64:    0 | struct C
> +// CHECK-X64:    0 |   (C vbtable pointer)
> +// CHECK-X64:    8 |   char a
> +// CHECK-X64:    9 |   char
> +// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
> +// CHECK-X64:      | [sizeof=16, align=8
> +// CHECK-X64:      |  nvsize=16, nvalign=8]
> +
> +struct D : virtual B0 { char a : 1; char b; };
> +
> +// CHECK: *** Dumping AST Record Layout
> +// CHECK:    0 | struct D
> +// CHECK:    0 |   (D vbtable pointer)
> +// CHECK:    4 |   char a
> +// CHECK:    5 |   char b
> +// CHECK:    8 |   struct B0 (virtual base) (empty)
> +// CHECK:      | [sizeof=8, align=4
> +// CHECK:      |  nvsize=8, nvalign=4]
> +// CHECK-X64: *** Dumping AST Record Layout
> +// CHECK-X64:    0 | struct D
> +// CHECK-X64:    0 |   (D vbtable pointer)
> +// CHECK-X64:    8 |   char a
> +// CHECK-X64:    9 |   char b
> +// CHECK-X64:   16 |   struct B0 (virtual base) (empty)
> +// CHECK-X64:      | [sizeof=16, align=8
> +// CHECK-X64:      |  nvsize=16, nvalign=8]
> +
> +int a[
> +sizeof(A)+
> +sizeof(B)+
> +sizeof(C)+
> +sizeof(D)];
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-- 
http://www.nuanti.com
the browser experts




More information about the cfe-commits mailing list