From 23ebdf2beabb80b9a39f1295b843fe6dcbdb0af1 Mon Sep 17 00:00:00 2001 From: Warren Hunt Date: Fri, 11 Apr 2014 23:33:35 +0000 Subject: [PATCH] [MS-ABI] Fixed alias-avoidance padding in the presence of vtordisps If a vtordisp exists between two bases, then there is no need for additional alias avoidance padding. Test case included. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206087 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/RecordLayoutBuilder.cpp | 5 +-- .../Layout/ms-x86-alias-avoidance-padding.cpp | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 73267f70a6..fda374e9a0 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -2620,10 +2620,7 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) { // bytes (in both 32 and 64 bits modes) and always involves rounding up to // the required alignment, we don't know why. if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() && - BaseLayout.leadsWithZeroSizedBase()) - Size = Size.RoundUpToAlignment(VtorDispAlignment) + VtorDispSize; - // Insert the vtordisp. - if (HasVtordisp) + BaseLayout.leadsWithZeroSizedBase() || HasVtordisp) Size = Size.RoundUpToAlignment(VtorDispAlignment) + VtorDispSize; // Insert the virtual base. ElementInfo Info = getAdjustedElementInfo(BaseLayout); diff --git a/test/Layout/ms-x86-alias-avoidance-padding.cpp b/test/Layout/ms-x86-alias-avoidance-padding.cpp index 7a78f8732c..e51bab3871 100644 --- a/test/Layout/ms-x86-alias-avoidance-padding.cpp +++ b/test/Layout/ms-x86-alias-avoidance-padding.cpp @@ -547,7 +547,37 @@ struct RZ8 : RX8, RY {}; // CHECK-X64-NEXT: | [sizeof=16, align=8 // CHECK-X64-NEXT: | nvsize=8, nvalign=8] +struct JA {}; +struct JB {}; +struct JC : JA { virtual void f() {} }; +struct JD : virtual JB, virtual JC { virtual void f() {} JD() {} }; +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct JD +// CHECK-NEXT: 0 | (JD vbtable pointer) +// CHECK-NEXT: 4 | struct JB (virtual base) (empty) +// CHECK-NEXT: 4 | (vtordisp for vbase JC) +// CHECK-NEXT: 8 | struct JC (virtual base) +// CHECK-NEXT: 8 | (JC vftable pointer) +// CHECK-NEXT: 12 | struct JA (base) (empty) +// CHECK-NEXT: | [sizeof=12, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64-NEXT: 0 | struct JD +// CHECK-X64-NEXT: 0 | (JD vbtable pointer) +// CHECK-X64-NEXT: 8 | struct JB (virtual base) (empty) +// CHECK-X64-NEXT: 12 | (vtordisp for vbase JC) +// CHECK-X64-NEXT: 16 | struct JC (virtual base) +// CHECK-X64-NEXT: 16 | (JC vftable pointer) +// CHECK-X64-NEXT: 24 | struct JA (base) (empty) +// CHECK-X64-NEXT: | [sizeof=24, align=8 +// CHECK-X64-NEXT: | nvsize=8, nvalign=8] int a[ sizeof(AT3) + @@ -565,4 +595,5 @@ sizeof(RZ5) + sizeof(RZ6) + sizeof(RZ7) + sizeof(RZ8) + +sizeof(JD) + 0]; -- 2.40.0