diff options
author | Anders Carlsson <andersca@mac.com> | 2010-02-24 22:27:12 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-02-24 22:27:12 +0000 |
commit | d91e7339577d74c2817b166fbdcbe847103dd85e (patch) | |
tree | 523cc6b93cb6be6dac896ff7bb5bf61faf0d11ba /lib/CodeGen/CGVtable.cpp | |
parent | 2157d30c25e4c4dd24ba3833a397ee79fb82774f (diff) |
Improve this adjustment pointer calculation.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97067 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
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); } |