diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-26 01:56:55 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-26 01:56:55 +0000 |
commit | 3b118abd93f48894e6c1706d6632097298bafecd (patch) | |
tree | 37f8fbd0b9efb9f90b7df3e7e18912938239cee1 /clang/lib/CodeGen | |
parent | affe111ba5b27af51d6039197f7d744cc127cd5c (diff) | |
download | bcm5719-llvm-3b118abd93f48894e6c1706d6632097298bafecd.tar.gz bcm5719-llvm-3b118abd93f48894e6c1706d6632097298bafecd.zip |
Implement VTableContext::createConstructionVTableLayout
llvm-svn: 140507
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 33 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTables.h | 6 |
2 files changed, 29 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index 2b187fdca7f..44ac56a0aad 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -2821,6 +2821,18 @@ void CodeGenVTables::EmitThunks(GlobalDecl GD) /*UseAvailableExternallyLinkage=*/false); } +static VTableLayout *CreateVTableLayout(const VTableBuilder &Builder) { + llvm::SmallVector<VTableLayout::VTableThunkTy, 1> + 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<VTableLayout::VTableThunkTy, 1> - 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/clang/lib/CodeGen/CGVTables.h b/clang/lib/CodeGen/CGVTables.h index 537ce383ce1..2691b436114 100644 --- a/clang/lib/CodeGen/CGVTables.h +++ b/clang/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()); |