Switch the __cxa_rethrow cleanup to be lazy.

llvm-svn: 108288
This commit is contained in:
John McCall 2010-07-13 22:24:23 +00:00
parent 5c08ab956b
commit 5c0e69ef0e
1 changed files with 12 additions and 6 deletions

View File

@ -1202,6 +1202,14 @@ static void BeginCatch(CodeGenFunction &CGF,
CGF.EmitLocalBlockVarDecl(*CatchParam, &InitCatchParam);
}
namespace {
struct CallRethrow : EHScopeStack::LazyCleanup {
void Emit(CodeGenFunction &CGF, bool IsForEH) {
CGF.EmitCallOrInvoke(getReThrowFn(CGF), 0, 0);
}
};
}
void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
unsigned NumHandlers = S.getNumHandlers();
EHCatchScope &CatchScope = cast<EHCatchScope>(*EHStack.begin());
@ -1242,12 +1250,10 @@ void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) {
BeginCatch(*this, C);
// If there's an implicit rethrow, push a normal "cleanup" to call
// _cxa_rethrow. This needs to happen before _cxa_end_catch is
// called.
if (ImplicitRethrow) {
CleanupBlock Rethrow(*this, NormalCleanup);
EmitCallOrInvoke(getReThrowFn(*this), 0, 0);
}
// _cxa_rethrow. This needs to happen before __cxa_end_catch is
// called, and so it is pushed after BeginCatch.
if (ImplicitRethrow)
EHStack.pushLazyCleanup<CallRethrow>(NormalCleanup);
// Perform the body of the catch.
EmitStmt(C->getHandlerBlock());