]> granicus.if.org Git - clang/commitdiff
Cleanups.
authorMike Stump <mrs@apple.com>
Sat, 5 Sep 2009 08:37:03 +0000 (08:37 +0000)
committerMike Stump <mrs@apple.com>
Sat, 5 Sep 2009 08:37:03 +0000 (08:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81072 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp

index 7d2866aeaa5989e2d39a527b4b4a4b6e13dd0a99..e9312ec57eb2f60a862946fa66a8b4045efabcfd 100644 (file)
@@ -1077,6 +1077,32 @@ public:
     return AddressPoint;
   }
 
+  void Primaries(const CXXRecordDecl *RD, bool forPrimary,
+                 bool MorallyVirtual, int64_t Offset, bool ForVirtualBase) {
+    if (!RD->isDynamicClass())
+      return;
+
+    const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
+    const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 
+    const bool PrimaryBaseWasVirtual = Layout.getPrimaryBaseWasVirtual();
+
+    std::vector<llvm::Constant *> offsets;
+
+    bool Top = true;
+
+    // vtables are composed from the chain of primaries.
+    if (PrimaryBase) {
+      if (PrimaryBaseWasVirtual)
+        IndirectPrimary.insert(PrimaryBase);
+      Top = false;
+      Primaries(PrimaryBase, true, PrimaryBaseWasVirtual|MorallyVirtual,
+                Offset, PrimaryBaseWasVirtual);
+    }
+
+    // And add the virtuals for the class to the primary vtable.
+    AddMethods(RD, MorallyVirtual, Offset);
+  }
+
   int64_t GenerateVtableForBase(const CXXRecordDecl *RD, bool forPrimary,
                                 bool Bottom, bool MorallyVirtual,
                                 int64_t Offset, bool ForVirtualBase) {
@@ -1089,8 +1115,7 @@ public:
 
     std::vector<llvm::Constant *> offsets;
     // FIXME: Audit, is this right?
-    if (Bottom && (PrimaryBase == 0 || forPrimary || !PrimaryBaseWasVirtual
-                   || Bottom)) {
+    if (Bottom) {
       extra = 0;
       GenerateVBaseOffsets(offsets, RD, Offset);
       if (ForVirtualBase)
@@ -1104,9 +1129,8 @@ public:
       if (PrimaryBaseWasVirtual)
         IndirectPrimary.insert(PrimaryBase);
       Top = false;
-      GenerateVtableForBase(PrimaryBase, true, false,
-                            PrimaryBaseWasVirtual|MorallyVirtual, Offset,
-                            PrimaryBaseWasVirtual);
+      Primaries(PrimaryBase, true, PrimaryBaseWasVirtual|MorallyVirtual,
+                Offset, PrimaryBaseWasVirtual);
     }
 
     // And add the virtuals for the class to the primary vtable.