diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-06 02:55:43 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-06 02:55:43 +0000 |
commit | 438cf925334a3feaa18030bfc5dea72d7f1ee6e6 (patch) | |
tree | bd6a630316646d164a44d4cee7ddafd0b615e6ff /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | 9e4e0237e4ed2c19726aace47198bbf6a35e61e9 (diff) | |
download | bcm5719-llvm-438cf925334a3feaa18030bfc5dea72d7f1ee6e6.tar.gz bcm5719-llvm-438cf925334a3feaa18030bfc5dea72d7f1ee6e6.zip |
Cleanup ctor/dtor emission.
llvm-svn: 86222
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 4be341311ce..281aa604fe3 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -260,19 +260,16 @@ 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)) + + if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) { EmitCtorPrologue(CD, GD.getCtorType()); - EmitStmt(S); + EmitStmt(S); + } else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD)) { + llvm::BasicBlock *DtorEpilogue = createBasicBlock("dtor.epilogue"); + PushCleanupBlock(DtorEpilogue); + + EmitStmt(S); - if (DD) { CleanupBlockInfo Info = PopCleanupBlock(); assert(Info.CleanupBlock == DtorEpilogue && "Block mismatch!"); @@ -283,7 +280,11 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, EmitBlock(Info.SwitchBlock); if (Info.EndBlock) EmitBlock(Info.EndBlock); + } else { + // Just a regular function, emit its body. + EmitStmt(S); } + FinishFunction(S->getRBracLoc()); } else if (FD->isImplicit()) { const CXXRecordDecl *ClassDecl = |