summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
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
commitd8d698da60d79a00ba322cbef2d30febf86517e2 (patch)
tree4601ba3fe43cb5f8b00f9a1ec852db39abc54b9a /clang/lib/CodeGen
parent8025e7b1b910e8f6bd22869472af77cca5e6f2fd (diff)
downloadbcm5719-llvm-d8d698da60d79a00ba322cbef2d30febf86517e2.tar.gz
bcm5719-llvm-d8d698da60d79a00ba322cbef2d30febf86517e2.zip
Improve this adjustment pointer calculation.
llvm-svn: 97067
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGVtable.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp
index f0a95b92da6..17c21f40f91 100644
--- a/clang/lib/CodeGen/CGVtable.cpp
+++ b/clang/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);
}
OpenPOWER on IntegriCloud