From d21d749d082594a2610649bd9e29ae7cb84892cf Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 13 Oct 2016 19:45:08 +0000 Subject: [PATCH] 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`. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284154 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGObjCRuntime.cpp | 20 ++++++++------------ test/CodeGenObjC/runtime-abi-match.m | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 test/CodeGenObjC/runtime-abi-match.m diff --git a/lib/CodeGen/CGObjCRuntime.cpp b/lib/CodeGen/CGObjCRuntime.cpp index ebc829272e..3da7ed230e 100644 --- a/lib/CodeGen/CGObjCRuntime.cpp +++ b/lib/CodeGen/CGObjCRuntime.cpp @@ -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(Exn)->setDoesNotThrow(); - } + if (beginCatchFn) + Exn = CGF.EmitNounwindRuntimeCall(beginCatchFn, RawExn, "exn.adjusted"); CodeGenFunction::LexicalScope cleanups(CGF, Handler.Body->getSourceRange()); diff --git a/test/CodeGenObjC/runtime-abi-match.m b/test/CodeGenObjC/runtime-abi-match.m new file mode 100644 index 0000000000..818f5ad53e --- /dev/null +++ b/test/CodeGenObjC/runtime-abi-match.m @@ -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 + -- 2.40.0