diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-01 07:37:17 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-01 07:37:17 +0000 |
commit | 0868137ac8c9661bd345444d17ac1d53bbc1a996 (patch) | |
tree | fb662d8072273eebfc951662728faaa21dabc1f0 /clang/lib/CodeGen | |
parent | b9bd6fb3976684fdfc39dd77b15d231aa4fd352d (diff) | |
download | bcm5719-llvm-0868137ac8c9661bd345444d17ac1d53bbc1a996.tar.gz bcm5719-llvm-0868137ac8c9661bd345444d17ac1d53bbc1a996.zip |
CodeGen: Declutter the emitVirtualObjectDelete interface
No functionality change intended.
llvm-svn: 221043
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGCXXABI.h | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 13 | ||||
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 16 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 15 |
4 files changed, 24 insertions, 23 deletions
diff --git a/clang/lib/CodeGen/CGCXXABI.h b/clang/lib/CodeGen/CGCXXABI.h index 9739f064478..c52b8e29d12 100644 --- a/clang/lib/CodeGen/CGCXXABI.h +++ b/clang/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/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index f81edb62225..3d1283f04b9 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/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<CallObjectDelete>(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/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 93d5ff13ecb..084fd3be5b3 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/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/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 428c7b11a47..5bdda98d68f 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/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 |