[cfe-commits] r78820 - in /cfe/trunk/lib/CodeGen: CGCXX.cpp CodeGenFunction.h

Mike Stump mrs at apple.com
Wed Aug 12 10:42:24 PDT 2009


Author: mrs
Date: Wed Aug 12 12:42:21 2009
New Revision: 78820

URL: http://llvm.org/viewvc/llvm-project?rev=78820&view=rev
Log:
Refine vtable building for the secondary vtables to exclude yet more
cases where a virtual base was already used as a primary base class.
WIP.

Modified:
    cfe/trunk/lib/CodeGen/CGCXX.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=78820&r1=78819&r2=78820&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Wed Aug 12 12:42:21 2009
@@ -626,7 +626,8 @@
                                             llvm::Constant *rtti,
                                          std::vector<llvm::Constant *> &methods,
                                             bool isPrimary,
-                                            bool ForVirtualBase) {
+                                            bool ForVirtualBase,
+                   llvm::SmallSet<const CXXRecordDecl *, 32> &IndirectPrimary) {
   typedef CXXRecordDecl::method_iterator meth_iter;
   llvm::Type *Ptr8Ty;
   Ptr8Ty = llvm::PointerType::get(llvm::Type::Int8Ty, 0);
@@ -668,9 +669,11 @@
     const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 
     const bool PrimaryBaseWasVirtual = Layout.getPrimaryBaseWasVirtual();
     if (PrimaryBase) {
+      if (PrimaryBaseWasVirtual)
+        IndirectPrimary.insert(PrimaryBase);
       TopPrimary = false;
       GenerateVtableForBase(0, PrimaryBase, rtti, methods, true,
-                            PrimaryBaseWasVirtual);
+                            PrimaryBaseWasVirtual, IndirectPrimary);
     }
   }
   // then come the vcall offsets for all our virtual bases.
@@ -739,10 +742,11 @@
   const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
   const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
   const bool PrimaryBaseWasVirtual = Layout.getPrimaryBaseWasVirtual();
+  llvm::SmallSet<const CXXRecordDecl *, 32> IndirectPrimary;
 
   // The primary base comes first.
   GenerateVtableForBase(PrimaryBase, RD, rtti, methods, true,
-                        PrimaryBaseWasVirtual);
+                        PrimaryBaseWasVirtual, IndirectPrimary);
   for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
          e = RD->bases_end(); i != e; ++i) {
     if (i->isVirtual())
@@ -750,7 +754,8 @@
     const CXXRecordDecl *Base = 
       cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
     if (PrimaryBase != Base) {
-      GenerateVtableForBase(Base, RD, rtti, methods);
+      GenerateVtableForBase(Base, RD, rtti, methods, false, false,
+                            IndirectPrimary);
     }
   }
 
@@ -760,8 +765,9 @@
          e = RD->vbases_end(); i != e; ++i) {
     const CXXRecordDecl *Base = 
       cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
-    if (Base != PrimaryBase)
-      GenerateVtableForBase(Base, RD, rtti, methods, false, true);
+    if (!IndirectPrimary.count(Base))
+      GenerateVtableForBase(Base, RD, rtti, methods, false, true,
+                            IndirectPrimary);
   }
 
   llvm::Constant *C;

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=78820&r1=78819&r2=78820&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Wed Aug 12 12:42:21 2009
@@ -363,8 +363,9 @@
                              const CXXRecordDecl *Class,
                              llvm::Constant *rtti,
                              std::vector<llvm::Constant *> &methods,
-                             bool isPrimary = false,
-                             bool ForVirtualBase = false);
+                             bool isPrimary,
+                             bool ForVirtualBase,
+                    llvm::SmallSet<const CXXRecordDecl *, 32> &IndirectPrimary);
   llvm::Value *GenerateVtable(const CXXRecordDecl *RD);
 
   void EmitCtorPrologue(const CXXConstructorDecl *CD);





More information about the cfe-commits mailing list