diff --git a/lib/IRGen/GenCall.cpp b/lib/IRGen/GenCall.cpp index 5dd48ccb841e0..5ec3a5eca122d 100644 --- a/lib/IRGen/GenCall.cpp +++ b/lib/IRGen/GenCall.cpp @@ -2605,7 +2605,10 @@ class SyncCallEmission final : public CallEmission { if (fnConv.getNumDirectSILResults() == 1 && (fnConv.getDirectSILResults().begin()->getConvention() == ResultConvention::Autoreleased)) { - result = emitObjCRetainAutoreleasedReturnValue(IGF, result); + if (IGF.IGM.Context.LangOpts.EnableObjCInterop) + result = emitObjCRetainAutoreleasedReturnValue(IGF, result); + else + IGF.emitNativeStrongRetain(result, IGF.getDefaultAtomicity()); } auto origFnType = getCallee().getOrigFunctionType(); diff --git a/test/IRGen/Inputs/CFBridgedType.h b/test/IRGen/Inputs/CFBridgedType.h new file mode 100644 index 0000000000000..415c2af3d49ff --- /dev/null +++ b/test/IRGen/Inputs/CFBridgedType.h @@ -0,0 +1,6 @@ +#define CF_BRIDGED_TYPE(T) __attribute__((objc_bridge(T))) + +typedef struct CF_BRIDGED_TYPE(id) __CFBridgedType *CFBridgedTypeRef; + +__attribute__((cf_audited_transfer)) +CFBridgedTypeRef returnsACFBridgedType(void); diff --git a/test/IRGen/Inputs/module.modulemap b/test/IRGen/Inputs/module.modulemap index 4b318ea597ee8..1bce3f3c6d5b6 100644 --- a/test/IRGen/Inputs/module.modulemap +++ b/test/IRGen/Inputs/module.modulemap @@ -33,5 +33,9 @@ module SynthesizedProtocol { } module PointerAuth { - header "ptrauth_field_fptr_import.h" - } + header "ptrauth_field_fptr_import.h" +} + +module CFBridgedType { + header "CFBridgedType.h" +} \ No newline at end of file diff --git a/test/IRGen/autorelease.sil b/test/IRGen/autorelease.sil index 078f74250f663..5ec98c807b839 100644 --- a/test/IRGen/autorelease.sil +++ b/test/IRGen/autorelease.sil @@ -1,4 +1,6 @@ -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -emit-ir | %FileCheck -check-prefix CHECK -check-prefix CHECK-%target-ptrsize -check-prefix %target-cpu -DINT=i%target-ptrsize %s +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %s -enable-objc-interop -emit-ir | %FileCheck -check-prefix CHECK -check-prefix CHECK-%target-ptrsize -check-prefix %target-cpu -DINT=i%target-ptrsize %s + +// REQUIRES: objc_codegen // rdar://16565958 diff --git a/test/IRGen/cf_objc_retainAutoreleasedReturnValue.swift b/test/IRGen/cf_objc_retainAutoreleasedReturnValue.swift new file mode 100644 index 0000000000000..884025261880a --- /dev/null +++ b/test/IRGen/cf_objc_retainAutoreleasedReturnValue.swift @@ -0,0 +1,20 @@ +// RUN: %target-swift-frontend -module-name cf_objc_retainAutoreleasedReturnValue -I %S/Inputs %s -enable-objc-interop -emit-ir | %FileCheck %s + +// We need to require objc_codegen to avoid this test on WASM. +// (That's why the other half of this test is in a separate file.) + +// REQUIRES: objc_codegen + +import CFBridgedType + +@inline(never) +public func foo() { + let _ = returnsACFBridgedType() +} + +// With interop enabled, this should use objc_retainAutoreleasedReturnValue() + +// CHECK-LABEL: define {{.*}}swiftcc void @"$s37cf_objc_retainAutoreleasedReturnValue3fooyyF"() +// CHECK: entry: +// CHECK: %0 = call {{.*}}@returnsACFBridgedType() +// CHECK: %1 = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %0) diff --git a/test/IRGen/cf_objc_retainAutoreleasedReturnValue2.swift b/test/IRGen/cf_objc_retainAutoreleasedReturnValue2.swift new file mode 100644 index 0000000000000..463c608a450f6 --- /dev/null +++ b/test/IRGen/cf_objc_retainAutoreleasedReturnValue2.swift @@ -0,0 +1,18 @@ +// RUN: %target-swift-frontend -module-name cf_objc_retainAutoreleasedReturnValue -I %S/Inputs %s -disable-objc-interop -emit-ir | %FileCheck %s + +// This is in a separate file because *this* one works on WASM. +// (cf_objc_retainAutoreleasedReturnValue.swift does not.) + +import CFBridgedType + +@inline(never) +public func foo() { + let _ = returnsACFBridgedType() +} + +// With interop disabled, this should use swift_retain(). + +// CHECK-LABEL: define {{.*}}swiftcc void @"$s37cf_objc_retainAutoreleasedReturnValue3fooyyF"() +// CHECK: entry: +// CHECK: %0 = call {{.*}}@returnsACFBridgedType() +// CHECK: %1 = call ptr @swift_retain(ptr returned %0)