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 | d8d698da60d79a00ba322cbef2d30febf86517e2 (patch) | |
| tree | 4601ba3fe43cb5f8b00f9a1ec852db39abc54b9a /clang/lib/CodeGen | |
| parent | 8025e7b1b910e8f6bd22869472af77cca5e6f2fd (diff) | |
| download | bcm5719-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.cpp | 21 |
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); } |

