Add a simplified EmitJumpThroughFinally and use it in CGObjC in preparation of making it use the cleanup stack.

llvm-svn: 64098
This commit is contained in:
Anders Carlsson 2009-02-08 22:25:30 +00:00
parent d1d4cffae9
commit dcb149cbef
2 changed files with 15 additions and 11 deletions

View File

@ -1904,7 +1904,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
CGF.EmitBlock(TryBlock);
CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
: cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
CGF.EmitJumpThroughFinally(FinallyEnd);
// Emit the "exception in @try" block.
CGF.EmitBlock(TryHandler);
@ -1919,7 +1919,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
{
CGF.Builder.CreateStore(Caught, RethrowPtr);
CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);
CGF.EmitJumpThroughFinally(FinallyRethrow);
}
else if (const ObjCAtCatchStmt* CatchStmt =
cast<ObjCAtTryStmt>(S).getCatchStmts())
@ -1973,7 +1973,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
}
CGF.EmitStmt(CatchStmt->getCatchBody());
CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
CGF.EmitJumpThroughFinally(FinallyEnd);
break;
}
@ -2004,7 +2004,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(VD));
CGF.EmitStmt(CatchStmt->getCatchBody());
CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
CGF.EmitJumpThroughFinally(FinallyEnd);
CGF.EmitBlock(NextCatchBlock);
}
@ -2013,7 +2013,7 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
// None of the handlers caught the exception, so store it to be
// rethrown at the end of the @finally block.
CGF.Builder.CreateStore(Caught, RethrowPtr);
CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow);
CGF.EmitJumpThroughFinally(FinallyRethrow);
}
// Emit the exception handler for the @catch blocks.
@ -2022,11 +2022,11 @@ void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
ExceptionData),
RethrowPtr);
CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);
CGF.EmitJumpThroughFinally(FinallyRethrow);
} else {
CGF.Builder.CreateStore(Caught, RethrowPtr);
CGF.Builder.CreateStore(llvm::ConstantInt::getFalse(), CallTryExitPtr);
CGF.EmitJumpThroughFinally(&EHEntry, FinallyRethrow, false);
CGF.EmitJumpThroughFinally(FinallyRethrow);
}
// Pop the exception-handling stack entry. It is important to do
@ -2090,9 +2090,12 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
CGF.Builder.ClearInsertionPoint();
}
void CodeGenFunction::EmitJumpThroughFinally(llvm::BasicBlock *Dest) {
EmitJumpThroughFinally(ObjCEHStack.back(), Dest);
}
void CodeGenFunction::EmitJumpThroughFinally(ObjCEHEntry *E,
llvm::BasicBlock *Dst,
bool ExecuteTryExit) {
llvm::BasicBlock *Dst) {
if (!HaveInsertPoint())
return;

View File

@ -125,8 +125,9 @@ public:
///
/// \param ExecuteTryExit - When true, the try_exit runtime function
/// should be called prior to executing the finally code.
void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest,
bool ExecuteTryExit=true);
void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest);
void EmitJumpThroughFinally(llvm::BasicBlock *Dest);
/// PushCleanupBlock - Push a new cleanup entry on the stack and set the
/// passed in block as the cleanup block.