From c83f1061fedc223ad661e25337cc853f54671d8a Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Mon, 29 Mar 2010 01:08:49 +0000 Subject: [PATCH] Use construction vtables when needed. This is currently guarded by -fdump-vtable-layouts since it doesn't work 100% yet :) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99787 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGClass.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index 17802fc201..4b5cffae85 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -1561,14 +1561,38 @@ CodeGenFunction::InitializeVTablePointer(BaseSubobject Base, bool BaseIsMorallyVirtual, llvm::Constant *VTable, const CXXRecordDecl *VTableClass) { + const CXXRecordDecl *RD = Base.getBase(); + // Compute the address point. - const CodeGenVTables::AddrSubMap_t& AddressPoints = - CGM.getVTables().getAddressPoints(VTableClass); + llvm::Value *VTableAddressPoint; + + // FIXME: Always use the new vtable code once we know it works. + bool UseNewVTableCode = CGM.getLangOptions().DumpVtableLayouts; + + // Check if we need to use a vtable from the VTT. + if (UseNewVTableCode && CodeGenVTables::needsVTTParameter(CurGD) && + (RD->getNumVBases() || BaseIsMorallyVirtual)) { + // Get the secondary vpointer index. + uint64_t VirtualPointerIndex = + CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base); + + /// Load the VTT. + llvm::Value *VTT = LoadCXXVTT(); + if (VirtualPointerIndex) + VTT = Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex); + + // And load the address point from the VTT. + VTableAddressPoint = Builder.CreateLoad(VTT); + } else { + const CodeGenVTables::AddrSubMap_t& AddressPoints = + CGM.getVTables().getAddressPoints(VTableClass); - uint64_t AddressPoint = - AddressPoints.lookup(std::make_pair(Base.getBase(), Base.getBaseOffset())); - llvm::Value *VTableAddressPoint = + uint64_t AddressPoint = + AddressPoints.lookup(std::make_pair(Base.getBase(), + Base.getBaseOffset())); + VTableAddressPoint = Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint); + } // Compute where to store the address point. const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); -- 2.40.0