Files
swift-mirror/test/SILOptimizer/function_uses.sil
Michael Gottesman 3e66f88d39 [sil] Update tests for witness table ABI verification.
(cherry picked from commit 20d7a6c4c4)
2025-05-19 10:33:33 -07:00

221 lines
5.8 KiB
Plaintext

// RUN: %target-sil-opt -wmo -dump-function-uses %s -o /dev/null | %FileCheck %s
// REQUIRES: swift_in_compiler
sil_stage canonical
import Builtin
import Swift
import SwiftShims
// CHECK-LABEL: Uses of public_func
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: @other_public_func:
// CHECK-NEXT: %0 = function_ref @public_func
// CHECK-NEXT: @internal_func:
// CHECK-NEXT: %1 = function_ref @public_func
// CHECK-NEXT: @internal_func:
// CHECK-NEXT: %0 = function_ref @public_func
// CHECK-NEXT: ]
// CHECK-NEXT: End function public_func
sil @public_func : $@convention(thin) () -> ()
// CHECK-LABEL: Uses of internal_func
// CHECK-NEXT: [
// CHECK-NEXT: @other_public_func:
// CHECK-NEXT: %1 = dynamic_function_ref @internal_func
// CHECK-NEXT: ]
// CHECK-NEXT: End function internal_func
sil hidden [dynamically_replacable] @internal_func : $@convention(thin) () -> () {
bb0:
%0 = function_ref @public_func : $@convention(thin) () -> ()
%1 = function_ref @public_func : $@convention(thin) () -> ()
%7 = tuple ()
return %7 : $()
}
// CHECK-LABEL: Uses of other_public_func
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: ]
// CHECK-NEXT: End function other_public_func
sil @other_public_func : $@convention(thin) () -> () {
bb0:
%0 = function_ref @public_func : $@convention(thin) () -> ()
%1 = dynamic_function_ref @internal_func : $@convention(thin) () -> ()
%7 = tuple ()
return %7 : $()
}
struct S: Hashable {
var x: Int
let y: String
var z: C
func hash(into hasher: inout Hasher)
static func ==(x: S, y: S) -> Bool
}
class C: Hashable {
final var x: Int
final let y: String
final var z: S
init()
var overridable: Int {
get set
}
func hash(into hasher: inout Hasher)
static func ==(x: C, y: C) -> Bool
}
// CHECK-LABEL: Uses of id_a
// CHECK-NEXT: [
// CHECK-NEXT: @test_keypath: %2 = keypath {{.*}}
// CHECK-NEXT: ]
// CHECK-NEXT: End function id_a
sil hidden @id_a : $@convention(thin) () -> () {
bb0:
unreachable
}
// CHECK-LABEL: Uses of get_s_int_subs
// CHECK-NEXT: [
// CHECK-NEXT: @test_keypath: %2 = keypath {{.*}}
// CHECK-NEXT: ]
// CHECK-NEXT: End function get_s_int_subs
sil hidden @get_s_int_subs : $@convention(keypath_accessor_getter) (@in_guaranteed S, @in_guaranteed (S, C)) -> @out Int {
bb0(%0 : $*Int, %1 : $*S, %2 : $*(S, C)):
unreachable
}
// CHECK-LABEL: Uses of set_s_int_subs
// CHECK-NEXT: [
// CHECK-NEXT: @test_keypath: %2 = keypath {{.*}}
// CHECK-NEXT: ]
// CHECK-NEXT: End function set_s_int_subs
sil hidden @set_s_int_subs : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed S, @in_guaranteed (S, C)) -> () {
bb0(%0 : $*Int, %1 : $*S, %2 : $*(S, C)):
unreachable
}
// CHECK-LABEL: Uses of subs_eq
// CHECK-NEXT: [
// CHECK-NEXT: @test_keypath: %2 = keypath {{.*}}
// CHECK-NEXT: ]
// CHECK-NEXT: End function subs_eq
sil hidden @subs_eq : $@convention(keypath_accessor_equals) (@in_guaranteed (S, C), @in_guaranteed (S, C)) -> Bool {
bb0(%0 : $*(S, C), %1 : $*(S, C)):
unreachable
}
// CHECK-LABEL: Uses of subs_hash
// CHECK-NEXT: [
// CHECK-NEXT: @test_keypath: %2 = keypath {{.*}}
// CHECK-NEXT: ]
// CHECK-NEXT: End function subs_hash
sil hidden @subs_hash : $@convention(keypath_accessor_hash) (@in_guaranteed (S, C)) -> Int {
bb0(%0 : $*(S, C)):
unreachable
}
// CHECK-LABEL: Uses of test_keypath
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: ]
// CHECK-NEXT: End function test_keypath
sil @test_keypath : $@convention(thin) (S, C) -> () {
bb0(%0 : $S, %1 : $C):
%2 = keypath $KeyPath<S, Int>, (root $S; settable_property $Int, id @id_a : $@convention(thin) () -> (), getter @get_s_int_subs : $@convention(keypath_accessor_getter) (@in_guaranteed S, @in_guaranteed (S, C)) -> @out Int, setter @set_s_int_subs : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed S, @in_guaranteed (S, C)) -> (), indices [%$0 : $S : $S, %$1 : $C : $C], indices_equals @subs_eq : $@convention(keypath_accessor_equals) (@in_guaranteed (S, C), @in_guaranteed (S, C)) -> Bool, indices_hash @subs_hash : $@convention(keypath_accessor_hash) (@in_guaranteed (S, C)) -> Int) (%0, %1)
%7 = tuple ()
return %7 : $()
}
public protocol RP {
func default_witness()
}
// CHECK-LABEL: Uses of default_witness
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: ]
// CHECK-NEXT: End function default_witness
sil hidden @default_witness : $@convention(witness_method: RP) <Self where Self : RP> (@in_guaranteed Self) -> () {
bb0(%0 : $*Self):
%7 = tuple ()
return %7 : $()
}
sil_default_witness_table RP {
method #RP.default_witness: @default_witness
}
public protocol RP2 {
}
sil_default_witness_table RP2 {
no_default
}
protocol P {
func witness()
func witness2()
}
struct SP : P {
func witness()
func witness2()
}
struct SP2 : P {
func witness()
func witness2()
}
// CHECK-LABEL: Uses of witness
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: ]
// CHECK-NEXT: End function witness
sil @witness : $@convention(witness_method: P) (@in_guaranteed SP) -> () {
bb0(%0 : $*SP):
%7 = tuple ()
return %7 : $()
}
sil @witness2 : $@convention(witness_method: P) (@in_guaranteed SP) -> () {
bb0(%0 : $*SP):
%7 = tuple ()
return %7 : $()
}
sil_witness_table SP: P module witness_tables {
method #P.witness: @witness
method #P.witness2: @witness2
}
sil_witness_table SP2: P module witness_tables {
method #P.witness: @witness
method #P.witness2: @witness2
}
// CHECK-LABEL: Uses of hash_func
// CHECK-NEXT: [
// CHECK-NEXT: <unknown uses>
// CHECK-NEXT: ]
// CHECK-NEXT: End function hash_func
sil hidden @hash_func : $@convention(method) (@inout Hasher, @guaranteed C) -> () {
bb0(%0 : $*Hasher, %1 : $C):
%4 = tuple ()
return %4 : $()
}
sil_vtable C {
#C.hash: (C) -> (inout Hasher) -> () : @hash_func
}