aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-08-07 19:00:50 +0000
committerMike Stump <mrs@apple.com>2009-08-07 19:00:50 +0000
commit928f1506eb38bb26a1284b876213a8f5244f6933 (patch)
treee01e592706e0b2b68b8b1a09d5c56223cc1fd793 /lib/AST/RecordLayoutBuilder.cpp
parent116b7d9cd0a31b34f32f6c5fe5b799367b70f257 (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.cpp15
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());