r196861 - [ms-abi] 64-bit fixes for r196549
Warren Hunt
whunt at google.com
Mon Dec 9 17:44:39 PST 2013
Author: whunt
Date: Mon Dec 9 19:44:39 2013
New Revision: 196861
URL: http://llvm.org/viewvc/llvm-project?rev=196861&view=rev
Log:
[ms-abi] 64-bit fixes for r196549
In order to address latent bugs that were easier to expose in 64-bit
mode, we move the application of __declspec(align) to before the layout
of vbases rather than after.
Modified:
cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp
cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp
Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Mon Dec 9 19:44:39 2013
@@ -2060,12 +2060,13 @@ public:
/// \brief Lays out a single zero-width bit-field in the record and handles
/// special cases associated with zero-width bit-fields.
void layoutZeroWidthBitField(const FieldDecl *FD);
+ void fixSizeAndAlignment(const RecordDecl *FD);
void layoutVirtualBases(const CXXRecordDecl *RD);
void layoutVirtualBase(const CXXRecordDecl *RD, bool HasVtordisp);
/// \brief Flushes the lazy virtual base and conditionally rounds up to
/// alignment.
void finalizeCXXLayout(const CXXRecordDecl *RD);
- void honorDeclspecAlign(const RecordDecl *RD);
+ void finalizeLayout(const RecordDecl *RD);
/// \brief Updates the alignment of the type. This function doesn't take any
/// properties (such as packedness) into account. getAdjustedFieldInfo()
@@ -2233,7 +2234,8 @@ void MicrosoftRecordLayoutBuilder::initi
void MicrosoftRecordLayoutBuilder::layout(const RecordDecl *RD) {
initializeLayout(RD);
layoutFields(RD);
- honorDeclspecAlign(RD);
+ fixSizeAndAlignment(RD);
+ finalizeLayout(RD);
}
void MicrosoftRecordLayoutBuilder::cxxLayout(const CXXRecordDecl *RD) {
@@ -2243,11 +2245,10 @@ void MicrosoftRecordLayoutBuilder::cxxLa
layoutNonVirtualBases(RD);
layoutVBPtr(RD);
layoutFields(RD);
- DataSize = Size;
- NonVirtualAlignment = Alignment;
+ fixSizeAndAlignment(RD);
layoutVirtualBases(RD);
finalizeCXXLayout(RD);
- honorDeclspecAlign(RD);
+ finalizeLayout(RD);
}
void
@@ -2543,6 +2544,13 @@ MicrosoftRecordLayoutBuilder::layoutZero
}
}
+void MicrosoftRecordLayoutBuilder::fixSizeAndAlignment(const RecordDecl *RD) {
+ DataSize = Size;
+ NonVirtualAlignment = Alignment;
+ RequiredAlignment = std::max(RequiredAlignment,
+ Context.toCharUnitsFromBits(RD->getMaxAlignment()));
+}
+
void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
if (!HasVBPtr)
return;
@@ -2581,8 +2589,9 @@ void MicrosoftRecordLayoutBuilder::layou
// bytes (in both 32 and 64 bits modes), we don't know why.
if (PreviousBaseLayout && PreviousBaseLayout->hasZeroSizedSubObject() &&
Layout.leadsWithZeroSizedBase())
- Size = Size.RoundUpToAlignment(Alignment) +
- std::max(CharUnits::fromQuantity(4), Layout.getAlignment());
+ Size = Size.RoundUpToAlignment(std::max(CharUnits::fromQuantity(4),
+ RequiredAlignment)) +
+ CharUnits::fromQuantity(4);
CharUnits BaseNVSize = Layout.getNonVirtualSize();
CharUnits BaseAlign = getBaseAlignment(Layout);
@@ -2612,9 +2621,7 @@ void MicrosoftRecordLayoutBuilder::final
}
}
-void MicrosoftRecordLayoutBuilder::honorDeclspecAlign(const RecordDecl *RD) {
- RequiredAlignment = std::max(RequiredAlignment,
- Context.toCharUnitsFromBits(RD->getMaxAlignment()));
+void MicrosoftRecordLayoutBuilder::finalizeLayout(const RecordDecl *RD) {
if (!RequiredAlignment.isZero()) {
updateAlignment(RequiredAlignment);
Size = Size.RoundUpToAlignment(Alignment);
Modified: cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-alias-avoidance-padding.cpp Mon Dec 9 19:44:39 2013
@@ -166,9 +166,9 @@ struct __declspec(align(1)) T3 : virtual
// CHECK-X64: 8 | struct T0 (base) (empty)
// CHECK-X64: 8 | struct AT (base) (empty)
// CHECK-X64: 8 | char a
-// CHECK-X64: 20 | struct T2 (virtual base)
-// CHECK-X64: 20 | struct AT (base) (empty)
-// CHECK-X64: 20 | char a
+// CHECK-X64: 16 | struct T2 (virtual base)
+// CHECK-X64: 16 | struct AT (base) (empty)
+// CHECK-X64: 16 | char a
// CHECK-X64: | [sizeof=24, align=8
// CHECK-X64: | nvsize=8, nvalign=8]
Modified: cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp?rev=196861&r1=196860&r2=196861&view=diff
==============================================================================
--- cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp (original)
+++ cfe/trunk/test/Layout/ms-x86-empty-virtual-base.cpp Mon Dec 9 19:44:39 2013
@@ -679,6 +679,31 @@ struct __declspec(align(32)) V : virtual
// CHECK-X64: | [sizeof=32, align=32
// CHECK-X64: | nvsize=16, nvalign=8]
+struct T0 {};
+struct T1 : T0 { char a; };
+struct T3 : virtual T1, virtual T0 { long long a; };
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: 0 | struct T3
+// CHECK: 0 | (T3 vbtable pointer)
+// CHECK: 8 | long long a
+// CHECK: 16 | struct T1 (virtual base)
+// CHECK: 16 | struct T0 (base) (empty)
+// CHECK: 16 | char a
+// CHECK: 24 | struct T0 (virtual base) (empty)
+// CHECK: | [sizeof=24, align=8
+// CHECK: | nvsize=16, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: 0 | struct T3
+// CHECK-X64: 0 | (T3 vbtable pointer)
+// CHECK-X64: 8 | long long a
+// CHECK-X64: 16 | struct T1 (virtual base)
+// CHECK-X64: 16 | struct T0 (base) (empty)
+// CHECK-X64: 16 | char a
+// CHECK-X64: 24 | struct T0 (virtual base) (empty)
+// CHECK-X64: | [sizeof=24, align=8
+// CHECK-X64: | nvsize=16, nvalign=8]
+
int a[
sizeof(A)+
sizeof(B)+
@@ -701,4 +726,5 @@ sizeof(R)+
sizeof(S)+
sizeof(T)+
sizeof(U)+
-sizeof(V)];
\ No newline at end of file
+sizeof(V)+
+sizeof(T3)];
\ No newline at end of file
More information about the cfe-commits
mailing list