// RUN: rm -rf %t && mkdir %t // RUN: %build-irgen-test-overlays // RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | FileCheck %s // REQUIRES: CPU=x86_64 // 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(%C18class_isa_pointers8Purebred*) {{.*}} { // CHECK: [[ISA_PTR:%.*]] = bitcast %C18class_isa_pointers8Purebred* %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(%C18class_isa_pointers7Mongrel*) {{.*}} { // CHECK: [[T0:%.*]] = bitcast {{.*}} %0 to i64* // CHECK-NEXT: [[T1:%.*]] = load i64, i64* [[T0]], align 8 // CHECK-NEXT: [[T2:%.*]] = load i64, i64* @swift_isaMask, align 8 // CHECK-NEXT: [[T3:%.*]] = and i64 [[T1]], [[T2]] // CHECK: [[ISA:%.*]] = inttoptr i64 [[T3]] 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 @_TToFC18class_isa_pointers7Mongrel6methodfT_T_ : $@convention(objc_method) (Purebred) -> () { entry(%0 : $Purebred): unreachable } sil private @_TToFC18class_isa_pointers7MongrelcfT7bellsOnSi_GSQS0__ : $@convention(objc_method) (Int, Purebred) -> () { entry(%0 : $Int, %1 : $Purebred): unreachable } sil private @_TToFC18class_isa_pointers7MongrelcfT_S0_ : $@convention(objc_method) (Purebred) -> () { entry(%0 : $Purebred): unreachable }