diff options
author | Mike Stump <mrs@apple.com> | 2009-08-06 00:38:46 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-08-06 00:38:46 +0000 |
commit | 2509480813c5e1bc3c0a471f982f697db9d4c0ee (patch) | |
tree | ec29a14a2393c8b73b0f52fe493162dac2ab762c /clang/lib | |
parent | 3389c2f7d0c59c33a0bd4b51c723a085509a547b (diff) | |
download | bcm5719-llvm-2509480813c5e1bc3c0a471f982f697db9d4c0ee.tar.gz bcm5719-llvm-2509480813c5e1bc3c0a471f982f697db9d4c0ee.zip |
Fixup object layout when we have a primary base (it goes first). Start preping for
virtual base layout.
llvm-svn: 78265
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 10295f18835..3131fdb852c 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -25,10 +25,14 @@ ASTRecordLayoutBuilder::ASTRecordLayoutBuilder(ASTContext &Ctx) : Ctx(Ctx), Size(0), Alignment(8), StructPacking(0), NextOffset(0), IsUnion(false), NonVirtualSize(0), NonVirtualAlignment(8) {} +/// LayoutVtable - Lay out the vtable and set PrimaryBase. void ASTRecordLayoutBuilder::LayoutVtable(const CXXRecordDecl *RD) { // FIXME: audit indirect virtual bases - if (!RD->isPolymorphic() && !RD->getNumVBases()) + if (!RD->isPolymorphic() && !RD->getNumVBases()) { + // There is no primary base in this case. + setPrimaryBase(0); return; + } SelectPrimaryBase(RD); if (PrimaryBase == 0) { @@ -46,7 +50,9 @@ ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) { if (!i->isVirtual()) { const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - LayoutNonVirtualBase(Base); + // Skip the PrimaryBase here, as it is laid down first. + if (Base != PrimaryBase) + LayoutNonVirtualBase(Base); } } } @@ -186,12 +192,10 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { // If this is a C++ class, lay out the nonvirtual bases. if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { LayoutVtable(RD); + // PrimaryBase goes first. + if (PrimaryBase) + LayoutNonVirtualBase(PrimaryBase); LayoutNonVirtualBases(RD); - - // FIXME: audit indirect virtual bases - assert (RD->getNumVBases() == 0 - && "FIXME: We don't support virtual bases yet!"); - // FIXME: We need to layout the virtual bases in the complete object layout. } LayoutFields(D); |