diff options
author | Anders Carlsson <andersca@mac.com> | 2009-12-04 02:52:22 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-12-04 02:52:22 +0000 |
commit | ea357223e50bb4ecefaa9c69f421e5b37750ccc6 (patch) | |
tree | 1eaf13b4a7b68bc0780517aa9da87f2308175bcd | |
parent | b73ba39f389bd80eac4a35c867604600b0098f53 (diff) |
Move covariant thunk handling to AppendMethods too.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90528 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 73 |
1 files changed, 30 insertions, 43 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index aa1b248a55..2f5d3f7226 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -292,45 +292,6 @@ public: void AppendMethods(); void InstallThunks() { - for (BaseReturnTypesMapTy::const_iterator i = BaseReturnTypes.begin(), - e = BaseReturnTypes.end(); i != e; ++i) { - uint64_t Index = i->first; - GlobalDecl GD = Methods[Index]; - - const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); - if (MD->isPure()) - continue; - - QualType BaseReturnType = i->second; - - assert(Index == VtableBuilder::Index[GD] && "Thunk index mismatch!"); - - // Check if there is an adjustment for the 'this' pointer. - ThunkAdjustment ThisAdjustment; - ThisAdjustmentsMapTy::iterator it = ThisAdjustments.find(Index); - if (it != ThisAdjustments.end()) { - ThisAdjustment = it->second; - - ThisAdjustments.erase(it); - } - - // Construct the return adjustment. - QualType DerivedType = - MD->getType()->getAs<FunctionType>()->getResultType(); - - int64_t NonVirtualAdjustment = - getNVOffset(BaseReturnType, DerivedType) / 8; - - int64_t VirtualAdjustment = - getVbaseOffset(BaseReturnType, DerivedType); - - ThunkAdjustment ReturnAdjustment(NonVirtualAdjustment, VirtualAdjustment); - - CovariantThunkAdjustment Adjustment(ThisAdjustment, ReturnAdjustment); - submethods[Index] = CGM.BuildCovariantThunk(MD, Extern, Adjustment); - } - BaseReturnTypes.clear(); - for (PureVirtualMethodsSetTy::iterator i = PureVirtualMethods.begin(), e = PureVirtualMethods.end(); i != e; ++i) { GlobalDecl GD = *i; @@ -895,15 +856,41 @@ void VtableBuilder::AppendMethods() { for (unsigned i = 0, e = Methods.size(); i != e; ++i) { GlobalDecl GD = Methods[i]; - + const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); + + // Get the 'this' pointer adjustment. ThunkAdjustment ThisAdjustment = ThisAdjustments.lookup(i); - - if (!ThisAdjustment.isEmpty()) + + // Construct the return type adjustment. + ThunkAdjustment ReturnAdjustment; + + QualType BaseReturnType = BaseReturnTypes.lookup(i); + if (!BaseReturnType.isNull() && !MD->isPure()) { + QualType DerivedType = + MD->getType()->getAs<FunctionType>()->getResultType(); + + int64_t NonVirtualAdjustment = + getNVOffset(BaseReturnType, DerivedType) / 8; + + int64_t VirtualAdjustment = + getVbaseOffset(BaseReturnType, DerivedType); + + ReturnAdjustment = ThunkAdjustment(NonVirtualAdjustment, + VirtualAdjustment); + } + + if (!ReturnAdjustment.isEmpty()) { + // Build a covariant thunk. + CovariantThunkAdjustment Adjustment(ThisAdjustment, ReturnAdjustment); + submethods[i] = CGM.BuildCovariantThunk(MD, Extern, Adjustment); + } else if (!ThisAdjustment.isEmpty()) { + // Build a "regular" thunk. submethods[i] = CGM.BuildThunk(GD, Extern, ThisAdjustment); + } } ThisAdjustments.clear(); - + BaseReturnTypes.clear(); D1(printf("============= combining methods\n")); methods.insert(methods.end(), submethods.begin(), submethods.end()); |