From 5e7180b8436993360d97b8d749f75cbdcc3967c4 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 1 Nov 2014 07:37:17 +0000 Subject: [PATCH] CodeGen: Declutter the emitVirtualObjectDelete interface No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221043 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCXXABI.h | 3 +-- lib/CodeGen/CGExprCXX.cpp | 13 ++++++------- lib/CodeGen/ItaniumCXXABI.cpp | 16 +++++++++------- lib/CodeGen/MicrosoftCXXABI.cpp | 15 ++++++++------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lib/CodeGen/CGCXXABI.h b/lib/CodeGen/CGCXXABI.h index 9739f06447..c52b8e29d1 100644 --- a/lib/CodeGen/CGCXXABI.h +++ b/lib/CodeGen/CGCXXABI.h @@ -210,9 +210,8 @@ protected: public: virtual void emitVirtualObjectDelete(CodeGenFunction &CGF, - const FunctionDecl *OperatorDelete, + const CXXDeleteExpr *DE, llvm::Value *Ptr, QualType ElementType, - bool UseGlobalDelete, const CXXDestructorDecl *Dtor) = 0; virtual llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) = 0; diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index f81edb6222..3d1283f04b 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -1420,10 +1420,9 @@ CodeGenFunction::pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, /// Emit the code for deleting a single object. static void EmitObjectDelete(CodeGenFunction &CGF, - const FunctionDecl *OperatorDelete, + const CXXDeleteExpr *DE, llvm::Value *Ptr, - QualType ElementType, - bool UseGlobalDelete) { + QualType ElementType) { // Find the destructor for the type, if applicable. If the // destructor is virtual, we'll just emit the vcall and return. const CXXDestructorDecl *Dtor = nullptr; @@ -1433,8 +1432,8 @@ static void EmitObjectDelete(CodeGenFunction &CGF, Dtor = RD->getDestructor(); if (Dtor->isVirtual()) { - CGF.CGM.getCXXABI().emitVirtualObjectDelete( - CGF, OperatorDelete, Ptr, ElementType, UseGlobalDelete, Dtor); + CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType, + Dtor); return; } } @@ -1443,6 +1442,7 @@ static void EmitObjectDelete(CodeGenFunction &CGF, // Make sure that we call delete even if the dtor throws. // This doesn't have to a conditional cleanup because we're going // to pop it off in a second. + const FunctionDecl *OperatorDelete = DE->getOperatorDelete(); CGF.EHStack.pushCleanup(NormalAndEHCleanup, Ptr, OperatorDelete, ElementType); @@ -1619,8 +1619,7 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) { if (E->isArrayForm()) { EmitArrayDelete(*this, E, Ptr, DeleteTy); } else { - EmitObjectDelete(*this, E->getOperatorDelete(), Ptr, DeleteTy, - E->isGlobalDelete()); + EmitObjectDelete(*this, E, Ptr, DeleteTy); } EmitBlock(DeleteEnd); diff --git a/lib/CodeGen/ItaniumCXXABI.cpp b/lib/CodeGen/ItaniumCXXABI.cpp index 93d5ff13ec..084fd3be5b 100644 --- a/lib/CodeGen/ItaniumCXXABI.cpp +++ b/lib/CodeGen/ItaniumCXXABI.cpp @@ -106,10 +106,8 @@ public: llvm::Value *Addr, const MemberPointerType *MPT) override; - void emitVirtualObjectDelete(CodeGenFunction &CGF, - const FunctionDecl *OperatorDelete, + void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, llvm::Value *Ptr, QualType ElementType, - bool UseGlobalDelete, const CXXDestructorDecl *Dtor) override; void EmitFundamentalRTTIDescriptor(QualType Type); @@ -851,9 +849,12 @@ bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) { /// The Itanium ABI always places an offset to the complete object /// at entry -2 in the vtable. -void ItaniumCXXABI::emitVirtualObjectDelete( - CodeGenFunction &CGF, const FunctionDecl *OperatorDelete, llvm::Value *Ptr, - QualType ElementType, bool UseGlobalDelete, const CXXDestructorDecl *Dtor) { +void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, + const CXXDeleteExpr *DE, + llvm::Value *Ptr, + QualType ElementType, + const CXXDestructorDecl *Dtor) { + bool UseGlobalDelete = DE->isGlobalDelete(); if (UseGlobalDelete) { // Derive the complete-object pointer, which is what we need // to pass to the deallocation function. @@ -873,7 +874,8 @@ void ItaniumCXXABI::emitVirtualObjectDelete( // If we're supposed to call the global delete, make sure we do so // even if the destructor throws. - CGF.pushCallObjectDeleteCleanup(OperatorDelete, CompletePtr, ElementType); + CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr, + ElementType); } // FIXME: Provide a source location here even though there's no diff --git a/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index 428c7b11a4..5bdda98d68 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/lib/CodeGen/MicrosoftCXXABI.cpp @@ -66,10 +66,8 @@ public: StringRef GetPureVirtualCallName() override { return "_purecall"; } StringRef GetDeletedVirtualCallName() override { return "_purecall"; } - void emitVirtualObjectDelete(CodeGenFunction &CGF, - const FunctionDecl *OperatorDelete, + void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, llvm::Value *Ptr, QualType ElementType, - bool UseGlobalDelete, const CXXDestructorDecl *Dtor) override; llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD, @@ -652,16 +650,19 @@ MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const { llvm_unreachable("invalid enum"); } -void MicrosoftCXXABI::emitVirtualObjectDelete( - CodeGenFunction &CGF, const FunctionDecl *OperatorDelete, llvm::Value *Ptr, - QualType ElementType, bool UseGlobalDelete, const CXXDestructorDecl *Dtor) { +void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, + const CXXDeleteExpr *DE, + llvm::Value *Ptr, + QualType ElementType, + const CXXDestructorDecl *Dtor) { // FIXME: Provide a source location here even though there's no // CXXMemberCallExpr for dtor call. + bool UseGlobalDelete = DE->isGlobalDelete(); CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting; llvm::Value *MDThis = EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, /*CE=*/nullptr); if (UseGlobalDelete) - CGF.EmitDeleteCall(OperatorDelete, MDThis, ElementType); + CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType); } /// \brief Gets the offset to the virtual base that contains the vfptr for -- 2.40.0