mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When compiling a Swift module in incremental mode, each Swift source file is compiled into an object file and we use linker to link them together. Because the predicate function for checking dynamic feature availability is eagerly synthesized per compilation unit, the linker will complain about duplicated symbols for them. Setting their visibility as private ensures that linker doesn't see them, thus addressing the linker errors. One workaround for this problem is to enable WMO. rdar://164971313
133 lines
5.3 KiB
Swift
133 lines
5.3 KiB
Swift
// RUN: %target-swift-emit-silgen -module-name Test %s -verify \
|
|
// RUN: -enable-experimental-feature CustomAvailability \
|
|
// RUN: -import-bridging-header %S/Inputs/AvailabilityDomains.h \
|
|
// RUN: | %FileCheck %s
|
|
|
|
// REQUIRES: swift_feature_CustomAvailability
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test28testIfAvailableEnabledDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfAvailableEnabledDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
|
|
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_enabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_enabled_domainyyFTo
|
|
if #available(EnabledDomain) {
|
|
available_in_enabled_domain()
|
|
} else {
|
|
unavailable_in_enabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test28testIfAvailableEnabledDomainyyF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test30testIfUnavailableEnabledDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfUnavailableEnabledDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
|
|
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_enabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_enabled_domainyyFTo
|
|
if #unavailable(EnabledDomain) {
|
|
unavailable_in_enabled_domain()
|
|
} else {
|
|
available_in_enabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test30testIfUnavailableEnabledDomainyyF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test29testIfAvailableDisabledDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfAvailableDisabledDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, 0
|
|
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo28available_in_disabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo30unavailable_in_disabled_domainyyFTo
|
|
if #available(DisabledDomain) {
|
|
available_in_disabled_domain()
|
|
} else {
|
|
unavailable_in_disabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test29testIfAvailableDisabledDomainyyF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test31testIfUnavailableDisabledDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfUnavailableDisabledDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[PRED:%.*]] = integer_literal $Builtin.Int1, -1
|
|
// CHECK: cond_br [[PRED]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo30unavailable_in_disabled_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo28available_in_disabled_domainyyFTo
|
|
if #unavailable(DisabledDomain) {
|
|
unavailable_in_disabled_domain()
|
|
} else {
|
|
available_in_disabled_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test31testIfUnavailableDisabledDomainyyF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test28testIfAvailableDynamicDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfAvailableDynamicDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: cond_br [[QUERY_RESULT]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_dynamic_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_dynamic_domainyyFTo
|
|
if #available(DynamicDomain) {
|
|
available_in_dynamic_domain()
|
|
} else {
|
|
unavailable_in_dynamic_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test28testIfAvailableDynamicDomainyyF'
|
|
|
|
// CHECK-LABEL: sil private [ossa] @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSo27__DynamicDomain_isAvailableSbyFTo : $@convention(c) () -> Bool
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(c) () -> Bool
|
|
// CHECK: [[RESULT:%.*]] = struct_extract [[QUERY_RESULT]], #Bool._value
|
|
// CHECK: return [[RESULT]]
|
|
// CHECK: end sil function '$sSC33__swift_DynamicDomain_isAvailableBi1_yF'
|
|
|
|
// CHECK-LABEL: sil{{.*}}$s4Test30testIfUnavailableDynamicDomainyyF : $@convention(thin) () -> ()
|
|
public func testIfUnavailableDynamicDomain() {
|
|
// CHECK: bb0:
|
|
// CHECK: [[QUERY_FUNC:%.*]] = function_ref @$sSC33__swift_DynamicDomain_isAvailableBi1_yF : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[QUERY_RESULT:%.*]] = apply [[QUERY_FUNC]]() : $@convention(thin) () -> Builtin.Int1
|
|
// CHECK: [[MINUSONE:%.*]] = integer_literal $Builtin.Int1, -1
|
|
// CHECK: [[QUERY_INVERSION:%.*]] = builtin "xor_Int1"([[QUERY_RESULT]], [[MINUSONE]]) : $Builtin.Int1
|
|
// CHECK: cond_br [[QUERY_INVERSION]], [[TRUE_BB:bb[0-9]+]], [[FALSE_BB:bb[0-9]+]]
|
|
|
|
// CHECK: [[TRUE_BB]]:
|
|
// CHECK: function_ref @$sSo29unavailable_in_dynamic_domainyyFTo
|
|
|
|
// CHECK: [[FALSE_BB]]:
|
|
// CHECK: function_ref @$sSo27available_in_dynamic_domainyyFTo
|
|
if #unavailable(DynamicDomain) {
|
|
unavailable_in_dynamic_domain()
|
|
} else {
|
|
available_in_dynamic_domain()
|
|
}
|
|
}
|
|
// CHECK: end sil function '$s4Test30testIfUnavailableDynamicDomainyyF'
|