]> granicus.if.org Git - clang/commitdiff
Use a PointerIntPair for the PrimaryBaseInfo. Yay for clever LLVM data structures!
authorAnders Carlsson <andersca@mac.com>
Fri, 27 Nov 2009 22:14:40 +0000 (22:14 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 27 Nov 2009 22:14:40 +0000 (22:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90020 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/RecordLayout.h
lib/AST/RecordLayoutBuilder.cpp

index c34a27e18f52c8ad6e2b1c9e3538b7257c1eafde..93ca2799bca0802047ddb598bf2c112de40e004e 100644 (file)
@@ -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.
index af270577bc6c1a1e335568e159ba19776f4c47f5..d104e3a769009e09a1c34aa41df12692fac6a50d 100644 (file)
@@ -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