]> granicus.if.org Git - clang/commitdiff
Simplify the vcall offset calculation and make it give the correct answers :) My...
authorAnders Carlsson <andersca@mac.com>
Tue, 23 Feb 2010 03:14:49 +0000 (03:14 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 23 Feb 2010 03:14:49 +0000 (03:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96877 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVtable.cpp

index d8ecd0c4e5a4c3e70ac57f3096c2532982ea05aa..52e82d9669a72824dc42b79f0253f1805df4d027 100644 (file)
@@ -967,7 +967,7 @@ private:
                                VisitedVirtualBasesSetTy &VBases);
 
   /// AddVCallOffsets - Add vcall offsets for the given base subobject.
-  void AddVCallOffsets(BaseSubobject Base);
+  void AddVCallOffsets(BaseSubobject Base, uint64_t VBaseOffset);
 
   /// AddVBaseOffsets - Add vbase offsets for the given class.
   void AddVBaseOffsets(const CXXRecordDecl *Base, int64_t OffsetToTop,
@@ -1108,10 +1108,13 @@ VtableBuilder::AddVCallAndVBaseOffsets(BaseSubobject Base,
 
   // We only want to add vcall offsets for virtual bases.
   if (BaseIsVirtual && OffsetToTop != 0)
-    AddVCallOffsets(Base);
+    AddVCallOffsets(Base, Base.getBaseOffset());
 }
 
-void VtableBuilder::AddVCallOffsets(BaseSubobject Base) {
+void VtableBuilder::AddVCallOffsets(BaseSubobject Base, uint64_t VBaseOffset) {
+  printf("adding call offsets for (%s, %llu) vbase offset %llu\n",
+         Base.getBase()->getQualifiedNameAsString().c_str(),
+         Base.getBaseOffset(), VBaseOffset);
   const CXXRecordDecl *RD = Base.getBase();
   const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
 
@@ -1122,7 +1125,8 @@ void VtableBuilder::AddVCallOffsets(BaseSubobject Base) {
     uint64_t PrimaryBaseOffset = Base.getBaseOffset() + 
       Layout.getBaseClassOffset(PrimaryBase);
     
-    AddVCallOffsets(BaseSubobject(PrimaryBase, PrimaryBaseOffset));
+    AddVCallOffsets(BaseSubobject(PrimaryBase, PrimaryBaseOffset),
+                    VBaseOffset);
   }
 
   // Add the vcall offsets.
@@ -1147,28 +1151,15 @@ void VtableBuilder::AddVCallOffsets(BaseSubobject Base) {
     // signature.
     if (!VCallOffsets.AddVCallOffset(MD, OffsetOffset))
       continue;
-    
-    // Get the 'this' pointer adjustment offset.
-    BaseOffset ThisAdjustmentOffset =
-      Overriders.getThisAdjustmentOffset(Base, MD);
-    
-    int64_t Offset = 0;
-    if (const CXXRecordDecl *VBaseDecl = ThisAdjustmentOffset.VirtualBase) {
-      const ASTRecordLayout &MostDerivedClassLayout =
-        Context.getASTRecordLayout(MostDerivedClass);
-      
-      FinalOverriders::OverriderInfo Overrider = 
-        Overriders.getOverrider(Base, MD);
 
-      Offset = 
-        -(int64_t)MostDerivedClassLayout.getVBaseClassOffset(VBaseDecl);
-      
-      // The base offset should be relative to the final overrider.
-      Offset += Overrider.BaseOffset;
-
-      // FIXME: We should not use / 8 here.
-      Offset = Offset / 8;
-    }
+    // Get the final overrider.
+    FinalOverriders::OverriderInfo Overrider = 
+      Overriders.getOverrider(Base, MD);
+    
+    /// The vcall offset is the offset from the virtual base to the object where
+    /// the function was overridden.
+    // FIXME: We should not use / 8 here.
+    int64_t Offset = (int64_t)(Overrider.BaseOffset - VBaseOffset) / 8;
 
     VCallAndVBaseOffsets.push_back(VtableComponent::MakeVCallOffset(Offset));
   }
@@ -1187,7 +1178,7 @@ void VtableBuilder::AddVCallOffsets(BaseSubobject Base) {
     uint64_t BaseOffset = Base.getBaseOffset() + 
       Layout.getBaseClassOffset(BaseDecl);
     
-    AddVCallOffsets(BaseSubobject(BaseDecl, BaseOffset));
+    AddVCallOffsets(BaseSubobject(BaseDecl, BaseOffset), VBaseOffset);
   }
 }