diff options
author | Warren Hunt <whunt@google.com> | 2013-12-10 01:44:39 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2013-12-10 01:44:39 +0000 |
commit | 1603e52700dc7ba0b264be03a8fe882457413dea (patch) | |
tree | 5cb8fbcd0ad86ffbce8f35a33ce8069c1cdf027c /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | 78f534d689175a36810d9c37b40491c457724201 (diff) | |
download | bcm5719-llvm-1603e52700dc7ba0b264be03a8fe882457413dea.tar.gz bcm5719-llvm-1603e52700dc7ba0b264be03a8fe882457413dea.zip |
[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.
llvm-svn: 196861
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index a3ea6b9f386..a5b07384dc8 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -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::initializeLayout(const RecordDecl *RD) { 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::cxxLayout(const CXXRecordDecl *RD) { 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::layoutZeroWidthBitField(const FieldDecl *FD) { } } +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::layoutVirtualBase(const CXXRecordDecl *RD, // 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::finalizeCXXLayout(const CXXRecordDecl *RD) { } } -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); |