r194256 - Thread the info about vbptr sharing through ASTRecordLayout

Timur Iskhodzhanov timurrrr at google.com
Fri Nov 8 03:45:36 PST 2013


Author: timurrrr
Date: Fri Nov  8 05:45:35 2013
New Revision: 194256

URL: http://llvm.org/viewvc/llvm-project?rev=194256&view=rev
Log:
Thread the info about vbptr sharing through ASTRecordLayout

Reviewed at http://llvm-reviews.chandlerc.com/D2120

Modified:
    cfe/trunk/include/clang/AST/RecordLayout.h
    cfe/trunk/lib/AST/RecordLayout.cpp
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
    cfe/trunk/lib/AST/VTableBuilder.cpp

Modified: cfe/trunk/include/clang/AST/RecordLayout.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecordLayout.h?rev=194256&r1=194255&r2=194256&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/RecordLayout.h (original)
+++ cfe/trunk/include/clang/AST/RecordLayout.h Fri Nov  8 05:45:35 2013
@@ -98,18 +98,16 @@ private:
     /// HasVFPtr - Does this class have a vftable at all (could be inherited
     /// from its primary base.)
     bool HasVFPtr : 1;
-    
-    /// HasOwnVBPtr - Does this class provide a virtual function table
-    /// (vtable in Itanium, VBtbl in Microsoft) that is independent from
-    /// its base classes?
-    bool HasOwnVBPtr : 1;
-    
+
     /// AlignAfterVBases - Force appropriate alignment after virtual bases are
     /// laid out in MS-C++-ABI.
     bool AlignAfterVBases : 1;
     
     /// PrimaryBase - The primary base info for this record.
     llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> PrimaryBase;
+
+    /// BaseSharingVBPtr - The base we share vbptr with.
+    const CXXRecordDecl *BaseSharingVBPtr;
     
     /// FIXME: This should really use a SmallPtrMap, once we have one in LLVM :)
     typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
@@ -135,7 +133,7 @@ private:
   typedef CXXRecordLayoutInfo::BaseOffsetsMapTy BaseOffsetsMapTy;
   ASTRecordLayout(const ASTContext &Ctx,
                   CharUnits size, CharUnits alignment,
-                  bool hasOwnVFPtr, bool hasVFPtr, bool hasOwnVBPtr,
+                  bool hasOwnVFPtr, bool hasVFPtr,
                   CharUnits vbptroffset,
                   CharUnits datasize,
                   const uint64_t *fieldoffsets, unsigned fieldcount,
@@ -143,6 +141,7 @@ private:
                   CharUnits SizeOfLargestEmptySubobject,
                   const CXXRecordDecl *PrimaryBase,
                   bool IsPrimaryBaseVirtual,
+                  const CXXRecordDecl *BaseSharingVBPtr,
                   bool ForceAlign,
                   const BaseOffsetsMapTy& BaseOffsets,
                   const VBaseOffsetsMapTy& VBaseOffsets);
@@ -256,7 +255,7 @@ public:
   /// of the ABI.
   bool hasOwnVBPtr() const {
     assert(CXXInfo && "Record layout does not have C++ specific info!");
-    return CXXInfo->HasOwnVBPtr;
+    return hasVBPtr() && !CXXInfo->BaseSharingVBPtr;
   }
 
   /// hasVBPtr - Does this class have a virtual function table pointer.
@@ -277,6 +276,11 @@ public:
     return CXXInfo->VBPtrOffset;
   }
 
