]> granicus.if.org Git - clang/commitdiff
We want to add all thunks, not just 'this' adjustment thunks.
authorAnders Carlsson <andersca@mac.com>
Mon, 22 Mar 2010 15:47:01 +0000 (15:47 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 22 Mar 2010 15:47:01 +0000 (15:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99177 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGVtable.cpp

index d11cbb4b802d3d4e1c36a931d61560da6fa4855a..04326b6e7ca086c168da8cf766ccf4f286254442 100644 (file)
@@ -1423,12 +1423,35 @@ void VtableBuilder::ComputeThisAdjustments() {
       // Add an adjustment for the deleting destructor as well.
       Thunks[VtableIndex + 1].This = ThisAdjustment;
     }
-    
-    AddThunk(Overrider.Method, Thunks[VtableIndex]);
   }
 
   /// Clear the method info map.
   MethodInfoMap.clear();
+  
+  if (isBuildingConstructorVtable()) {
+    // We don't need to store thunk information for construction vtables.
+    return;
+  }
+
+  for (ThunksInfoMapTy::const_iterator I = Thunks.begin(), E = Thunks.end();
+       I != E; ++I) {
+    const VtableComponent &Component = Components[I->first];
+    const ThunkInfo &Thunk = I->second;
+    
+    switch (Component.getKind()) {
+    default:
+      llvm_unreachable("Unexpected vtable component kind!");
+    case VtableComponent::CK_FunctionPointer:
+      AddThunk(Component.getFunctionDecl(), Thunk);
+      break;
+    case VtableComponent::CK_CompleteDtorPointer:
+      AddThunk(Component.getDestructorDecl(), Thunk);
+      break;
+    case VtableComponent::CK_DeletingDtorPointer:
+      // We've already added the thunk when we saw the complete dtor pointer.
+      break;
+    }
+  }
 }
 
 VtableBuilder::ReturnAdjustment