aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-02-24 22:27:12 +0000
committerAnders Carlsson <andersca@mac.com>2010-02-24 22:27:12 +0000
commitd91e7339577d74c2817b166fbdcbe847103dd85e (patch)
tree523cc6b93cb6be6dac896ff7bb5bf61faf0d11ba /lib/CodeGen/CGVtable.cpp
parent2157d30c25e4c4dd24ba3833a397ee79fb82774f (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.cpp21
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);
}