summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/RecordLayout.cpp4
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp23
2 files changed, 15 insertions, 12 deletions
diff --git a/clang/lib/AST/RecordLayout.cpp b/clang/lib/AST/RecordLayout.cpp
index df5f79c9614..71e44ecf921 100644
--- a/clang/lib/AST/RecordLayout.cpp
+++ b/clang/lib/AST/RecordLayout.cpp
@@ -43,7 +43,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, CharUnits size,
// Constructor for C++ records.
ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
CharUnits size, CharUnits alignment,
- bool hasOwnVFPtr, bool hasVFPtr,
+ bool hasOwnVFPtr, bool hasExtendableVFPtr,
CharUnits vbptroffset,
CharUnits datasize,
const uint64_t *fieldoffsets,
@@ -74,7 +74,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
CXXInfo->VBaseOffsets = VBaseOffsets;
CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
CXXInfo->VBPtrOffset = vbptroffset;
- CXXInfo->HasVFPtr = hasVFPtr;
+ CXXInfo->HasExtendableVFPtr = hasExtendableVFPtr;
CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
CXXInfo->AlignAfterVBases = AlignAfterVBases;
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index d0426fa8dbf..524c3ba254d 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -2118,8 +2118,10 @@ public:
const CXXRecordDecl *PrimaryBase;
/// \brief The class we share our vb-pointer with.
const CXXRecordDecl *SharedVBPtrBase;
- /// \brief True if the class has a (not necessarily its own) vftable pointer.
- bool HasVFPtr : 1;
+ /// \brief True if the class has a vftable pointer that can be extended
+ /// by this class or classes derived from it. Such a vfptr will always occur
+ /// at offset 0.
+ bool HasExtendableVFPtr : 1;
/// \brief True if the class has a (not necessarily its own) vbtable pointer.
bool HasVBPtr : 1;
/// \brief Offset to the virtual base table pointer (if one exists).
@@ -2226,7 +2228,7 @@ MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {
// Initialize information about the bases.
HasVBPtr = false;
- HasVFPtr = false;
+ HasExtendableVFPtr = false;
SharedVBPtrBase = 0;
PrimaryBase = 0;
VirtualAlignment = CharUnits::One();
@@ -2251,9 +2253,9 @@ MicrosoftRecordLayoutBuilder::initializeCXXLayout(const CXXRecordDecl *RD) {
continue;
}
// We located a primary base class!
- if (!PrimaryBase && Layout.hasVFPtr()) {
+ if (!PrimaryBase && Layout.hasExtendableVFPtr()) {
PrimaryBase = BaseDecl;
- HasVFPtr = true;
+ HasExtendableVFPtr = true;
}
// We located a base to share a VBPtr with!
if (!SharedVBPtrBase && Layout.hasVBPtr()) {
@@ -2279,12 +2281,12 @@ void MicrosoftRecordLayoutBuilder::layoutVFPtr(const CXXRecordDecl *RD) {
// Look at all of our methods to determine if we need a VFPtr. We need a
// vfptr if we define a new virtual function.
- if (!HasVFPtr && RD->isDynamicClass())
+ if (!HasExtendableVFPtr && RD->isDynamicClass())
for (CXXRecordDecl::method_iterator i = RD->method_begin(),
e = RD->method_end();
- !HasVFPtr && i != e; ++i)
- HasVFPtr = i->isVirtual() && i->size_overridden_methods() == 0;
- if (!HasVFPtr)
+ !HasExtendableVFPtr && i != e; ++i)
+ HasExtendableVFPtr = i->isVirtual() && i->size_overridden_methods() == 0;
+ if (!HasExtendableVFPtr)
return;
// MSVC 32 (but not 64) potentially over-aligns the vf-table pointer by giving
@@ -2672,7 +2674,8 @@ ASTContext::BuildMicrosoftASTRecordLayout(const RecordDecl *D) const {
Builder.cxxLayout(RD);
return new (*this) ASTRecordLayout(
*this, Builder.Size, Builder.Alignment,
- Builder.HasVFPtr && !Builder.PrimaryBase, Builder.HasVFPtr,
+ Builder.HasExtendableVFPtr && !Builder.PrimaryBase,
+ Builder.HasExtendableVFPtr,
Builder.VBPtrOffset, Builder.DataSize, Builder.FieldOffsets.data(),
Builder.FieldOffsets.size(), Builder.DataSize,
Builder.NonVirtualAlignment, CharUnits::Zero(), Builder.PrimaryBase,
OpenPOWER on IntegriCloud