Refactor emitting call to delete operator into common function EmitDeleteCall.

llvm-svn: 89173
This commit is contained in:
Eli Friedman 2009-11-18 00:50:08 +00:00
parent 5bbbb13765
commit fe81e3fb3c
2 changed files with 32 additions and 46 deletions

View 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,

View 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>();
if (ShouldCallDelete)
EmitDeleteCall(E->getOperatorDelete(), Ptr, DeleteTy);
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);
}
EmitBlock(DeleteEnd);
}