From: Anders Carlsson Date: Wed, 24 Feb 2010 22:27:12 +0000 (+0000) Subject: Improve this adjustment pointer calculation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d91e7339577d74c2817b166fbdcbe847103dd85e;p=clang Improve this adjustment pointer calculation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97067 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index f0a95b92da..17c21f40f9 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -1432,12 +1432,23 @@ VtableBuilder::AddMethods(BaseSubobject Base, ReturnAdjustment ReturnAdjustment = ComputeReturnAdjustment(ReturnAdjustmentOffset); - // Check if this overrider needs a 'this' pointer adjustment. - BaseOffset ThisAdjustmentOffset = - Overriders.getThisAdjustmentOffset(Base, MD); + ThisAdjustment ThisAdjustment; - ThisAdjustment ThisAdjustment = ComputeThisAdjustment(Overrider.Method, - ThisAdjustmentOffset); + // Check if this overrider needs a 'this' pointer adjustment. + // (We use the base offset of the first base in the primary base chain here, + // because Base will not have the right offset if it is a primary virtual + // base that is not a primary base in the complete class. + if (FirstBaseInPrimaryBaseChain.getBaseOffset() != Overrider.BaseOffset) { + BaseSubobject OverriderBaseSubobject(Overrider.Method->getParent(), + Overrider.BaseOffset); + + BaseOffset ThisAdjustmentOffset = + Overriders.ComputeThisAdjustmentBaseOffset(FirstBaseInPrimaryBaseChain, + OverriderBaseSubobject); + + ThisAdjustment = ComputeThisAdjustment(Overrider.Method, + ThisAdjustmentOffset); + } AddMethod(Overrider.Method, ReturnAdjustment, ThisAdjustment); }