diff options
author | Anders Carlsson <andersca@mac.com> | 2010-02-27 18:09:40 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-02-27 18:09:40 +0000 |
commit | 01d3c7da60dd1174e1782321f1ff07ea9fc1483e (patch) | |
tree | 78365762890681c2f086d8c50f34f78a04577071 | |
parent | ec27c49d6c45cea1614a0d5f93a49b6b4524fdb5 (diff) | |
download | bcm5719-llvm-01d3c7da60dd1174e1782321f1ff07ea9fc1483e.tar.gz bcm5719-llvm-01d3c7da60dd1174e1782321f1ff07ea9fc1483e.zip |
We want to store method info for unused functions.
llvm-svn: 97333
-rw-r--r-- | clang/lib/CodeGen/CGVtable.cpp | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp index c17334b645c..6fb70d83c2d 100644 --- a/clang/lib/CodeGen/CGVtable.cpp +++ b/clang/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<CXXDestructorDecl>(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 = |