From: Anders Carlsson Date: Fri, 6 Nov 2009 02:55:43 +0000 (+0000) Subject: Cleanup ctor/dtor emission. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4365bba95be15342575b4f030c6583a770a5da3d;p=clang Cleanup ctor/dtor emission. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86222 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 4be341311c..281aa604fe 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/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(FD); - llvm::BasicBlock *DtorEpilogue = 0; - if (DD) { - DtorEpilogue = createBasicBlock("dtor.epilogue"); - - PushCleanupBlock(DtorEpilogue); - } - - if (const CXXConstructorDecl *CD = dyn_cast(FD)) + + if (const CXXConstructorDecl *CD = dyn_cast(FD)) { EmitCtorPrologue(CD, GD.getCtorType()); - EmitStmt(S); + EmitStmt(S); + } else if (const CXXDestructorDecl *DD = dyn_cast(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 =