summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2013-12-11 02:21:03 +0000
committerWarren Hunt <whunt@google.com>2013-12-11 02:21:03 +0000
commit1b5184321d217c0854d8085f4646f7d4d1c977aa (patch)
tree584a48b82baf6a076418c15936f8bdf3df816807 /clang/lib/AST/RecordLayoutBuilder.cpp
parentb2fb78d45a3073873c3d64674fdb55bfb40d4ff3 (diff)
downloadbcm5719-llvm-1b5184321d217c0854d8085f4646f7d4d1c977aa.tar.gz
bcm5719-llvm-1b5184321d217c0854d8085f4646f7d4d1c977aa.zip
[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. llvm-svn: 196997
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index a5b07384dc8..112e6d6981d 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -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::initializeCXXLayout(const CXXRecordDecl *RD) {
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::initializeCXXLayout(const CXXRecordDecl *RD) {
HasZeroSizedSubObject = true;
// Handle virtual bases.
if (i->isVirtual()) {
- VirtualAlignment = std::max(VirtualAlignment, getBaseAlignment(Layout));
HasVBPtr = true;
continue;
}
@@ -2555,7 +2551,14 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
if (!HasVBPtr)
return;
- updateAlignment(VirtualAlignment);
+ for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
+ e = RD->vbases_end();
+ i != e; ++i) {
+ const CXXRecordDecl *BaseDecl =
+ cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->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
OpenPOWER on IntegriCloud