]> granicus.if.org Git - clang/commitdiff
Refactor emitting call to delete operator into common function EmitDeleteCall.
authorEli Friedman <eli.friedman@gmail.com>
Wed, 18 Nov 2009 00:50:08 +0000 (00:50 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 18 Nov 2009 00:50:08 +0000 (00:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89173 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
lib/CodeGen/CGCXXExpr.cpp

index 82f3cfefcabe496bf476482e86b49364208c7502..8f5cff4efafe3b5bc36de2fdb6af26f99a106b12 100644 (file)
@@ -1734,26 +1734,9 @@ void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD,
   }
     
   // If we have a deleting destructor, emit a call to the delete operator.
-  if (DtorType == Dtor_Deleting) {
-    const FunctionDecl *DeleteFD = DD->getOperatorDelete();
-    assert(DeleteFD && "deleting dtor did not have a delete operator!");
-    
-    const FunctionProtoType *DeleteFTy =
-      DeleteFD->getType()->getAs<FunctionProtoType>();
-
-    CallArgList DeleteArgs;
-
-    QualType ArgTy = DeleteFTy->getArgType(0);
-    llvm::Value *DeletePtr = Builder.CreateBitCast(LoadCXXThis(), 
-                                                   ConvertType(ArgTy));
-    DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy));
-
-    // Emit the call to delete.
-    EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(),
-                                            DeleteArgs),
-             CGM.GetAddrOfFunction(DeleteFD),
-             DeleteArgs, DeleteFD);
-  }
+  if (DtorType == Dtor_Deleting)
+    EmitDeleteCall(DD->getOperatorDelete(), LoadCXXThis(),
+                   getContext().getTagDeclType(ClassDecl));
 }
 
 void CodeGenFunction::SynthesizeDefaultDestructor(const CXXDestructorDecl *Dtor,
index a93210904d1ee5389030aaf918c4f86915a9731b..cd7d21b3b951811a0a7e0fceab6b70260c6582aa 100644 (file)
@@ -234,6 +234,33 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
   return NewPtr;
 }
 
+void CodeGenFunction::EmitDeleteCall(const FunctionDecl *DeleteFD,
+                                     llvm::Value *Ptr,
+                                     QualType DeleteTy) {
+  const FunctionProtoType *DeleteFTy =
+    DeleteFD->getType()->getAs<FunctionProtoType>();
+
+  CallArgList DeleteArgs;
+
+  QualType ArgTy = DeleteFTy->getArgType(0);
+  llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy));
+  DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy));
+
+  if (DeleteFTy->getNumArgs() == 2) {
+    QualType SizeTy = DeleteFTy->getArgType(1);
+    uint64_t SizeVal = getContext().getTypeSize(DeleteTy) / 8;
+    llvm::Constant *Size = llvm::ConstantInt::get(ConvertType(SizeTy),
+                                                  SizeVal);
+    DeleteArgs.push_back(std::make_pair(RValue::get(Size), SizeTy));
+  }
+
+  // Emit the call to delete.
+  EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(),
+                                          DeleteArgs),
+           CGM.GetAddrOfFunction(DeleteFD),
+           DeleteArgs, DeleteFD);
+}
+
 void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
   
   // Get at the argument before we performed the implicit conversion
@@ -313,33 +340,9 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
     }
   }
 
-  if (ShouldCallDelete) {
-    // Call delete.
-    FunctionDecl *DeleteFD = E->getOperatorDelete();
-    const FunctionProtoType *DeleteFTy =
-      DeleteFD->getType()->getAs<FunctionProtoType>();
-
-    CallArgList DeleteArgs;
+  if (ShouldCallDelete)
+    EmitDeleteCall(E->getOperatorDelete(), Ptr, DeleteTy);
 
-    QualType ArgTy = DeleteFTy->getArgType(0);
-    llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy));
-    DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy));
-
-    if (DeleteFTy->getNumArgs() == 2) {
-      QualType SizeTy = DeleteFTy->getArgType(1);
-      uint64_t SizeVal = getContext().getTypeSize(DeleteTy) / 8;
-      llvm::Constant *Size = llvm::ConstantInt::get(ConvertType(SizeTy),
-                                                    SizeVal);
-      DeleteArgs.push_back(std::make_pair(RValue::get(Size), SizeTy));
-    }
-
-    // Emit the call to delete.
-    EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(),
-                                            DeleteArgs),
-             CGM.GetAddrOfFunction(DeleteFD),
-             DeleteArgs, DeleteFD);
-  }
-  
   EmitBlock(DeleteEnd);
 }