diff options
author | Anders Carlsson <andersca@mac.com> | 2010-04-20 16:03:35 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-04-20 16:03:35 +0000 |
commit | 9dc228a1b971aa884766a9bdfdf5fa8ee4730b5b (patch) | |
tree | 93d2eeca0acb9ff23c1f9436dd6ea2b3b0730fda /lib/CodeGen/CGClass.cpp | |
parent | 81d3466d037dc5844234c7a93dab21a6ad986e7d (diff) |
Move code to apply a non-virtual and virtual offset out into a separate function.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101909 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGClass.cpp')
-rw-r--r-- | lib/CodeGen/CGClass.cpp | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index 57b65b9e7b..a21af413fd 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -105,6 +105,33 @@ CodeGenFunction::GetAddressOfBaseOfCompleteClass(llvm::Value *This, return V; } +static llvm::Value * +ApplyNonVirtualAndVirtualOffset(CodeGenFunction &CGF, llvm::Value *ThisPtr, + uint64_t NonVirtual, llvm::Value *Virtual) { + const llvm::Type *PtrDiffTy = + CGF.ConvertType(CGF.getContext().getPointerDiffType()); + + llvm::Value *NonVirtualOffset = 0; + if (NonVirtual) + NonVirtualOffset = llvm::ConstantInt::get(PtrDiffTy, NonVirtual); + + llvm::Value *BaseOffset; + if (Virtual) { + if (NonVirtualOffset) + BaseOffset = CGF.Builder.CreateAdd(Virtual, NonVirtualOffset); + else + BaseOffset = Virtual; + } else + BaseOffset = NonVirtualOffset; + + // Apply the base offset. + const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); + ThisPtr = CGF.Builder.CreateBitCast(ThisPtr, Int8PtrTy); + ThisPtr = CGF.Builder.CreateGEP(ThisPtr, BaseOffset, "add.ptr"); + + return ThisPtr; +} + llvm::Value * CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, const CXXRecordDecl *Class, @@ -136,7 +163,6 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, assert(!Paths.isAmbiguous(BTy) && "Path is ambiguous"); unsigned Start = 0; - llvm::Value *VirtualOffset = 0; const CXXBasePath &Path = Paths.front(); const CXXRecordDecl *VBase = 0; @@ -173,27 +199,13 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, EmitBlock(CastNotNull); } + llvm::Value *VirtualOffset = 0; + if (VBase) VirtualOffset = GetVirtualBaseClassOffset(Value, Class, VBase); - const llvm::Type *PtrDiffTy = ConvertType(getContext().getPointerDiffType()); - llvm::Value *NonVirtualOffset = 0; - if (Offset) - NonVirtualOffset = llvm::ConstantInt::get(PtrDiffTy, Offset); - - llvm::Value *BaseOffset; - if (VBase) { - if (NonVirtualOffset) - BaseOffset = Builder.CreateAdd(VirtualOffset, NonVirtualOffset); - else - BaseOffset = VirtualOffset; - } else - BaseOffset = NonVirtualOffset; - - // Apply the base offset. - const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(getLLVMContext()); - Value = Builder.CreateBitCast(Value, Int8PtrTy); - Value = Builder.CreateGEP(Value, BaseOffset, "add.ptr"); + // Apply the offsets. + Value = ApplyNonVirtualAndVirtualOffset(*this, Value, Offset, VirtualOffset); // Cast back. Value = Builder.CreateBitCast(Value, BasePtrTy); |