blob: f7d9966a85e670522f28d1c7947d0912cbb1052e [file] [log] [blame]
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: %target-swift-frontend -emit-module -enable-resilience -I %t -module-name resilient_struct -o %t %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -emit-module -enable-resilience -I %t -module-name resilient_class -o %t %S/../Inputs/resilient_class.swift
// RUN: %target-swift-frontend -enable-resilience -parse-sil -parse-as-library -emit-ir -I %t %s | FileCheck %s
sil_stage canonical
import Builtin
import Swift
import SwiftShims
import resilient_class
public class ChildToResilientParent : ResilientOutsideParent {
public override func method()
public override class func classMethod()
deinit
override init()
}
public class ChildToFixedParent : OutsideParent {
public override func method()
public override class func classMethod()
deinit
override init()
}
public extension ResilientOutsideChild {
public func callSuperMethod()
public class func callSuperClassMethod()
}
// resilient_class.ResilientOutsideParent.method () -> ()
sil @_TFC15resilient_class22ResilientOutsideParent6methodfT_T_ : $@convention(method) (@guaranteed ResilientOutsideParent) -> ()
// static resilient_class.ResilientOutsideParent.classMethod () -> ()
sil @_TZFC15resilient_class22ResilientOutsideParent11classMethodfT_T_ : $@convention(method) (@thick ResilientOutsideParent.Type) -> ()
// super.ChildToResilientParent.method () -> ()
sil @_TFC5super22ChildToResilientParent6methodfT_T_ : $@convention(method) (@guaranteed ChildToResilientParent) -> () {
// %0
bb0(%0 : $ChildToResilientParent):
debug_value %0 : $ChildToResilientParent, let, name "self", argno 1
strong_retain %0 : $ChildToResilientParent
%3 = upcast %0 : $ChildToResilientParent to $ResilientOutsideParent
%4 = super_method %0 : $ChildToResilientParent, #ResilientOutsideParent.method!1 : (ResilientOutsideParent) -> () -> () , $@convention(method) (@guaranteed ResilientOutsideParent) -> ()
%5 = apply %4(%3) : $@convention(method) (@guaranteed ResilientOutsideParent) -> ()
strong_release %3 : $ResilientOutsideParent
%7 = tuple ()
return %7 : $()
}
// ChildToResilientParent is in our resilience domain - can load the superclass's metadata directly.
// CHECK-LABEL: define{{( protected)?}} void @_TFC5super22ChildToResilientParent6methodfT_T_(%C5super22ChildToResilientParent*)
// CHECK: [[SUPER_METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class22ResilientOutsideParent()
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%C15resilient_class22ResilientOutsideParent*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%C15resilient_class22ResilientOutsideParent*)*, void (%C15resilient_class22ResilientOutsideParent*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%C15resilient_class22ResilientOutsideParent*)*, void (%C15resilient_class22ResilientOutsideParent*)** [[VTABLE_SLOT]]
// CHECK: call void
// static super.ChildToResilientParent.classMethod () -> ()
sil @_TZFC5super22ChildToResilientParent11classMethodfT_T_ : $@convention(method) (@thick ChildToResilientParent.Type) -> () {
bb0(%0 : $@thick ChildToResilientParent.Type):
debug_value %0 : $@thick ChildToResilientParent.Type, let, name "self", argno 1
%2 = upcast %0 : $@thick ChildToResilientParent.Type to $@thick ResilientOutsideParent.Type
%3 = super_method %0 : $@thick ChildToResilientParent.Type, #ResilientOutsideParent.classMethod!1 : (ResilientOutsideParent.Type) -> () -> () , $@convention(method) (@thick ResilientOutsideParent.Type) -> ()
%4 = apply %3(%2) : $@convention(method) (@thick ResilientOutsideParent.Type) -> ()
%5 = tuple ()
return %5 : $()
}
// ChildToResilientParent is in our resilience domain - can load the superclass's metadata directly.
// CHECK-LABEL: define{{( protected)?}} void @_TZFC5super22ChildToResilientParent11classMethodfT_T_(%swift.type*)
// CHECK: [[SUPER_METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class22ResilientOutsideParent()
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%swift.type*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%swift.type*)*, void (%swift.type*)** [[VTABLE_SLOT]]
// CHECK: call void
// resilient_class.OutsideParent.method () -> ()
sil @_TFC15resilient_class13OutsideParent6methodfT_T_ : $@convention(method) (@guaranteed OutsideParent) -> ()
// static resilient_class.OutsideParent.classMethod () -> ()
sil @_TZFC15resilient_class13OutsideParent11classMethodfT_T_ : $@convention(thin) (@thick OutsideParent.Type) -> ()
// super.ChildToFixedParent.method () -> ()
sil @_TFC5super18ChildToFixedParent6methodfT_T_ : $@convention(method) (@guaranteed ChildToFixedParent) -> () {
// %0
bb0(%0 : $ChildToFixedParent):
debug_value %0 : $ChildToFixedParent, let, name "self", argno 1
strong_retain %0 : $ChildToFixedParent
%3 = upcast %0 : $ChildToFixedParent to $OutsideParent
%4 = super_method %0 : $ChildToFixedParent, #OutsideParent.method!1 : (OutsideParent) -> () -> () , $@convention(method) (@guaranteed OutsideParent) -> ()
%5 = apply %4(%3) : $@convention(method) (@guaranteed OutsideParent) -> ()
strong_release %3 : $OutsideParent
%7 = tuple ()
return %7 : $()
}
// CHECK-LABEL: define{{( protected)?}} void @_TFC5super18ChildToFixedParent6methodfT_T_(%C5super18ChildToFixedParent*)
// CHECK: [[SUPER_METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class13OutsideParent()
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%C15resilient_class13OutsideParent*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%C15resilient_class13OutsideParent*)*, void (%C15resilient_class13OutsideParent*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%C15resilient_class13OutsideParent*)*, void (%C15resilient_class13OutsideParent*)** [[VTABLE_SLOT]]
// CHECK: call void
// static super.ChildToFixedParent.classMethod () -> ()
sil @_TZFC5super18ChildToFixedParent11classMethodfT_T_ : $@convention(method) (@thick ChildToFixedParent.Type) -> () {
// %0
bb0(%0 : $@thick ChildToFixedParent.Type):
debug_value %0 : $@thick ChildToFixedParent.Type, let, name "self", argno 1
%2 = upcast %0 : $@thick ChildToFixedParent.Type to $@thick OutsideParent.Type
%3 = super_method %0 : $@thick ChildToFixedParent.Type, #OutsideParent.classMethod!1 : (OutsideParent.Type) -> () -> () , $@convention(method) (@thick OutsideParent.Type) -> ()
%4 = apply %3(%2) : $@convention(method) (@thick OutsideParent.Type) -> ()
%5 = tuple ()
return %5 : $()
}
// ChildToFixedParent is in our resilience domain - load super metadata directly.
// CHECK-LABEL: define{{( protected)?}} void @_TZFC5super18ChildToFixedParent11classMethodfT_T_(%swift.type*)
// CHECK: [[SUPER_METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class13OutsideParent()
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%swift.type*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%swift.type*)*, void (%swift.type*)** [[VTABLE_SLOT]]
// CHECK: call void
// ext.super.resilient_class.ResilientOutsideChild.callSuperMethod () -> ()
sil @_TFE5superC15resilient_class21ResilientOutsideChild15callSuperMethodfT_T_ : $@convention(method) (@guaranteed ResilientOutsideChild) -> () {
// %0
bb0(%0 : $ResilientOutsideChild):
debug_value %0 : $ResilientOutsideChild, let, name "self", argno 1
strong_retain %0 : $ResilientOutsideChild
%3 = upcast %0 : $ResilientOutsideChild to $ResilientOutsideParent
%4 = super_method %0 : $ResilientOutsideChild, #ResilientOutsideParent.method!1 : (ResilientOutsideParent) -> () -> () , $@convention(method) (@guaranteed ResilientOutsideParent) -> ()
%5 = apply %4(%3) : $@convention(method) (@guaranteed ResilientOutsideParent) -> ()
strong_release %3 : $ResilientOutsideParent
%7 = tuple ()
return %7 : $()
}
// Extending a resilient class - load super metadata indirectly.
// CHECK-LABEL: define{{( protected)?}} void @_TFE5superC15resilient_class21ResilientOutsideChild15callSuperMethodfT_T_(%C15resilient_class21ResilientOutsideChild*)
// CHECK: [[METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class21ResilientOutsideChild()
// CHECK: [[OPAQUE_METADATA:%[0-9]+]] = bitcast %swift.type* [[METADATA]] to %swift.type**
// CHECK: [[SUPER_METADATA_PTR:%[0-9]+]] = getelementptr inbounds %swift.type*, %swift.type** [[OPAQUE_METADATA]], i32 1
// CHECK: [[SUPER_METADATA:%[0-9]+]] = load %swift.type*, %swift.type** [[SUPER_METADATA_PTR]]
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%C15resilient_class22ResilientOutsideParent*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%C15resilient_class22ResilientOutsideParent*)*, void (%C15resilient_class22ResilientOutsideParent*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%C15resilient_class22ResilientOutsideParent*)*, void (%C15resilient_class22ResilientOutsideParent*)** [[VTABLE_SLOT]]
// CHECK: call void
// static ext.super.resilient_class.ResilientOutsideChild.callSuperClassMethod () -> ()
sil @_TZFE5superC15resilient_class21ResilientOutsideChild20callSuperClassMethodfT_T_ : $@convention(method) (@thick ResilientOutsideChild.Type) -> () {
// %0
bb0(%0 : $@thick ResilientOutsideChild.Type):
debug_value %0 : $@thick ResilientOutsideChild.Type, let, name "self", argno 1
%2 = upcast %0 : $@thick ResilientOutsideChild.Type to $@thick ResilientOutsideParent.Type
%3 = super_method %0 : $@thick ResilientOutsideChild.Type, #ResilientOutsideParent.classMethod!1 : (ResilientOutsideParent.Type) -> () -> () , $@convention(method) (@thick ResilientOutsideParent.Type) -> ()
%4 = apply %3(%2) : $@convention(method) (@thick ResilientOutsideParent.Type) -> ()
%5 = tuple ()
return %5 : $()
}
// Extending a resilient class - load super metadata indirectly.
// CHECK-LABEL: define{{( protected)?}} void @_TZFE5superC15resilient_class21ResilientOutsideChild20callSuperClassMethodfT_T_(%swift.type*)
// CHECK: [[METADATA:%[0-9]+]] = call %swift.type* @_TMaC15resilient_class21ResilientOutsideChild()
// CHECK: [[OPAQUE_METADATA:%[0-9]+]] = bitcast %swift.type* [[METADATA]] to %swift.type**
// CHECK: [[SUPER_METADATA_PTR:%[0-9]+]] = getelementptr inbounds %swift.type*, %swift.type** [[OPAQUE_METADATA]], i32 1
// CHECK: [[SUPER_METADATA:%[0-9]+]] = load %swift.type*, %swift.type** [[SUPER_METADATA_PTR]]
// CHECK: [[OPAQUE_SUPER_METADATA:%[0-9]+]] = bitcast %swift.type* [[SUPER_METADATA]] to void (%swift.type*)**
// CHECK: [[VTABLE_SLOT:%[0-9]+]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[OPAQUE_SUPER_METADATA]]
// CHECK: [[FN_PTR:%[0-9]+]] = load void (%swift.type*)*, void (%swift.type*)** [[VTABLE_SLOT]]
// CHECK: call void
sil_vtable ChildToResilientParent {
#ResilientOutsideParent.method!1: _TFC5super22ChildToResilientParent6methodfT_T_ // super.ChildToResilientParent.method () -> ()
#ResilientOutsideParent.classMethod!1: _TZFC5super22ChildToResilientParent11classMethodfT_T_ // static super.ChildToResilientParent.classMethod () -> ()
}
sil_vtable ChildToFixedParent {
#OutsideParent.method!1: _TFC5super18ChildToFixedParent6methodfT_T_ // super.ChildToFixedParent.method () -> ()
#OutsideParent.classMethod!1: _TZFC5super18ChildToFixedParent11classMethodfT_T_ // static super.ChildToFixedParent.classMethod () -> ()
}