forked from OSchip/llvm-project
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:
parent
52ffa6711b
commit
887a82c5d6
|
@ -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());
|
||||
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue