r196997 - [ms-abi] Makes Virtual Base Alignment Look at All Virtual Bases

David Majnemer david.majnemer at gmail.com
Tue Dec 10 20:00:52 PST 2013


On Tue, Dec 10, 2013 at 6:21 PM, Warren Hunt <whunt at google.com> wrote:

> Author: whunt
> Date: Tue Dec 10 20:21:03 2013
> New Revision: 196997
>
> URL: http://llvm.org/viewvc/llvm-project?rev=196997&view=rev
> Log:
> [ms-abi] Makes Virtual Base Alignment Look at All Virtual Bases
>
> Prior to this patch, the alignment imposed by virtual bases only
> included direct virtual bases.  This patch fixes it to look at all
> virtual bases.
>
>
> Modified:
>     cfe/trunk/lib/AST/RecordLayoutBuilder.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=196997&r1=196996&r2=196997&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
> +++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Tue Dec 10 20:21:03 2013
> @@ -2125,8 +2125,6 @@ public:
>    /// \brief The alignment of the non-virtual portion of the record layout
>    /// Only used for C++ layouts.
>    CharUnits NonVirtualAlignment;
> -  /// \brief The additional alignment imposed by the virtual bases.
> -  CharUnits VirtualAlignment;
>    /// \brief The primary base class (if one exists).
>    const CXXRecordDecl *PrimaryBase;
>    /// \brief The class we share our vb-pointer with.
> @@ -2265,7 +2263,6 @@ MicrosoftRecordLayoutBuilder::initialize
>    HasExtendableVFPtr = false;
>    SharedVBPtrBase = 0;
>    PrimaryBase = 0;
> -  VirtualAlignment = CharUnits::One();
>    LeadsWithZeroSizedBase = false;
>
>    // If the record has a dynamic base class, attempt to choose a primary
> base
> @@ -2285,7 +2282,6 @@ MicrosoftRecordLayoutBuilder::initialize
>        HasZeroSizedSubObject = true;
>      // Handle virtual bases.
>      if (i->isVirtual()) {
> -      VirtualAlignment = std::max(VirtualAlignment,
> getBaseAlignment(Layout));
>        HasVBPtr = true;
>        continue;
>      }
> @@ -2555,7 +2551,14 @@ void MicrosoftRecordLayoutBuilder::layou
>    if (!HasVBPtr)
>      return;
>
> -  updateAlignment(VirtualAlignment);
> +  for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
> +                                                e = RD->vbases_end();
> +       i != e; ++i) {
>

I'd make 'i' and 'e' capital seeing as how they are actually class types.


> +    const CXXRecordDecl *BaseDecl =
> +        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
>

I think this could be I->getType->getAsCXXRecordDecl()->getDecl()


> +    const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl);
> +    updateAlignment(getBaseAlignment(Layout));
> +  }
>    PreviousBaseLayout = 0;
>
>    // Zero-sized v-bases obey the alignment attribute so apply it here.
>  The
>
> 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=196997&r1=196996&r2=196997&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp (original)
> +++ cfe/trunk/test/Layout/ms-x86-pack-and-align.cpp Tue Dec 10 20:21:03
> 2013
> @@ -114,7 +114,32 @@ struct Z : virtual B {
>
>  #pragma pack(pop)
>
> +struct A1 { long long a; };
> +#pragma pack(push, 1)
> +struct B1 : virtual A1 { char a; };
> +#pragma pack(pop)
> +struct C1 : B1 {};
> +// CHECK: *** Dumping AST Record Layout
> +// CHECK:    0 | struct C1
> +// CHECK:    0 |   struct B1 (base)
> +// CHECK:    0 |     (B1 vbtable pointer)
> +// CHECK:    4 |     char a
> +// CHECK:    8 |   struct A1 (virtual base)
> +// CHECK:    8 |     long long a
> +// CHECK:      | [sizeof=16, align=8
> +// CHECK:      |  nvsize=5, nvalign=1]
> +// CHECK-X64: *** Dumping AST Record Layout
> +// CHECK-X64:    0 | struct C1
> +// CHECK-X64:    0 |   struct B1 (base)
> +// CHECK-X64:    0 |     (B1 vbtable pointer)
> +// CHECK-X64:    8 |     char a
> +// CHECK-X64:   16 |   struct A1 (virtual base)
> +// CHECK-X64:   16 |     long long a
> +// CHECK-X64:      | [sizeof=24, align=8
> +// CHECK-X64:      |  nvsize=9, nvalign=1]
> +
>  int a[
>  sizeof(X)+
>  sizeof(Y)+
> -sizeof(Z)];
> +sizeof(Z)+
> +sizeof(C1)];
>
>
> _______________________________________________
> 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/20131210/3d8689d2/attachment.html>


More information about the cfe-commits mailing list