diff options
author | Anders Carlsson <andersca@mac.com> | 2010-03-28 19:40:00 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-03-28 19:40:00 +0000 |
commit | e87fae9afa223534d48da8ea3f9462ef297aff42 (patch) | |
tree | ce5329c684554d9b75d861b24d0e81a5c66b96f6 /clang/lib/CodeGen/CGClass.cpp | |
parent | 32bdaef3fec910e7c5d29248cdb25ab57c2115bf (diff) | |
download | bcm5719-llvm-e87fae9afa223534d48da8ea3f9462ef297aff42.tar.gz bcm5719-llvm-e87fae9afa223534d48da8ea3f9462ef297aff42.zip |
Factor vtable pointer setting code out into a separate function.
llvm-svn: 99773
Diffstat (limited to 'clang/lib/CodeGen/CGClass.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 8a084926e76..2fa58372895 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -139,7 +139,7 @@ CodeGenFunction::GetAddressOfBaseOfCompleteClass(llvm::Value *This, V = Builder.CreateBitCast(V, ConvertType(Base)->getPointerTo()); return V; -} +} llvm::Value * CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, @@ -1556,6 +1556,34 @@ CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This, return VBaseOffset; } +void +CodeGenFunction::InitializeVTablePointer(BaseSubobject Base, + bool BaseIsMorallyVirtual, + llvm::Constant *VTable, + const CXXRecordDecl *VTableClass) { + + // Compute the address point. + const CodeGenVTables::AddrSubMap_t& AddressPoints = + CGM.getVTables().getAddressPoints(VTableClass); + + uint64_t AddressPoint = + AddressPoints.lookup(std::make_pair(Base.getBase(), Base.getBaseOffset())); + llvm::Value *VTableAddressPoint = + Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint); + + // Compute where to store the address point. + const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); + llvm::Value *VTableField = Builder.CreateBitCast(LoadCXXThis(), Int8PtrTy); + VTableField = + Builder.CreateConstInBoundsGEP1_64(VTableField, Base.getBaseOffset() / 8); + + // Finally, store the address point. + const llvm::Type *AddressPointPtrTy = + VTableAddressPoint->getType()->getPointerTo(); + VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy); + Builder.CreateStore(VTableAddressPoint, VTableField); +} + void CodeGenFunction::InitializeVtablePtrs(const CXXRecordDecl *RD) { if (!RD->isDynamicClass()) return; @@ -1607,25 +1635,8 @@ void CodeGenFunction::InitializeVtablePtrs(BaseSubobject Base, InitializeVtablePtrs(BaseSubobject(BaseDecl, BaseOffset), VTable, VTableClass); } - - // Compute the address point. - const CodeGenVTables::AddrSubMap_t& AddressPoints = - CGM.getVTables().getAddressPoints(VTableClass); - - uint64_t AddressPoint = - AddressPoints.lookup(std::make_pair(Base.getBase(), Base.getBaseOffset())); - llvm::Value *VTableAddressPoint = - Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint); - // Compute where to store the address point. - const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); - llvm::Value *VTableField = Builder.CreateBitCast(LoadCXXThis(), Int8PtrTy); - VTableField = - Builder.CreateConstInBoundsGEP1_64(VTableField, Base.getBaseOffset() / 8); - - // Finally, store the address point. - const llvm::Type *AddressPointPtrTy = - VTableAddressPoint->getType()->getPointerTo(); - VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy); - Builder.CreateStore(VTableAddressPoint, VTableField); + // FIXME: BaseIsMorallyVirtual is not correct here. + InitializeVTablePointer(Base, /*BaseIsMorallyVirtual=*/false, VTable, + VTableClass); } |