summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-10-06 18:09:57 +0000
committerAnders Carlsson <andersca@mac.com>2009-10-06 18:09:57 +0000
commit6b7378bbe1d96bea701d71e9555651e75409ac07 (patch)
treede8c1367623723293905e40f3fddd5150cbf3bcd /clang/lib/CodeGen/CodeGenFunction.cpp
parent36d1b14ddedb32dfc628ec7ee4259ea8aa9268b6 (diff)
downloadbcm5719-llvm-6b7378bbe1d96bea701d71e9555651e75409ac07.tar.gz
bcm5719-llvm-6b7378bbe1d96bea701d71e9555651e75409ac07.zip
Emit the destructor epilogue in a cleanup block so a return from a destructor body still calls the epilogue.
llvm-svn: 83397
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index f9e54b75708..f802068b26d 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -233,11 +233,30 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD,
// FIXME: Support CXXTryStmt here, too.
if (const CompoundStmt *S = FD->getCompoundBody()) {
StartFunction(GD, FD->getResultType(), Fn, Args, S->getLBracLoc());
+ const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD);
+ llvm::BasicBlock *DtorEpilogue = 0;
+ if (DD) {
+ DtorEpilogue = createBasicBlock("dtor.epilogue");
+
+ PushCleanupBlock(DtorEpilogue);
+ }
+
if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD))
EmitCtorPrologue(CD, GD.getCtorType());
EmitStmt(S);
- if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD))
+
+ if (DD) {
+ CleanupBlockInfo Info = PopCleanupBlock();
+
+ assert(Info.CleanupBlock == DtorEpilogue && "Block mismatch!");
+ EmitBlock(DtorEpilogue);
EmitDtorEpilogue(DD, GD.getDtorType());
+
+ if (Info.SwitchBlock)
+ EmitBlock(Info.SwitchBlock);
+ if (Info.EndBlock)
+ EmitBlock(Info.EndBlock);
+ }
FinishFunction(S->getRBracLoc());
} else if (FD->isImplicit()) {
const CXXRecordDecl *ClassDecl =
OpenPOWER on IntegriCloud