diff options
author | Mike Stump <mrs@apple.com> | 2009-08-07 19:00:50 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-07 19:00:50 +0000 |
commit | 928f1506eb38bb26a1284b876213a8f5244f6933 (patch) | |
tree | e01e592706e0b2b68b8b1a09d5c56223cc1fd793 /lib/AST/RecordLayoutBuilder.cpp | |
parent | 116b7d9cd0a31b34f32f6c5fe5b799367b70f257 (diff) |
Add ability to generate vcall offsets for primary virtual base.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78396 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 5f23a8ca46..1d96c1a20b 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -30,7 +30,7 @@ void ASTRecordLayoutBuilder::LayoutVtable(const CXXRecordDecl *RD) { // FIXME: audit indirect virtual bases if (!RD->isPolymorphic() && !RD->getNumVBases()) { // There is no primary base in this case. - setPrimaryBase(0); + setPrimaryBase(0, false); return; } @@ -103,7 +103,7 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); if (Base->isDynamicClass()) { - setPrimaryBase(Base); + setPrimaryBase(Base, false); return; } } @@ -116,7 +116,7 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { // is expensive. // FIXME: audit indirect virtual bases if (RD->getNumVBases() == 0) { - setPrimaryBase(0); + setPrimaryBase(0, false); return; } @@ -143,15 +143,15 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { if (FirstPrimary==0) FirstPrimary = Base; if (!IndirectPrimary.count(Base)) { - setPrimaryBase(Base); + setPrimaryBase(Base, true); return; } } } - // Otherwise if is the first nearly empty base, if one exists, otherwise - // there is no primary base class. - setPrimaryBase(FirstPrimary); + // Otherwise if is the first nearly empty virtual base, if one exists, + // otherwise there is no primary base class. + setPrimaryBase(FirstPrimary, true); return; } @@ -404,6 +404,7 @@ ASTRecordLayoutBuilder::ComputeLayout(ASTContext &Ctx, NonVirtualSize, Builder.NonVirtualAlignment, Builder.PrimaryBase, + Builder.PrimaryBaseWasVirtual, Builder.Bases.data(), Builder.BaseOffsets.data(), Builder.Bases.size()); |