diff options
author | Warren Hunt <whunt@google.com> | 2013-12-19 00:43:59 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2013-12-19 00:43:59 +0000 |
commit | f037bd1e7c5bcd905c1a5678ddc671cd012ec4d9 (patch) | |
tree | e4b8c5779475a49ffb0102531a46d3cd440f29a0 /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | 47f3c64a48ebd5ede62a5e4d06aab8142517a4df (diff) | |
download | bcm5719-llvm-f037bd1e7c5bcd905c1a5678ddc671cd012ec4d9.tar.gz bcm5719-llvm-f037bd1e7c5bcd905c1a5678ddc671cd012ec4d9.zip |
[ms-abi] Update Alignment for VtorDisps
The alignment impact of the virtual bases apperas to be applied in
order, rather than up front. This patch adds the new behavior and
provides a test case.
llvm-svn: 197639
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 10 |
1 files changed, 2 insertions, 8 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index d81fb00466f..74010ce7aa0 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2525,14 +2525,6 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) { if (!HasVBPtr) return; - // Update the alignment - for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(), - e = RD->vbases_end(); - i != e; ++i) { - const CXXRecordDecl *BaseDecl = i->getType()->getAsCXXRecordDecl(); - const ASTRecordLayout &Layout = Context.getASTRecordLayout(BaseDecl); - updateAlignment(getBaseAlignment(Layout)); - } PreviousBaseLayout = 0; llvm::SmallPtrSet<const CXXRecordDecl *, 2> HasVtordisp = @@ -2569,6 +2561,8 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBase(const CXXRecordDecl *RD, // Insert the base here. Size = Size.RoundUpToAlignment(getBaseAlignment(Layout)); + // Update the alignment + updateAlignment(getBaseAlignment(Layout)); VBases.insert( std::make_pair(RD, ASTRecordLayout::VBaseInfo(Size, HasVtordisp))); Size += Layout.getNonVirtualSize(); |