| // RUN: rm -rf %t && mkdir -p %t |
| // RUN: %build-irgen-test-overlays |
| // RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s |
| |
| // REQUIRES: CPU=armv7k, OS=watchos |
| // REQUIRES: objc_interop |
| |
| import Swift |
| import gizmo |
| |
| // |
| // A pure Swift class. We can access its isa directly. |
| // |
| |
| class Purebred { |
| func method() {} |
| } |
| sil_vtable Purebred {} |
| |
| // CHECK-LABEL: define{{( protected)?}} void @purebred_method(%C33class_isa_pointers_armv7k_watchos8Purebred*) {{.*}} { |
| // CHECK: [[ISA_PTR:%.*]] = bitcast %C33class_isa_pointers_armv7k_watchos8Purebred* %0 to %swift.type** |
| // CHECK: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_PTR]] |
| // CHECK: [[VTABLE:%.*]] = bitcast %swift.type* [[ISA]] |
| // CHECK: getelementptr inbounds {{.*}} [[VTABLE]] |
| sil @purebred_method : $@convention(thin) (@owned Purebred) -> () { |
| entry(%0 : $Purebred): |
| %m = class_method %0 : $Purebred, #Purebred.method!1 : (Purebred) -> () -> (), $@convention(method) (@guaranteed Purebred) -> () |
| %z = apply %m(%0) : $@convention(method) (@guaranteed Purebred) -> () |
| return %z : $() |
| } |
| |
| // |
| // A mixed Swift/ObjC class. We have to mask when reading its isa. |
| // |
| |
| class Mongrel: Gizmo { |
| func method() {} |
| } |
| sil_vtable Mongrel {} |
| |
| // CHECK-LABEL: define{{( protected)?}} void @mongrel_method(%C33class_isa_pointers_armv7k_watchos7Mongrel*) {{.*}} { |
| // CHECK: [[T0:%.*]] = bitcast {{.*}} %0 to %objc_object* |
| // CHECK: [[T1:%.*]] = call %objc_class* @object_getClass(%objc_object* [[T0]]) |
| // CHECK: [[ISA:%.*]] = bitcast %objc_class* [[T1]] to %swift.type* |
| // CHECK: [[VTABLE:%.*]] = bitcast %swift.type* [[ISA]] |
| // CHECK: getelementptr inbounds {{.*}} [[VTABLE]] |
| sil @mongrel_method : $@convention(thin) (@owned Mongrel) -> () { |
| entry(%0 : $Mongrel): |
| %m = class_method %0 : $Mongrel, #Mongrel.method!1 : (Mongrel) -> () -> (), $@convention(method) (@guaranteed Mongrel) -> () |
| %z = apply %m(%0) : $@convention(method) (@guaranteed Mongrel) -> () |
| return %z : $() |
| } |
| |
| // ObjC stubs expected by ObjC metadata emission |
| |
| sil private @_TToFC33class_isa_pointers_armv7k_watchos7Mongrel6methodfT_T_ : $@convention(objc_method) (Purebred) -> () { |
| entry(%0 : $Purebred): |
| unreachable |
| } |
| sil private @_TToFC33class_isa_pointers_armv7k_watchos7MongrelcfT7bellsOnSi_GSQS0__ : $@convention(objc_method) (Int, Purebred) -> () { |
| entry(%0 : $Int, %1 : $Purebred): |
| unreachable |
| } |
| sil private @_TToFC33class_isa_pointers_armv7k_watchos7MongrelcfT_S0_ : $@convention(objc_method) (Purebred) -> () { |
| entry(%0 : $Purebred): |
| unreachable |
| } |