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);
{
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())
}
CGF.EmitStmt(CatchStmt->getCatchBody());
- CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
+ CGF.EmitJumpThroughFinally(FinallyEnd);
break;
}
CGF.Builder.CreateStore(Tmp, CGF.GetAddrOfLocalVar(VD));
CGF.EmitStmt(CatchStmt->getCatchBody());
- CGF.EmitJumpThroughFinally(&EHEntry, FinallyEnd);
+ CGF.EmitJumpThroughFinally(FinallyEnd);
CGF.EmitBlock(NextCatchBlock);
}
// 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.
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
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;
///
/// \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.