From: Peter Collingbourne Date: Mon, 26 Sep 2011 01:56:55 +0000 (+0000) Subject: Implement VTableContext::createConstructionVTableLayout X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e00fe697ccc755a1f4aca4dab2d47fcb40903947;p=clang Implement VTableContext::createConstructionVTableLayout git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140507 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGVTables.cpp b/lib/CodeGen/CGVTables.cpp index 2b187fdca7..44ac56a0aa 100644 --- a/lib/CodeGen/CGVTables.cpp +++ b/lib/CodeGen/CGVTables.cpp @@ -2821,6 +2821,18 @@ void CodeGenVTables::EmitThunks(GlobalDecl GD) /*UseAvailableExternallyLinkage=*/false); } +static VTableLayout *CreateVTableLayout(const VTableBuilder &Builder) { + llvm::SmallVector + VTableThunks(Builder.vtable_thunks_begin(), Builder.vtable_thunks_end()); + std::sort(VTableThunks.begin(), VTableThunks.end()); + + return new VTableLayout(Builder.getNumVTableComponents(), + Builder.vtable_component_begin(), + VTableThunks.size(), + VTableThunks.data(), + Builder.getAddressPoints()); +} + void VTableContext::ComputeVTableRelatedInformation(const CXXRecordDecl *RD) { const VTableLayout *&Entry = VTableLayouts[RD]; @@ -2830,16 +2842,7 @@ void VTableContext::ComputeVTableRelatedInformation(const CXXRecordDecl *RD) { VTableBuilder Builder(*this, RD, CharUnits::Zero(), /*MostDerivedClassIsVirtual=*/0, RD); - - llvm::SmallVector - VTableThunks(Builder.vtable_thunks_begin(), Builder.vtable_thunks_end()); - std::sort(VTableThunks.begin(), VTableThunks.end()); - - Entry = new VTableLayout(Builder.getNumVTableComponents(), - Builder.vtable_component_begin(), - VTableThunks.size(), - VTableThunks.data(), - Builder.getAddressPoints()); + Entry = CreateVTableLayout(Builder); // Add the known thunks. Thunks.insert(Builder.thunks_begin(), Builder.thunks_end()); @@ -2867,6 +2870,16 @@ void VTableContext::ComputeVTableRelatedInformation(const CXXRecordDecl *RD) { } } +VTableLayout *VTableContext::createConstructionVTableLayout( + const CXXRecordDecl *MostDerivedClass, + CharUnits MostDerivedClassOffset, + bool MostDerivedClassIsVirtual, + const CXXRecordDecl *LayoutClass) { + VTableBuilder Builder(*this, MostDerivedClass, MostDerivedClassOffset, + MostDerivedClassIsVirtual, LayoutClass); + return CreateVTableLayout(Builder); +} + llvm::Constant * CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD, const VTableComponent *Components, diff --git a/lib/CodeGen/CGVTables.h b/lib/CodeGen/CGVTables.h index 537ce383ce..2691b43611 100644 --- a/lib/CodeGen/CGVTables.h +++ b/lib/CodeGen/CGVTables.h @@ -314,6 +314,12 @@ public: return *VTableLayouts[RD]; } + VTableLayout * + createConstructionVTableLayout(const CXXRecordDecl *MostDerivedClass, + CharUnits MostDerivedClassOffset, + bool MostDerivedClassIsVirtual, + const CXXRecordDecl *LayoutClass); + const ThunkInfoVectorTy *getThunkInfo(const CXXMethodDecl *MD) { ComputeVTableRelatedInformation(MD->getParent());