From 5889027ccc55f68e3d00fdb144549fe71da14923 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 :) llvm-svn: 99787 --- clang/lib/CodeGen/CGClass.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 17802fc20100..4b5cffae853c 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/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; - uint64_t AddressPoint = - AddressPoints.lookup(std::make_pair(Base.getBase(), Base.getBaseOffset())); - 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())); + VTableAddressPoint = Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint); + } // Compute where to store the address point. const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());