Move C++ destructor emission into CGCXXABI
No functionality change. Only Itanium C++ destructors have implicit VTT
parameters.
llvm-svn: 197194
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index 6e2f497..46a9256 100644
--- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -156,6 +156,10 @@
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 @@
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();