From: Anders Carlsson Date: Sat, 27 Feb 2010 18:09:40 +0000 (+0000) Subject: We want to store method info for unused functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd4e63721eb01f449731741d404409835a32e29b;p=clang We want to store method info for unused functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97333 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index c17334b645..6fb70d83c2 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -1314,6 +1314,13 @@ void VtableBuilder::ComputeThisAdjustments() { if (Overrider.BaseOffset == MethodInfo.BaseOffset) continue; + uint64_t VtableIndex = MethodInfo.VtableIndex; + + // Ignore this adjustments for unused function pointers. + if (Components[VtableIndex].getKind() == + VtableComponent::CK_UnusedFunctionPointer) + continue; + BaseSubobject OverriderBaseSubobject(Overrider.Method->getParent(), Overrider.BaseOffset); @@ -1326,11 +1333,12 @@ void VtableBuilder::ComputeThisAdjustments() { ThisAdjustment ThisAdjustment = ComputeThisAdjustment(Overrider.Method, ThisAdjustmentOffset); - ThisAdjustments.push_back(std::make_pair(MethodInfo.VtableIndex, - ThisAdjustment)); + // Add it. + ThisAdjustments.push_back(std::make_pair(VtableIndex, ThisAdjustment)); + if (isa(MD)) { // Add an adjustment for the deleting destructor as well. - ThisAdjustments.push_back(std::make_pair(MethodInfo.VtableIndex + 1, + ThisAdjustments.push_back(std::make_pair(VtableIndex + 1, ThisAdjustment)); } } @@ -1493,6 +1501,8 @@ VtableBuilder::IsOverriderUsed(BaseSubobject Base, assert(Layout.getBaseClassOffset(PrimaryBase) == 0 && "Primary base should always be at offset 0!"); } + + RD = PrimaryBase; } // If the final overrider is an override of one of the primary bases, @@ -1591,19 +1601,19 @@ VtableBuilder::AddMethods(BaseSubobject Base, } } - // Check if this overrider is going to be used. - if (!IsOverriderUsed(Base, FirstBaseInPrimaryBaseChain, Overrider)) { - const CXXMethodDecl *OverriderMD = Overrider.Method; - Components.push_back(VtableComponent::MakeUnusedFunction(OverriderMD)); - continue; - } - // Insert the method info for this method. MethodInfo MethodInfo(Base.getBaseOffset(), Components.size()); assert(!MethodInfoMap.count(MD) && "Should not have method info for this method yet!"); MethodInfoMap.insert(std::make_pair(MD, MethodInfo)); + + // Check if this overrider is going to be used. + if (!IsOverriderUsed(Base, FirstBaseInPrimaryBaseChain, Overrider)) { + const CXXMethodDecl *OverriderMD = Overrider.Method; + Components.push_back(VtableComponent::MakeUnusedFunction(OverriderMD)); + continue; + } // Check if this overrider needs a return adjustment. BaseOffset ReturnAdjustmentOffset =