]> granicus.if.org Git - clang/commitdiff
Prep for vbase layout refinements. WIP.
authorMike Stump <mrs@apple.com>
Thu, 13 Aug 2009 02:02:14 +0000 (02:02 +0000)
committerMike Stump <mrs@apple.com>
Thu, 13 Aug 2009 02:02:14 +0000 (02:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78882 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
lib/AST/RecordLayoutBuilder.h
lib/CodeGen/CGCXX.cpp

index 0b56d774281b52218eceb05f2a71ecfa11e02757..bd994143087ca3e4d7cfa34361030f78130d250f 100644 (file)
@@ -167,13 +167,14 @@ void ASTRecordLayoutBuilder::LayoutVirtualBase(const CXXRecordDecl *RD) {
   LayoutBaseNonVirtually(RD);
 }
 
-void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD) {
-  // FIXME: audit indirect virtual bases
+void ASTRecordLayoutBuilder::LayoutVirtualBases(const CXXRecordDecl *RD,
+                    llvm::SmallSet<const CXXRecordDecl*, 32> &IndirectPrimary) {
+  // FIXME: Though complete, this is the wrong order
   for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
          e = RD->vbases_end(); i != e; ++i) {
     const CXXRecordDecl *Base = 
       cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-    if (!PrimaryBaseWasVirtual || Base != PrimaryBase)
+    if (!IndirectPrimary.count(Base))
       LayoutVirtualBase(Base);
   }
 }
@@ -215,13 +216,20 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) {
   if (const AlignedAttr *AA = D->getAttr<AlignedAttr>())
     UpdateAlignment(AA->getAlignment());
 
+  // FIXME: Calculate this completely.
+  llvm::SmallSet<const CXXRecordDecl*, 32> IndirectPrimary;
+
   // If this is a C++ class, lay out the nonvirtual bases.
   const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D);
   if (RD) {
     LayoutVtable(RD);
     // PrimaryBase goes first.
-    if (PrimaryBase)
+    if (PrimaryBase) {
+      // FIXME: We need all the primaries.
+      if (PrimaryBaseWasVirtual)
+        IndirectPrimary.insert(PrimaryBase);
       LayoutBaseNonVirtually(PrimaryBase);
+    }
     LayoutNonVirtualBases(RD);
   }
 
@@ -231,7 +239,7 @@ void ASTRecordLayoutBuilder::Layout(const RecordDecl *D) {
   NonVirtualAlignment = Alignment;
 
   if (RD)
-    LayoutVirtualBases(RD);
+    LayoutVirtualBases(RD, IndirectPrimary);
 
   // Finally, round the size of the total struct up to the alignment of the
   // struct itself.
index 31bbdd7530302fb01dec96ca61193be4b97d6396..05944ece7da4d63d4ae4f91e67640dc5f7dd7e0d 100644 (file)
@@ -68,7 +68,8 @@ class ASTRecordLayoutBuilder {
   void LayoutNonVirtualBases(const CXXRecordDecl *RD);
   void LayoutBaseNonVirtually(const CXXRecordDecl *RD);
   void LayoutVirtualBase(const CXXRecordDecl *RD);
-  void LayoutVirtualBases(const CXXRecordDecl *RD);
+  void LayoutVirtualBases(const CXXRecordDecl *RD,
+                     llvm::SmallSet<const CXXRecordDecl*, 32> &IndirectPrimary);
   
   /// FinishLayout - Finalize record layout. Adjust record size based on the
   /// alignment.
index 4148d7b717a5361d0da9c1ef09e6b88c51a28272..9146206589ae7502270ecacaaeeccdbb204c581b 100644 (file)
@@ -765,7 +765,7 @@ llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) {
   }
 
   // FIXME: finish layout for virtual bases
-  // FIXME: audit indirect virtual bases
+  // FIXME: Though complete, this is the wrong order
   for (CXXRecordDecl::base_class_const_iterator i = RD->vbases_begin(),
          e = RD->vbases_end(); i != e; ++i) {
     const CXXRecordDecl *Base =