From: Anders Carlsson Date: Sat, 24 Apr 2010 23:01:49 +0000 (+0000) Subject: RenameGetAddressOfBaseOfCompleteClass to GetAddressOfDirectBaseInCompleteClass to... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8561a8666c70f924c8f0209c41b9b77bbbf90607;p=clang RenameGetAddressOfBaseOfCompleteClass to GetAddressOfDirectBaseInCompleteClass to reflect that it only handles direct bases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102284 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGClass.cpp b/lib/CodeGen/CGClass.cpp index bc0662db9c..3fa8680b76 100644 --- a/lib/CodeGen/CGClass.cpp +++ b/lib/CodeGen/CGClass.cpp @@ -90,16 +90,16 @@ CodeGenModule::GetNonVirtualBaseClassOffset(const CXXRecordDecl *ClassDecl, return llvm::ConstantInt::get(PtrDiffTy, Offset); } -/// Gets the address of a virtual base class within a complete object. +/// Gets the address of a direct base class within a complete object. /// This should only be used for (1) non-virtual bases or (2) virtual bases /// when the type is known to be complete (e.g. in complete destructors). /// /// The object pointed to by 'This' is assumed to be non-null. llvm::Value * -CodeGenFunction::GetAddressOfBaseOfCompleteClass(llvm::Value *This, - bool isBaseVirtual, - const CXXRecordDecl *Derived, - const CXXRecordDecl *Base) { +CodeGenFunction::GetAddressOfDirectBaseInCompleteClass(llvm::Value *This, + const CXXRecordDecl *Derived, + const CXXRecordDecl *Base, + bool BaseIsVirtual) { // 'this' must be a pointer (in some address space) to Derived. assert(This->getType()->isPointerTy() && cast(This->getType())->getElementType() @@ -108,7 +108,7 @@ CodeGenFunction::GetAddressOfBaseOfCompleteClass(llvm::Value *This, // Compute the offset of the virtual base. uint64_t Offset; const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Derived); - if (isBaseVirtual) + if (BaseIsVirtual) Offset = Layout.getVBaseClassOffset(Base); else Offset = Layout.getBaseClassOffset(Base); @@ -155,7 +155,7 @@ ApplyNonVirtualAndVirtualOffset(CodeGenFunction &CGF, llvm::Value *ThisPtr, llvm::Value * CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, - const CXXRecordDecl *ClassDecl, + const CXXRecordDecl *Derived, const CXXBaseSpecifierArray &BasePath, bool NullCheckValue) { assert(!BasePath.empty() && "Base path should not be empty!"); @@ -171,7 +171,7 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, } uint64_t NonVirtualOffset = - ComputeNonVirtualBaseClassOffset(getContext(), VBase ? VBase : ClassDecl, + ComputeNonVirtualBaseClassOffset(getContext(), VBase ? VBase : Derived, Start, BasePath.end()); // Get the base pointer type. @@ -202,7 +202,7 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, llvm::Value *VirtualOffset = 0; if (VBase) - VirtualOffset = GetVirtualBaseClassOffset(Value, ClassDecl, VBase); + VirtualOffset = GetVirtualBaseClassOffset(Value, Derived, VBase); // Apply the offsets. Value = ApplyNonVirtualAndVirtualOffset(*this, Value, NonVirtualOffset, @@ -296,18 +296,17 @@ CodeGenFunction::OldGetAddressOfBaseClass(llvm::Value *Value, llvm::Value * CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value, - const CXXRecordDecl *DerivedClass, + const CXXRecordDecl *Derived, const CXXBaseSpecifierArray &BasePath, bool NullCheckValue) { assert(!BasePath.empty() && "Base path should not be empty!"); QualType DerivedTy = - getContext().getCanonicalType( - getContext().getTypeDeclType(const_cast(DerivedClass))); + getContext().getCanonicalType(getContext().getTagDeclType(Derived)); const llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo(); llvm::Value *NonVirtualOffset = - CGM.GetNonVirtualBaseClassOffset(DerivedClass, BasePath); + CGM.GetNonVirtualBaseClassOffset(Derived, BasePath); if (!NonVirtualOffset) { // No offset, we can just cast back. @@ -837,9 +836,10 @@ static void EmitBaseInitializer(CodeGenFunction &CGF, // We can pretend to be a complete class because it only matters for // virtual bases, and we only do virtual bases for complete ctors. - llvm::Value *V = ThisPtr; - V = CGF.GetAddressOfBaseOfCompleteClass(V, isBaseVirtual, - ClassDecl, BaseClassDecl); + llvm::Value *V = + CGF.GetAddressOfDirectBaseInCompleteClass(ThisPtr, ClassDecl, + BaseClassDecl, + BaseInit->isBaseVirtual()); CGF.EmitAggExpr(BaseInit->getInit(), V, false, false, true); @@ -1154,10 +1154,10 @@ void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD, if (BaseClassDecl->hasTrivialDestructor()) continue; const CXXDestructorDecl *D = BaseClassDecl->getDestructor(getContext()); - llvm::Value *V = GetAddressOfBaseOfCompleteClass(LoadCXXThis(), - true, - ClassDecl, - BaseClassDecl); + llvm::Value *V = + GetAddressOfDirectBaseInCompleteClass(LoadCXXThis(), + ClassDecl, BaseClassDecl, + /*BaseIsVirtual=*/true); EmitCXXDestructorCall(D, Dtor_Base, V); } return; diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 3e27e94cd5..b862ef5088 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -775,11 +775,12 @@ public: } /// GetAddressOfBaseOfCompleteClass - Convert the given pointer to a - /// complete class down to one of its virtual bases. - llvm::Value *GetAddressOfBaseOfCompleteClass(llvm::Value *Value, - bool IsVirtual, - const CXXRecordDecl *Derived, - const CXXRecordDecl *Base); + /// complete class to the given direct base. + llvm::Value * + GetAddressOfDirectBaseInCompleteClass(llvm::Value *Value, + const CXXRecordDecl *Derived, + const CXXRecordDecl *Base, + bool BaseIsVirtual); llvm::Value *OldGetAddressOfBaseClass(llvm::Value *Value, const CXXRecordDecl *ClassDecl, @@ -788,12 +789,12 @@ public: /// GetAddressOfBaseClass - This function will add the necessary delta to the /// load of 'this' and returns address of the base class. llvm::Value *GetAddressOfBaseClass(llvm::Value *Value, - const CXXRecordDecl *ClassDecl, + const CXXRecordDecl *Derived, const CXXBaseSpecifierArray &BasePath, bool NullCheckValue); llvm::Value *GetAddressOfDerivedClass(llvm::Value *Value, - const CXXRecordDecl *DerivedClassDecl, + const CXXRecordDecl *Derived, const CXXBaseSpecifierArray &BasePath, bool NullCheckValue);