summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-10 23:32:32 +0000
committerWarren Hunt <whunt@google.com>2014-01-10 23:32:32 +0000
commit87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51 (patch)
tree90b7422ab1b650eeccfbafb01902d6c628532de0 /clang/lib/AST/RecordLayoutBuilder.cpp
parentb8912b4f28393cef48d149ccd1b5ea5be09a13bf (diff)
downloadbcm5719-llvm-87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51.tar.gz
bcm5719-llvm-87c2b0400d0675ad68d7e3d5b4e7e81508ba3c51.zip
[ms-abi] Adjusting Rules for Padding Between Bases
The presence of a VBPtr suppresses the presence of zero sized sub-objects in the non-virtual portion of the object in the context of determining if two base objects need alias-avoidance padding placed between them. Test cases included. llvm-svn: 198975
Diffstat (limited to 'clang/lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index 30293c27c17..6a708a7e8d7 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2477,6 +2477,9 @@ void MicrosoftRecordLayoutBuilder::injectVBPtr(const CXXRecordDecl *RD) {
i->second += Offset;
// Update the object alignment.
updateAlignment(PointerInfo.Alignment);
+ // The presence of a vbptr suppresses zero sized objects that are not in
+ // virtual bases.
+ HasZeroSizedSubObject = false;
}
void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) {
@@ -2566,6 +2569,9 @@ void MicrosoftRecordLayoutBuilder::injectVPtrs(const CXXRecordDecl *RD) {
}
}
layoutFields(RD);
+ // The presence of a vbptr suppresses zero sized objects that are not in
+ // virtual bases.
+ HasZeroSizedSubObject = false;
}
void MicrosoftRecordLayoutBuilder::layoutVirtualBases(const CXXRecordDecl *RD) {
OpenPOWER on IntegriCloud