зеркало из https://github.com/microsoft/clang-1.git
Switch the __cxa_rethrow cleanup to be lazy.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108288 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8e3f861939
Коммит
fcd5c0c62e
|
@ -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());
|
||||
|
|
Загрузка…
Ссылка в новой задаче