summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2013-12-19 00:43:59 +0000
committerWarren Hunt <whunt@google.com>2013-12-19 00:43:59 +0000
commitf037bd1e7c5bcd905c1a5678ddc671cd012ec4d9 (patch)
treee4b8c5779475a49ffb0102531a46d3cd440f29a0 /clang/lib/AST/RecordLayoutBuilder.cpp
parent47f3c64a48ebd5ede62a5e4d06aab8142517a4df (diff)
downloadbcm5719-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.cpp10
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();
OpenPOWER on IntegriCloud