+  const CXXRecordDecl *getBaseSharingVBPtr() const {
+    assert(CXXInfo && "Record layout does not have C++ specific info!");
+    return CXXInfo->BaseSharingVBPtr;
+  }
+
   const VBaseOffsetsMapTy &getVBaseOffsetsMap() const {
     assert(CXXInfo && "Record layout does not have C++ specific info!");
     return CXXInfo->VBaseOffsets;

Modified: cfe/trunk/lib/AST/RecordLayout.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayout.cpp?rev=194256&r1=194255&r2=194256&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayout.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayout.cpp Fri Nov  8 05:45:35 2013
@@ -44,7 +44,6 @@ ASTRecordLayout::ASTRecordLayout(const A
 ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
                                  CharUnits size, CharUnits alignment,
                                  bool hasOwnVFPtr, bool hasVFPtr,
-                                 bool hasOwnVBPtr,
                                  CharUnits vbptroffset,
                                  CharUnits datasize,
                                  const uint64_t *fieldoffsets,
@@ -54,6 +53,7 @@ ASTRecordLayout::ASTRecordLayout(const A
                                  CharUnits SizeOfLargestEmptySubobject,
                                  const CXXRecordDecl *PrimaryBase,
                                  bool IsPrimaryBaseVirtual,
+                                 const CXXRecordDecl *BaseSharingVBPtr,
                                  bool AlignAfterVBases,
                                  const BaseOffsetsMapTy& BaseOffsets,
                                  const VBaseOffsetsMapTy& VBaseOffsets)
@@ -75,7 +75,7 @@ ASTRecordLayout::ASTRecordLayout(const A
   CXXInfo->HasOwnVFPtr = hasOwnVFPtr;
   CXXInfo->VBPtrOffset = vbptroffset;
   CXXInfo->HasVFPtr = hasVFPtr;
-  CXXInfo->HasOwnVBPtr = hasOwnVBPtr;
+  CXXInfo->BaseSharingVBPtr = BaseSharingVBPtr;
   CXXInfo->AlignAfterVBases = AlignAfterVBases;
 
 

Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=194256&r1=194255&r2=194256&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Fri Nov  8 05:45:35 2013
@@ -2673,11 +2673,11 @@ ASTContext::BuildMicrosoftASTRecordLayou
     return new (*this) ASTRecordLayout(
         *this, Builder.Size, Builder.Alignment,
         Builder.HasVFPtr && !Builder.PrimaryBase, Builder.HasVFPtr,
-        Builder.HasVBPtr && !Builder.SharedVBPtrBase, Builder.VBPtrOffset,
-        Builder.DataSize, Builder.FieldOffsets.data(),
+        Builder.VBPtrOffset, Builder.DataSize, Builder.FieldOffsets.data(),
         Builder.FieldOffsets.size(), Builder.DataSize,
         Builder.NonVirtualAlignment, CharUnits::Zero(), Builder.PrimaryBase,
-        false, Builder.AlignAfterVBases, Builder.Bases, Builder.VBases);
+        false, Builder.SharedVBPtrBase, Builder.AlignAfterVBases, Builder.Bases,
+        Builder.VBases);
   } else {
     Builder.layout(D);
     return new (*this) ASTRecordLayout(
@@ -2735,7 +2735,6 @@ ASTContext::getASTRecordLayout(const Rec
                                   Builder.Alignment,
                                   Builder.HasOwnVFPtr,
                                   RD->isDynamicClass(),
-                                  false,
                                   CharUnits::fromQuantity(-1),
                                   DataSize, 
                                   Builder.FieldOffsets.data(),
@@ -2745,7 +2744,7 @@ ASTContext::getASTRecordLayout(const Rec
                                   EmptySubobjects.SizeOfLargestEmptySubobject,
                                   Builder.PrimaryBase,
                                   Builder.PrimaryBaseIsVirtual,
-                                  true,
+                                  0, true,
                                   Builder.Bases, Builder.VBases);
   } else {
     RecordLayoutBuilder Builder(*this, /*EmptySubobjects=*/0);

Modified: cfe/trunk/lib/AST/VTableBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/VTableBuilder.cpp?rev=194256&r1=194255&r2=194256&view=diff
==============================================================================
--- cfe/trunk/lib/AST/VTableBuilder.cpp (original)
+++ cfe/trunk/lib/AST/VTableBuilder.cpp Fri Nov  8 05:45:35 2013
@@ -3363,30 +3363,17 @@ void MicrosoftVTableContext::computeVBTa
   const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
   BasesSetVectorTy VisitedBases;
 
-  // First, see if the Derived class shared the vbptr
-  // with the first non-virtual base.
-  for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
-       E = RD->bases_end(); I != E; ++I) {
-    if (I->isVirtual())
-      continue;
-
-    const CXXRecordDecl *CurBase = I->getType()->getAsCXXRecordDecl();
-    CharUnits DerivedVBPtrOffset = Layout.getVBPtrOffset(),
-              BaseOffset = Layout.getBaseClassOffset(CurBase);
-    const ASTRecordLayout &BaseLayout = Context.getASTRecordLayout(CurBase);
-    if (!BaseLayout.hasVBPtr() ||
-        DerivedVBPtrOffset != BaseOffset + BaseLayout.getVBPtrOffset())
-      continue;
-
+  // First, see if the Derived class shared the vbptr with a non-virtual base.
+  if (const CXXRecordDecl *VBPtrBase = Layout.getBaseSharingVBPtr()) {
     // If the Derived class shares the vbptr with a non-virtual base,
     // it inherits its vbase indices.
-    computeVBTableRelatedInformation(CurBase);
-    for (CXXRecordDecl::base_class_const_iterator J = CurBase->vbases_begin(),
-         F = CurBase->vbases_end(); J != F; ++J) {
-      const CXXRecordDecl *SubVBase = J->getType()->getAsCXXRecordDecl();
-      assert(VBTableIndices.count(ClassPairTy(CurBase, SubVBase)));
+    computeVBTableRelatedInformation(VBPtrBase);
+    for (CXXRecordDecl::base_class_const_iterator I = VBPtrBase->vbases_begin(),
+         E = VBPtrBase->vbases_end(); I != E; ++I) {
+      const CXXRecordDecl *SubVBase = I->getType()->getAsCXXRecordDecl();
+      assert(VBTableIndices.count(ClassPairTy(VBPtrBase, SubVBase)));
       VBTableIndices[ClassPairTy(RD, SubVBase)] =
-          VBTableIndices[ClassPairTy(CurBase, SubVBase)];
+          VBTableIndices[ClassPairTy(VBPtrBase, SubVBase)];
       VisitedBases.insert(SubVBase);
     }
   }





More information about the cfe-commits mailing list