summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-11-06 02:38:24 +0000
committerMike Stump <mrs@apple.com>2009-11-06 02:38:24 +0000
commit72431bd9ea53f7f2afeab80b7ff6a1940db2c555 (patch)
tree2c44c0596500f18e569e2fc5feadfb71bce8f95c /clang/lib/CodeGen
parentbee01e5b611a6a4c3050274c4f210e49899c1e09 (diff)
downloadbcm5719-llvm-72431bd9ea53f7f2afeab80b7ff6a1940db2c555.tar.gz
bcm5719-llvm-72431bd9ea53f7f2afeab80b7ff6a1940db2c555.zip
Refine the vcall for a function that is defined in a virtual base
class that is overridden in a base that isn't morally virtual. llvm-svn: 86217
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGVtable.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGVtable.cpp b/clang/lib/CodeGen/CGVtable.cpp
index e2e11478de2..34012cafe5f 100644
--- a/clang/lib/CodeGen/CGVtable.cpp
+++ b/clang/lib/CodeGen/CGVtable.cpp
@@ -242,15 +242,13 @@ public:
idx = VCalls.size()+1;
VCalls.push_back(0);
D1(printf(" vcall for %s at %d with delta %d most derived %s\n",
- MD->getNameAsCString(),
- (int)-VCalls.size()-3, (int)VCallOffset[MD],
+ MD->getNameAsCString(), (int)-idx-3, (int)VCalls[idx-1],
Class->getNameAsCString()));
} else {
VCallOffset[MD] = VCallOffset[OMD];
VCalls[idx-1] = -VCallOffset[OMD] + OverrideOffset/8;
D1(printf(" vcall patch for %s at %d with delta %d most derived %s\n",
- MD->getNameAsCString(),
- (int)-VCalls.size()-3, (int)VCallOffset[MD],
+ MD->getNameAsCString(), (int)-idx-3, (int)VCalls[idx-1],
Class->getNameAsCString()));
}
VCall[MD] = idx;
@@ -271,6 +269,16 @@ public:
// FIXME: finish off
int64_t O = VCallOffset[OMD] - OverrideOffset/8;
// int64_t O = CurrentVBaseOffset/8 - OverrideOffset/8;
+
+ if (VCall.count(OMD)) {
+ VCallOffset[MD] = VCallOffset[OMD];
+ Index_t idx = VCall[OMD];
+ VCalls[idx-1] = -VCallOffset[OMD] + OverrideOffset/8;
+ D1(printf(" vcall patch for %s at %d with delta %d most derived %s\n",
+ MD->getNameAsCString(), (int)-idx-3, (int)VCalls[idx-1],
+ Class->getNameAsCString()));
+ VCall[MD] = idx;
+ }
if (O || ReturnOffset.first || ReturnOffset.second) {
CallOffset ThisOffset = std::make_pair(O, 0);
@@ -374,8 +382,7 @@ public:
idx = VCalls.size()+1;
VCalls.push_back(0);
D1(printf(" vcall for %s at %d with delta %d\n",
- MD->getNameAsCString(), (int)-VCalls.size()-3,
- (int)VCallOffset[MD]));
+ MD->getNameAsCString(), (int)-VCalls.size()-3, 0));
}
}
}
OpenPOWER on IntegriCloud