diff options
author | Anders Carlsson <andersca@mac.com> | 2009-10-06 18:09:57 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-10-06 18:09:57 +0000 |
commit | 6b7378bbe1d96bea701d71e9555651e75409ac07 (patch) | |
tree | de8c1367623723293905e40f3fddd5150cbf3bcd /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | 36d1b14ddedb32dfc628ec7ee4259ea8aa9268b6 (diff) | |
download | bcm5719-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.cpp | 21 |
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 = |