summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-09 23:51:31 +0000
committerWarren Hunt <whunt@google.com>2014-01-09 23:51:31 +0000
commit640015cbc3c371ad196b9252ca85e59436ddf17e (patch)
treea288d0e15330fa06f9f783079de74e9a51038e3c /clang/lib/AST/RecordLayoutBuilder.cpp
parenta4bb4b9f0ba15f6d5c4e37a5db4f72a6388a6a2f (diff)
downloadbcm5719-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.cpp12
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;
}
OpenPOWER on IntegriCloud