[cfe-commits] r86793 - in /cfe/trunk/lib/CodeGen: CGVtable.cpp CGVtable.h

Mike Stump mrs at apple.com
Tue Nov 10 19:08:24 PST 2009


Author: mrs
Date: Tue Nov 10 21:08:24 2009
New Revision: 86793

URL: http://llvm.org/viewvc/llvm-project?rev=86793&view=rev
Log:
More VTT work.  We now track offsets and use the ctor vtable builder
interface.  WIP.

Modified:
    cfe/trunk/lib/CodeGen/CGVtable.cpp
    cfe/trunk/lib/CodeGen/CGVtable.h

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.cpp Tue Nov 10 21:08:24 2009
@@ -724,9 +724,13 @@
   const CXXRecordDecl *Class;
   CodeGenModule &CGM;  // Per-module state.
   llvm::SmallSet<const CXXRecordDecl *, 32> SeenVBase;
+  /// BLayout - Layout for the most derived class that this vtable is being
+  /// built for.
+  const ASTRecordLayout &BLayout;
 
   /// Secondary - Add the secondary vtable pointers to Inits.
-  void Secondary(const CXXRecordDecl *RD, bool MorallyVirtual=false) {
+  void Secondary(const CXXRecordDecl *RD, uint64_t Offset=0,
+                 bool MorallyVirtual=false) {
     if (RD->getNumVBases() == 0 && ! MorallyVirtual)
       return;
 
@@ -740,31 +744,37 @@
       bool NonVirtualPrimaryBase;
       NonVirtualPrimaryBase = !PrimaryBaseWasVirtual && Base == PrimaryBase;
       bool BaseMorallyVirtual = MorallyVirtual | i->isVirtual();
+      uint64_t BaseOffset;
+      if (!i->isVirtual()) {
+        const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
+        BaseOffset = Offset + Layout.getBaseClassOffset(Base);
+      } else
+        BaseOffset = BLayout.getVBaseClassOffset(Base);
       if ((Base->getNumVBases() || BaseMorallyVirtual)
           && !NonVirtualPrimaryBase) {
         // FIXME: Slightly too many of these for __ZTT8test8_B2
-        // FIXME: ctor vtbl or normal vtable.
-        llvm::Constant *vtbl = CGM.getVtableInfo().getVtable(Base);
+        llvm::Constant *vtbl;
+        vtbl = CGM.getVtableInfo().getVtable(Base, Class, BaseOffset/8);
         Inits.push_back(vtbl);
       }
-      Secondary(Base, BaseMorallyVirtual);
+      Secondary(Base, BaseOffset, BaseMorallyVirtual);
     }
   }
 
   /// BuiltVTT - Add the VTT to Inits.
-  void BuildVTT(const CXXRecordDecl *RD, bool MorallyVirtual=false) {
+  void BuildVTT(const CXXRecordDecl *RD, uint64_t Offset,
+                bool MorallyVirtual=false) {
     if (RD->getNumVBases() == 0 && !MorallyVirtual)
       return;
 
     // First comes the primary virtual table pointer...
-    // FIXME: ctor vtable instead
-    Inits.push_back(CGM.getVtableInfo().getVtable(RD));
+    Inits.push_back(CGM.getVtableInfo().getVtable(RD, Class, Offset));
 
     // then the secondary VTTs....
     SecondaryVTTs(RD, MorallyVirtual);
 
     // and last the secondary vtable pointers.
-    Secondary(RD, MorallyVirtual);
+    Secondary(RD, MorallyVirtual, Offset);
   }
 
   /// SecondaryVTTs - Add the secondary VTTs to Inits.  The secondary VTTs are
@@ -797,7 +807,9 @@
   }
 public:
   VTTBuilder(std::vector<llvm::Constant *> &inits, const CXXRecordDecl *c,
-             CodeGenModule &cgm) : Inits(inits), Class(c), CGM(cgm) {
+             CodeGenModule &cgm)
+    : Inits(inits), Class(c), CGM(cgm),
+      BLayout(cgm.getContext().getASTRecordLayout(c)) {
     
     // First comes the primary virtual table pointer for the complete class...
     Inits.push_back(CGM.getVtableInfo().getVtable(Class));
@@ -840,7 +852,10 @@
   return vtt;
 }
 
-llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
+llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD,
+                                        const CXXRecordDecl *Class,
+                                        uint64_t Offset) {
+  // FIXME: Add ctor vtable support
   llvm::Constant *&vtbl = Vtables[RD];
   if (vtbl)
     return vtbl;

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.h (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.h Tue Nov 10 21:08:24 2009
@@ -57,7 +57,8 @@
   int64_t getVirtualBaseOffsetIndex(const CXXRecordDecl *RD, 
                                     const CXXRecordDecl *VBase);
 
-  llvm::Constant *getVtable(const CXXRecordDecl *RD);
+  llvm::Constant *getVtable(const CXXRecordDecl *RD,
+                            const CXXRecordDecl *Class=0, uint64_t Offset=0);
 };
   
 }





More information about the cfe-commits mailing list