forked from OSchip/llvm-project
Fix the Objective-C exception rethrow from cleanups (GNU runtimes). Note that
a bug in the inliner still causes the wrong thing to happen at -O2 and above (PR14116). llvm-svn: 167534
This commit is contained in:
parent
67dc5702f8
commit
9a837be2b9
|
@ -534,7 +534,7 @@ static void emitFilterDispatchBlock(CodeGenFunction &CGF,
|
|||
llvm::Value *zero = CGF.Builder.getInt32(0);
|
||||
llvm::Value *failsFilter =
|
||||
CGF.Builder.CreateICmpSLT(selector, zero, "ehspec.fails");
|
||||
CGF.Builder.CreateCondBr(failsFilter, unexpectedBB, CGF.getEHResumeBlock());
|
||||
CGF.Builder.CreateCondBr(failsFilter, unexpectedBB, CGF.getEHResumeBlock(false));
|
||||
|
||||
CGF.EmitBlock(unexpectedBB);
|
||||
}
|
||||
|
@ -614,7 +614,7 @@ CodeGenFunction::getEHDispatchBlock(EHScopeStack::stable_iterator si) {
|
|||
// The dispatch block for the end of the scope chain is a block that
|
||||
// just resumes unwinding.
|
||||
if (si == EHStack.stable_end())
|
||||
return getEHResumeBlock();
|
||||
return getEHResumeBlock(true);
|
||||
|
||||
// Otherwise, we should look at the actual scope.
|
||||
EHScope &scope = *EHStack.find(si);
|
||||
|
@ -1546,7 +1546,7 @@ llvm::BasicBlock *CodeGenFunction::getTerminateHandler() {
|
|||
return TerminateHandler;
|
||||
}
|
||||
|
||||
llvm::BasicBlock *CodeGenFunction::getEHResumeBlock() {
|
||||
llvm::BasicBlock *CodeGenFunction::getEHResumeBlock(bool isCleanup) {
|
||||
if (EHResumeBlock) return EHResumeBlock;
|
||||
|
||||
CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
|
||||
|
@ -1560,7 +1560,7 @@ llvm::BasicBlock *CodeGenFunction::getEHResumeBlock() {
|
|||
// This can always be a call because we necessarily didn't find
|
||||
// anything on the EH stack which needs our help.
|
||||
const char *RethrowName = Personality.CatchallRethrowFn;
|
||||
if (RethrowName != 0) {
|
||||
if (RethrowName != 0 && !isCleanup) {
|
||||
Builder.CreateCall(getCatchallRethrowFn(*this, RethrowName),
|
||||
getExceptionFromSlot())
|
||||
->setDoesNotReturn();
|
||||
|
|
|
@ -2547,7 +2547,7 @@ void CGObjCGNU::EmitTryStmt(CodeGenFunction &CGF,
|
|||
// Unlike the Apple non-fragile runtimes, which also uses
|
||||
// unwind-based zero cost exceptions, the GNU Objective C runtime's
|
||||
// EH support isn't a veneer over C++ EH. Instead, exception
|
||||
// objects are created by __objc_exception_throw and destroyed by
|
||||
// objects are created by objc_exception_throw and destroyed by
|
||||
// the personality function; this avoids the need for bracketing
|
||||
// catch handlers with calls to __blah_begin_catch/__blah_end_catch
|
||||
// (or even _Unwind_DeleteException), but probably doesn't
|
||||
|
@ -2572,7 +2572,9 @@ void CGObjCGNU::EmitThrowStmt(CodeGenFunction &CGF,
|
|||
ExceptionAsObject = CGF.ObjCEHValueStack.back();
|
||||
}
|
||||
ExceptionAsObject = CGF.Builder.CreateBitCast(ExceptionAsObject, IdTy);
|
||||
CGF.EmitCallOrInvoke(ExceptionThrowFn, ExceptionAsObject);
|
||||
llvm::CallSite Throw =
|
||||
CGF.EmitCallOrInvoke(ExceptionThrowFn, ExceptionAsObject);
|
||||
Throw.setDoesNotReturn();
|
||||
CGF.Builder.CreateUnreachable();
|
||||
CGF.Builder.ClearInsertionPoint();
|
||||
}
|
||||
|
|
|
@ -908,7 +908,7 @@ public:
|
|||
/// themselves).
|
||||
void popCatchScope();
|
||||
|
||||
llvm::BasicBlock *getEHResumeBlock();
|
||||
llvm::BasicBlock *getEHResumeBlock(bool isCleanup);
|
||||
llvm::BasicBlock *getEHDispatchBlock(EHScopeStack::stable_iterator scope);
|
||||
|
||||
/// An object to manage conditionally-evaluated expressions.
|
||||
|
|
|
@ -20,7 +20,7 @@ void test0() {
|
|||
|
||||
// CHECK: call void @log(i32 0)
|
||||
|
||||
// CHECK: call void @objc_exception_throw
|
||||
// CHECK: resume
|
||||
|
||||
log(0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue