CodeGen: ensure that the runtime calling convention matches

Incorrect specification of the calling convention results in UB which can cause
the code path to be eliminated.  Simplify the existing code by using the
RuntimeCall constructor in `CodeGenFunction`.

llvm-svn: 284154
This commit is contained in:
Saleem Abdulrasool 2016-10-13 19:45:08 +00:00
parent 52ffa6711b
commit 887a82c5d6
2 changed files with 32 additions and 12 deletions

View File

@ -150,18 +150,16 @@ namespace {
};
struct CallObjCEndCatch final : EHScopeStack::Cleanup {
CallObjCEndCatch(bool MightThrow, llvm::Value *Fn) :
MightThrow(MightThrow), Fn(Fn) {}
CallObjCEndCatch(bool MightThrow, llvm::Value *Fn)
: MightThrow(MightThrow), Fn(Fn) {}
bool MightThrow;
llvm::Value *Fn;
void Emit(CodeGenFunction &CGF, Flags flags) override {
if (!MightThrow) {
CGF.Builder.CreateCall(Fn)->setDoesNotThrow();
return;
}
CGF.EmitRuntimeCallOrInvoke(Fn);
if (MightThrow)
CGF.EmitRuntimeCallOrInvoke(Fn);
else
CGF.EmitNounwindRuntimeCall(Fn);
}
};
}
@ -230,10 +228,8 @@ void CGObjCRuntime::EmitTryCatchStmt(CodeGenFunction &CGF,
// Enter the catch.
llvm::Value *Exn = RawExn;
if (beginCatchFn) {
Exn = CGF.Builder.CreateCall(beginCatchFn, RawExn, "exn.adjusted");
cast<llvm::CallInst>(Exn)->setDoesNotThrow();
}
if (beginCatchFn)
Exn = CGF.EmitNounwindRuntimeCall(beginCatchFn, RawExn, "exn.adjusted");
CodeGenFunction::LexicalScope cleanups(CGF, Handler.Body->getSourceRange());

View File

@ -0,0 +1,24 @@
// RUN: %clang -target armv7-windows -fobjc-runtime=ios -O1 -fexceptions -S -emit-llvm %s -o - | FileCheck %s
void (*f)(id);
void (*g)(void);
void h(void);
@interface NSNumber
+ (NSNumber *)numberWithInt:(int)i;
@end
void i(void) {
@try {
@throw(@1);
} @catch (id i) {
(*f)(i);
(*g)();
}
}
// CHECK: call arm_aapcs_vfpcc i8* @objc_begin_catch
// CHECK: call arm_aapcs_vfpcc void @objc_end_catch
// CHECK-NOT: call i8* @objc_begin_catch
// CHECK-NOT: call void @objc_end_catch