diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGCXXABI.h | 8 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 19 | ||||
-rw-r--r-- | clang/lib/CodeGen/ItaniumCXXABI.cpp | 31 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 18 |
4 files changed, 56 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CGCXXABI.h b/clang/lib/CodeGen/CGCXXABI.h index 0e7577e4dcc..cbb120f576f 100644 --- a/clang/lib/CodeGen/CGCXXABI.h +++ b/clang/lib/CodeGen/CGCXXABI.h @@ -291,7 +291,7 @@ public: /// Emit the ABI-specific prolog for the function. virtual void EmitInstanceFunctionProlog(CodeGenFunction &CGF) = 0; - /// Emit the constructor call. Return the function that is called. + /// Emit the constructor call. virtual void EmitConstructorCall(CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, @@ -300,6 +300,12 @@ public: CallExpr::const_arg_iterator ArgBeg, CallExpr::const_arg_iterator ArgEnd) = 0; + /// Emit the destructor call. + virtual void EmitDestructorCall(CodeGenFunction &CGF, + const CXXDestructorDecl *DD, CXXDtorType Type, + bool ForVirtualBase, bool Delegating, + llvm::Value *This) = 0; + /// Emits the VTable definitions required for the given record type. virtual void emitVTableDefinitions(CodeGenVTables &CGVT, const CXXRecordDecl *RD) = 0; diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index d503d332e7d..7a0391b9b9c 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -1814,23 +1814,8 @@ void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *DD, bool ForVirtualBase, bool Delegating, llvm::Value *This) { - GlobalDecl GD(DD, Type); - llvm::Value *VTT = GetVTTParameter(GD, ForVirtualBase, Delegating); - llvm::Value *Callee = 0; - if (getLangOpts().AppleKext) - Callee = BuildAppleKextVirtualDestructorCall(DD, Type, - DD->getParent()); - - if (!Callee) - Callee = CGM.GetAddrOfCXXDestructor(DD, Type); - - if (DD->isVirtual()) - This = CGM.getCXXABI().adjustThisArgumentForVirtualCall(*this, GD, This); - - // FIXME: Provide a source location here. - EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This, - VTT, getContext().getPointerType(getContext().VoidPtrTy), - 0, 0); + CGM.getCXXABI().EmitDestructorCall(*this, DD, Type, ForVirtualBase, + Delegating, This); } namespace { diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index 2a311a0cf0c..bb8b5362025 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -149,6 +149,10 @@ public: CallExpr::const_arg_iterator ArgBeg, CallExpr::const_arg_iterator ArgEnd); + void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD, + CXXDtorType Type, bool ForVirtualBase, + bool Delegating, llvm::Value *This); + void emitVTableDefinitions(CodeGenVTables &CGVT, const CXXRecordDecl *RD); llvm::Value *getVTableAddressPointInStructor( @@ -917,8 +921,31 @@ void ItaniumCXXABI::EmitConstructorCall(CodeGenFunction &CGF, llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type); // FIXME: Provide a source location here. - CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValueSlot(), - This, VTT, VTTTy, ArgBeg, ArgEnd); + CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValueSlot(), This, + VTT, VTTTy, ArgBeg, ArgEnd); +} + +void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF, + const CXXDestructorDecl *DD, + CXXDtorType Type, bool ForVirtualBase, + bool Delegating, llvm::Value *This) { + GlobalDecl GD(DD, Type); + llvm::Value *VTT = CGF.GetVTTParameter(GD, ForVirtualBase, Delegating); + QualType VTTTy = getContext().getPointerType(getContext().VoidPtrTy); + + llvm::Value *Callee = 0; + if (getContext().getLangOpts().AppleKext) + Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent()); + + if (!Callee) + Callee = CGM.GetAddrOfCXXDestructor(DD, Type); + + if (DD->isVirtual()) + This = adjustThisArgumentForVirtualCall(CGF, GD, This); + + // FIXME: Provide a source location here. + CGF.EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This, + VTT, VTTTy, 0, 0); } void ItaniumCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT, diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 6e2f4975b80..46a9256a32e 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -156,6 +156,10 @@ public: CallExpr::const_arg_iterator ArgBeg, CallExpr::const_arg_iterator ArgEnd); + void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD, + CXXDtorType Type, bool ForVirtualBase, + bool Delegating, llvm::Value *This); + void emitVTableDefinitions(CodeGenVTables &CGVT, const CXXRecordDecl *RD); llvm::Value *getVTableAddressPointInStructor( @@ -807,6 +811,20 @@ void MicrosoftCXXABI::EmitConstructorCall(CodeGenFunction &CGF, ImplicitParam, ImplicitParamTy, ArgBeg, ArgEnd); } +void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF, + const CXXDestructorDecl *DD, + CXXDtorType Type, bool ForVirtualBase, + bool Delegating, llvm::Value *This) { + llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(DD, Type); + + if (DD->isVirtual()) + This = adjustThisArgumentForVirtualCall(CGF, GlobalDecl(DD, Type), This); + + // FIXME: Provide a source location here. + CGF.EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This, + /*ImplicitParam=*/0, /*ImplicitParamTy=*/QualType(), 0, 0); +} + void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT, const CXXRecordDecl *RD) { MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext(); |