summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorAkira Hatanaka <ahatanaka@apple.com>2019-05-10 21:54:16 +0000
committerAkira Hatanaka <ahatanaka@apple.com>2019-05-10 21:54:16 +0000
commit34d28cf25f38aa220d0b43d70ab430ec693252fa (patch)
tree6e8e459f5dbfdb6f408ac38a46f36b5fa22e79d8 /clang/lib/CodeGen
parent7eb6b5ffc3c7c2a5c988dad209671bdaff452cc4 (diff)
downloadbcm5719-llvm-34d28cf25f38aa220d0b43d70ab430ec693252fa.tar.gz
bcm5719-llvm-34d28cf25f38aa220d0b43d70ab430ec693252fa.zip
[CodeGen][ObjC] Emit invoke instead of call to call `objc_release` when
necessary. Prior to r349952, clang used to call objc_msgSend when sending a release messages, emitting an invoke instruction instead of a call instruction when it was necessary to catch an exception. That changed in r349952 because runtime function objc_release is called as a nounwind function, which broke programs that were overriding the dealloc method and throwing an exception from it. This patch restores the behavior prior to r349952. rdar://problem/50253394 Differential Revision: https://reviews.llvm.org/D61803 llvm-svn: 360474
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index d5906cf994c..5b675651513 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -2631,7 +2631,7 @@ void CodeGenFunction::EmitObjCRelease(llvm::Value *value,
value = Builder.CreateBitCast(value, Int8PtrTy);
// Call objc_release.
- llvm::CallInst *call = EmitNounwindRuntimeCall(fn, value);
+ llvm::CallBase *call = EmitCallOrInvoke(fn, value);
if (precise == ARCImpreciseLifetime) {
call->setMetadata("clang.imprecise_release",
OpenPOWER on IntegriCloud