aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-03-29 15:08:41 +0000
committerAnders Carlsson <andersca@mac.com>2010-03-29 15:08:41 +0000
commitadb507df13aeb2334eddef64e6bbdf41a44dc5b1 (patch)
tree290da18d2e3c1be553f1766c233226c8b172b34b /lib/CodeGen/CGVtable.cpp
parent0b4c9b5834a0a5520d2cd32227a53cf7f73fedca (diff)
Another vtable layout fix, making us match gcc better.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99812 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index 1283c69d97..e79e91a446 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -1401,8 +1401,15 @@ void VtableBuilder::ComputeThisAdjustments() {
MethodInfo.BaseOffset), MD);
// Check if we need an adjustment at all.
- if (MethodInfo.BaseOffsetInLayoutClass == Overrider.Offset)
- continue;
+ if (MethodInfo.BaseOffsetInLayoutClass == Overrider.Offset) {
+ // When a return thunk is needed by a derived class that overrides a
+ // virtual base, gcc uses a virtual 'this' adjustment as well.
+ // While the thunk itself might be needed by vtables in subclasses or
+ // in construction vtables, there doesn't seem to be a reason for using
+ // the thunk in this vtable. Still, we do so to match gcc.
+ if (VTableThunks.lookup(VtableIndex).Return.isEmpty())
+ continue;
+ }
ThisAdjustment ThisAdjustment =
ComputeThisAdjustment(MD, MethodInfo.BaseOffsetInLayoutClass, Overrider);