diff options
author | Warren Hunt <whunt@google.com> | 2014-01-09 23:51:31 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2014-01-09 23:51:31 +0000 |
commit | 640015cbc3c371ad196b9252ca85e59436ddf17e (patch) | |
tree | a288d0e15330fa06f9f783079de74e9a51038e3c /clang/lib/AST/RecordLayoutBuilder.cpp | |
parent | a4bb4b9f0ba15f6d5c4e37a5db4f72a6388a6a2f (diff) | |
download | bcm5719-llvm-640015cbc3c371ad196b9252ca85e59436ddf17e.tar.gz bcm5719-llvm-640015cbc3c371ad196b9252ca85e59436ddf17e.zip |
[ms-abi] Fixing CGRecordLayoutBuilder w.r.t. MS NonVirutalBase Layout
The MS abi lays out *all* non-virtual bases with leading vfptrs before
laying out non-virutal bases without vfptrs. This guarantees that the
primary base is laid out first. r198818 fixed RecordLayoutBuilder to
produce compatiable layouts. This patch fixes CGRecordLayoutBuilder to
be able to consume those layouts and produce meaningful output without
tripping any asserts about assumed incoming layout.
A test case is included that shows CGRecordLayoutBuilder in fact
produces output in the compatiable order.
llvm-svn: 198900
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 515088e67bb..ceb49ff0bf2 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2157,7 +2157,7 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo( // Respect required alignment, this is necessary because we may have adjusted // the alignment in the case of pragam pack. Info.Alignment = std::max(Info.Alignment, Layout.getRequiredAlignment()); - Info.Size = Layout.getNonVirtualSize(); + Info.Size = Layout.getDataSize(); return Info; } @@ -2538,17 +2538,17 @@ void MicrosoftRecordLayoutBuilder::injectVPtrs(const CXXRecordDecl *RD) { // different from the general case layout but it may have to do with lazy // placement of zero sized bases. VBPtrOffset = Size; - if (LastBaseLayout && LastBaseLayout->getNonVirtualSize().isZero()) { + if (LastBaseLayout && LastBaseLayout->getDataSize().isZero()) { VBPtrOffset = Bases[LastBaseDecl]; - if (PenultBaseLayout && PenultBaseLayout->getNonVirtualSize().isZero()) + if (PenultBaseLayout && PenultBaseLayout->getDataSize().isZero()) VBPtrOffset = Bases[PenultBaseDecl]; } // Once we've located a spot for the vbptr, place it. VBPtrOffset = VBPtrOffset.RoundUpToAlignment(PointerInfo.Alignment); Size = VBPtrOffset + PointerInfo.Size; - if (LastBaseLayout && LastBaseLayout->getNonVirtualSize().isZero()) { + if (LastBaseLayout && LastBaseLayout->getDataSize().isZero()) { // Add the padding between zero sized bases after the vbptr. - if (PenultBaseLayout && PenultBaseLayout->getNonVirtualSize().isZero()) + if (PenultBaseLayout && PenultBaseLayout->getDataSize().isZero()) Size += CharUnits::One(); Size = Size.RoundUpToAlignment(LastBaseLayout->getRequiredAlignment()); Bases[LastBaseDecl] = Size; @@ -2601,7 +2601,7 @@ void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) { CharUnits BaseOffset = Size.RoundUpToAlignment(Info.Alignment);
VBases.insert(std::make_pair(BaseDecl, ASTRecordLayout::VBaseInfo(BaseOffset, HasVtordisp))); - Size = BaseOffset + BaseLayout.getNonVirtualSize(); + Size = BaseOffset + BaseLayout.getDataSize(); updateAlignment(Info.Alignment); PreviousBaseLayout = &BaseLayout; } |