diff options
| author | Mike Stump <mrs@apple.com> | 2009-11-06 02:38:24 +0000 |
|---|---|---|
| committer | Mike Stump <mrs@apple.com> | 2009-11-06 02:38:24 +0000 |
| commit | 72431bd9ea53f7f2afeab80b7ff6a1940db2c555 (patch) | |
| tree | 2c44c0596500f18e569e2fc5feadfb71bce8f95c /clang/lib/CodeGen | |
| parent | bee01e5b611a6a4c3050274c4f210e49899c1e09 (diff) | |
| download | bcm5719-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.cpp | 19 |
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)); } } } |

