summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2013-12-10 01:44:39 +0000
committerWarren Hunt <whunt@google.com>2013-12-10 01:44:39 +0000
commit1603e52700dc7ba0b264be03a8fe882457413dea (patch)
tree5cb8fbcd0ad86ffbce8f35a33ce8069c1cdf027c /clang/lib/AST/RecordLayoutBuilder.cpp
parent78f534d689175a36810d9c37b40491c457724201 (diff)
downloadbcm5719-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.cpp27
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);
OpenPOWER on IntegriCloud