| // RUN: %empty-directory(%t) |
| // RUN: %build-irgen-test-overlays |
| // RUN: %target-swift-frontend -sdk %S/Inputs -I %t -emit-ir %s | %FileCheck %s |
| |
| // REQUIRES: CPU=x86_64 |
| // REQUIRES: objc_interop |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| import gizmo |
| |
| class X { |
| } |
| sil_vtable X {} |
| |
| sil @_TFC8metatype1Xd : $@convention(method) (@owned X) -> @owned Builtin.NativeObject |
| |
| sil @_TFC8metatype1XD : $@convention(method) (@owned X) -> () |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_(%swift.type*) |
| sil @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@thick X.Type) -> @objc_metatype X.Type { |
| bb0(%0 : $@thick X.Type): |
| // CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = bitcast %swift.type* %0 to %objc_class* |
| %1 = thick_to_objc_metatype %0 : $@thick X.Type to $@objc_metatype X.Type |
| // CHECK-NEXT: ret %objc_class* [[RESULT]] |
| return %1 : $@objc_metatype X.Type |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @foreign_thick_to_objc(%swift.type*) |
| sil @foreign_thick_to_objc : $@convention(thin) (@thick Gizmo.Type) -> @objc_metatype Gizmo.Type { |
| bb0(%0 : $@thick Gizmo.Type): |
| // CHECK: call %objc_class* @swift_getObjCClassFromMetadata |
| %1 = thick_to_objc_metatype %0 : $@thick Gizmo.Type to $@objc_metatype Gizmo.Type |
| // CHECK: ret %objc_class* |
| return %1 : $@objc_metatype Gizmo.Type |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_(%objc_class*) |
| sil @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@objc_metatype X.Type) -> @thick X.Type { |
| bb0(%0 : $@objc_metatype X.Type): |
| // CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0) |
| %1 = objc_to_thick_metatype %0 : $@objc_metatype X.Type to $@thick X.Type |
| // CHECK-NEXT: ret %swift.type* [[RESULT]] |
| return %1 : $@thick X.Type |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @foreign_objc_to_thick(%objc_class*) |
| sil @foreign_objc_to_thick : $@convention(thin) (@objc_metatype Gizmo.Type) -> @thick Gizmo.Type { |
| bb0(%0 : $@objc_metatype Gizmo.Type): |
| // CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0) |
| %1 = objc_to_thick_metatype %0 : $@objc_metatype Gizmo.Type to $@thick Gizmo.Type |
| // CHECK-NEXT: ret %swift.type* [[RESULT]] |
| return %1 : $@thick Gizmo.Type |
| } |
| |
| protocol CP: class {} |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @archetype_objc_metatype(%swift.type* %T, i8** %T.CP) |
| // CHECK: call %objc_class* @swift_getObjCClassFromMetadata |
| sil @archetype_objc_metatype : $@convention(thin) <T: CP> () -> @objc_metatype T.Type { |
| entry: |
| %m = metatype $@objc_metatype T.Type |
| return %m : $@objc_metatype T.Type |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @existential_objc_metatype(%objc_object*) {{.*}} { |
| // CHECK: entry: |
| // CHECK-NEXT: [[METATYPE:%.*]] = call %objc_class* @swift_getObjCClassFromObject(%objc_object* %0) {{#[0-9]+}} |
| // CHECK-NEXT: ret %objc_class* [[METATYPE]] |
| // CHECK-NEXT: } |
| sil @existential_objc_metatype : $@convention(thin) (AnyObject) -> (@objc_metatype AnyObject.Type) { |
| bb0(%0 : $AnyObject): |
| %1 = existential_metatype $@objc_metatype AnyObject.Type, %0 : $AnyObject |
| return %1 : $@objc_metatype AnyObject.Type |
| } |
| |
| |
| public protocol ClassProto : AnyObject { |
| var other: ClassProto? { get } |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @drop_witness_table(%swift.type*, i8**) |
| // CHECK: call %objc_class* @swift_getObjCClassFromMetadata(%swift.type* %0) |
| // CHECK: ret void |
| sil @drop_witness_table : $@convention(thin) (@thick ClassProto.Type) -> () { |
| bb0(%0 : $@thick ClassProto.Type): |
| %1 = thick_to_objc_metatype %0 : $@thick ClassProto.Type to $@objc_metatype ClassProto.Type |
| %2 = tuple () |
| return %2 : $() |
| } |