r360802 - [CodeGenObjC] invoke objc_autorelease, objc_retain when necessary
Erik Pilkington via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 13:15:01 PDT 2019
Author: epilk
Date: Wed May 15 13:15:01 2019
New Revision: 360802
URL: http://llvm.org/viewvc/llvm-project?rev=360802&view=rev
Log:
[CodeGenObjC] invoke objc_autorelease, objc_retain when necessary
Any of these methods can be overridden, so we need to invoke these functions.
Differential revision: https://reviews.llvm.org/D61957
Modified:
cfe/trunk/lib/CodeGen/CGObjC.cpp
cfe/trunk/test/CodeGenObjC/convert-messages-to-runtime-calls.m
cfe/trunk/test/CodeGenObjC/objc-alloc-init.m
Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=360802&r1=360801&r2=360802&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Wed May 15 13:15:01 2019
@@ -2059,7 +2059,7 @@ static llvm::Value *emitObjCValueOperati
llvm::Value *value,
llvm::Type *returnType,
llvm::FunctionCallee &fn,
- StringRef fnName, bool MayThrow) {
+ StringRef fnName) {
if (isa<llvm::ConstantPointerNull>(value))
return value;
@@ -2079,11 +2079,7 @@ static llvm::Value *emitObjCValueOperati
value = CGF.Builder.CreateBitCast(value, CGF.Int8PtrTy);
// Call the function.
- llvm::CallBase *Inst = nullptr;
- if (MayThrow)
- Inst = CGF.EmitCallOrInvoke(fn, value);
- else
- Inst = CGF.EmitNounwindRuntimeCall(fn, value);
+ llvm::CallBase *Inst = CGF.EmitCallOrInvoke(fn, value);
// Cast the result back to the original type.
return CGF.Builder.CreateBitCast(Inst, origType);
@@ -2536,7 +2532,7 @@ llvm::Value *CodeGenFunction::EmitObjCAl
llvm::Type *resultType) {
return emitObjCValueOperation(*this, value, resultType,
CGM.getObjCEntrypoints().objc_alloc,
- "objc_alloc", /*MayThrow=*/true);
+ "objc_alloc");
}
/// Allocate the given objc object.
@@ -2545,14 +2541,14 @@ llvm::Value *CodeGenFunction::EmitObjCAl
llvm::Type *resultType) {
return emitObjCValueOperation(*this, value, resultType,
CGM.getObjCEntrypoints().objc_allocWithZone,
- "objc_allocWithZone", /*MayThrow=*/true);
+ "objc_allocWithZone");
}
llvm::Value *CodeGenFunction::EmitObjCAllocInit(llvm::Value *value,
llvm::Type *resultType) {
return emitObjCValueOperation(*this, value, resultType,
CGM.getObjCEntrypoints().objc_alloc_init,
- "objc_alloc_init", /*MayThrow=*/true);
+ "objc_alloc_init");
}
/// Produce the code to do a primitive release.
@@ -2596,7 +2592,7 @@ llvm::Value *CodeGenFunction::EmitObjCAu
return emitObjCValueOperation(
*this, value, returnType,
CGM.getObjCEntrypoints().objc_autoreleaseRuntimeFunction,
- "objc_autorelease", /*MayThrow=*/false);
+ "objc_autorelease");
}
/// Retain the given object, with normal retain semantics.
@@ -2605,8 +2601,7 @@ llvm::Value *CodeGenFunction::EmitObjCRe
llvm::Type *returnType) {
return emitObjCValueOperation(
*this, value, returnType,
- CGM.getObjCEntrypoints().objc_retainRuntimeFunction, "objc_retain",
- /*MayThrow=*/false);
+ CGM.getObjCEntrypoints().objc_retainRuntimeFunction, "objc_retain");
}
/// Release the given object.
Modified: cfe/trunk/test/CodeGenObjC/convert-messages-to-runtime-calls.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/convert-messages-to-runtime-calls.m?rev=360802&r1=360801&r2=360802&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/convert-messages-to-runtime-calls.m (original)
+++ cfe/trunk/test/CodeGenObjC/convert-messages-to-runtime-calls.m Wed May 15 13:15:01 2019
@@ -177,8 +177,8 @@ float test_cannot_message_return_float(C
@class Ety;
-// CHECK-LABEL: define {{.*}}void @testException
-void testException(NSObject *a) {
+// CHECK-LABEL: define {{.*}}void @testException_release
+void testException_release(NSObject *a) {
// MSGS: {{invoke.*@objc_msgSend}}
// CALLS: invoke{{.*}}void @objc_release(i8* %
@try {
@@ -186,3 +186,44 @@ void testException(NSObject *a) {
} @catch (Ety *e) {
}
}
+
+// CHECK-LABEL: define {{.*}}void @testException_autorelease
+void testException_autorelease(NSObject *a) {
+ @try {
+ // MSGS: {{invoke.*@objc_msgSend}}
+ // CALLS: invoke{{.*}}objc_autorelease(i8* %
+ [a autorelease];
+ } @catch (Ety *e) {
+ }
+}
+
+// CHECK-LABEL: define {{.*}}void @testException_retain
+void testException_retain(NSObject *a) {
+ @try {
+ // MSGS: {{invoke.*@objc_msgSend}}
+ // CALLS: invoke{{.*}}@objc_retain(i8* %
+ [a retain];
+ } @catch (Ety *e) {
+ }
+}
+
+
+// CHECK-LABEL: define {{.*}}void @testException_alloc(
+void testException_alloc() {
+ @try {
+ // MSGS: {{invoke.*@objc_msgSend}}
+ // CALLS: invoke{{.*}}@objc_alloc(i8* %
+ [A alloc];
+ } @catch (Ety *e) {
+ }
+}
+
+// CHECK-LABEL: define {{.*}}void @testException_allocWithZone
+void testException_allocWithZone() {
+ @try {
+ // MSGS: {{invoke.*@objc_msgSend}}
+ // CALLS: invoke{{.*}}@objc_allocWithZone(i8* %
+ [A allocWithZone:nil];
+ } @catch (Ety *e) {
+ }
+}
Modified: cfe/trunk/test/CodeGenObjC/objc-alloc-init.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/objc-alloc-init.m?rev=360802&r1=360801&r2=360802&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/objc-alloc-init.m (original)
+++ cfe/trunk/test/CodeGenObjC/objc-alloc-init.m Wed May 15 13:15:01 2019
@@ -1,7 +1,7 @@
-// RUN: %clang_cc1 %s -fobjc-runtime=macosx-10.14.4 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=OPTIMIZED --check-prefix=EITHER
-// RUN: %clang_cc1 %s -fobjc-runtime=macosx-10.14.3 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=NOT_OPTIMIZED --check-prefix=EITHER
-// RUN: %clang_cc1 %s -fobjc-runtime=ios-12.2 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=OPTIMIZED --check-prefix=EITHER
-// RUN: %clang_cc1 %s -fobjc-runtime=ios-12.1 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=NOT_OPTIMIZED --check-prefix=EITHER
+// RUN: %clang_cc1 %s -fobjc-exceptions -fexceptions -fobjc-runtime=macosx-10.14.4 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=OPTIMIZED --check-prefix=EITHER
+// RUN: %clang_cc1 %s -fobjc-exceptions -fexceptions -fobjc-runtime=macosx-10.14.3 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=NOT_OPTIMIZED --check-prefix=EITHER
+// RUN: %clang_cc1 %s -fobjc-exceptions -fexceptions -fobjc-runtime=ios-12.2 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=OPTIMIZED --check-prefix=EITHER
+// RUN: %clang_cc1 %s -fobjc-exceptions -fexceptions -fobjc-runtime=ios-12.1 -emit-llvm -O0 -o - | FileCheck %s --check-prefix=NOT_OPTIMIZED --check-prefix=EITHER
@interface X
+(X *)alloc;
@@ -12,6 +12,13 @@ void f() {
[[X alloc] init];
// OPTIMIZED: call i8* @objc_alloc_init(
// NOT_OPTIMIZED: call i8* @objc_alloc(
+
+ @try {
+ [[X alloc] init];
+ } @catch (X *x) {
+ }
+ // OPTIMIZED: invoke i8* @objc_alloc_init(
+ // NOT_OPTIMIZED: invoke i8* @objc_alloc(
}
@interface Y : X
More information about the cfe-commits
mailing list