diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-27 22:14:40 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-27 22:14:40 +0000 |
commit | 261fba6cf57a09a1f1d0c4a4c4856aaa62753242 (patch) | |
tree | 71d61b5fec015293bf9f397346a35c97b8ca5d67 | |
parent | ce2009ab2f59894dbcc847e25e05abe78c296e95 (diff) |
Use a PointerIntPair for the PrimaryBaseInfo. Yay for clever LLVM data structures!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90020 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/RecordLayout.h | 20 | ||||
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 25 |
2 files changed, 25 insertions, 20 deletions
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h index c34a27e18f..93ca2799bc 100644 --- a/include/clang/AST/RecordLayout.h +++ b/include/clang/AST/RecordLayout.h @@ -50,16 +50,20 @@ class ASTRecordLayout { public: /// PrimaryBaseInfo - Contains info about a primary base. struct PrimaryBaseInfo { - PrimaryBaseInfo() : Base(0), IsVirtual(false) {} + PrimaryBaseInfo() {} PrimaryBaseInfo(const CXXRecordDecl *Base, bool IsVirtual) - : Base(Base), IsVirtual(IsVirtual) {} + : Value(Base, IsVirtual) {} - /// Base - The primary base. - const CXXRecordDecl *Base; + /// Value - Points to the primary base. The single-bit value + /// will be non-zero when the primary base is virtual. + llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> Value; + + /// getBase - Returns the primary base. + const CXXRecordDecl *getBase() const { return Value.getPointer(); } - /// IsVirtual - Whether the primary base is virtual or not. - bool IsVirtual; + /// isVirtual - Returns whether the primary base is virtual or not. + bool isVirtual() const { return Value.getInt(); } }; private: @@ -185,12 +189,12 @@ public: // FIXME: Migrate off of this function and use getPrimaryBaseInfo directly. const CXXRecordDecl *getPrimaryBase() const { - return getPrimaryBaseInfo().Base; + return getPrimaryBaseInfo().getBase(); } // FIXME: Migrate off of this function and use getPrimaryBaseInfo directly. bool getPrimaryBaseWasVirtual() const { - return getPrimaryBaseInfo().IsVirtual; + return getPrimaryBaseInfo().isVirtual(); } /// getBaseClassOffset - Get the offset, in bits, for the given base class. diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index af270577bc..d104e3a769 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -33,7 +33,7 @@ void ASTRecordLayoutBuilder::LayoutVtable(const CXXRecordDecl *RD) { } SelectPrimaryBase(RD); - if (!PrimaryBase.Base) { + if (!PrimaryBase.getBase()) { int AS = 0; UpdateAlignment(Ctx.Target.getPointerAlign(AS)); Size += Ctx.Target.getPointerWidth(AS); @@ -51,7 +51,7 @@ ASTRecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) { const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); // Skip the PrimaryBase here, as it is laid down first. - if (Base != PrimaryBase.Base || PrimaryBase.IsVirtual) + if (Base != PrimaryBase.getBase() || PrimaryBase.isVirtual()) LayoutBaseNonVirtually(Base, false); } } @@ -78,8 +78,8 @@ void ASTRecordLayoutBuilder::IdentifyPrimaryBases(const CXXRecordDecl *RD) { // If the record has a primary base class that is virtual, add it to the set // of primary bases. - if (BaseInfo.IsVirtual) - IndirectPrimaryBases.insert(BaseInfo.Base); + if (BaseInfo.isVirtual()) + IndirectPrimaryBases.insert(BaseInfo.getBase()); // Now traverse all bases and find primary bases for them. for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(), @@ -107,7 +107,7 @@ ASTRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD, cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); if (!i->isVirtual()) { SelectPrimaryVBase(Base, FirstPrimary); - if (PrimaryBase.Base) + if (PrimaryBase.getBase()) return; continue; } @@ -169,7 +169,7 @@ void ASTRecordLayoutBuilder::SelectPrimaryBase(const CXXRecordDecl *RD) { // Otherwise if is the first nearly empty virtual base, if one exists, // otherwise there is no primary base class. - if (!PrimaryBase.Base) + if (!PrimaryBase.getBase()) setPrimaryBase(FirstPrimary, /*IsVirtual=*/true); } @@ -236,7 +236,7 @@ void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *Class, if (Base->getNumVBases()) { const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(Base); - const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().Base; + const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBaseInfo().getBase(); LayoutVirtualBases(Class, Base, PrimaryBase, BaseOffset, mark, IndirectPrimary); } @@ -459,10 +459,10 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { if (RD) { LayoutVtable(RD); // PrimaryBase goes first. - if (PrimaryBase.Base) { - if (PrimaryBase.IsVirtual) - IndirectPrimaryBases.insert(PrimaryBase.Base); - LayoutBaseNonVirtually(PrimaryBase.Base, PrimaryBase.IsVirtual); + if (PrimaryBase.getBase()) { + if (PrimaryBase.isVirtual()) + IndirectPrimaryBases.insert(PrimaryBase.getBase()); + LayoutBaseNonVirtually(PrimaryBase.getBase(), PrimaryBase.isVirtual()); } LayoutNonVirtualBases(RD); } @@ -474,7 +474,8 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) { if (RD) { llvm::SmallSet<const CXXRecordDecl*, 32> mark; - LayoutVirtualBases(RD, RD, PrimaryBase.Base, 0, mark, IndirectPrimaryBases); + LayoutVirtualBases(RD, RD, PrimaryBase.getBase(), + 0, mark, IndirectPrimaryBases); } // Finally, round the size of the total struct up to the alignment of the |