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
diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp
index 57b65b9..a21af41 100644
--- a/lib/CodeGen/CGClass.cpp
+++ b/lib/CodeGen/CGClass.cpp
@@ -105,6 +105,33 @@
   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 @@
   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 @@
     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);